Search in sources :

Example 1 with SymbolSolver

use of com.github.javaparser.symbolsolver.resolution.SymbolSolver in project javaparser by javaparser.

the class JavaParserTypeAdapter method solveType.

public SymbolReference<ResolvedTypeDeclaration> solveType(String name, TypeSolver typeSolver) {
    if (wrappedNode instanceof NodeWithTypeParameters<?>) {
        NodeList<TypeParameter> typeParameters = ((NodeWithTypeParameters<?>) wrappedNode).getTypeParameters();
        for (com.github.javaparser.ast.type.TypeParameter typeParameter : typeParameters) {
            if (typeParameter.getName().getId().equals(name)) {
                return SymbolReference.solved(new JavaParserTypeVariableDeclaration(typeParameter, typeSolver));
            }
        }
    }
    // Internal classes
    for (BodyDeclaration<?> member : this.wrappedNode.getMembers()) {
        if (member instanceof com.github.javaparser.ast.body.TypeDeclaration) {
            com.github.javaparser.ast.body.TypeDeclaration<?> internalType = (com.github.javaparser.ast.body.TypeDeclaration<?>) member;
            String prefix = internalType.getName() + ".";
            if (internalType.getName().getId().equals(name)) {
                if (internalType instanceof ClassOrInterfaceDeclaration) {
                    return SymbolReference.solved(new JavaParserClassDeclaration((com.github.javaparser.ast.body.ClassOrInterfaceDeclaration) internalType, typeSolver));
                } else if (internalType instanceof EnumDeclaration) {
                    return SymbolReference.solved(new JavaParserEnumDeclaration((com.github.javaparser.ast.body.EnumDeclaration) internalType, typeSolver));
                } else {
                    throw new UnsupportedOperationException();
                }
            } else if (name.startsWith(prefix) && name.length() > prefix.length()) {
                if (internalType instanceof ClassOrInterfaceDeclaration) {
                    return new JavaParserClassDeclaration((com.github.javaparser.ast.body.ClassOrInterfaceDeclaration) internalType, typeSolver).solveType(name.substring(prefix.length()), typeSolver);
                } else if (internalType instanceof EnumDeclaration) {
                    return new SymbolSolver(typeSolver).solveTypeInType(new JavaParserEnumDeclaration((com.github.javaparser.ast.body.EnumDeclaration) internalType, typeSolver), name.substring(prefix.length()));
                } else {
                    throw new UnsupportedOperationException();
                }
            }
        }
    }
    return SymbolReference.unsolved(ResolvedTypeDeclaration.class);
}
Also used : NodeWithTypeParameters(com.github.javaparser.ast.nodeTypes.NodeWithTypeParameters) TypeParameter(com.github.javaparser.ast.type.TypeParameter) ClassOrInterfaceDeclaration(com.github.javaparser.ast.body.ClassOrInterfaceDeclaration) TypeParameter(com.github.javaparser.ast.type.TypeParameter) EnumDeclaration(com.github.javaparser.ast.body.EnumDeclaration) SymbolSolver(com.github.javaparser.symbolsolver.resolution.SymbolSolver) ResolvedTypeDeclaration(com.github.javaparser.resolution.declarations.ResolvedTypeDeclaration) ResolvedReferenceTypeDeclaration(com.github.javaparser.resolution.declarations.ResolvedReferenceTypeDeclaration)

Example 2 with SymbolSolver

use of com.github.javaparser.symbolsolver.resolution.SymbolSolver in project javaparser by javaparser.

the class TypeExtractor method visit.

@Override
public ResolvedType visit(NameExpr node, Boolean solveLambdas) {
    logger.finest("getType on name expr " + node);
    Optional<Value> value = new SymbolSolver(typeSolver).solveSymbolAsValue(node.getName().getId(), node);
    if (!value.isPresent()) {
        throw new com.github.javaparser.resolution.UnsolvedSymbolException("Solving " + node, node.getName().getId());
    } else {
        return value.get().getType();
    }
}
Also used : UnsolvedSymbolException(com.github.javaparser.resolution.UnsolvedSymbolException) SymbolSolver(com.github.javaparser.symbolsolver.resolution.SymbolSolver) Value(com.github.javaparser.symbolsolver.model.resolution.Value)

Example 3 with SymbolSolver

use of com.github.javaparser.symbolsolver.resolution.SymbolSolver in project javaparser by javaparser.

the class CompilationUnitContext method solveSymbol.

