Example usage for org.eclipse.jdt.core Signature C_GENERIC_START

List of usage examples for org.eclipse.jdt.core Signature C_GENERIC_START

Introduction

In this page you can find the example usage for org.eclipse.jdt.core Signature C_GENERIC_START.

Prototype

char C_GENERIC_START

To view the source code for org.eclipse.jdt.core Signature C_GENERIC_START.

Click Source Link

Document

Character constant indicating the start of a formal type parameter (or type argument) list in a signature.

Usage

From source file:at.bestsolution.fxide.jdt.editor.internal.SignatureUtil.java

License:Open Source License

private static int typeEnd(char[] signature, int pos) {
    int depth = 0;
    while (pos < signature.length) {
        switch (signature[pos]) {
        case Signature.C_GENERIC_START:
            depth++;/*  w w w . jav a  2 s  .  c om*/
            break;
        case Signature.C_GENERIC_END:
            if (depth == 0)
                return pos;
            depth--;
            break;
        case Signature.C_SEMICOLON:
            if (depth == 0)
                return pos + 1;
            break;
        }
        pos++;
    }
    return pos + 1;
}

From source file:com.codenvy.ide.ext.java.server.core.search.SearchPattern.java

License:Open Source License

private static SearchPattern createMethodOrConstructorPattern(String patternString, int limitTo, int matchRule,
        boolean isConstructor) {
    // use 1.7 as the source level as there are more valid tokens in 1.7 mode
    // https://bugs.eclipse.org/bugs/show_bug.cgi?id=376673
    Scanner scanner = new Scanner(false /*comment*/, true /*whitespace*/, false /*nls*/,
            ClassFileConstants.JDK1_7/*sourceLevel*/, null /*taskTags*/, null/*taskPriorities*/,
            true/*taskCaseSensitive*/);
    scanner.setSource(patternString.toCharArray());
    final int InsideSelector = 1;
    final int InsideTypeArguments = 2;
    final int InsideParameter = 3;
    final int InsideReturnType = 4;
    int lastToken = -1;

    String declaringType = null, selector = null, parameterType = null;
    String[] parameterTypes = null;
    char[][] typeArguments = null;
    String typeArgumentsString = null;
    int parameterCount = -1;
    String returnType = null;//  w ww.  j  a va2 s . c  om
    boolean foundClosingParenthesis = false;
    int mode = InsideSelector;
    int token, argCount = 0;
    try {
        token = scanner.getNextToken();
    } catch (InvalidInputException e) {
        return null;
    }
    while (token != TerminalTokens.TokenNameEOF) {
        switch (mode) {
        // read declaring type and selector
        case InsideSelector:
            if (argCount == 0) {
                switch (token) {
                case TerminalTokens.TokenNameLESS:
                    argCount++;
                    if (selector == null || lastToken == TerminalTokens.TokenNameDOT) {
                        typeArgumentsString = scanner.getCurrentTokenString();
                        mode = InsideTypeArguments;
                        break;
                    }
                    if (declaringType == null) {
                        declaringType = selector;
                    } else {
                        declaringType += '.' + selector;
                    }
                    declaringType += scanner.getCurrentTokenString();
                    selector = null;
                    break;
                case TerminalTokens.TokenNameDOT:
                    if (!isConstructor && typeArgumentsString != null)
                        return null; // invalid syntax
                    if (declaringType == null) {
                        if (selector == null)
                            return null; // invalid syntax
                        declaringType = selector;
                    } else if (selector != null) {
                        declaringType += scanner.getCurrentTokenString() + selector;
                    }
                    selector = null;
                    break;
                case TerminalTokens.TokenNameLPAREN:
                    parameterTypes = new String[5];
                    parameterCount = 0;
                    mode = InsideParameter;
                    break;
                case TerminalTokens.TokenNameWHITESPACE:
                    switch (lastToken) {
                    case TerminalTokens.TokenNameWHITESPACE:
                    case TerminalTokens.TokenNameDOT:
                    case TerminalTokens.TokenNameGREATER:
                    case TerminalTokens.TokenNameRIGHT_SHIFT:
                    case TerminalTokens.TokenNameUNSIGNED_RIGHT_SHIFT:
                        break;
                    default:
                        mode = InsideReturnType;
                        break;
                    }
                    break;
                default: // all other tokens are considered identifiers (see bug 21763 Problem in Java search [search])
                    if (selector == null)
                        selector = scanner.getCurrentTokenString();
                    else
                        selector += scanner.getCurrentTokenString();
                    break;
                }
            } else {
                if (declaringType == null)
                    return null; // invalid syntax
                switch (token) {
                case TerminalTokens.TokenNameGREATER:
                case TerminalTokens.TokenNameRIGHT_SHIFT:
                case TerminalTokens.TokenNameUNSIGNED_RIGHT_SHIFT:
                    argCount--;
                    break;
                case TerminalTokens.TokenNameLESS:
                    argCount++;
                    break;
                }
                declaringType += scanner.getCurrentTokenString();
            }
            break;
        // read type arguments
        case InsideTypeArguments:
            if (typeArgumentsString == null)
                return null; // invalid syntax
            typeArgumentsString += scanner.getCurrentTokenString();
            switch (token) {
            case TerminalTokens.TokenNameGREATER:
            case TerminalTokens.TokenNameRIGHT_SHIFT:
            case TerminalTokens.TokenNameUNSIGNED_RIGHT_SHIFT:
                argCount--;
                if (argCount == 0) {
                    String pseudoType = "Type" + typeArgumentsString; //$NON-NLS-1$
                    typeArguments = Signature
                            .getTypeArguments(Signature.createTypeSignature(pseudoType, false).toCharArray());
                    mode = InsideSelector;
                }
                break;
            case TerminalTokens.TokenNameLESS:
                argCount++;
                break;
            }
            break;
        // read parameter types
        case InsideParameter:
            if (argCount == 0) {
                switch (token) {
                case TerminalTokens.TokenNameWHITESPACE:
                    break;
                case TerminalTokens.TokenNameCOMMA:
                    if (parameterType == null)
                        return null;
                    if (parameterTypes != null) {
                        if (parameterTypes.length == parameterCount)
                            System.arraycopy(parameterTypes, 0, parameterTypes = new String[parameterCount * 2],
                                    0, parameterCount);
                        parameterTypes[parameterCount++] = parameterType;
                    }
                    parameterType = null;
                    break;
                case TerminalTokens.TokenNameRPAREN:
                    foundClosingParenthesis = true;
                    if (parameterType != null && parameterTypes != null) {
                        if (parameterTypes.length == parameterCount)
                            System.arraycopy(parameterTypes, 0, parameterTypes = new String[parameterCount * 2],
                                    0, parameterCount);
                        parameterTypes[parameterCount++] = parameterType;
                    }
                    mode = isConstructor ? InsideTypeArguments : InsideReturnType;
                    break;
                case TerminalTokens.TokenNameLESS:
                    argCount++;
                    if (parameterType == null)
                        return null; // invalid syntax
                    // $FALL-THROUGH$ - fall through next case to add token
                default: // all other tokens are considered identifiers (see bug 21763 Problem in Java search [search])
                    if (parameterType == null)
                        parameterType = scanner.getCurrentTokenString();
                    else
                        parameterType += scanner.getCurrentTokenString();
                }
            } else {
                if (parameterType == null)
                    return null; // invalid syntax
                switch (token) {
                case TerminalTokens.TokenNameGREATER:
                case TerminalTokens.TokenNameRIGHT_SHIFT:
                case TerminalTokens.TokenNameUNSIGNED_RIGHT_SHIFT:
                    argCount--;
                    break;
                case TerminalTokens.TokenNameLESS:
                    argCount++;
                    break;
                }
                parameterType += scanner.getCurrentTokenString();
            }
            break;
        // read return type
        case InsideReturnType:
            if (argCount == 0) {
                switch (token) {
                case TerminalTokens.TokenNameWHITESPACE:
                    break;
                case TerminalTokens.TokenNameLPAREN:
                    parameterTypes = new String[5];
                    parameterCount = 0;
                    mode = InsideParameter;
                    break;
                case TerminalTokens.TokenNameLESS:
                    argCount++;
                    if (returnType == null)
                        return null; // invalid syntax
                    // $FALL-THROUGH$ - fall through next case to add token
                default: // all other tokens are considered identifiers (see bug 21763 Problem in Java search [search])
                    if (returnType == null)
                        returnType = scanner.getCurrentTokenString();
                    else
                        returnType += scanner.getCurrentTokenString();
                }
            } else {
                if (returnType == null)
                    return null; // invalid syntax
                switch (token) {
                case TerminalTokens.TokenNameGREATER:
                case TerminalTokens.TokenNameRIGHT_SHIFT:
                case TerminalTokens.TokenNameUNSIGNED_RIGHT_SHIFT:
                    argCount--;
                    break;
                case TerminalTokens.TokenNameLESS:
                    argCount++;
                    break;
                }
                returnType += scanner.getCurrentTokenString();
            }
            break;
        }
        lastToken = token;
        try {
            token = scanner.getNextToken();
        } catch (InvalidInputException e) {
            return null;
        }
    }
    // parenthesis mismatch
    if (parameterCount > 0 && !foundClosingParenthesis)
        return null;
    // type arguments mismatch
    if (argCount > 0)
        return null;

    char[] selectorChars = null;
    if (isConstructor) {
        // retrieve type for constructor patterns
        if (declaringType == null)
            declaringType = selector;
        else if (selector != null)
            declaringType += '.' + selector;
    } else {
        // get selector chars
        if (selector == null)
            return null;
        selectorChars = selector.toCharArray();
        if (selectorChars.length == 1 && selectorChars[0] == '*')
            selectorChars = null;
    }

    char[] declaringTypeQualification = null, declaringTypeSimpleName = null;
    char[] returnTypeQualification = null, returnTypeSimpleName = null;
    char[][] parameterTypeQualifications = null, parameterTypeSimpleNames = null;
    // Signatures
    String declaringTypeSignature = null;
    String returnTypeSignature = null;
    String[] parameterTypeSignatures = null;

    // extract declaring type infos
    if (declaringType != null) {
        // get declaring type part and signature
        char[] declaringTypePart = null;
        try {
            declaringTypeSignature = Signature.createTypeSignature(declaringType, false);
            if (declaringTypeSignature.indexOf(Signature.C_GENERIC_START) < 0) {
                declaringTypePart = declaringType.toCharArray();
            } else {
                declaringTypePart = Signature
                        .toCharArray(Signature.getTypeErasure(declaringTypeSignature.toCharArray()));
            }
        } catch (IllegalArgumentException iae) {
            // declaring type is invalid
            return null;
        }
        int lastDotPosition = CharOperation.lastIndexOf('.', declaringTypePart);
        if (lastDotPosition >= 0) {
            declaringTypeQualification = CharOperation.subarray(declaringTypePart, 0, lastDotPosition);
            if (declaringTypeQualification.length == 1 && declaringTypeQualification[0] == '*')
                declaringTypeQualification = null;
            declaringTypeSimpleName = CharOperation.subarray(declaringTypePart, lastDotPosition + 1,
                    declaringTypePart.length);
        } else {
            declaringTypeSimpleName = declaringTypePart;
        }
        if (declaringTypeSimpleName.length == 1 && declaringTypeSimpleName[0] == '*')
            declaringTypeSimpleName = null;
    }
    // extract parameter types infos
    if (parameterCount >= 0) {
        parameterTypeQualifications = new char[parameterCount][];
        parameterTypeSimpleNames = new char[parameterCount][];
        parameterTypeSignatures = new String[parameterCount];
        for (int i = 0; i < parameterCount; i++) {
            // get parameter type part and signature
            char[] parameterTypePart = null;
            try {
                if (parameterTypes != null) {
                    parameterTypeSignatures[i] = Signature.createTypeSignature(parameterTypes[i], false);
                    if (parameterTypeSignatures[i].indexOf(Signature.C_GENERIC_START) < 0) {
                        parameterTypePart = parameterTypes[i].toCharArray();
                    } else {
                        parameterTypePart = Signature.toCharArray(
                                Signature.getTypeErasure(parameterTypeSignatures[i].toCharArray()));
                    }
                }
            } catch (IllegalArgumentException iae) {
                // string is not a valid type syntax
                return null;
            }
            int lastDotPosition = parameterTypePart == null ? -1
                    : CharOperation.lastIndexOf('.', parameterTypePart);
            if (parameterTypePart != null && lastDotPosition >= 0) {
                parameterTypeQualifications[i] = CharOperation.subarray(parameterTypePart, 0, lastDotPosition);
                if (parameterTypeQualifications[i].length == 1 && parameterTypeQualifications[i][0] == '*') {
                    parameterTypeQualifications[i] = null;
                } else {
                    // prefix with a '*' as the full qualification could be bigger (because of an import)
                    parameterTypeQualifications[i] = CharOperation.concat(IIndexConstants.ONE_STAR,
                            parameterTypeQualifications[i]);
                }
                parameterTypeSimpleNames[i] = CharOperation.subarray(parameterTypePart, lastDotPosition + 1,
                        parameterTypePart.length);
            } else {
                parameterTypeQualifications[i] = null;
                parameterTypeSimpleNames[i] = parameterTypePart;
            }
            if (parameterTypeSimpleNames[i].length == 1 && parameterTypeSimpleNames[i][0] == '*')
                parameterTypeSimpleNames[i] = null;
        }
    }
    // extract return type infos
    if (returnType != null) {
        // get return type part and signature
        char[] returnTypePart = null;
        try {
            returnTypeSignature = Signature.createTypeSignature(returnType, false);
            if (returnTypeSignature.indexOf(Signature.C_GENERIC_START) < 0) {
                returnTypePart = returnType.toCharArray();
            } else {
                returnTypePart = Signature
                        .toCharArray(Signature.getTypeErasure(returnTypeSignature.toCharArray()));
            }
        } catch (IllegalArgumentException iae) {
            // declaring type is invalid
            return null;
        }
        int lastDotPosition = CharOperation.lastIndexOf('.', returnTypePart);
        if (lastDotPosition >= 0) {
            returnTypeQualification = CharOperation.subarray(returnTypePart, 0, lastDotPosition);
            if (returnTypeQualification.length == 1 && returnTypeQualification[0] == '*') {
                returnTypeQualification = null;
            } else {
                // because of an import
                returnTypeQualification = CharOperation.concat(IIndexConstants.ONE_STAR,
                        returnTypeQualification);
            }
            returnTypeSimpleName = CharOperation.subarray(returnTypePart, lastDotPosition + 1,
                    returnTypePart.length);
        } else {
            returnTypeSimpleName = returnTypePart;
        }
        if (returnTypeSimpleName.length == 1 && returnTypeSimpleName[0] == '*')
            returnTypeSimpleName = null;
    }
    // Create method/constructor pattern
    if (isConstructor) {
        return new ConstructorPattern(declaringTypeSimpleName, declaringTypeQualification,
                declaringTypeSignature, parameterTypeQualifications, parameterTypeSimpleNames,
                parameterTypeSignatures, typeArguments, limitTo, matchRule);
    } else {
        return new MethodPattern(selectorChars, declaringTypeQualification, declaringTypeSimpleName,
                declaringTypeSignature, returnTypeQualification, returnTypeSimpleName, returnTypeSignature,
                parameterTypeQualifications, parameterTypeSimpleNames, parameterTypeSignatures, typeArguments,
                limitTo, matchRule);
    }
}

