Example usage for org.eclipse.jdt.internal.compiler.classfmt ClassFileConstants AccAbstract

List of usage examples for org.eclipse.jdt.internal.compiler.classfmt ClassFileConstants AccAbstract

Introduction

In this page you can find the example usage for org.eclipse.jdt.internal.compiler.classfmt ClassFileConstants AccAbstract.

Prototype

int AccAbstract

To view the source code for org.eclipse.jdt.internal.compiler.classfmt ClassFileConstants AccAbstract.

Click Source Link

Usage

From source file:ch.uzh.ifi.seal.changedistiller.ast.java.JavaASTHelper.java

License:Apache License

private boolean isAbstract(int ecjModifier) {
    return (ecjModifier & ClassFileConstants.AccAbstract) != 0;
}

From source file:com.android.tools.lint.psi.EcjPsiBuilder.java

License:Apache License

private EcjPsiModifierList toModifierList(@NonNull EcjPsiSourceElement parent, int modifiers,
        Annotation[] annotations) {
    int flags = 0;
    if ((modifiers & ClassFileConstants.AccStatic) != 0) {
        flags |= Modifier.STATIC;
    }// www  . j a  v  a  2  s .c  o  m
    if ((modifiers & ClassFileConstants.AccFinal) != 0) {
        flags |= Modifier.FINAL;
    }
    if ((modifiers & ClassFileConstants.AccAbstract) != 0) {
        flags |= Modifier.ABSTRACT;
    }
    if ((modifiers & ClassFileConstants.AccPrivate) != 0) {
        flags |= Modifier.PRIVATE;
    }
    if ((modifiers & ClassFileConstants.AccProtected) != 0) {
        flags |= Modifier.PROTECTED;
    }
    if ((modifiers & ClassFileConstants.AccPublic) != 0) {
        flags |= Modifier.PUBLIC;
    }
    if ((modifiers & ClassFileConstants.AccSynchronized) != 0) {
        flags |= Modifier.SYNCHRONIZED;
    }
    if ((modifiers & ClassFileConstants.AccVolatile) != 0) {
        flags |= Modifier.VOLATILE;
    }
    if ((modifiers & ExtraCompilerModifiers.AccDefaultMethod) != 0) {
        flags |= EcjPsiModifierList.DEFAULT_MASK;
    }

    EcjPsiModifierList modifierList = new EcjPsiModifierList(mManager, flags);
    parent.adoptChild(modifierList);
    EcjPsiAnnotation[] psiAnnotations = toAnnotations(modifierList, annotations);
    modifierList.setAnnotations(psiAnnotations);
    return modifierList;
}

From source file:com.codenvy.ide.ext.java.server.internal.compiler.parser.SourceTypeConverter.java

License:Open Source License