// /
// / Public methods
// /
@Override
public SymbolReference<? extends ResolvedValueDeclaration> solveSymbol(String name, TypeSolver typeSolver) {
    // solve absolute references
    String itName = name;
    while (itName.contains(".")) {
        String typeName = getType(itName);
        String memberName = getMember(itName);
        SymbolReference<ResolvedTypeDeclaration> type = this.solveType(typeName, typeSolver);
        if (type.isSolved()) {
            return new SymbolSolver(typeSolver).solveSymbolInType(type.getCorrespondingDeclaration(), memberName);
        } else {
            itName = typeName;
        }
    }
    // Look among statically imported values
    if (wrappedNode.getImports() != null) {
        for (ImportDeclaration importDecl : wrappedNode.getImports()) {
            if (importDecl.isStatic()) {
                if (importDecl.isAsterisk()) {
                    String qName = importDecl.getNameAsString();
                    ResolvedTypeDeclaration importedType = typeSolver.solveType(qName);
                    SymbolReference<? extends ResolvedValueDeclaration> ref = new SymbolSolver(typeSolver).solveSymbolInType(importedType, name);
                    if (ref.isSolved()) {
                        return ref;
                    }
                } else {
                    String whole = importDecl.getNameAsString();
                    // split in field/method name and type name
                    String memberName = getMember(whole);
                    String typeName = getType(whole);
                    if (memberName.equals(name)) {
                        ResolvedTypeDeclaration importedType = typeSolver.solveType(typeName);
                        return new SymbolSolver(typeSolver).solveSymbolInType(importedType, memberName);
                    }
                }
            }
        }
    }
    return SymbolReference.unsolved(ResolvedValueDeclaration.class);
}
Also used : SymbolSolver(com.github.javaparser.symbolsolver.resolution.SymbolSolver) ImportDeclaration(com.github.javaparser.ast.ImportDeclaration) ResolvedTypeDeclaration(com.github.javaparser.resolution.declarations.ResolvedTypeDeclaration)

Example 4 with SymbolSolver

use of com.github.javaparser.symbolsolver.resolution.SymbolSolver in project javaparser by javaparser.

the class JavaParserEnumDeclaration method getAncestors.

@Override
public List<ResolvedReferenceType> getAncestors() {
    List<ResolvedReferenceType> ancestors = new ArrayList<>();
    ResolvedReferenceType enumClass = ReflectionFactory.typeUsageFor(Enum.class, typeSolver).asReferenceType();
    ResolvedTypeParameterDeclaration eTypeParameter = enumClass.getTypeDeclaration().getTypeParameters().get(0);
    enumClass = enumClass.deriveTypeParameters(new ResolvedTypeParametersMap.Builder().setValue(eTypeParameter, new ReferenceTypeImpl(this, typeSolver)).build());
    ancestors.add(enumClass);
    if (wrappedNode.getImplementedTypes() != null) {
        for (ClassOrInterfaceType implementedType : wrappedNode.getImplementedTypes()) {
            SymbolReference<ResolvedTypeDeclaration> implementedDeclRef = new SymbolSolver(typeSolver).solveTypeInType(this, implementedType.getName().getId());
            if (!implementedDeclRef.isSolved()) {
                throw new UnsolvedSymbolException(implementedType.getName().getId());
            }
            ancestors.add(new ReferenceTypeImpl((ResolvedReferenceTypeDeclaration) implementedDeclRef.getCorrespondingDeclaration(), typeSolver));
        }
    }
    return ancestors;
}
Also used : UnsolvedSymbolException(com.github.javaparser.resolution.UnsolvedSymbolException) ResolvedReferenceType(com.github.javaparser.resolution.types.ResolvedReferenceType) ReferenceTypeImpl(com.github.javaparser.symbolsolver.model.typesystem.ReferenceTypeImpl) ClassOrInterfaceType(com.github.javaparser.ast.type.ClassOrInterfaceType) SymbolSolver(com.github.javaparser.symbolsolver.resolution.SymbolSolver)

Example 5 with SymbolSolver

use of com.github.javaparser.symbolsolver.resolution.SymbolSolver in project javaparser by javaparser.

the class JavassistUtils method parseTypeParameters.