From source file:com.codenvy.ide.ext.java.server.core.search.SearchPattern.java

License:Open Source License

private static SearchPattern createTypePattern(String patternString, int limitTo, int matchRule,
        char indexSuffix) {
    // use 1.7 as the source level as there are more valid tokens in 1.7 mode
    // https://bugs.eclipse.org/bugs/show_bug.cgi?id=376673
    Scanner scanner = new Scanner(false /*comment*/, true /*whitespace*/, false /*nls*/,
            ClassFileConstants.JDK1_7/*sourceLevel*/, null /*taskTags*/, null/*taskPriorities*/,
            true/*taskCaseSensitive*/);
    scanner.setSource(patternString.toCharArray());
    String type = null;// w  w w  . j a  v  a  2s.co m
    int token;
    try {
        token = scanner.getNextToken();
    } catch (InvalidInputException e) {
        return null;
    }
    int argCount = 0;
    while (token != TerminalTokens.TokenNameEOF) {
        if (argCount == 0) {
            switch (token) {
            case TerminalTokens.TokenNameWHITESPACE:
                break;
            case TerminalTokens.TokenNameLESS:
                argCount++;
                // $FALL-THROUGH$ - fall through default case to add token to type
            default: // all other tokens are considered identifiers (see bug 21763 Problem in Java search [search])
                if (type == null)
                    type = scanner.getCurrentTokenString();
                else
                    type += scanner.getCurrentTokenString();
            }
        } else {
            switch (token) {
            case TerminalTokens.TokenNameGREATER:
            case TerminalTokens.TokenNameRIGHT_SHIFT:
            case TerminalTokens.TokenNameUNSIGNED_RIGHT_SHIFT:
                argCount--;
                break;
            case TerminalTokens.TokenNameLESS:
                argCount++;
                break;
            }
            if (type == null)
                return null; // invalid syntax
            type += scanner.getCurrentTokenString();
        }
        try {
            token = scanner.getNextToken();
        } catch (InvalidInputException e) {
            return null;
        }
    }
    if (type == null)
        return null;
    String typeSignature = null;
    char[] qualificationChars = null, typeChars = null;

    // get type part and signature
    char[] typePart = null;
    try {
        typeSignature = Signature.createTypeSignature(type, false);
        if (typeSignature.indexOf(Signature.C_GENERIC_START) < 0) {
            typePart = type.toCharArray();
        } else {
            typePart = Signature.toCharArray(Signature.getTypeErasure(typeSignature.toCharArray()));
        }
    } catch (IllegalArgumentException iae) {
        // string is not a valid type syntax
        return null;
    }

    // get qualification name
    int lastDotPosition = CharOperation.lastIndexOf('.', typePart);
    if (lastDotPosition >= 0) {
        qualificationChars = CharOperation.subarray(typePart, 0, lastDotPosition);
        if (qualificationChars.length == 1 && qualificationChars[0] == '*')
            qualificationChars = null;
        typeChars = CharOperation.subarray(typePart, lastDotPosition + 1, typePart.length);
    } else {
        typeChars = typePart;
    }
    if (typeChars.length == 1 && typeChars[0] == '*') {
        typeChars = null;
    }
    switch (limitTo) {
    case IJavaSearchConstants.DECLARATIONS: // cannot search for explicit member types
        return new QualifiedTypeDeclarationPattern(qualificationChars, typeChars, indexSuffix, matchRule);
    case IJavaSearchConstants.REFERENCES:
        return new TypeReferencePattern(qualificationChars, typeChars, typeSignature, indexSuffix, matchRule);
    case IJavaSearchConstants.IMPLEMENTORS:
        return new SuperTypeReferencePattern(qualificationChars, typeChars,
                SuperTypeReferencePattern.ONLY_SUPER_INTERFACES, indexSuffix, matchRule);
    case IJavaSearchConstants.ALL_OCCURRENCES:
        return new OrPattern(
                new QualifiedTypeDeclarationPattern(qualificationChars, typeChars, indexSuffix, matchRule), // cannot search for explicit
                // member types
                new TypeReferencePattern(qualificationChars, typeChars, typeSignature, indexSuffix, matchRule));
    default:
        return new TypeReferencePattern(qualificationChars, typeChars, typeSignature, limitTo, indexSuffix,
                matchRule);
    }
}