private TypeDeclaration convert(SourceType typeHandle, CompilationResult compilationResult)
        throws JavaModelException {
    SourceTypeElementInfo typeInfo = (SourceTypeElementInfo) typeHandle.getElementInfo();
    if (typeInfo.isAnonymousMember())
        throw new AnonymousMemberFound();
    /* create type declaration - can be member type */
    TypeDeclaration type = new TypeDeclaration(compilationResult);
    if (typeInfo.getEnclosingType() == null) {
        if (typeHandle.isAnonymous()) {
            type.name = CharOperation.NO_CHAR;
            type.bits |= (ASTNode.IsAnonymousType | ASTNode.IsLocalType);
        } else {/*from   w  w w .j  a  v a 2 s.  com*/
            if (typeHandle.isLocal()) {
                type.bits |= ASTNode.IsLocalType;
            }
        }
    } else {
        type.bits |= ASTNode.IsMemberType;
    }
    if ((type.bits & ASTNode.IsAnonymousType) == 0) {
        type.name = typeInfo.getName();
    }
    type.name = typeInfo.getName();
    int start, end; // only positions available
    type.sourceStart = start = typeInfo.getNameSourceStart();
    type.sourceEnd = end = typeInfo.getNameSourceEnd();
    type.modifiers = typeInfo.getModifiers();
    type.declarationSourceStart = typeInfo.getDeclarationSourceStart();
    type.declarationSourceEnd = typeInfo.getDeclarationSourceEnd();
    type.bodyEnd = type.declarationSourceEnd;

    // convert 1.5 specific constructs only if compliance is 1.5 or above
    if (this.has1_5Compliance) {
        /* convert annotations */
        type.annotations = convertAnnotations(typeHandle);
    }
    /* https://bugs.eclipse.org/bugs/show_bug.cgi?id=324850, even in a 1.4 project, we
       must internalize type variables and observe any parameterization of super class
       and/or super interfaces in order to be able to detect overriding in the presence
       of generics.
     */
    char[][] typeParameterNames = typeInfo.getTypeParameterNames();
    if (typeParameterNames.length > 0) {
        int parameterCount = typeParameterNames.length;
        char[][][] typeParameterBounds = typeInfo.getTypeParameterBounds();
        type.typeParameters = new TypeParameter[parameterCount];
        for (int i = 0; i < parameterCount; i++) {
            type.typeParameters[i] = createTypeParameter(typeParameterNames[i], typeParameterBounds[i], start,
                    end);
        }
    }

    /* set superclass and superinterfaces */
    if (typeInfo.getSuperclassName() != null) {
        type.superclass = createTypeReference(typeInfo.getSuperclassName(), start, end,
                true /* include generics */);
        type.superclass.bits |= ASTNode.IsSuperType;
    }
    char[][] interfaceNames = typeInfo.getInterfaceNames();
    int interfaceCount = interfaceNames == null ? 0 : interfaceNames.length;
    if (interfaceCount > 0) {
        type.superInterfaces = new TypeReference[interfaceCount];
        for (int i = 0; i < interfaceCount; i++) {
            type.superInterfaces[i] = createTypeReference(interfaceNames[i], start, end,
                    true /* include generics */);
            type.superInterfaces[i].bits |= ASTNode.IsSuperType;
        }
    }
    /* convert member types */
    if ((this.flags & MEMBER_TYPE) != 0) {
        SourceType[] sourceMemberTypes = typeInfo.getMemberTypeHandles();
        int sourceMemberTypeCount = sourceMemberTypes.length;
        type.memberTypes = new TypeDeclaration[sourceMemberTypeCount];
        for (int i = 0; i < sourceMemberTypeCount; i++) {
            type.memberTypes[i] = convert(sourceMemberTypes[i], compilationResult);
            type.memberTypes[i].enclosingType = type;
        }
    }

    /* convert intializers and fields*/
    InitializerElementInfo[] initializers = null;
    int initializerCount = 0;
    if ((this.flags & LOCAL_TYPE) != 0) {
        initializers = typeInfo.getInitializers();
        initializerCount = initializers.length;
    }
    SourceField[] sourceFields = null;
    int sourceFieldCount = 0;
    if ((this.flags & FIELD) != 0) {
        sourceFields = typeInfo.getFieldHandles();
        sourceFieldCount = sourceFields.length;
    }
    int length = initializerCount + sourceFieldCount;
    if (length > 0) {
        type.fields = new FieldDeclaration[length];
        for (int i = 0; i < initializerCount; i++) {
            type.fields[i] = convert(initializers[i], compilationResult);
        }
        int index = 0;
        for (int i = initializerCount; i < length; i++) {
            type.fields[i] = convert(sourceFields[index++], type, compilationResult);
        }
    }

    /* convert methods - need to add default constructor if necessary */
    boolean needConstructor = (this.flags & CONSTRUCTOR) != 0;
    boolean needMethod = (this.flags & METHOD) != 0;
    if (needConstructor || needMethod) {

        SourceMethod[] sourceMethods = typeInfo.getMethodHandles();
        int sourceMethodCount = sourceMethods.length;

        /* source type has a constructor ?           */
        /* by default, we assume that one is needed. */
        int extraConstructor = 0;
        int methodCount = 0;
        int kind = TypeDeclaration.kind(type.modifiers);
        boolean isAbstract = kind == TypeDeclaration.INTERFACE_DECL
                || kind == TypeDeclaration.ANNOTATION_TYPE_DECL;
        if (!isAbstract) {
            extraConstructor = needConstructor ? 1 : 0;
            for (int i = 0; i < sourceMethodCount; i++) {
                if (sourceMethods[i].isConstructor()) {
                    if (needConstructor) {
                        extraConstructor = 0; // Does not need the extra constructor since one constructor already exists.
                        methodCount++;
                    }
                } else if (needMethod) {
                    methodCount++;
                }
            }
        } else {
            methodCount = needMethod ? sourceMethodCount : 0;
        }
        type.methods = new AbstractMethodDeclaration[methodCount + extraConstructor];
        if (extraConstructor != 0) { // add default constructor in first position
            type.methods[0] = type.createDefaultConstructor(false, false);
        }
        int index = 0;
        boolean hasAbstractMethods = false;
        for (int i = 0; i < sourceMethodCount; i++) {
            SourceMethod sourceMethod = sourceMethods[i];
            SourceMethodElementInfo methodInfo = (SourceMethodElementInfo) sourceMethod.getElementInfo();
            boolean isConstructor = methodInfo.isConstructor();
            if ((methodInfo.getModifiers() & ClassFileConstants.AccAbstract) != 0) {
                hasAbstractMethods = true;
            }
            if ((isConstructor && needConstructor) || (!isConstructor && needMethod)) {
                AbstractMethodDeclaration method = convert(sourceMethod, methodInfo, compilationResult);
                if (isAbstract || method.isAbstract()) { // fix-up flag
                    method.modifiers |= ExtraCompilerModifiers.AccSemicolonBody;
                }
                type.methods[extraConstructor + index++] = method;
            }
        }
        if (hasAbstractMethods)
            type.bits |= ASTNode.HasAbstractMethods;
    }

    return type;
}

From source file:com.codenvy.ide.ext.java.server.internal.core.BinaryMethod.java

License:Open Source License

public int getFlags() throws JavaModelException {
    IBinaryMethod info = (IBinaryMethod) getElementInfo();
    int modifiers = info.getModifiers();
    if (((IType) this.parent).isInterface()
            && (modifiers & (ClassFileConstants.AccAbstract | ClassFileConstants.AccStatic)) == 0)
        modifiers |= ExtraCompilerModifiers.AccDefaultMethod;
    return modifiers;
}

From source file:com.google.gwt.dev.javac.GwtIncompatiblePreprocessor.java

License:Apache License

/**
 * Removes all members of a class to leave it as an empty stub.
 *//*from  www.j  av  a2  s.com*/
private static void stripAllMembers(TypeDeclaration tyDecl) {
    tyDecl.superclass = null;
    tyDecl.superInterfaces = new TypeReference[0];
    tyDecl.annotations = new Annotation[0];
    tyDecl.methods = new AbstractMethodDeclaration[0];
    tyDecl.memberTypes = new TypeDeclaration[0];
    tyDecl.fields = new FieldDeclaration[0];
    if (TypeDeclaration.kind(tyDecl.modifiers) != TypeDeclaration.INTERFACE_DECL
            && TypeDeclaration.kind(tyDecl.modifiers) != TypeDeclaration.ENUM_DECL) {
        // Create a default constructor so that the class is proper.
        ConstructorDeclaration constructor = tyDecl.createDefaultConstructor(true, true);
        // Mark only constructor as private so that it can not be instantiated.
        constructor.modifiers = ClassFileConstants.AccPrivate;
        // Clear a bit that is used for marking the constructor as default as it makes JDT
        // assume that the constructor is public.
        constructor.bits &= ~ASTNode.IsDefaultConstructor;
        // Mark the class as final so that it can not be extended.
        tyDecl.modifiers |= ClassFileConstants.AccFinal;
        tyDecl.modifiers &= ~ClassFileConstants.AccAbstract;
    }
}

From source file:lombok.eclipse.handlers.HandleSuperBuilder.java

License:Open Source License

