1 package com.github.javaparser.symbolsolver.javaparsermodel.declarations; 2 3 import static com.github.javaparser.symbolsolver.javaparser.Navigator.getParentNode; 4 5 import com.github.javaparser.ast.AccessSpecifier; 6 import com.github.javaparser.ast.Node; 7 import com.github.javaparser.ast.expr.ObjectCreationExpr; 8 import com.github.javaparser.resolution.declarations.*; 9 import com.github.javaparser.resolution.types.ResolvedReferenceType; 10 import com.github.javaparser.resolution.types.ResolvedType; 11 import com.github.javaparser.symbolsolver.core.resolution.Context; 12 import com.github.javaparser.symbolsolver.javaparsermodel.JavaParserFacade; 13 import com.github.javaparser.symbolsolver.javaparsermodel.JavaParserFactory; 14 import com.github.javaparser.symbolsolver.logic.AbstractClassDeclaration; 15 import com.github.javaparser.symbolsolver.model.resolution.TypeSolver; 16 import com.github.javaparser.symbolsolver.model.typesystem.ReferenceTypeImpl; 17 import com.google.common.collect.ImmutableList; 18 import com.google.common.collect.Lists; 19 20 import java.util.*; 21 import java.util.stream.Collectors; 22 23 /** 24 * An anonymous class declaration representation. 25 */ 26 public class JavaParserAnonymousClassDeclaration extends AbstractClassDeclaration { 27 28 private final TypeSolver typeSolver; 29 private final ObjectCreationExpr wrappedNode; 30 private final ResolvedTypeDeclaration superTypeDeclaration; 31 private final String name = "Anonymous-" + UUID.randomUUID(); 32 33 public JavaParserAnonymousClassDeclaration(ObjectCreationExpr wrappedNode, 34 TypeSolver typeSolver) { 35 this.typeSolver = typeSolver; 36 this.wrappedNode = wrappedNode; 37 superTypeDeclaration = 38 JavaParserFactory.getContext(wrappedNode.getParentNode().get(), typeSolver) 39 .solveType(wrappedNode.getType().getName().getId(), typeSolver) 40 .getCorrespondingDeclaration(); 41 } 42 43 public ResolvedTypeDeclaration getSuperTypeDeclaration() { 44 return superTypeDeclaration; 45 } 46 47 public <T extends Node> List<T> findMembersOfKind(final Class<T> memberClass) { 48 if (wrappedNode.getAnonymousClassBody().isPresent()) { 49 return wrappedNode 50 .getAnonymousClassBody() 51 .get() 52 .stream() 53 .filter(node -> memberClass.isAssignableFrom(node.getClass())) 54 .map(memberClass::cast) 55 .collect(Collectors.toList()); 56 } else { 57 return Collections.emptyList(); 58 } 59 } 60 61 public Context getContext() { 62 return JavaParserFactory.getContext(wrappedNode, typeSolver); 63 } 64 65 @Override 66 protected ResolvedReferenceType object() { 67 return new ReferenceTypeImpl(typeSolver.solveType(Object.class.getCanonicalName()), typeSolver); 68 } 69 70 @Override 71 public ResolvedReferenceType getSuperClass() { 72 return new ReferenceTypeImpl(superTypeDeclaration.asReferenceType(), typeSolver); 73 } 74 75 @Override 76 public List<ResolvedReferenceType> getInterfaces() { 77 return 78 superTypeDeclaration 79 .asReferenceType().getAncestors() 80 .stream() 81 .filter(type -> type.getTypeDeclaration().isInterface()) 82 .collect(Collectors.toList()); 83 } 84 85 @Override 86 public List<ResolvedConstructorDeclaration> getConstructors() { 87 return 88 findMembersOfKind(com.github.javaparser.ast.body.ConstructorDeclaration.class) 89 .stream() 90 .map(ctor -> new JavaParserConstructorDeclaration(this, ctor, typeSolver)) 91 .collect(Collectors.toList()); 92 } 93 94 @Override 95 public AccessSpecifier accessSpecifier() { 96 return AccessSpecifier.PRIVATE; 97 } 98 99 @Override 100 public List<ResolvedReferenceType> getAncestors() { 101 return 102 ImmutableList. 103 <ResolvedReferenceType>builder() 104 .add(getSuperClass()) 105 .addAll(superTypeDeclaration.asReferenceType().getAncestors()) 106 .build(); 107 } 108 109 @Override 110 public List<ResolvedFieldDeclaration> getAllFields() { 111 112 List<JavaParserFieldDeclaration> myFields = 113 findMembersOfKind(com.github.javaparser.ast.body.FieldDeclaration.class) 114 .stream() 115 .flatMap(field -> 116 field.getVariables().stream() 117 .map(variable -> new JavaParserFieldDeclaration(variable, 118 typeSolver))) 119 .collect(Collectors.toList()); 120 121 List<ResolvedFieldDeclaration> superClassFields = 122 getSuperClass().getTypeDeclaration().getAllFields(); 123 124 List<ResolvedFieldDeclaration> interfaceFields = 125 getInterfaces().stream() 126 .flatMap(inteface -> inteface.getTypeDeclaration().getAllFields().stream()) 127 .collect(Collectors.toList()); 128 129 return 130 ImmutableList 131 .<ResolvedFieldDeclaration>builder() 132 .addAll(myFields) 133 .addAll(superClassFields) 134 .addAll(interfaceFields) 135 .build(); 136 } 137 138 @Override 139 public Set<ResolvedMethodDeclaration> getDeclaredMethods() { 140 return 141 findMembersOfKind(com.github.javaparser.ast.body.MethodDeclaration.class) 142 .stream() 143 .map(method -> new JavaParserMethodDeclaration(method, typeSolver)) 144 .collect(Collectors.toSet()); 145 } 146 147 @Override 148 public boolean isAssignableBy(ResolvedType type) { 149 return false; 150 } 151 152 @Override 153 public boolean isAssignableBy(ResolvedReferenceTypeDeclaration other) { 154 return false; 155 } 156 157 @Override 158 public boolean hasDirectlyAnnotation(String qualifiedName) { 159 return false; 160 } 161 162 @Override 163 public String getPackageName() { 164 return Helper.getPackageName(wrappedNode); 165 } 166 167 @Override 168 public String getClassName() { 169 return Helper.getClassName("", wrappedNode); 170 } 171 172 @Override 173 public String getQualifiedName() { 174 String containerName = Helper.containerName(wrappedNode.getParentNode().orElse(null)); 175 if (containerName.isEmpty()) { 176 return getName(); 177 } else { 178 return containerName + "." + getName(); 179 } 180 } 181 182 @Override 183 public Set<ResolvedReferenceTypeDeclaration> internalTypes() { 184 return 185 findMembersOfKind(com.github.javaparser.ast.body.TypeDeclaration.class) 186 .stream() 187 .map(typeMember -> JavaParserFacade.get(typeSolver).getTypeDeclaration(typeMember)) 188 .collect(Collectors.toSet()); 189 } 190 191 @Override 192 public String getName() { 193 return name; 194 } 195 196 @Override 197 public List<ResolvedTypeParameterDeclaration> getTypeParameters() { 198 return Lists.newArrayList(); 199 } 200 201 @Override 202 public Optional<ResolvedReferenceTypeDeclaration> containerType() { 203 throw new UnsupportedOperationException("containerType is not supported for " + this.getClass().getCanonicalName()); 204 } 205 } 206