Home | History | Annotate | Download | only in declarations
      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