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

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

Introduction

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

Prototype

public final int getRule() 

Source Link

Document

Returns the rule used while creating the 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.//  www .j  a v a  2s .  c om
 */
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  . j a v  a2  s .  com*/
 * @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  va  2  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.
 *//*w ww.j  ava 2 s . com*/
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);

}