more tracking of sourse positions for function parameters

This commit is contained in:
Julian Dolby 2018-06-05 15:00:31 -04:00
parent d2852beebf
commit 9aed4e058d
16 changed files with 129 additions and 10 deletions

View File

@ -274,7 +274,12 @@ public abstract class JDTJava2CAstTranslator<T extends Position> {
protected final class ClassEntity implements CAstEntity {
// TAGALONG (not static, will keep reference to ast, fIdentityMapper, etc)
private final String fName;
@Override
public Position getPosition(int arg) {
return null;
}
private final String fName;
private final Collection<CAstQualifier> fQuals;
@ -1031,7 +1036,13 @@ public abstract class JDTJava2CAstTranslator<T extends Position> {
return new CAstType.Method() {
private Collection<CAstType> fExceptionTypes = null;
@Override
public boolean isStatic() {
return getQualifiers().contains(CAstQualifier.STATIC);
}
@Override
public CAstType getReturnType() {
if (fReturnType != null)
return fTypeDict.getCAstTypeFor(fReturnType);
@ -1088,6 +1099,13 @@ public abstract class JDTJava2CAstTranslator<T extends Position> {
}
};
}
@Override
public Position getPosition(int arg) {
// TODO Auto-generated method stub
SingleVariableDeclaration p = (SingleVariableDeclaration) fDecl.parameters().get(arg);
return makePosition(p);
}
}
// ////////////////////////////////////
@ -1239,6 +1257,12 @@ public abstract class JDTJava2CAstTranslator<T extends Position> {
public CAstType getType() {
return fTypeDict.getCAstTypeFor(type);
}
@Override
public Position getPosition(int arg) {
return null;
}
}
// /////////////////////////////////////
@ -3016,6 +3040,11 @@ public abstract class JDTJava2CAstTranslator<T extends Position> {
Assertions.UNREACHABLE("CompilationUnitEntity.getType()");
return null;
}
@Override
public Position getPosition(int arg) {
return null;
}
}
// /////////////////////////////

View File

@ -27,6 +27,7 @@ import com.ibm.wala.cast.tree.CAstControlFlowMap;
import com.ibm.wala.cast.tree.CAstEntity;
import com.ibm.wala.cast.tree.CAstNode;
import com.ibm.wala.cast.tree.CAstQualifier;
import com.ibm.wala.cast.tree.CAstSourcePositionMap.Position;
import com.ibm.wala.cast.tree.CAstType;
import com.ibm.wala.cast.tree.CAstType.Method;
import com.ibm.wala.cast.tree.visit.CAstVisitor;
@ -436,6 +437,16 @@ public class JavaCAst2IRTranslator extends AstTranslator {
return getType("java.lang.Exception");
}
@Override
protected Position[] getParameterPositions(CAstEntity n) {
int offset = 0;
Position[] parameterPositions = new Position[ n.getArgumentCount() ];
if ((n.getType() instanceof CAstType.Method) && !((CAstType.Method)n.getType()).isStatic()) {
offset = 1;
}
for(int i = 0; i < n.getArgumentCount() - offset; i++) {
parameterPositions[i+offset] = n.getPosition(i);
}
return parameterPositions;
}
}

View File