From source file:com.codenvy.ide.ext.java.server.internal.core.search.indexing.AbstractIndexer.java

License:Open Source License

private char[] erasure(char[] typeName) {
    int genericStart = CharOperation.indexOf(Signature.C_GENERIC_START, typeName);
    if (genericStart > -1)
        typeName = CharOperation.subarray(typeName, 0, genericStart);
    return typeName;
}

From source file:com.codenvy.ide.ext.java.server.internal.core.search.indexing.SourceIndexerRequestor.java

License:Open Source License

/**
 * @see org.eclipse.jdt.internal.compiler.ISourceElementRequestor#acceptConstructorReference(char[], int, int)
 *///w w  w  . j a va 2  s. co m
public void acceptConstructorReference(char[] typeName, int argCount, int sourcePosition) {
    if (CharOperation.indexOf(Signature.C_GENERIC_START, typeName) > 0) {
        typeName = Signature.toCharArray(
                Signature.getTypeErasure(Signature.createTypeSignature(typeName, false)).toCharArray());
    }
    this.indexer.addConstructorReference(typeName, argCount);
    int lastDot = CharOperation.lastIndexOf('.', typeName);
    if (lastDot != -1) {
        char[][] qualification = CharOperation.splitOn('.', CharOperation.subarray(typeName, 0, lastDot));
        for (int i = 0, length = qualification.length; i < length; i++) {
            this.indexer.addNameReference(qualification[i]);
        }
    }
}

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

