Switched to new string value iteration in Python file references inside string literals

This commit is contained in:
Andrey Vlasovskikh
2013-12-05 19:14:13 +04:00
parent 2d0dc7d61f
commit e1d45302b8
@@ -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<FileReference> referencesList = textRangeConsumer.myReferenceList;
myReferences = referencesList.toArray(new FileReference[referencesList.size()]);
final List<FileReference> 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<FileReference> myReferenceList = new ArrayList<FileReference>();
private MyTextRangeConsumer(FileReferenceSet set) {
myFileReferenceSet = set;
@NotNull
private List<FileReference> getFileReferences(@NotNull PyStringLiteralExpression expression) {
final String value = expression.getStringValue();
final Matcher matcher = DELIMITERS.matcher(value);
int start = 0;
int index = 0;
final List<FileReference> results = new ArrayList<FileReference>();
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;
}
}