Skip to content

Commit

Permalink
resolve local vars and parameters
Browse files Browse the repository at this point in the history
  • Loading branch information
ftomassetti committed Jul 29, 2018
1 parent bc430c0 commit 2f89028
Show file tree
Hide file tree
Showing 7 changed files with 103 additions and 29 deletions.
Expand Up @@ -17,6 +17,7 @@
package com.github.javaparser.symbolsolver.core.resolution; package com.github.javaparser.symbolsolver.core.resolution;


import com.github.javaparser.ast.Node; import com.github.javaparser.ast.Node;
import com.github.javaparser.ast.body.Parameter;
import com.github.javaparser.ast.body.VariableDeclarator; import com.github.javaparser.ast.body.VariableDeclarator;
import com.github.javaparser.resolution.MethodUsage; import com.github.javaparser.resolution.MethodUsage;
import com.github.javaparser.resolution.declarations.*; import com.github.javaparser.resolution.declarations.*;
Expand Down Expand Up @@ -112,11 +113,13 @@ default List<VariableDeclarator> localVariablesExposedToChild(Node child) {
return Collections.emptyList(); return Collections.emptyList();
} }


default List<VariableDeclarator> localVariablesDeclared() { default List<Parameter> parametersExposedToChild(Node child) {
//throw new UnsupportedOperationException(this.getClass().getCanonicalName());
// TODO fixme // TODO fixme
return Collections.emptyList(); return Collections.emptyList();
} }