@Override
public void handle(AnnotationValues<SuperBuilder> annotation, Annotation ast, EclipseNode annotationNode) {
    handleExperimentalFlagUsage(annotationNode, ConfigurationKeys.SUPERBUILDER_FLAG_USAGE, "@SuperBuilder");

    long p = (long) ast.sourceStart << 32 | ast.sourceEnd;

    SuperBuilder superbuilderAnnotation = annotation.getInstance();

    String builderMethodName = superbuilderAnnotation.builderMethodName();
    String buildMethodName = superbuilderAnnotation.buildMethodName();

    if (builderMethodName == null)
        builderMethodName = "builder";
    if (buildMethodName == null)
        buildMethodName = "build";

    boolean generateBuilderMethod;
    if (builderMethodName.isEmpty()) {
        generateBuilderMethod = false;/*from   w  ww . j  a v  a  2 s  .  c  o m*/
    } else if (!checkName("builderMethodName", builderMethodName, annotationNode)) {
        return;
    } else {
        generateBuilderMethod = true;
    }
    if (!checkName("buildMethodName", buildMethodName, annotationNode))
        return;

    boolean toBuilder = superbuilderAnnotation.toBuilder();

    EclipseNode tdParent = annotationNode.up();

    java.util.List<BuilderFieldData> builderFields = new ArrayList<BuilderFieldData>();
    TypeReference returnType;
    TypeParameter[] typeParams;

    boolean addCleaning = false;

    if (!(tdParent.get() instanceof TypeDeclaration)) {
        annotationNode.addError("@SuperBuilder is only supported on types.");
        return;
    }
    TypeDeclaration td = (TypeDeclaration) tdParent.get();

    // Gather all fields of the class that should be set by the builder.
    List<EclipseNode> allFields = new ArrayList<EclipseNode>();
    List<EclipseNode> nonFinalNonDefaultedFields = null;

    boolean valuePresent = (hasAnnotation(lombok.Value.class, tdParent)
            || hasAnnotation("lombok.experimental.Value", tdParent));
    for (EclipseNode fieldNode : HandleConstructor.findAllFields(tdParent, true)) {
        FieldDeclaration fd = (FieldDeclaration) fieldNode.get();
        EclipseNode isDefault = findAnnotation(Builder.Default.class, fieldNode);
        boolean isFinal = ((fd.modifiers & ClassFileConstants.AccFinal) != 0)
                || (valuePresent && !hasAnnotation(NonFinal.class, fieldNode));

        Annotation[] copyableAnnotations = findCopyableAnnotations(fieldNode);

        BuilderFieldData bfd = new BuilderFieldData();
        bfd.rawName = fieldNode.getName().toCharArray();
        bfd.name = removePrefixFromField(fieldNode);
        bfd.annotations = copyAnnotations(fd, copyableAnnotations);
        bfd.type = fd.type;
        bfd.singularData = getSingularData(fieldNode, ast);
        bfd.originalFieldNode = fieldNode;

        if (bfd.singularData != null && isDefault != null) {
            isDefault.addError("@Builder.Default and @Singular cannot be mixed.");
            isDefault = null;
        }

        if (fd.initialization == null && isDefault != null) {
            isDefault.addWarning("@Builder.Default requires an initializing expression (' = something;').");
            isDefault = null;
        }

        if (fd.initialization != null && isDefault == null) {
            if (isFinal)
                continue;
            if (nonFinalNonDefaultedFields == null)
                nonFinalNonDefaultedFields = new ArrayList<EclipseNode>();
            nonFinalNonDefaultedFields.add(fieldNode);
        }

        if (isDefault != null) {
            bfd.nameOfDefaultProvider = prefixWith(DEFAULT_PREFIX, bfd.name);
            bfd.nameOfSetFlag = prefixWith(bfd.name, SET_PREFIX);

            MethodDeclaration md = HandleBuilder.generateDefaultProvider(bfd.nameOfDefaultProvider,
                    td.typeParameters, fieldNode, ast);
            if (md != null)
                injectMethod(tdParent, md);
        }
        addObtainVia(bfd, fieldNode);
        builderFields.add(bfd);
        allFields.add(fieldNode);
    }

    // Set the names of the builder classes.
    String builderClassName = String.valueOf(td.name) + "Builder";
    String builderImplClassName = builderClassName + "Impl";

    typeParams = td.typeParameters != null ? td.typeParameters : new TypeParameter[0];
    returnType = namePlusTypeParamsToTypeReference(td.name, typeParams, p);

    // <C, B> are the generics for our builder.
    String classGenericName = "C";
    String builderGenericName = "B";
    // If these generics' names collide with any generics on the annotated class, modify them.
    // For instance, if there are generics <B, B2, C> on the annotated class, use "C2" and "B3" for our builder.
    java.util.List<String> typeParamStrings = new ArrayList<String>();
    for (TypeParameter typeParam : typeParams)
        typeParamStrings.add(typeParam.toString());
    classGenericName = generateNonclashingNameFor(classGenericName, typeParamStrings);
    builderGenericName = generateNonclashingNameFor(builderGenericName, typeParamStrings);

    TypeReference extendsClause = td.superclass;
    TypeReference superclassBuilderClass = null;
    TypeReference[] typeArguments = new TypeReference[] {
            new SingleTypeReference(classGenericName.toCharArray(), 0),
            new SingleTypeReference(builderGenericName.toCharArray(), 0) };
    if (extendsClause instanceof QualifiedTypeReference) {
        QualifiedTypeReference qualifiedTypeReference = (QualifiedTypeReference) extendsClause;
        String superclassClassName = String.valueOf(qualifiedTypeReference.getLastToken());
        String superclassBuilderClassName = superclassClassName + "Builder";

        char[][] tokens = Arrays.copyOf(qualifiedTypeReference.tokens,
                qualifiedTypeReference.tokens.length + 1);
        tokens[tokens.length] = superclassBuilderClassName.toCharArray();
        long[] poss = new long[tokens.length];
        Arrays.fill(poss, p);

        TypeReference[] superclassTypeArgs = getTypeParametersFrom(extendsClause);

        // Every token may potentially have type args. Here, we only have
        // type args for the last token, the superclass' builder.
        TypeReference[][] typeArgsForTokens = new TypeReference[tokens.length][];
        typeArgsForTokens[typeArgsForTokens.length - 1] = mergeTypeReferences(superclassTypeArgs,
                typeArguments);

        superclassBuilderClass = new ParameterizedQualifiedTypeReference(tokens, typeArgsForTokens, 0, poss);
    } else if (extendsClause != null) {
        String superClass = String.valueOf(extendsClause.getTypeName()[0]);
        String superclassBuilderClassName = superClass + "Builder";

        char[][] tokens = new char[][] { superClass.toCharArray(), superclassBuilderClassName.toCharArray() };
        long[] poss = new long[tokens.length];
        Arrays.fill(poss, p);

        TypeReference[] superclassTypeArgs = getTypeParametersFrom(extendsClause);

        // Every token may potentially have type args. Here, we only have
        // type args for the last token, the superclass' builder.
        TypeReference[][] typeArgsForTokens = new TypeReference[tokens.length][];
        typeArgsForTokens[typeArgsForTokens.length - 1] = mergeTypeReferences(superclassTypeArgs,
                typeArguments);

        superclassBuilderClass = new ParameterizedQualifiedTypeReference(tokens, typeArgsForTokens, 0, poss);
    }
    // If there is no superclass, superclassBuilderClassExpression is still == null at this point.
    // You can use it to check whether to inherit or not.

    generateBuilderBasedConstructor(tdParent, typeParams, builderFields, annotationNode, builderClassName,
            superclassBuilderClass != null);

    // Create the abstract builder class, or reuse an existing one.
    EclipseNode builderType = findInnerClass(tdParent, builderClassName);
    if (builderType == null) {
        builderType = generateBuilderAbstractClass(tdParent, builderClassName, superclassBuilderClass,
                typeParams, ast, classGenericName, builderGenericName);
    } else {
        TypeDeclaration builderTypeDeclaration = (TypeDeclaration) builderType.get();
        if ((builderTypeDeclaration.modifiers
                & (ClassFileConstants.AccStatic | ClassFileConstants.AccAbstract)) == 0) {
            annotationNode.addError("Existing Builder must be an abstract static inner class.");
            return;
        }
        sanityCheckForMethodGeneratingAnnotationsOnBuilderClass(builderType, annotationNode);
        // Generate errors for @Singular BFDs that have one already defined node.
        for (BuilderFieldData bfd : builderFields) {
            SingularData sd = bfd.singularData;
            if (sd == null)
                continue;
            EclipseSingularizer singularizer = sd.getSingularizer();
            if (singularizer == null)
                continue;
            if (singularizer.checkForAlreadyExistingNodesAndGenerateError(builderType, sd)) {
                bfd.singularData = null;
            }
        }
    }

    // Check validity of @ObtainVia fields, and add check if adding cleaning for @Singular is necessary.
    for (BuilderFieldData bfd : builderFields) {
        if (bfd.singularData != null && bfd.singularData.getSingularizer() != null) {
            if (bfd.singularData.getSingularizer().requiresCleaning()) {
                addCleaning = true;
                break;
            }
        }
        if (bfd.obtainVia != null) {
            if (bfd.obtainVia.field().isEmpty() == bfd.obtainVia.method().isEmpty()) {
                bfd.obtainViaNode.addError(
                        "The syntax is either @ObtainVia(field = \"fieldName\") or @ObtainVia(method = \"methodName\").");
                return;
            }
            if (bfd.obtainVia.method().isEmpty() && bfd.obtainVia.isStatic()) {
                bfd.obtainViaNode
                        .addError("@ObtainVia(isStatic = true) is not valid unless 'method' has been set.");
                return;
            }
        }
    }

    // Generate the fields in the abstract builder class that hold the values for the instance.
    generateBuilderFields(builderType, builderFields, ast);
    if (addCleaning) {
        FieldDeclaration cleanDecl = new FieldDeclaration(CLEAN_FIELD_NAME, 0, -1);
        cleanDecl.declarationSourceEnd = -1;
        cleanDecl.modifiers = ClassFileConstants.AccPrivate;
        cleanDecl.type = TypeReference.baseTypeReference(TypeIds.T_boolean, 0);
        injectFieldAndMarkGenerated(builderType, cleanDecl);
    }

    if (toBuilder) {
        // Generate $fillValuesFrom() method in the abstract builder.
        injectMethod(builderType, generateFillValuesMethod(tdParent, superclassBuilderClass != null,
                builderGenericName, classGenericName, builderClassName, typeParams));
        // Generate $fillValuesFromInstanceIntoBuilder() method in the builder implementation class.
        injectMethod(builderType,
                generateStaticFillValuesMethod(tdParent, builderClassName, typeParams, builderFields, ast));
    }

    // Generate abstract self() and build() methods in the abstract builder.
    injectMethod(builderType,
            generateAbstractSelfMethod(tdParent, superclassBuilderClass != null, builderGenericName));
    injectMethod(builderType, generateAbstractBuildMethod(tdParent, buildMethodName,
            superclassBuilderClass != null, classGenericName, ast));

    // Create the setter methods in the abstract builder.
    for (BuilderFieldData bfd : builderFields) {
        generateSetterMethodsForBuilder(builderType, bfd, annotationNode, builderGenericName);
    }

    // Create the toString() method for the abstract builder.
    if (methodExists("toString", builderType, 0) == MemberExistsResult.NOT_EXISTS) {
        List<Included<EclipseNode, ToString.Include>> fieldNodes = new ArrayList<Included<EclipseNode, ToString.Include>>();
        for (BuilderFieldData bfd : builderFields) {
            for (EclipseNode f : bfd.createdFields) {
                fieldNodes.add(new Included<EclipseNode, ToString.Include>(f, null, true));
            }
        }
        // Let toString() call super.toString() if there is a superclass, so that it also shows fields from the superclass' builder.
        MethodDeclaration md = HandleToString.createToString(builderType, fieldNodes, true,
                superclassBuilderClass != null, ast, FieldAccess.ALWAYS_FIELD);
        if (md != null) {
            injectMethod(builderType, md);
        }
    }

    if (addCleaning)
        injectMethod(builderType, generateCleanMethod(builderFields, builderType, ast));

    boolean isAbstract = (td.modifiers & ClassFileConstants.AccAbstract) != 0;
    if (isAbstract) {
        // Only non-abstract classes get the Builder implementation.
        return;
    }

    // Create the builder implementation class, or reuse an existing one.
    EclipseNode builderImplType = findInnerClass(tdParent, builderImplClassName);
    if (builderImplType == null) {
        builderImplType = generateBuilderImplClass(tdParent, builderImplClassName, builderClassName, typeParams,
                ast);
    } else {
        TypeDeclaration builderImplTypeDeclaration = (TypeDeclaration) builderImplType.get();
        if ((builderImplTypeDeclaration.modifiers & ClassFileConstants.AccAbstract) != 0
                || (builderImplTypeDeclaration.modifiers & ClassFileConstants.AccStatic) == 0) {
            annotationNode.addError("Existing BuilderImpl must be a non-abstract static inner class.");
            return;
        }
        sanityCheckForMethodGeneratingAnnotationsOnBuilderClass(builderImplType, annotationNode);
    }

    if (toBuilder) {
        // Add the toBuilder() method to the annotated class.
        switch (methodExists(TO_BUILDER_METHOD_NAME_STRING, tdParent, 0)) {
        case EXISTS_BY_USER:
            annotationNode.addWarning("Not generating toBuilder() as it already exists.");
            break;
        case NOT_EXISTS:
            injectMethod(tdParent,
                    generateToBuilderMethod(builderClassName, builderImplClassName, tdParent, typeParams, ast));
        default:
            // Should not happen.
        }
    }

    // Create the self() and build() methods in the BuilderImpl.
    injectMethod(builderImplType, generateSelfMethod(builderImplType, typeParams, p));
    if (methodExists(buildMethodName, builderImplType, -1) == MemberExistsResult.NOT_EXISTS) {
        injectMethod(builderImplType, generateBuildMethod(tdParent, buildMethodName, returnType, ast));
    }

    // Add the builder() method to the annotated class.
    if (generateBuilderMethod && methodExists(builderMethodName, tdParent, -1) != MemberExistsResult.NOT_EXISTS)
        generateBuilderMethod = false;
    if (generateBuilderMethod) {
        MethodDeclaration md = generateBuilderMethod(builderMethodName, builderClassName, builderImplClassName,
                tdParent, typeParams, ast);
        if (md != null)
            injectMethod(tdParent, md);
    }

    if (nonFinalNonDefaultedFields != null && generateBuilderMethod) {
        for (EclipseNode fieldNode : nonFinalNonDefaultedFields) {
            fieldNode.addWarning(
                    "@SuperBuilder will ignore the initializing expression entirely. If you want the initializing expression to serve as default, add @Builder.Default. If it is not supposed to be settable during building, make the field final.");
        }
    }
}

