support for method argument default values
This commit is contained in:
parent
948d69cbb8
commit
533d392bda
|
@ -562,6 +562,10 @@ public class ClosureExtractor extends CAstRewriterExt {
|
||||||
public CAstNodeTypeMap newTypes() { return theTypes; }
|
public CAstNodeTypeMap newTypes() { return theTypes; }
|
||||||
@Override
|
@Override
|
||||||
public Map<CAstNode, Collection<CAstEntity>> newChildren() { return theChildren; }
|
public Map<CAstNode, Collection<CAstEntity>> newChildren() { return theChildren; }
|
||||||
|
@Override
|
||||||
|
public CAstNode[] newDefaults() {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
};
|
};
|
||||||
new_entity.setRewrite(rw);
|
new_entity.setRewrite(rw);
|
||||||
|
|
||||||
|
|
|
@ -815,7 +815,8 @@ public abstract class AstTranslator extends CAstVisitor<AstTranslator.WalkContex
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}).copy(sourceContext.unwindAst, sourceContext.astContext.getControlFlow(), sourceContext.astContext.getSourceMap(),
|
}).copy(sourceContext.unwindAst, sourceContext.astContext.getControlFlow(), sourceContext.astContext.getSourceMap(),
|
||||||
sourceContext.astContext.top().getNodeTypeMap(), sourceContext.astContext.top().getAllScopedEntities());
|
sourceContext.astContext.top().getNodeTypeMap(), sourceContext.astContext.top().getAllScopedEntities(),
|
||||||
|
sourceContext.astContext.top().getArgumentDefaults());
|
||||||
sourceContext.astVisitor.visit(ast.newRoot(), new DelegatingContext(sourceContext.astContext) {
|
sourceContext.astVisitor.visit(ast.newRoot(), new DelegatingContext(sourceContext.astContext) {
|
||||||
@Override
|
@Override
|
||||||
public CAstSourcePositionMap getSourceMap() {
|
public CAstSourcePositionMap getSourceMap() {
|
||||||
|
|
|
@ -296,7 +296,7 @@ public interface TranslatorToCAst {
|
||||||
if (replicateForDoLoops) {
|
if (replicateForDoLoops) {
|
||||||
loopBody = Ast.makeNode(CAstNode.BLOCK_STMT, loopBody, continueNode);
|
loopBody = Ast.makeNode(CAstNode.BLOCK_STMT, loopBody, continueNode);
|
||||||
|
|
||||||
CAstRewriter.Rewrite x = (new CAstCloner(Ast, false)).copy(loopBody, wc.cfg(), wc.pos(), wc.getNodeTypeMap(), null);
|
CAstRewriter.Rewrite x = (new CAstCloner(Ast, false)).copy(loopBody, wc.cfg(), wc.pos(), wc.getNodeTypeMap(), null, null);
|
||||||
CAstNode otherBody = x.newRoot();
|
CAstNode otherBody = x.newRoot();
|
||||||
|
|
||||||
wc.cfg().addAll(x.newCfg());
|
wc.cfg().addAll(x.newCfg());
|
||||||
|
|
|
@ -46,7 +46,7 @@ public class AstConstantFolder {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}.rewrite(ce.getAST(), ce.getControlFlow(), ce.getSourceMap(), ce.getNodeTypeMap(), ce.getAllScopedEntities());
|
}.rewrite(ce.getAST(), ce.getControlFlow(), ce.getSourceMap(), ce.getNodeTypeMap(), ce.getAllScopedEntities(), ce.getArgumentDefaults());
|
||||||
return new DelegatingEntity(ce) {
|
return new DelegatingEntity(ce) {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -62,7 +62,7 @@ public class CAstCloner extends CAstBasicRewriter<CAstBasicRewriter.NonCopyingCo
|
||||||
}
|
}
|
||||||
|
|
||||||
public Rewrite copy(CAstNode root, final CAstControlFlowMap cfg, final CAstSourcePositionMap pos, final CAstNodeTypeMap types,
|
public Rewrite copy(CAstNode root, final CAstControlFlowMap cfg, final CAstSourcePositionMap pos, final CAstNodeTypeMap types,
|
||||||
final Map<CAstNode, Collection<CAstEntity>> children) {
|
final Map<CAstNode, Collection<CAstEntity>> children, CAstNode[] defaults) {
|
||||||
return rewrite(root, cfg, pos, types, children);
|
return rewrite(root, cfg, pos, types, children, defaults);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -100,6 +100,7 @@ public abstract class CAstRewriter<C extends CAstRewriter.RewriteContext<K>, K e
|
||||||
|
|
||||||
Map<CAstNode, Collection<CAstEntity>> newChildren();
|
Map<CAstNode, Collection<CAstEntity>> newChildren();
|
||||||
|
|
||||||
|
CAstNode[] newDefaults();
|
||||||
}
|
}
|
||||||
|
|
||||||
protected final CAst Ast;
|
protected final CAst Ast;
|
||||||
|
@ -342,9 +343,14 @@ public abstract class CAstRewriter<C extends CAstRewriter.RewriteContext<K>, K e
|
||||||
* rewrite the CAst sub-tree rooted at root
|
* rewrite the CAst sub-tree rooted at root
|
||||||
*/
|
*/
|
||||||
public Rewrite rewrite(final CAstNode root, final CAstControlFlowMap cfg, final CAstSourcePositionMap pos, final CAstNodeTypeMap types,
|
public Rewrite rewrite(final CAstNode root, final CAstControlFlowMap cfg, final CAstSourcePositionMap pos, final CAstNodeTypeMap types,
|
||||||
final Map<CAstNode, Collection<CAstEntity>> children) {
|
final Map<CAstNode, Collection<CAstEntity>> children, final CAstNode[] defaults) {
|
||||||
final Map<Pair<CAstNode, K>, CAstNode> nodes = HashMapFactory.make();
|
final Map<Pair<CAstNode, K>, CAstNode> nodes = HashMapFactory.make();
|
||||||
final CAstNode newRoot = copyNodes(root, cfg, rootContext, nodes);
|
final CAstNode newRoot = copyNodes(root, cfg, rootContext, nodes);
|
||||||
|
final CAstNode newDefaults[] = new CAstNode[ defaults==null? 0: defaults.length ];
|
||||||
|
for(int i = 0; i < newDefaults.length; i++) {
|
||||||
|
newDefaults[i] = copyNodes(defaults[i], cfg, rootContext, nodes);
|
||||||
|
}
|
||||||
|
|
||||||
return new Rewrite() {
|
return new Rewrite() {
|
||||||
private CAstControlFlowMap theCfg = null;
|
private CAstControlFlowMap theCfg = null;
|
||||||
|
|
||||||
|
@ -354,6 +360,11 @@ public abstract class CAstRewriter<C extends CAstRewriter.RewriteContext<K>, K e
|
||||||
|
|
||||||
private Map<CAstNode, Collection<CAstEntity>> theChildren = null;
|
private Map<CAstNode, Collection<CAstEntity>> theChildren = null;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public CAstNode[] newDefaults() {
|
||||||
|
return newDefaults;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public CAstNode newRoot() {
|
public CAstNode newRoot() {
|
||||||
return newRoot;
|
return newRoot;
|
||||||
|
@ -397,7 +408,7 @@ public abstract class CAstRewriter<C extends CAstRewriter.RewriteContext<K>, K e
|
||||||
|
|
||||||
if (root.getAST() != null) {
|
if (root.getAST() != null) {
|
||||||
final Rewrite rewrite = rewrite(root.getAST(), root.getControlFlow(), root.getSourceMap(), root.getNodeTypeMap(),
|
final Rewrite rewrite = rewrite(root.getAST(), root.getControlFlow(), root.getSourceMap(), root.getNodeTypeMap(),
|
||||||
root.getAllScopedEntities());
|
root.getAllScopedEntities(), root.getArgumentDefaults());
|
||||||
|
|
||||||
return new DelegatingEntity(root) {
|
return new DelegatingEntity(root) {
|
||||||
@Override
|
@Override
|
||||||
|
@ -439,6 +450,11 @@ public abstract class CAstRewriter<C extends CAstRewriter.RewriteContext<K>, K e
|
||||||
public CAstControlFlowMap getControlFlow() {
|
public CAstControlFlowMap getControlFlow() {
|
||||||
return rewrite.newCfg();
|
return rewrite.newCfg();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public CAstNode[] getArgumentDefaults() {
|
||||||
|
return rewrite.newDefaults();
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
} else if (recursive) {
|
} else if (recursive) {
|
||||||
|
|
|
@ -184,6 +184,10 @@ public abstract class CAstVisitor<C extends CAstVisitor.Context> {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case CAstEntity.FUNCTION_ENTITY: {
|
case CAstEntity.FUNCTION_ENTITY: {
|
||||||
|
for(CAstNode dflt : n.getArgumentDefaults()) {
|
||||||
|
visitor.visit(dflt, context, visitor);
|
||||||
|
visitor.visitScopedEntities(context.top(), context.top().getScopedEntities(dflt), context, visitor);
|
||||||
|
}
|
||||||
C codeContext = visitor.makeCodeContext(context, n);
|
C codeContext = visitor.makeCodeContext(context, n);
|
||||||
if (visitor.visitFunctionEntity(n, context, codeContext, visitor))
|
if (visitor.visitFunctionEntity(n, context, codeContext, visitor))
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -160,4 +160,9 @@ public interface IMethod extends IMember, ContextItem {
|
||||||
* @return true iff the local variable table information for this method is available
|
* @return true iff the local variable table information for this method is available
|
||||||
*/
|
*/
|
||||||
boolean hasLocalVariableTable();
|
boolean hasLocalVariableTable();
|
||||||
|
|
||||||
|
default int getNumberOfDefaultParameters() {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue