Example usage for org.eclipse.jdt.core.search SearchMatch setLength

List of usage examples for org.eclipse.jdt.core.search SearchMatch setLength

Introduction

In this page you can find the example usage for org.eclipse.jdt.core.search SearchMatch setLength.

Prototype

public final void setLength(int length) 

Source Link

Document

Sets the length of this search match.

Usage

From source file:org.eclipse.jdt.internal.core.search.matching.MatchLocator.java

License:Open Source License

/**
 * Finds the accurate positions of the sequence of tokens given by qualifiedName
 * in the source and reports a reference to this this qualified name
 * to the search requestor.// w w w.ja  va  2 s.  co m
 */
protected void reportAccurateTypeReference(SearchMatch match, ASTNode typeRef, char[] name)
        throws CoreException {
    if (match.getRule() == 0)
        return;
    if (!encloses((IJavaElement) match.getElement()))
        return;

    int sourceStart = typeRef.sourceStart;
    int sourceEnd = typeRef.sourceEnd;

    // Compute source positions of the qualified reference
    if (name != null) {
        Scanner scanner = this.parser.scanner;
        scanner.setSource(this.currentPossibleMatch.getContents());
        scanner.resetTo(sourceStart, sourceEnd);

        int token = -1;
        int currentPosition;
        do {
            currentPosition = scanner.currentPosition;
            try {
                token = scanner.getNextToken();
            } catch (InvalidInputException e) {
                // ignore
            }
            if (token == TerminalTokens.TokenNameIdentifier
                    && this.pattern.matchesName(name, scanner.getCurrentTokenSource())) {
                int length = scanner.currentPosition - currentPosition;
                match.setOffset(currentPosition);
                match.setLength(length);
                report(match);
                return;
            }
        } while (token != TerminalTokens.TokenNameEOF);
    }

    //   Report match
    match.setOffset(sourceStart);
    match.setLength(sourceEnd - sourceStart + 1);
    report(match);
}

From source file:org.eclipse.jdt.internal.core.search.matching.MatchLocator.java

License:Open Source License

/**
 * Finds the accurate positions of the sequence of tokens given by qualifiedName
 * in the source and reports a reference to this parameterized type name
 * to the search requestor.//from w w w . jav  a2 s.c  o  m
 * @since 3.1
 */
protected void reportAccurateParameterizedMethodReference(SearchMatch match, ASTNode statement,
        TypeReference[] typeArguments) throws CoreException {
    if (match.getRule() == 0)
        return;
    if (!encloses((IJavaElement) match.getElement()))
        return;

    // If there's type arguments, look for end (i.e. char '>') of last one.
    int start = match.getOffset();
    if (typeArguments != null && typeArguments.length > 0) {
        boolean isErasureMatch = (this.pattern instanceof OrPattern)
                ? ((OrPattern) this.pattern).isErasureMatch()
                : ((JavaSearchPattern) this.pattern).isErasureMatch();
        if (!isErasureMatch) {

            // Initialize scanner
            Scanner scanner = this.parser.scanner;
            char[] source = this.currentPossibleMatch.getContents();
            scanner.setSource(source);

            // Search previous opening '<'
            start = typeArguments[0].sourceStart;
            int end = statement.sourceEnd;
            scanner.resetTo(start, end);
            int lineStart = start;
            try {
                linesUp: while (true) {
                    while (scanner.source[scanner.currentPosition] != '\n') {
                        scanner.currentPosition--;
                        if (scanner.currentPosition == 0)
                            break linesUp;
                    }
                    lineStart = scanner.currentPosition + 1;
                    scanner.resetTo(lineStart, end);
                    while (!scanner.atEnd()) {
                        if (scanner.getNextToken() == TerminalTokens.TokenNameLESS) {
                            start = scanner.getCurrentTokenStartPosition();
                            break linesUp;
                        }
                    }
                    end = lineStart - 2;
                    scanner.currentPosition = end;
                }
            } catch (InvalidInputException ex) {
                // give up
            }
        }
    }

    // Report match
    match.setOffset(start);
    match.setLength(statement.sourceEnd - start + 1);
    report(match);
}

From source file:org.eclipse.jdt.internal.core.search.matching.MatchLocator.java

License:Open Source License

/**
 * Finds the accurate positions of the sequence of tokens given by qualifiedName
 * in the source and reports a reference to this parameterized type name
 * to the search requestor.// w  w w  .j a v  a2 s. c  o m
 * @since 3.1
 */
protected void reportAccurateParameterizedTypeReference(SearchMatch match, TypeReference typeRef, int index,
        TypeReference[] typeArguments) throws CoreException {
    if (match.getRule() == 0)
        return;
    if (!encloses((IJavaElement) match.getElement()))
        return;

    // If there's type arguments, look for end (i.e. char '>') of last one.
    int end = typeRef.sourceEnd;
    if (typeArguments != null) {

        boolean shouldMatchErasure = (this.pattern instanceof OrPattern)
                ? ((OrPattern) this.pattern).isErasureMatch()
                : ((JavaSearchPattern) this.pattern).isErasureMatch();
        boolean hasSignatures = (this.pattern instanceof OrPattern) ? ((OrPattern) this.pattern).hasSignatures()
                : ((JavaSearchPattern) this.pattern).hasSignatures();
        if (shouldMatchErasure || !hasSignatures) {
            // if pattern is erasure only, then select the end of the reference
            if (typeRef instanceof QualifiedTypeReference && index >= 0) {
                long[] positions = ((QualifiedTypeReference) typeRef).sourcePositions;
                end = (int) positions[index];
            } else if (typeRef instanceof ArrayTypeReference) {
                end = ((ArrayTypeReference) typeRef).originalSourceEnd;
            }
        } else {
            // Initialize scanner
            Scanner scanner = this.parser.scanner;
            char[] source = this.currentPossibleMatch.getContents();
            scanner.setSource(source);

            // Set scanner position at end of last type argument
            scanner.resetTo(end, source.length - 1);
            int depth = 0;
            for (int i = typeArguments.length - 1; i >= 0; i--) {
                if (typeArguments[i] != null) {
                    long lastTypeArgInfo = findLastTypeArgumentInfo(typeArguments[i]);
                    depth = (int) (lastTypeArgInfo >>> 32) + 1;
                    scanner.resetTo(((int) lastTypeArgInfo) + 1, scanner.eofPosition - 1);
                    break;
                }
            }

            // Now, scan to search next closing '>'
            while (depth-- > 0) {
                while (!scanner.atEnd()) {
                    if (scanner.getNextChar() == '>') {
                        end = scanner.currentPosition - 1;
                        break;
                    }
                }
            }
        }
    }

    // Report match
    match.setLength(end - match.getOffset() + 1);
    report(match);
}