License:Open Source License

/**
 * NOT API, public only for access by Unit tests.
 * Converts these type names to unqualified signatures. This needs to be done in order to be consistent
 * with the way the source range is retrieved.
 *
 * @see org.eclipse.jdt.internal.core.SourceMapper#getUnqualifiedMethodHandle
 * @see org.eclipse.jdt.core.Signature/*  www .j  a  v  a 2  s  .c  o m*/
 */
public String[] convertTypeNamesToSigs(char[][] typeNames) {
    if (typeNames == null)
        return CharOperation.NO_STRINGS;
    int n = typeNames.length;
    if (n == 0)
        return CharOperation.NO_STRINGS;
    String[] typeSigs = new String[n];
    for (int i = 0; i < n; ++i) {
        char[] typeSig = Signature.createCharArrayTypeSignature(typeNames[i], false);

        // transforms signatures that contains a qualification into unqualified signatures
        // e.g. "QX<+QMap.Entry;>;" becomes "QX<+QEntry;>;"
        StringBuffer simpleTypeSig = null;
        int start = 0;
        int dot = -1;
        int length = typeSig.length;
        for (int j = 0; j < length; j++) {
            switch (typeSig[j]) {
            case Signature.C_UNRESOLVED:
                if (simpleTypeSig != null)
                    simpleTypeSig.append(typeSig, start, j - start);
                start = j;
                break;
            case Signature.C_DOT:
                dot = j;
                break;
            case Signature.C_GENERIC_START:
                int matchingEnd = findMatchingGenericEnd(typeSig, j + 1);
                if (matchingEnd > 0 && matchingEnd + 1 < length
                        && typeSig[matchingEnd + 1] == Signature.C_DOT) {
                    // found Head<Param>.Tail -> discard everything except Tail
                    if (simpleTypeSig == null)
                        simpleTypeSig = new StringBuffer().append(typeSig, 0, start);
                    simpleTypeSig.append(Signature.C_UNRESOLVED);
                    start = j = matchingEnd + 2;
                    break;
                }
                //$FALL-THROUGH$
            case Signature.C_NAME_END:
                if (dot > start) {
                    if (simpleTypeSig == null)
                        simpleTypeSig = new StringBuffer().append(typeSig, 0, start);
                    simpleTypeSig.append(Signature.C_UNRESOLVED);
                    simpleTypeSig.append(typeSig, dot + 1, j - dot - 1);
                    start = j;
                }
                break;
            }
        }
        if (simpleTypeSig == null) {
            typeSigs[i] = new String(typeSig);
        } else {
            simpleTypeSig.append(typeSig, start, length - start);
            typeSigs[i] = simpleTypeSig.toString();
        }
    }
    return typeSigs;
}

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

