mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
Switched to new string value iteration in Python file references inside string literals
This commit is contained in:
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user