import com.intellij.psi.PsiElement;
import com.intellij.spellchecker.inspections.PlainTextSplitter;
import com.intellij.spellchecker.inspections.Splitter;
import com.intellij.spellchecker.tokenizer.SpellcheckingStrategy;
import com.intellij.spellchecker.tokenizer.TokenConsumer;
import com.intellij.spellchecker.tokenizer.Tokenizer;
import com.intellij.psi.PsiElement;
import com.intellij.spellchecker.inspections.PlainTextSplitter;
import com.intellij.spellchecker.inspections.Splitter;
import com.intellij.spellchecker.tokenizer.SpellcheckingStrategy;
import com.intellij.spellchecker.tokenizer.TokenConsumer;
import com.intellij.spellchecker.tokenizer.Tokenizer;
import com.jetbrains.python.PyTokenTypes;
import com.jetbrains.python.PythonStringUtil;
import com.jetbrains.python.inspections.PyStringFormatParser;
import com.jetbrains.python.PyTokenTypes;
import com.jetbrains.python.PythonStringUtil;
import com.jetbrains.python.inspections.PyStringFormatParser;
@Override
public void tokenize(@NotNull PyStringLiteralExpression element, TokenConsumer consumer) {
final Splitter splitter = PlainTextSplitter.getInstance();
@Override
public void tokenize(@NotNull PyStringLiteralExpression element, TokenConsumer consumer) {
final Splitter splitter = PlainTextSplitter.getInstance();
- final String text = element.getText();
- final String prefix = PythonStringUtil.getPrefix(text);
- if (text.indexOf('\\') >= 0 && !PythonStringUtil.isRawPrefix(prefix)) {
+ final List<ASTNode> strNodes = element.getStringNodes();
+ final List<String> prefixes = ContainerUtil.mapNotNull(strNodes, n -> StringUtil.nullize(new StringNodeInfo(n).getPrefix()));
+
+ if (element.textContains('\\') && !prefixes.stream().anyMatch(PythonStringUtil::isRawPrefix)) {
for (Pair<TextRange, String> fragment : element.getDecodedFragments()) {
final String value = fragment.getSecond();
final int startOffset = fragment.getFirst().getStartOffset();
consumer.consumeToken(element, value, false, startOffset, TextRange.allOf(value), splitter);
}
}
for (Pair<TextRange, String> fragment : element.getDecodedFragments()) {
final String value = fragment.getSecond();
final int startOffset = fragment.getFirst().getStartOffset();
consumer.consumeToken(element, value, false, startOffset, TextRange.allOf(value), splitter);
}
}
for (TextRange valueTextRange : element.getStringValueTextRanges()) {
final String value = valueTextRange.substring(element.getText());
final int startOffset = valueTextRange.getStartOffset();
for (TextRange valueTextRange : element.getStringValueTextRanges()) {
final String value = valueTextRange.substring(element.getText());
final int startOffset = valueTextRange.getStartOffset();