@Override public ResolvedFieldDeclaration getField(String name) { Optional<ResolvedFieldDeclaration> field = javassistTypeDeclarationAdapter.getDeclaredFields().stream().filter(f -> f.getName().equals(name)).findFirst(); return field.orElseThrow(() -> new RuntimeException("Field " + name + " does not exist in " + ctClass.getName() + ".")); }
@Override public List<ResolvedFieldDeclaration> fieldsExposedToChild(Node child) { List<ResolvedFieldDeclaration> res = new LinkedList<>(); // Consider the static imports for static fields for (ImportDeclaration importDeclaration : wrappedNode.getImports()) { if (importDeclaration.isStatic()) { Name typeNameAsNode = importDeclaration.isAsterisk() ? importDeclaration.getName() : importDeclaration.getName().getQualifier().get(); String typeName = typeNameAsNode.asString(); ResolvedReferenceTypeDeclaration typeDeclaration = typeSolver.solveType(typeName); res.addAll(typeDeclaration.getAllFields().stream() .filter(f -> f.isStatic()) .filter(f -> importDeclaration.isAsterisk() || importDeclaration.getName().getIdentifier().equals(f.getName())) .collect(Collectors.toList())); } } return res; }
@Test public void testGetFieldForExistingField() { JavaParserClassDeclaration constructorDeclaration = (JavaParserClassDeclaration) typeSolverNewCode.solveType("com.github.javaparser.ast.body.ConstructorDeclaration"); ResolvedFieldDeclaration fieldDeclaration = null; // declared field fieldDeclaration = constructorDeclaration.getField("modifiers"); assertEquals("modifiers", fieldDeclaration.getName()); assertEquals("java.util.EnumSet", fieldDeclaration.getType().asReferenceType().getQualifiedName()); assertEquals(AccessSpecifier.PRIVATE, fieldDeclaration.accessSpecifier()); assertEquals(false, fieldDeclaration.isStatic()); // inherited field fieldDeclaration = constructorDeclaration.getField("annotations"); assertEquals("annotations", fieldDeclaration.getName()); assertEquals("java.util.List", fieldDeclaration.getType().asReferenceType().getQualifiedName()); assertEquals(AccessSpecifier.PRIVATE, fieldDeclaration.accessSpecifier()); }
@Test public void testGetAllGenericFields() throws IOException, ParseException { TypeSolver typeSolver = new ReflectionTypeSolver(); CompilationUnit cu = JavaParser.parse(adaptPath(new File("src/test/resources/GenericFields.java.txt"))); JavaParserClassDeclaration classDeclaration = new JavaParserClassDeclaration(Navigator.demandClass(cu, "CB"), typeSolver); assertEquals(3, classDeclaration.getAllFields().size()); ReferenceTypeImpl rtClassDeclaration = new ReferenceTypeImpl(classDeclaration, typeSolver); assertEquals("s", classDeclaration.getAllFields().get(0).getName()); assertEquals(string, classDeclaration.getAllFields().get(0).getType()); assertEquals(string, rtClassDeclaration.getFieldType("s").get()); assertEquals("t", classDeclaration.getAllFields().get(1).getName()); assertEquals("java.util.List<java.lang.Boolean>", classDeclaration.getAllFields().get(1).getType().describe()); assertEquals(listOfBoolean, rtClassDeclaration.getFieldType("t").get()); assertEquals("i", classDeclaration.getAllFields().get(2).getName()); assertEquals(ResolvedPrimitiveType.INT, classDeclaration.getAllFields().get(2).getType()); assertEquals(ResolvedPrimitiveType.INT, rtClassDeclaration.getFieldType("i").get()); }
@Test public void findAllInheritedFieldsAndGenerics() throws ParseException { CompilationUnit cu = parseSample("AClassWithFieldsAndGenerics"); ClassOrInterfaceDeclaration classC = Navigator.demandClass(cu, "C"); ResolvedReferenceTypeDeclaration typeDeclaration = JavaParserFacade.get(new ReflectionTypeSolver()).getTypeDeclaration(classC); assertEquals(3, typeDeclaration.getAllFields().size()); assertEquals(ImmutableSet.of("a", "b", "c"), typeDeclaration.getAllFields().stream().map(ResolvedDeclaration::getName).collect(Collectors.toSet())); assertEquals("java.util.List<java.lang.String>", typeDeclaration.getField("b").getType().describe()); } }
@Test public void testGetFieldDeclarationTypeVariableInheritance() { class Foo<E> { E field; } class Bar extends Foo<String> { } TypeSolver typeResolver = new ReflectionTypeSolver(); ResolvedReferenceTypeDeclaration foo = new ReflectionClassDeclaration(Foo.class, typeResolver); ResolvedReferenceTypeDeclaration bar = new ReflectionClassDeclaration(Bar.class, typeResolver); ResolvedFieldDeclaration fooField = foo.getField("field"); assertEquals(true, fooField.getType().isTypeVariable()); assertEquals("E", fooField.getType().asTypeParameter().getName()); ResolvedFieldDeclaration barField = bar.getField("field"); assertEquals(true, barField.getType().isReferenceType()); assertEquals(String.class.getCanonicalName(), barField.getType().asReferenceType().getQualifiedName()); }
@Override public ResolvedFieldDeclaration getField(String name) { Optional<ResolvedFieldDeclaration> field = javassistTypeDeclarationAdapter.getDeclaredFields().stream().filter(f -> f.getName().equals(name)).findFirst(); return field.orElseThrow(() -> new RuntimeException("Field " + name + " does not exist in " + ctClass.getName() + ".")); }
/** * Java Parser can't differentiate between packages, internal types, and fields. * All three are lumped together into FieldAccessExpr. We need to differentiate them. */ private ResolvedType solveDotExpressionType(ResolvedReferenceTypeDeclaration parentType, FieldAccessExpr node) { // Fields and internal type declarations cannot have the same name. // Thus, these checks will always be mutually exclusive. if (parentType.hasField(node.getName().getId())) { return parentType.getField(node.getName().getId()).getType(); } else if (parentType.hasInternalType(node.getName().getId())) { return new ReferenceTypeImpl(parentType.getInternalType(node.getName().getId()), typeSolver); } else { throw new UnsolvedSymbolException(node.getName().getId()); } }
@Override public ResolvedFieldDeclaration getField(String name) { Optional<ResolvedFieldDeclaration> field = javassistTypeDeclarationAdapter.getDeclaredFields().stream().filter(f -> f.getName().equals(name)).findFirst(); return field.orElseThrow(() -> new RuntimeException("Field " + name + " does not exist in " + ctClass.getName() + ".")); }
/** * Java Parser can't differentiate between packages, internal types, and fields. * All three are lumped together into FieldAccessExpr. We need to differentiate them. */ private ResolvedType solveDotExpressionType(ResolvedReferenceTypeDeclaration parentType, FieldAccessExpr node) { // Fields and internal type declarations cannot have the same name. // Thus, these checks will always be mutually exclusive. if (parentType.hasField(node.getName().getId())) { return parentType.getField(node.getName().getId()).getType(); } else if (parentType.hasInternalType(node.getName().getId())) { return new ReferenceTypeImpl(parentType.getInternalType(node.getName().getId()), typeSolver); } else { throw new UnsolvedSymbolException(node.getName().getId()); } }
@Override public boolean hasField(String name) { return javassistTypeDeclarationAdapter.getDeclaredFields().stream().anyMatch(f -> f.getName().equals(name)); }
/** * Java Parser can't differentiate between packages, internal types, and fields. * All three are lumped together into FieldAccessExpr. We need to differentiate them. */ private ResolvedType solveDotExpressionType(ResolvedReferenceTypeDeclaration parentType, FieldAccessExpr node) { // Fields and internal type declarations cannot have the same name. // Thus, these checks will always be mutually exclusive. if (parentType.isEnum() && parentType.asEnum().hasEnumConstant(node.getName().getId())) { return parentType.asEnum().getEnumConstant(node.getName().getId()).getType(); } else if (parentType.hasField(node.getName().getId())) { return parentType.getField(node.getName().getId()).getType(); } else if (parentType.hasInternalType(node.getName().getId())) { return new ReferenceTypeImpl(parentType.getInternalType(node.getName().getId()), typeSolver); } else { throw new UnsolvedSymbolException(node.getName().getId()); } }
@Override public boolean hasField(String name) { return javassistTypeDeclarationAdapter.getDeclaredFields().stream().anyMatch(f -> f.getName().equals(name)); }
@Override public boolean hasField(String name) { return javassistTypeDeclarationAdapter.getDeclaredFields().stream().anyMatch(f -> f.getName().equals(name)); }
default Optional<ResolvedFieldDeclaration> fieldDeclarationInScope(String name) { if (getParent() == null) { return Optional.empty(); } Optional<ResolvedFieldDeclaration> localRes = getParent().fieldsExposedToChild(((AbstractJavaParserContext)this) .getWrappedNode()).stream().filter(vd -> vd.getName().equals(name)).findFirst(); if (localRes.isPresent()) { return localRes; } return getParent().fieldDeclarationInScope(name); }
@Test public void testGetAllStaticFields() { JavaParserClassDeclaration constructorDeclaration = (JavaParserClassDeclaration) typeSolverNewCode.solveType("com.github.javaparser.ast.body.ConstructorDeclaration"); List<ResolvedFieldDeclaration> allFields = constructorDeclaration.getAllStaticFields(); assertEquals(3, allFields.size()); ResolvedFieldDeclaration fieldDeclaration = null; fieldDeclaration = allFields.get(0); assertEquals("NODE_BY_BEGIN_POSITION", fieldDeclaration.getName()); fieldDeclaration = allFields.get(1); assertEquals("ABSOLUTE_BEGIN_LINE", fieldDeclaration.getName()); fieldDeclaration = allFields.get(2); assertEquals("ABSOLUTE_END_LINE", fieldDeclaration.getName()); }
@Test public void testGetDeclaredFields() { JavaParserClassDeclaration constructorDeclaration = (JavaParserClassDeclaration) typeSolverNewCode.solveType("com.github.javaparser.ast.body.ConstructorDeclaration"); List<ResolvedFieldDeclaration> allFields = constructorDeclaration.getDeclaredFields(); assertEquals(6, allFields.size()); ResolvedFieldDeclaration fieldDeclaration = null; fieldDeclaration = allFields.get(0); assertEquals("modifiers", fieldDeclaration.getName()); fieldDeclaration = allFields.get(1); assertEquals("typeParameters", fieldDeclaration.getName()); fieldDeclaration = allFields.get(2); assertEquals("name", fieldDeclaration.getName()); fieldDeclaration = allFields.get(3); assertEquals("parameters", fieldDeclaration.getName()); fieldDeclaration = allFields.get(4); assertEquals("throws_", fieldDeclaration.getName()); fieldDeclaration = allFields.get(5); assertEquals("body", fieldDeclaration.getName()); }
assertEquals("modifiers", fieldDeclaration.getName()); assertEquals("typeParameters", fieldDeclaration.getName()); assertEquals("name", fieldDeclaration.getName()); assertEquals("parameters", fieldDeclaration.getName()); assertEquals("throws_", fieldDeclaration.getName()); assertEquals("body", fieldDeclaration.getName()); assertEquals("annotations", fieldDeclaration.getName()); assertEquals("range", fieldDeclaration.getName()); assertEquals("parentNode", fieldDeclaration.getName()); assertEquals("childrenNodes", fieldDeclaration.getName()); assertEquals("orphanComments", fieldDeclaration.getName()); assertEquals("userData", fieldDeclaration.getName()); assertEquals("comment", fieldDeclaration.getName());
assertEquals("modifiers", fieldDeclaration.getName()); assertEquals("typeParameters", fieldDeclaration.getName()); assertEquals("name", fieldDeclaration.getName()); assertEquals("parameters", fieldDeclaration.getName()); assertEquals("throws_", fieldDeclaration.getName()); assertEquals("body", fieldDeclaration.getName()); assertEquals("annotations", fieldDeclaration.getName()); assertEquals("NODE_BY_BEGIN_POSITION", fieldDeclaration.getName()); assertEquals("range", fieldDeclaration.getName()); assertEquals("parentNode", fieldDeclaration.getName()); assertEquals("childrenNodes", fieldDeclaration.getName()); assertEquals("orphanComments", fieldDeclaration.getName()); assertEquals("userData", fieldDeclaration.getName()); assertEquals("comment", fieldDeclaration.getName()); assertEquals("ABSOLUTE_BEGIN_LINE", fieldDeclaration.getName());