From source file:lombok.eclipse.handlers.HandleSuperBuilder.java

License:Open Source License

private EclipseNode generateBuilderAbstractClass(EclipseNode tdParent, String builderClass,
        TypeReference superclassBuilderClass, TypeParameter[] typeParams, ASTNode source,
        String classGenericName, String builderGenericName) {

    TypeDeclaration parent = (TypeDeclaration) tdParent.get();
    TypeDeclaration builder = new TypeDeclaration(parent.compilationResult);
    builder.bits |= Eclipse.ECLIPSE_DO_NOT_TOUCH_FLAG;
    builder.modifiers |= ClassFileConstants.AccPublic | ClassFileConstants.AccStatic
            | ClassFileConstants.AccAbstract;
    builder.name = builderClass.toCharArray();

    // Keep any type params of the annotated class.
    builder.typeParameters = Arrays.copyOf(copyTypeParams(typeParams, source), typeParams.length + 2);
    // Add builder-specific type params required for inheritable builders.
    // 1. The return type for the build() method, named "C", which extends the annotated class.
    TypeParameter o = new TypeParameter();
    o.name = classGenericName.toCharArray();
    o.type = cloneSelfType(tdParent, source);
    builder.typeParameters[builder.typeParameters.length - 2] = o;
    // 2. The return type for all setter methods, named "B", which extends this builder class.
    o = new TypeParameter();
    o.name = builderGenericName.toCharArray();
    TypeReference[] typerefs = appendBuilderTypeReferences(typeParams, classGenericName, builderGenericName);
    o.type = new ParameterizedSingleTypeReference(builderClass.toCharArray(), typerefs, 0, 0);
    builder.typeParameters[builder.typeParameters.length - 1] = o;

    builder.superclass = copyType(superclassBuilderClass, source);

    builder.createDefaultConstructor(false, true);

    builder.traverse(new SetGeneratedByVisitor(source), (ClassScope) null);
    return injectType(tdParent, builder);
}

