From e1d45302b807d53797e3947dba49fae624075be0 Mon Sep 17 00:00:00 2001 From: Andrey Vlasovskikh Date: Thu, 5 Dec 2013 19:14:13 +0400 Subject: [PATCH] Switched to new string value iteration in Python file references inside string literals --- .../psi/PyStringLiteralFileReferenceSet.java | 74 ++++++------------- 1 file changed, 22 insertions(+), 52 deletions(-) diff --git a/python/openapi/src/com/jetbrains/python/psi/PyStringLiteralFileReferenceSet.java b/python/openapi/src/com/jetbrains/python/psi/PyStringLiteralFileReferenceSet.java index e74cd80a3260..c11cb290574d 100644 --- a/python/openapi/src/com/jetbrains/python/psi/PyStringLiteralFileReferenceSet.java +++ b/python/openapi/src/com/jetbrains/python/psi/PyStringLiteralFileReferenceSet.java @@ -20,17 +20,19 @@ import com.intellij.openapi.util.SystemInfo; import com.intellij.openapi.util.TextRange; import com.intellij.psi.PsiReferenceProvider; import com.intellij.psi.impl.source.resolve.reference.impl.providers.FileReference; -import com.intellij.psi.impl.source.resolve.reference.impl.providers.FileReferenceSet; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.ArrayList; import java.util.List; +import java.util.regex.Matcher; +import java.util.regex.Pattern; /** * @author traff */ public class PyStringLiteralFileReferenceSet extends RootFileReferenceSet { + public static final Pattern DELIMITERS = Pattern.compile("\\\\|/"); private final PyStringLiteralExpression myStringLiteralExpression; @@ -57,61 +59,29 @@ public class PyStringLiteralFileReferenceSet extends RootFileReferenceSet { protected void reparse() { //noinspection ConstantConditions if (myStringLiteralExpression != null) { - MyTextRangeConsumer textRangeConsumer = new MyTextRangeConsumer(this); - - myStringLiteralExpression.iterateCharacterRanges(textRangeConsumer); - textRangeConsumer.finish(); - - List referencesList = textRangeConsumer.myReferenceList; - - myReferences = referencesList.toArray(new FileReference[referencesList.size()]); + final List references = getFileReferences(myStringLiteralExpression); + myReferences = references.toArray(new FileReference[references.size()]); } } - private static class MyTextRangeConsumer implements PyStringLiteralExpression.TextRangeConsumer { - private final StringBuilder myItem = new StringBuilder(); - private int myStartOffset = -1; - private int myIndex = 0; - private int myEndOffset = -1; - private final FileReferenceSet myFileReferenceSet; - - - private final List myReferenceList = new ArrayList(); - - private MyTextRangeConsumer(FileReferenceSet set) { - myFileReferenceSet = set; + @NotNull + private List getFileReferences(@NotNull PyStringLiteralExpression expression) { + final String value = expression.getStringValue(); + final Matcher matcher = DELIMITERS.matcher(value); + int start = 0; + int index = 0; + final List results = new ArrayList(); + while (matcher.find()) { + final TextRange range = TextRange.create(expression.valueOffsetToTextOffset(start), + expression.valueOffsetToTextOffset(matcher.start())); + results.add(createFileReference(range, index++, value.substring(start, matcher.start()))); + start = matcher.end(); } - - @Override - public boolean process(int startOffset, int endOffset, String value) { - if ("\\".equals(value) || "/".equals(value)) { - addReference(startOffset); - } - else { - if (myStartOffset == -1) { - myStartOffset = startOffset; - } - myEndOffset = endOffset; - myItem.append(value); - } - return true; - } - - private void addReference(int startOffset) { - if (myStartOffset != -1) { - final FileReference ref = myFileReferenceSet.createFileReference( - new TextRange(myStartOffset, startOffset), - myIndex++, - myItem.toString()); - myReferenceList.add(ref); - myStartOffset = -1; - myItem.setLength(0); - } - } - - - public void finish() { - addReference(myEndOffset); + if (start != 0) { + final TextRange range = TextRange.create(expression.valueOffsetToTextOffset(start), + expression.valueOffsetToTextOffset(value.length())); + results.add(createFileReference(range, index, value.substring(start))); } + return results; } }