License:Open Source License

private int findMatchingGenericEnd(char[] sig, int start) {
    int nesting = 0;
    int length = sig.length;
    for (int i = start; i < length; i++) {
        switch (sig[i]) {
        case Signature.C_GENERIC_START:
            nesting++;//  ww  w .j  av  a  2  s . co  m
            break;
        case Signature.C_GENERIC_END:
            if (nesting == 0)
                return i;
            nesting--;
            break;
        }
    }
    return -1;
}

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

License:Open Source License

private int getUnqualifiedTypeSignature(String qualifiedTypeSig, int start, int length,
        StringBuffer unqualifiedTypeSig, boolean noDollar) {
    char firstChar = qualifiedTypeSig.charAt(start);
    int end = start + 1;
    boolean sigStart = false;
    firstPass: for (int i = start; i < length; i++) {
        char current = qualifiedTypeSig.charAt(i);
        switch (current) {
        case Signature.C_ARRAY:
        case Signature.C_SUPER:
        case Signature.C_EXTENDS:
            unqualifiedTypeSig.append(current);
            start = i + 1;/*from   w ww. j a  v a2s  .c  om*/
            end = start + 1;
            firstChar = qualifiedTypeSig.charAt(start);
            break;
        case Signature.C_RESOLVED:
        case Signature.C_UNRESOLVED:
        case Signature.C_TYPE_VARIABLE:
            if (!sigStart) {
                start = ++i;
                sigStart = true;
            }
            break;
        case Signature.C_NAME_END:
        case Signature.C_GENERIC_START:
            end = i;
            break firstPass;
        case Signature.C_STAR:
            unqualifiedTypeSig.append(current);
            start = i + 1;
            end = start + 1;
            firstChar = qualifiedTypeSig.charAt(start);
            break;
        case Signature.C_GENERIC_END:
            return i;
        case Signature.C_DOT:
            start = ++i;
            break;
        case Signature.C_BOOLEAN:
        case Signature.C_BYTE:
        case Signature.C_CHAR:
        case Signature.C_DOUBLE:
        case Signature.C_FLOAT:
        case Signature.C_INT:
        case Signature.C_LONG:
        case Signature.C_SHORT:
            if (!sigStart) {
                unqualifiedTypeSig.append(current);
                return i + 1;
            }
        }
    }
    switch (firstChar) {
    case Signature.C_RESOLVED:
    case Signature.C_UNRESOLVED:
    case Signature.C_TYPE_VARIABLE:
        unqualifiedTypeSig.append(Signature.C_UNRESOLVED);
        if (noDollar) {
            int lastDollar = qualifiedTypeSig.lastIndexOf('$', end);
            if (lastDollar > start)
                start = lastDollar + 1;
        }
        for (int i = start; i < length; i++) {
            char current = qualifiedTypeSig.charAt(i);
            switch (current) {
            case Signature.C_GENERIC_START:
                unqualifiedTypeSig.append(current);
                i++;
                do {
                    i = getUnqualifiedTypeSignature(qualifiedTypeSig, i, length, unqualifiedTypeSig, noDollar);
                } while (qualifiedTypeSig.charAt(i) != Signature.C_GENERIC_END);
                unqualifiedTypeSig.append(Signature.C_GENERIC_END);
                break;
            case Signature.C_NAME_END:
                unqualifiedTypeSig.append(current);
                return i + 1;
            default:
                unqualifiedTypeSig.append(current);
                break;
            }
        }
        return length;
    default:
        // primitive type or wildcard
        unqualifiedTypeSig.append(qualifiedTypeSig.substring(start, end));
        return end;
    }
}

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