From source file:lombok.eclipse.handlers.HandleSuperBuilder.java

License:Open Source License

private MethodDeclaration generateAbstractSelfMethod(EclipseNode tdParent, boolean override,
        String builderGenericName) {
    MethodDeclaration out = new MethodDeclaration(
            ((CompilationUnitDeclaration) tdParent.top().get()).compilationResult);
    out.selector = SELF_METHOD_NAME;/*from   w w  w  .  j a v a2  s  . co  m*/
    out.bits |= ECLIPSE_DO_NOT_TOUCH_FLAG;
    out.modifiers = ClassFileConstants.AccAbstract | ClassFileConstants.AccProtected
            | ExtraCompilerModifiers.AccSemicolonBody;
    if (override)
        out.annotations = new Annotation[] {
                makeMarkerAnnotation(TypeConstants.JAVA_LANG_OVERRIDE, tdParent.get()) };
    out.returnType = new SingleTypeReference(builderGenericName.toCharArray(), 0);
    return out;
}

From source file:lombok.eclipse.handlers.HandleSuperBuilder.java

License:Open Source License

private MethodDeclaration generateAbstractBuildMethod(EclipseNode tdParent, String methodName, boolean override,
        String classGenericName, ASTNode source) {

    MethodDeclaration out = new MethodDeclaration(
            ((CompilationUnitDeclaration) tdParent.top().get()).compilationResult);
    out.bits |= ECLIPSE_DO_NOT_TOUCH_FLAG;

    out.modifiers = ClassFileConstants.AccPublic | ClassFileConstants.AccAbstract
            | ExtraCompilerModifiers.AccSemicolonBody;
    out.selector = methodName.toCharArray();
    out.bits |= ECLIPSE_DO_NOT_TOUCH_FLAG;
    out.returnType = new SingleTypeReference(classGenericName.toCharArray(), 0);
    if (override)
        out.annotations = new Annotation[] { makeMarkerAnnotation(TypeConstants.JAVA_LANG_OVERRIDE, source) };
    out.traverse(new SetGeneratedByVisitor(source), (ClassScope) null);
    return out;//from  w  w  w. j  a  v  a 2 s.c  om
}