@ -393,7 +393,7 @@ public class RhinoToAstTranslator implements TranslatorToCAst {
* Used to represent a script or function in the CAst; see walkEntity().
*
*/
private static class ScriptOrFnEntity implements CAstEntity {
private class ScriptOrFnEntity implements CAstEntity {
private final String[] arguments;
private final String name;
@ -410,6 +410,8 @@ public class RhinoToAstTranslator implements TranslatorToCAst {
private final Position entityPosition;
private final Position[] paramPositions;
private ScriptOrFnEntity(AstNode n, Map<CAstNode, Collection<CAstEntity>> subs, CAstNode ast, CAstControlFlowMap map, CAstSourcePositionMap pos, String name) {
this.name = name;
this.entityPosition = pos.getPosition(ast);
@ -424,7 +426,15 @@ public class RhinoToAstTranslator implements TranslatorToCAst {
for (int j = 0; j < f.getParamCount(); j++) {
arguments[i++] = f.getParamOrVarName(j);
}
List<AstNode> params = f.getParams();
paramPositions = new Position[ params.size() ];
for(int pi = 0; pi < params.size(); pi++) {
paramPositions[pi] = makePosition(params.get(pi));
}
} else {
paramPositions = new Position[0];
arguments = new String[0];
}
kind = (n instanceof FunctionNode) ? CAstEntity.FUNCTION_ENTITY : CAstEntity.SCRIPT_ENTITY;
@ -523,6 +533,11 @@ public class RhinoToAstTranslator implements TranslatorToCAst {
public CAstType getType() {
return JSAstTranslator.Any;
}
@Override
public Position getPosition(int arg) {
return paramPositions[arg];
}
}
private CAstEntity walkEntity(final AstNode n, List<CAstNode> body, String name, WalkContext child) {

View File

@ -186,4 +186,9 @@ class ExtractedFunction implements CAstEntity {
public String toString() {
return "<JS function " + name + ">";
}
@Override
public Position getPosition(int arg) {
return null;
}
}

View File

@ -26,6 +26,7 @@ import com.ibm.wala.cast.loader.DynamicCallSiteReference;
import com.ibm.wala.cast.loader.AstMethod.DebuggingInformation;
import com.ibm.wala.cast.tree.CAstEntity;
import com.ibm.wala.cast.tree.CAstNode;
import com.ibm.wala.cast.tree.CAstSourcePositionMap.Position;
import com.ibm.wala.cast.tree.CAstSymbol;
import com.ibm.wala.cast.tree.CAstType;
import com.ibm.wala.cast.tree.impl.CAstSymbolImpl;
@ -485,4 +486,17 @@ public class JSAstTranslator extends AstTranslator {
return Any;
}
@Override
protected Position[] getParameterPositions(CAstEntity e) {
if (e.getKind() == CAstEntity.SCRIPT_ENTITY) {
return new Position[0];
} else {
Position[] ps = new Position[ e.getArgumentCount() ];
for(int i = 2; i < e.getArgumentCount(); i++) {
ps[i] = e.getPosition(i-2);
}
return ps;
}
}
}

View File

@ -124,6 +124,12 @@ public class TestConstantCollector {
// TODO Auto-generated method stub
return null;
}
@Override
public Position getPosition(int arg) {
// TODO Auto-generated method stub
return null;
}
};
}

View File

@ -142,6 +142,12 @@ public class TestNativeTranslator {
// TODO Auto-generated method stub
return null;
}
@Override
public Position getPosition(int arg) {
// TODO Auto-generated method stub
return null;
}
};
}
}

View File