private static List<ResolvedType> parseTypeParameters(String signature, TypeSolver typeSolver, Context invokationContext) {
    String originalSignature = signature;
    if (signature.contains("<")) {
        signature = signature.substring(signature.indexOf('<') + 1);
        if (!signature.endsWith(">")) {
            throw new IllegalArgumentException();
        }
        signature = signature.substring(0, signature.length() - 1);
        if (signature.contains(",")) {
            throw new UnsupportedOperationException();
        }
        if (signature.startsWith("?")) {
            // TODO: check bounds
            List<ResolvedType> types = new ArrayList<>();
            types.add(ResolvedWildcard.UNBOUNDED);
            return types;
        }
        List<ResolvedType> typeParameters = parseTypeParameters(signature, typeSolver, invokationContext);
        if (signature.contains("<")) {
            signature = signature.substring(0, signature.indexOf('<'));
        }
        if (signature.contains(">")) {
            throw new UnsupportedOperationException();
        }
        ResolvedType type = new SymbolSolver(typeSolver).solveTypeUsage(signature, invokationContext);
        if (type.isReferenceType() && typeParameters.size() > 0) {
            type = type.asReferenceType().transformTypeParameters(tp -> typeParameters.remove(0));
        }
        List<ResolvedType> types = new ArrayList<>();
        types.add(type);
        return types;
    } else {
        return Collections.emptyList();
    }
}
Also used : CtMethod(javassist.CtMethod) java.util(java.util) BadBytecode(javassist.bytecode.BadBytecode) UnsolvedSymbolException(com.github.javaparser.resolution.UnsolvedSymbolException) TypeSolver(com.github.javaparser.symbolsolver.model.resolution.TypeSolver) MethodUsage(com.github.javaparser.resolution.MethodUsage) com.github.javaparser.symbolsolver.model.typesystem(com.github.javaparser.symbolsolver.model.typesystem) SignatureAttribute(javassist.bytecode.SignatureAttribute) CtClass(javassist.CtClass) Collectors(java.util.stream.Collectors) ResolvedTypeParameterDeclaration(com.github.javaparser.resolution.declarations.ResolvedTypeParameterDeclaration) ResolvedReferenceTypeDeclaration(com.github.javaparser.resolution.declarations.ResolvedReferenceTypeDeclaration) Context(com.github.javaparser.symbolsolver.core.resolution.Context) com.github.javaparser.resolution.types(com.github.javaparser.resolution.types) ResolvedTypeParametrizable(com.github.javaparser.resolution.declarations.ResolvedTypeParametrizable) NotFoundException(javassist.NotFoundException) SymbolSolver(com.github.javaparser.symbolsolver.resolution.SymbolSolver) SymbolSolver(com.github.javaparser.symbolsolver.resolution.SymbolSolver)

Aggregations

SymbolSolver (com.github.javaparser.symbolsolver.resolution.SymbolSolver)5 UnsolvedSymbolException (com.github.javaparser.resolution.UnsolvedSymbolException)3 ResolvedReferenceTypeDeclaration (com.github.javaparser.resolution.declarations.ResolvedReferenceTypeDeclaration)2 ResolvedTypeDeclaration (com.github.javaparser.resolution.declarations.ResolvedTypeDeclaration)2 ImportDeclaration (com.github.javaparser.ast.ImportDeclaration)1 ClassOrInterfaceDeclaration (com.github.javaparser.ast.body.ClassOrInterfaceDeclaration)1 EnumDeclaration (com.github.javaparser.ast.body.EnumDeclaration)1 NodeWithTypeParameters (com.github.javaparser.ast.nodeTypes.NodeWithTypeParameters)1 ClassOrInterfaceType (com.github.javaparser.ast.type.ClassOrInterfaceType)1 TypeParameter (com.github.javaparser.ast.type.TypeParameter)1 MethodUsage (com.github.javaparser.resolution.MethodUsage)1 ResolvedTypeParameterDeclaration (com.github.javaparser.resolution.declarations.ResolvedTypeParameterDeclaration)1 ResolvedTypeParametrizable (com.github.javaparser.resolution.declarations.ResolvedTypeParametrizable)1 com.github.javaparser.resolution.types (com.github.javaparser.resolution.types)1 ResolvedReferenceType (com.github.javaparser.resolution.types.ResolvedReferenceType)1 Context (com.github.javaparser.symbolsolver.core.resolution.Context)1 TypeSolver (com.github.javaparser.symbolsolver.model.resolution.TypeSolver)1 Value (com.github.javaparser.symbolsolver.model.resolution.Value)1 com.github.javaparser.symbolsolver.model.typesystem (com.github.javaparser.symbolsolver.model.typesystem)1 ReferenceTypeImpl (com.github.javaparser.symbolsolver.model.typesystem.ReferenceTypeImpl)1