/** /**
* The local variables that are visible in a certain scope are defined in JLS 6.3. Scope of a Declaration. * The local variables that are visible in a certain scope are defined in JLS 6.3. Scope of a Declaration.
* *
Expand Down Expand Up @@ -161,10 +164,17 @@ default Optional<VariableDeclarator> localVariableDeclarationInScope(String name
return getParent().localVariableDeclarationInScope(name); return getParent().localVariableDeclarationInScope(name);
} }


default Optional<VariableDeclarator> parameterDeclarationInScope(String name) { default Optional<Parameter> parameterDeclarationInScope(String name) {
//throw new UnsupportedOperationException(); if (getParent() == null) {
// TODO Fixme return Optional.empty();
return Optional.empty(); }
Optional<Parameter> localRes = getParent().parametersExposedToChild(((AbstractJavaParserContext)this)
.getWrappedNode()).stream().filter(vd -> vd.getNameAsString().equals(name)).findFirst();
if (localRes.isPresent()) {
return localRes;
}

return getParent().parameterDeclarationInScope(name);
} }


default Optional<VariableDeclarator> fieldDeclarationInScope(String name) { default Optional<VariableDeclarator> fieldDeclarationInScope(String name) {
Expand Down
@@ -1,6 +1,7 @@
package com.github.javaparser.symbolsolver.javaparsermodel.contexts; package com.github.javaparser.symbolsolver.javaparsermodel.contexts;


import com.github.javaparser.ast.Node; import com.github.javaparser.ast.Node;
import com.github.javaparser.ast.body.Parameter;
import com.github.javaparser.ast.body.VariableDeclarator; import com.github.javaparser.ast.body.VariableDeclarator;
import com.github.javaparser.ast.stmt.CatchClause; import com.github.javaparser.ast.stmt.CatchClause;
import com.github.javaparser.resolution.declarations.ResolvedMethodDeclaration; import com.github.javaparser.resolution.declarations.ResolvedMethodDeclaration;
Expand Down Expand Up @@ -61,4 +62,12 @@ public final SymbolReference<ResolvedMethodDeclaration> solveMethod(
public List<VariableDeclarator> localVariablesExposedToChild(Node child) { public List<VariableDeclarator> localVariablesExposedToChild(Node child) {
return Collections.emptyList(); return Collections.emptyList();
} }

@Override
public List<Parameter> parametersExposedToChild(Node child) {
if (child == getWrappedNode().getBody()) {
return Collections.singletonList(getWrappedNode().getParameter());
}
return Collections.emptyList();
}
} }
Expand Up @@ -16,6 +16,7 @@


package com.github.javaparser.symbolsolver.javaparsermodel.contexts; package com.github.javaparser.symbolsolver.javaparsermodel.contexts;


import com.github.javaparser.ast.Node;
import com.github.javaparser.ast.body.VariableDeclarator; import com.github.javaparser.ast.body.VariableDeclarator;
import com.github.javaparser.ast.expr.AssignExpr; import com.github.javaparser.ast.expr.AssignExpr;
import com.github.javaparser.ast.expr.Expression; import com.github.javaparser.ast.expr.Expression;
Expand All @@ -30,6 +31,8 @@
import com.github.javaparser.symbolsolver.model.resolution.SymbolReference; import com.github.javaparser.symbolsolver.model.resolution.SymbolReference;
import com.github.javaparser.symbolsolver.model.resolution.TypeSolver; import com.github.javaparser.symbolsolver.model.resolution.TypeSolver;


import java.util.Collections;
import java.util.LinkedList;
import java.util.List; import java.util.List;


import static com.github.javaparser.symbolsolver.javaparser.Navigator.requireParentNode; import static com.github.javaparser.symbolsolver.javaparser.Navigator.requireParentNode;
Expand Down Expand Up @@ -67,4 +70,16 @@ public SymbolReference<ResolvedMethodDeclaration> solveMethod(String name, List<
boolean staticOnly, TypeSolver typeSolver) { boolean staticOnly, TypeSolver typeSolver) {
return getParent().solveMethod(name, argumentsTypes, false, typeSolver); return getParent().solveMethod(name, argumentsTypes, false, typeSolver);
} }

@Override
public List<VariableDeclarator> localVariablesExposedToChild(Node child) {
List<VariableDeclarator> res = new LinkedList<>();
for (Expression expression : wrappedNode.getInitialization()) {
if (expression instanceof VariableDeclarationExpr) {
VariableDeclarationExpr variableDeclarationExpr = (VariableDeclarationExpr) expression;
res.addAll(variableDeclarationExpr.getVariables());
}
}
return res;
}
} }
Expand Up @@ -16,6 +16,7 @@


package com.github.javaparser.symbolsolver.javaparsermodel.contexts; package com.github.javaparser.symbolsolver.javaparsermodel.contexts;


import com.github.javaparser.ast.Node;
import com.github.javaparser.ast.body.VariableDeclarator; import com.github.javaparser.ast.body.VariableDeclarator;
import com.github.javaparser.ast.stmt.BlockStmt; import com.github.javaparser.ast.stmt.BlockStmt;
import com.github.javaparser.ast.stmt.ForeachStmt; import com.github.javaparser.ast.stmt.ForeachStmt;
Expand All @@ -26,6 +27,7 @@
import com.github.javaparser.symbolsolver.model.resolution.SymbolReference; import com.github.javaparser.symbolsolver.model.resolution.SymbolReference;
import com.github.javaparser.symbolsolver.model.resolution.TypeSolver; import com.github.javaparser.symbolsolver.model.resolution.TypeSolver;


import java.util.Collections;
import java.util.List; import java.util.List;


import static com.github.javaparser.symbolsolver.javaparser.Navigator.requireParentNode; import static com.github.javaparser.symbolsolver.javaparser.Navigator.requireParentNode;
Expand Down Expand Up @@ -58,4 +60,12 @@ public SymbolReference<ResolvedMethodDeclaration> solveMethod(String name, List<
boolean staticOnly, TypeSolver typeSolver) { boolean staticOnly, TypeSolver typeSolver) {
return getParent().solveMethod(name, argumentsTypes, false, typeSolver); return getParent().solveMethod(name, argumentsTypes, false, typeSolver);
} }

@Override
public List<VariableDeclarator> localVariablesExposedToChild(Node child) {
if (child == wrappedNode.getBody()) {
return wrappedNode.getVariable().getVariables();
}
return Collections.emptyList();
}
} }
Expand Up @@ -16,9 +16,14 @@


package com.github.javaparser.symbolsolver.javaparsermodel.contexts; package com.github.javaparser.symbolsolver.javaparsermodel.contexts;


import com.github.javaparser.ast.Node;
import com.github.javaparser.ast.body.MethodDeclaration; import com.github.javaparser.ast.body.MethodDeclaration;
import com.github.javaparser.ast.body.Parameter;
import com.github.javaparser.symbolsolver.model.resolution.TypeSolver; import com.github.javaparser.symbolsolver.model.resolution.TypeSolver;


import java.util.Collections;
import java.util.List;

/** /**
* @author Federico Tomassetti * @author Federico Tomassetti
*/ */
Expand All @@ -32,4 +37,12 @@ public MethodContext(MethodDeclaration wrappedNode, TypeSolver typeSolver) {
super(wrappedNode, typeSolver); super(wrappedNode, typeSolver);
} }



