@Nonnull @Override protected String getName(@Nonnull FieldAccessExpr reference) { return reference.getField(); }
private static String getFullQualifier(FieldAccessExpr reference) { StringBuilder buffy = new StringBuilder(reference.getField()); for (FieldAccessExpr loop = reference; loop != null; ) { Expression scope = loop.getScope(); final String qualifier; if (NameExpr.class.isInstance(scope)) { loop = null; qualifier = NameExpr.class.cast(scope).getName(); } else { loop = FieldAccessExpr.class.cast(scope); qualifier = loop.getField(); } buffy.insert(0, '.'); buffy.insert(0, qualifier); } return buffy.toString(); }
private String name(final FieldAccessExpr n) { LinkedList<String> name = new LinkedList<>(); Expression it = n.getScope(); while (it instanceof FieldAccessExpr) { name.addFirst(((FieldAccessExpr) it).getField()); it = ((FieldAccessExpr) it).getScope(); } name.addFirst(it.toStringWithoutComments()); return name.stream().collect(Collectors.joining(".")); }
@SuppressWarnings({"rawtypes", "unchecked" }) @Override public Object visit(final FieldAccessExpr n, final Context ctx) { String name = name(n); Type type = ctx.resolveType(n, name) .orElseThrow(() -> new IllegalArgumentException("Type not found " + name)); if (type instanceof Class) { Class etype = (Class) type; if (etype.isEnum()) { return Enum.valueOf(etype, n.getField()); } } return super.visit(n, ctx); }
private static final String getAnnotationParamValue(String packageName, Object expr, List<String> imports) { String str = expr.toString(); if (expr instanceof FieldAccessExpr) { FieldAccessExpr fae = (FieldAccessExpr) expr; String className = getClassName(packageName, fae.getScope().toString(), imports); return String.format("%s.%s", className, fae.getField()); } else if (expr instanceof IntegerLiteralExpr) { return str; } else if (expr instanceof LongLiteralExpr) { return str; } else if (expr instanceof DoubleLiteralExpr) { return str; } else if (expr instanceof StringLiteralExpr) { return str; } return null; } // =========================================================================
private static final String getAnnotationParamValue(String packageName, Object expr, List<String> imports) { String str = expr.toString(); if (expr instanceof FieldAccessExpr) { FieldAccessExpr fae = (FieldAccessExpr) expr; String className = getClassName(packageName, fae.getScope().toString(), imports); return String.format("%s.%s", className, fae.getField()); } else if (expr instanceof IntegerLiteralExpr) { return str; } else if (expr instanceof LongLiteralExpr) { return str; } else if (expr instanceof DoubleLiteralExpr) { return str; } else if (expr instanceof StringLiteralExpr) { return str; } return null; } // =========================================================================
private void addPlanTargetsFromClassAnnotationFields() { for (AnnotationExpr annotationExpr : pair.getRight().getAnnotations()) { if (annotationExpr.getName().getName().equals(ContinuousIntegrationPlan.class.getName()) || annotationExpr.getName().getName().equals(ContinuousIntegrationPlan.class.getSimpleName())) { Map<String, MemberValuePair> classAnnotationFields = AgileTestingJavaParserTools.mapAnnotationFields(annotationExpr); if (classAnnotationFields.containsKey(AgileTestingAnnotationTools.CLASS_TARGETS)) { Expression expression = classAnnotationFields.get(AgileTestingAnnotationTools.CLASS_TARGETS).getValue(); if (expression instanceof FieldAccessExpr) { FieldAccessExpr fieldAccessExpr = (FieldAccessExpr) expression; classPlanTargets.add(IntegrationCategory.fromString(fieldAccessExpr.getField())); } else if (expression instanceof ArrayInitializerExpr) { ArrayInitializerExpr arrayInitializerExpr = (ArrayInitializerExpr) expression; for (Expression arrayField : arrayInitializerExpr.getValues()) { FieldAccessExpr arrayFieldAccessExpr = (FieldAccessExpr) arrayField; classPlanTargets.add(IntegrationCategory.fromString(arrayFieldAccessExpr.getField())); } } } } } }
@Override public Optional<Value> solveSymbolAsValue(String name, TypeSolver typeSolver) { Expression scope = wrappedNode.getScope(); if (wrappedNode.getField().toString().equals(name)) { ResolvedType typeOfScope = JavaParserFacade.get(typeSolver).getType(scope); if (typeOfScope.isArray() && name.equals(ARRAY_LENGTH_FIELD_NAME)) { return Optional.of(new Value(ResolvedPrimitiveType.INT, ARRAY_LENGTH_FIELD_NAME)); } if (typeOfScope.isReferenceType()) { Optional<ResolvedType> typeUsage = typeOfScope.asReferenceType().getFieldType(name); if (typeUsage.isPresent()) { return Optional.of(new Value(typeUsage.get(), name)); } else { return Optional.empty(); } } else { return Optional.empty(); } } else { return getParent().solveSymbolAsValue(name, typeSolver); } }
@Override public Optional<Value> solveSymbolAsValue(String name, TypeSolver typeSolver) { Expression scope = wrappedNode.getScope(); if (wrappedNode.getField().toString().equals(name)) { ResolvedType typeOfScope = JavaParserFacade.get(typeSolver).getType(scope); if (typeOfScope.isArray() && name.equals(ARRAY_LENGTH_FIELD_NAME)) { return Optional.of(new Value(ResolvedPrimitiveType.INT, ARRAY_LENGTH_FIELD_NAME)); } if (typeOfScope.isReferenceType()) { Optional<ResolvedType> typeUsage = typeOfScope.asReferenceType().getFieldType(name); if (typeUsage.isPresent()) { return Optional.of(new Value(typeUsage.get(), name)); } else { return Optional.empty(); } } else { return Optional.empty(); } } else { return getParent().solveSymbolAsValue(name, typeSolver); } } }
@Override public SymbolReference<? extends ResolvedValueDeclaration> solveSymbol(String name, TypeSolver typeSolver) { if (wrappedNode.getField().toString().equals(name)) { if (wrappedNode.getScope() instanceof ThisExpr) { ResolvedType typeOfThis = JavaParserFacade.get(typeSolver).getTypeOfThisIn(wrappedNode); return new SymbolSolver(typeSolver).solveSymbolInType(typeOfThis.asReferenceType().getTypeDeclaration(), name); } } return JavaParserFactory.getContext(requireParentNode(wrappedNode), typeSolver).solveSymbol(name, typeSolver); }
IntegrationCategory integrationCategory = IntegrationCategory.fromString(fieldAccessExpr.getField()); addDurationToMap(integrationCategory, methodDuration); atTestMethods.get(method.getLeft().getName()).addCategory(integrationCategory); IntegrationCategory integrationCategory = IntegrationCategory.fromString(arrayFieldAccessExpr.getField()); addDurationToMap(integrationCategory, methodDuration); atTestMethods.get(method.getLeft().getName()).addCategory(integrationCategory);
@Override public SymbolReference<? extends ResolvedValueDeclaration> solveSymbol(String name, TypeSolver typeSolver) { if (wrappedNode.getField().toString().equals(name)) { if (wrappedNode.getScope() instanceof ThisExpr) { ResolvedType typeOfThis = JavaParserFacade.get(typeSolver).getTypeOfThisIn(wrappedNode); return new SymbolSolver(typeSolver).solveSymbolInType(typeOfThis.asReferenceType().getTypeDeclaration(), name); } } return JavaParserFactory.getContext(requireParentNode(wrappedNode), typeSolver).solveSymbol(name, typeSolver); }
IntegrationCategory integrationCategory = IntegrationCategory.fromString(fieldAccessExpr.getField()); addDurationToMap(integrationCategory, methodDuration); atTestMethods.get(method.getLeft().getName()).addCategory(integrationCategory); IntegrationCategory integrationCategory = IntegrationCategory.fromString(arrayFieldAccessExpr.getField()); addDurationToMap(integrationCategory, methodDuration); atTestMethods.get(method.getLeft().getName()).addCategory(integrationCategory);
@Test public void accessClassFieldThroughThisWithCompetingSymbolInParentContext() throws ParseException { CompilationUnit cu = parseSample("AccessClassMemberThroughThis"); com.github.javaparser.ast.body.ClassOrInterfaceDeclaration clazz = Navigator.demandClass(cu, "AccessClassMemberThroughThis"); MethodDeclaration method = Navigator.demandMethod(clazz, "setLabel"); ExpressionStmt expressionStmt = (ExpressionStmt) method.getBody().get().getStatements().get(0); AssignExpr assignExpr = (AssignExpr) expressionStmt.getExpression(); FieldAccessExpr fieldAccessExpr = (FieldAccessExpr) assignExpr.getTarget(); File src = adaptPath(new File("src/test/resources")); CombinedTypeSolver typeSolver = new CombinedTypeSolver(new JavaParserTypeSolver(src), new ReflectionTypeSolver()); SymbolSolver symbolSolver = new SymbolSolver(typeSolver); SymbolReference<? extends ResolvedValueDeclaration> ref = symbolSolver.solveSymbol(fieldAccessExpr.getField().getId(), fieldAccessExpr); assertTrue(ref.isSolved()); assertTrue(ref.getCorrespondingDeclaration().isField()); }