License:Open Source License

private static int appendClassTypeSignatureForAnchor(char[] string, int start, StringBuffer buffer) {
    // need a minimum 3 chars "Lx;"
    if (start >= string.length - 2) {
        throw new IllegalArgumentException();
    }//from   ww w. ja  v a2s  .  com
    // must start in "L" or "Q"
    char c = string[start];
    if (c != Signature.C_RESOLVED && c != Signature.C_UNRESOLVED) {
        throw new IllegalArgumentException();
    }
    int p = start + 1;
    while (true) {
        if (p >= string.length) {
            throw new IllegalArgumentException();
        }
        c = string[p];
        switch (c) {
        case Signature.C_SEMICOLON:
            // all done
            return p;
        case Signature.C_GENERIC_START:
            int e = scanGenericEnd(string, p + 1);
            // once we hit type arguments there are no more package prefixes
            p = e;
            break;
        case Signature.C_DOT:
            buffer.append('.');
            break;
        case '/':
            buffer.append('/');
            break;
        case Signature.C_DOLLAR:
            // once we hit "$" there are no more package prefixes
            /**
             * Convert '$' in resolved type signatures into '.'. NOTE: This assumes that the type signature is an inner type
             * signature. This is true in most cases, but someone can define a non-inner type name containing a '$'.
             */
            buffer.append('.');
            break;
        default:
            buffer.append(c);
        }
        p++;
    }
}

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

License:Open Source License

private static int scanGenericEnd(char[] string, int start) {
    if (string[start] == Signature.C_GENERIC_END) {
        return start;
    }/*from w  w w  .  java  2  s  .  co  m*/
    int length = string.length;
    int balance = 1;
    start++;
    while (start <= length) {
        switch (string[start]) {
        case Signature.C_GENERIC_END:
            balance--;
            if (balance == 0) {
                return start;
            }
            break;
        case Signature.C_GENERIC_START:
            balance++;
            break;
        }
        start++;
    }
    return start;
}