From source file:org.eclipse.jdt.internal.core.search.matching.MatchLocator.java

License:Open Source License

/**
 * Finds the accurate positions of each valid token in the source and
 * reports a reference to this token to the search requestor.
 * A token is valid if it has an accuracy which is not -1.
 *///from  w  ww. j  ava  2 s .com
protected void reportAccurateEnumConstructorReference(SearchMatch match, FieldDeclaration field,
        AllocationExpression allocation) throws CoreException {
    // Verify that field declaration is really an enum constant
    if (allocation == null || allocation.enumConstant == null) {
        report(match);
        return;
    }

    // Get scan area
    int sourceStart = match.getOffset() + match.getLength();
    if (allocation.arguments != null && allocation.arguments.length > 0) {
        sourceStart = allocation.arguments[allocation.arguments.length - 1].sourceEnd + 1;
    }
    int sourceEnd = field.declarationSourceEnd;
    if (allocation instanceof QualifiedAllocationExpression) {
        QualifiedAllocationExpression qualifiedAllocation = (QualifiedAllocationExpression) allocation;
        if (qualifiedAllocation.anonymousType != null) {
            sourceEnd = qualifiedAllocation.anonymousType.sourceStart - 1;
        }
    }

    // Scan to find last closing parenthesis
    Scanner scanner = this.parser.scanner;
    scanner.setSource(this.currentPossibleMatch.getContents());
    scanner.resetTo(sourceStart, sourceEnd);
    try {
        int token = scanner.getNextToken();
        while (token != TerminalTokens.TokenNameEOF) {
            if (token == TerminalTokens.TokenNameRPAREN) {
                sourceEnd = scanner.getCurrentTokenEndPosition();
            }
            token = scanner.getNextToken();
        }
    } catch (InvalidInputException iie) {
        // give up
    }

    // Report match
    match.setLength(sourceEnd - match.getOffset() + 1);
    report(match);
}

From source file:org.eclipse.jdt.internal.core.search.matching.MatchLocator.java

License:Open Source License

/**
 * Finds the accurate positions of each valid token in the source and
 * reports a reference to this token to the search requestor.
 * A token is valid if it has an accuracy which is not -1.
 *///from  w w w  .  jav  a 2  s .c  o m
protected void reportAccurateFieldReference(SearchMatch[] matches, QualifiedNameReference qNameRef)
        throws CoreException {
    if (matches == null)
        return; // there's nothing to accurate in this case
    int matchesLength = matches.length;

    int sourceStart = qNameRef.sourceStart;
    int sourceEnd = qNameRef.sourceEnd;
    char[][] tokens = qNameRef.tokens;

    // compute source positions of the qualified reference
    Scanner scanner = this.parser.scanner;
    scanner.setSource(this.currentPossibleMatch.getContents());
    scanner.resetTo(sourceStart, sourceEnd);
    int sourceLength = sourceEnd - sourceStart + 1;

    int refSourceStart = -1, refSourceEnd = -1;
    int length = tokens.length;
    int token = -1;
    int previousValid = -1;
    int i = 0;
    int index = 0;
    do {
        int currentPosition = scanner.currentPosition;
        // read token
        try {
            token = scanner.getNextToken();
        } catch (InvalidInputException e) {
            //ignore
        }
        if (token != TerminalTokens.TokenNameEOF) {
            char[] currentTokenSource = scanner.getCurrentTokenSource();
            boolean equals = false;
            while (i < length && !(equals = this.pattern.matchesName(tokens[i++], currentTokenSource))) {
                /*empty*/}
            if (equals && (previousValid == -1 || previousValid == i - 2)) {
                previousValid = i - 1;
                if (refSourceStart == -1)
                    refSourceStart = currentPosition;
                refSourceEnd = scanner.currentPosition - 1;
            } else {
                i = 0;
                refSourceStart = -1;
                previousValid = -1;
            }
            // read '.'
            try {
                token = scanner.getNextToken();
            } catch (InvalidInputException e) {
                // ignore
            }
        }
        SearchMatch match = matches[index];
        if (match != null && match.getRule() != 0) {
            if (!encloses((IJavaElement) match.getElement()))
                return;
            // accept reference
            if (refSourceStart != -1) {
                match.setOffset(refSourceStart);
                match.setLength(refSourceEnd - refSourceStart + 1);
                report(match);
            } else {
                match.setOffset(sourceStart);
                match.setLength(sourceLength);
                report(match);
            }
            i = 0;
        }
        refSourceStart = -1;
        previousValid = -1;
        if (index < matchesLength - 1) {
            index++;
        }
    } while (token != TerminalTokens.TokenNameEOF);

}