From source file:org.codehaus.jdt.groovy.internal.compiler.ast.GroovyClassScope.java

License:Open Source License

private void createMethod(String name, boolean isStatic, String signature, TypeBinding[] parameterTypes,
        TypeBinding returnType, List<MethodBinding> groovyMethods, MethodBinding[] existingMethods,
        GroovyTypeDeclaration typeDeclaration) {
    boolean found = false;
    for (MethodBinding existingMethod : existingMethods) {
        if (new String(existingMethod.selector).equals(name)) {
            // FIXASC safe to do this resolution so early?
            ((SourceTypeBinding) existingMethod.declaringClass).resolveTypesFor(existingMethod);
            boolean equalParameters = true;
            if (parameterTypes == null) {
                // not looking for parameters, if this has none, that is OK
                if (existingMethod.parameters.length != 0) {
                    equalParameters = false;
                }/* w w  w  .  j av  a 2 s  . co m*/
            } else if (existingMethod.parameters.length == parameterTypes.length) {
                TypeBinding[] existingParams = existingMethod.parameters;
                for (int p = 0, max = parameterTypes.length; p < max; p++) {
                    if (!CharOperation.equals(parameterTypes[p].signature(), existingParams[p].signature())) {
                        equalParameters = false;
                        break;
                    }
                }
            }
            // FIXASC consider return type?
            if (equalParameters) {
                found = true;
                break;
            }
            // FIXASC what about inherited methods - what if the supertype
            // provides an implementation, does the subtype get a new method?
        }
    }
    if (!found) {
        int modifiers = ClassFileConstants.AccPublic;
        if (isStatic) {
            modifiers |= ClassFileConstants.AccStatic;
        }
        if (this.referenceContext.binding.isInterface()) {
            modifiers |= ClassFileConstants.AccAbstract;
        }
        char[] methodName = name.toCharArray();
        /*
         * if (typeDeclaration != null) { // check we are not attempting to override a final method MethodBinding[]
         * existingBindings = typeDeclaration.binding.getMethods(name.toCharArray()); int stop = 1; }
         */
        MethodBinding mb = new MethodBinding(modifiers, methodName, returnType, parameterTypes, null,
                this.referenceContext.binding);
        // FIXASC parameter names - what value would it have to set them correctly?
        groovyMethods.add(mb);
    }
}