@Override
public List<Parameter> parametersExposedToChild(Node child) {
if (wrappedNode.getBody().isPresent() && child == wrappedNode.getBody().get()) {
return wrappedNode.getParameters();
}
return Collections.emptyList();
}
} }
Expand Up @@ -204,28 +204,28 @@ public SymbolReference<ResolvedTypeDeclaration> solveType(String name, TypeSolve
return getParent().solveType(name, typeSolver); return getParent().solveType(name, typeSolver);
} }


@Override // @Override
public List<VariableDeclarator> localVariablesExposedToChild(Node child) { // public List<VariableDeclarator> localVariablesExposedToChild(Node child) {
// TODO fixme // // TODO fixme
//return Collections.emptyList(); // //return Collections.emptyList();
if (wrappedNode instanceof BlockStmt) { // if (wrappedNode instanceof BlockStmt) {
NodeWithStatements<?> nodeWithStmt = (NodeWithStatements<?>) wrappedNode; // NodeWithStatements<?> nodeWithStmt = (NodeWithStatements<?>) wrappedNode;
int position = -1; // int position = -1;
for (int i = 0; i < nodeWithStmt.getStatements().size(); i++) { // for (int i = 0; i < nodeWithStmt.getStatements().size(); i++) {
if (nodeWithStmt.getStatements().get(i).equals(child)) { // if (nodeWithStmt.getStatements().get(i).equals(child)) {
position = i; // position = i;
} // }
} // }
if (position == -1) { // if (position == -1) {
throw new RuntimeException("I cannot find the child " + child + " in " + wrappedNode); // throw new RuntimeException("I cannot find the child " + child + " in " + wrappedNode);
} // }
List<VariableDeclarator> variableDeclarators = new LinkedList<>(); // List<VariableDeclarator> variableDeclarators = new LinkedList<>();
for (int i = position - 1; i >= 0; i--) { // for (int i = position - 1; i >= 0; i--) {
variableDeclarators.addAll(JavaParserFactory.getContext(nodeWithStmt.getStatements().get(i), typeSolver).localVariablesDeclared()); // variableDeclarators.addAll(JavaParserFactory.getContext(nodeWithStmt.getStatements().get(i), typeSolver).localVariablesDeclared());
} // }
return variableDeclarators; // return variableDeclarators;
} else { // } else {
return Collections.emptyList(); // return Collections.emptyList();
} // }
} // }
} }
Expand Up @@ -16,6 +16,7 @@


package com.github.javaparser.symbolsolver.javaparsermodel.contexts; package com.github.javaparser.symbolsolver.javaparsermodel.contexts;


import com.github.javaparser.ast.Node;
import com.github.javaparser.ast.body.VariableDeclarator; import com.github.javaparser.ast.body.VariableDeclarator;
import com.github.javaparser.ast.expr.Expression; import com.github.javaparser.ast.expr.Expression;
import com.github.javaparser.ast.expr.VariableDeclarationExpr; import com.github.javaparser.ast.expr.VariableDeclarationExpr;
Expand All @@ -29,6 +30,8 @@
import com.github.javaparser.symbolsolver.model.resolution.TypeSolver; import com.github.javaparser.symbolsolver.model.resolution.TypeSolver;
import com.github.javaparser.symbolsolver.model.resolution.Value; import com.github.javaparser.symbolsolver.model.resolution.Value;


import java.util.Collections;
import java.util.LinkedList;
import java.util.List; import java.util.List;
import java.util.Optional; import java.util.Optional;


Expand Down Expand Up @@ -85,4 +88,18 @@ public SymbolReference<ResolvedMethodDeclaration> solveMethod(String name, List<
boolean staticOnly, TypeSolver typeSolver) { boolean staticOnly, TypeSolver typeSolver) {
return getParent().solveMethod(name, argumentsTypes, false, typeSolver); return getParent().solveMethod(name, argumentsTypes, false, typeSolver);
} }

@Override
public List<VariableDeclarator> localVariablesExposedToChild(Node child) {
if (child == wrappedNode.getTryBlock()) {
List<VariableDeclarator> res = new LinkedList<>();
for (Expression expr : wrappedNode.getResources()) {
if (expr instanceof VariableDeclarationExpr) {
res.addAll(((VariableDeclarationExpr)expr).getVariables());
}
}
return res;
}
return Collections.emptyList();
}
} }

0 comments on commit 2f89028

Please sign in to comment.