@ -19,7 +19,7 @@ import java.util.Collection;
import com.ibm.wala.cast.tree.CAstQualifier;
import com.ibm.wala.cast.tree.CAstType;
public class AbstractClassEntity extends AbstractDataEntity {
public abstract class AbstractClassEntity extends AbstractDataEntity {
private final CAstType.Class type;
public AbstractClassEntity(CAstType.Class type) {

View File

@ -23,7 +23,7 @@ import com.ibm.wala.cast.tree.CAstQualifier;
import com.ibm.wala.cast.tree.CAstType;
import com.ibm.wala.util.debug.Assertions;
public class AbstractFieldEntity extends AbstractDataEntity {
public abstract class AbstractFieldEntity extends AbstractDataEntity {
private final String name;
private final Set<CAstQualifier> modifiers;

View File

@ -21,7 +21,7 @@ import java.util.Set;
import com.ibm.wala.cast.tree.CAstQualifier;
import com.ibm.wala.cast.tree.CAstType;
public class AbstractGlobalEntity extends AbstractDataEntity {
public abstract class AbstractGlobalEntity extends AbstractDataEntity {
private final String name;
private final Set<CAstQualifier> modifiers;

View File

@ -22,7 +22,7 @@ import com.ibm.wala.cast.tree.CAstNode;
import com.ibm.wala.cast.tree.CAstQualifier;
import com.ibm.wala.cast.tree.CAstType;
public class AbstractScriptEntity extends AbstractCodeEntity {
public abstract class AbstractScriptEntity extends AbstractCodeEntity {
private final File file;
public AbstractScriptEntity(File file, CAstType type) {

View File

@ -502,13 +502,17 @@ public abstract class AstTranslator extends CAstVisitor<AstTranslator.WalkContex
private Position[][] operandPositions;
AstDebuggingInformation(Position codeBodyPosition, Position[] instructionPositions, Position[][] operandPositions, String[] names) {
private Position[] parameterPositions;
AstDebuggingInformation(Position codeBodyPosition, Position[] instructionPositions, Position[][] operandPositions, Position[] parameterPositions, String[] names) {
this.codeBodyPosition = codeBodyPosition;
this.instructionPositions = instructionPositions;
this.operandPositions = operandPositions;
this.parameterPositions = parameterPositions;
valueNumberNames = new String[names.length][];
for (int i = 0; i < names.length; i++) {
if (names[i] != null) {
@ -542,6 +546,11 @@ public abstract class AstTranslator extends CAstVisitor<AstTranslator.WalkContex
public String[][] getSourceNamesForValues() {
return valueNumberNames;
}
@Override
public Position getParameterPosition(int param) {
return parameterPositions[param];
}
}
public static final boolean DEBUG_ALL = false;
@ -3359,12 +3368,16 @@ public abstract class AstTranslator extends CAstVisitor<AstTranslator.WalkContex
functionContext.exposeNameSet(n, true),
functionContext.getAccesses(n));
DebuggingInformation DBG = new AstDebuggingInformation(n.getPosition(), line, operand, nms);
Position[] parameterPositions = getParameterPositions(n);
DebuggingInformation DBG = new AstDebuggingInformation(n.getPosition(), line, operand, parameterPositions, nms);
// actually make code body
defineFunction(n, parentContext, cfg, symtab, katch, catchTypes, monitor, LI, DBG);
}
protected abstract Position[] getParameterPositions(CAstEntity e);
@Override
protected WalkContext makeLocalContext(WalkContext context, CAstNode n) {
return new LocalContext(context, makeLocalScope(context.currentScope()));

View File

@ -52,6 +52,8 @@ public abstract class AstMethod implements IMethod {
Position getOperandPosition(int instructionOffset, int operand);
Position getParameterPosition(int param);
}
/**
@ -342,6 +344,10 @@ public abstract class AstMethod implements IMethod {
return debugInfo.getCodeBodyPosition();
}
public Position getParameterPosition(int paramIndex) {
return debugInfo.getParameterPosition(paramIndex);
}
@Override
public Position getSourcePosition(int instructionIndex) {
return debugInfo.getInstructionPosition(instructionIndex);

View File

@ -161,6 +161,11 @@ public interface CAstEntity {
*/
CAstSourcePositionMap.Position getPosition();
/**
* The source position of argument 'arg' this entity, if any;
*/
CAstSourcePositionMap.Position getPosition(int arg);
/**
* The map from CAstNodes to types. Valid for nodes that have an explicitly
* declared type (e.g. local vars).

View File

@ -54,6 +54,9 @@ public interface CAstType {
public interface Method extends Function {
CAstType getDeclaringType();
boolean isStatic();
}
public interface Complex extends CAstType {

View File

@ -21,6 +21,7 @@ import com.ibm.wala.cast.tree.CAstNode;
import com.ibm.wala.cast.tree.CAstNodeTypeMap;
import com.ibm.wala.cast.tree.CAstQualifier;
import com.ibm.wala.cast.tree.CAstSourcePositionMap;
import com.ibm.wala.cast.tree.CAstSourcePositionMap.Position;
import com.ibm.wala.cast.tree.CAstType;
public class DelegatingEntity implements CAstEntity {
@ -110,4 +111,9 @@ public class DelegatingEntity implements CAstEntity {
return base.getAnnotations();
}
@Override
public Position getPosition(int arg) {
return base.getPosition(arg);
}
}