Search in sources :

Example 1 with Field

use of com.jetbrains.python.inspections.PyNewStyleStringFormatParser.Field in project intellij-community by JetBrains.

the class NewStyleConvertToFStringProcessor method convertSubstitutionChunk.

@Override
protected boolean convertSubstitutionChunk(@NotNull Field field, @NotNull StringBuilder fStringText) {
    final String stringText = myPyString.getText();
    // Actual format field
    fStringText.append("{");
    final PySubstitutionChunkReference reference = createReference(field);
    final PyExpression resolveResult = adjustResolveResult(reference.resolve());
    if (resolveResult == null)
        return false;
    final PsiElement adjusted = prepareExpressionToInject(resolveResult, field);
    if (adjusted == null)
        return false;
    fStringText.append(adjusted.getText());
    final String quotedAttrsAndItems = quoteItemsInFragments(field);
    if (quotedAttrsAndItems == null)
        return false;
    fStringText.append(quotedAttrsAndItems);
    // Conversion is copied as is if it's present
    final String conversion = field.getConversion();
    if (conversion != null) {
        fStringText.append(conversion);
    }
    // Format spec is copied if present handling nested fields
    final TextRange specRange = field.getFormatSpecRange();
    if (specRange != null) {
        int specOffset = specRange.getStartOffset();
        // Do not proceed too nested fields
        if (field.getDepth() == 1) {
            for (Field nestedField : field.getNestedFields()) {
                // Copy text of the format spec between nested fragments
                fStringText.append(stringText, specOffset, nestedField.getLeftBraceOffset());
                specOffset = nestedField.getFieldEnd();
                // recursively format nested field
                if (!convertSubstitutionChunk(nestedField, fStringText)) {
                    return false;
                }
            }
        }
        if (specOffset < specRange.getEndOffset()) {
            fStringText.append(stringText, specOffset, specRange.getEndOffset());
        }
    }
    fStringText.append("}");
    return true;
}
Also used : Field(com.jetbrains.python.inspections.PyNewStyleStringFormatParser.Field) PySubstitutionChunkReference(com.jetbrains.python.codeInsight.PySubstitutionChunkReference) TextRange(com.intellij.openapi.util.TextRange) PsiElement(com.intellij.psi.PsiElement)

Example 2 with Field

use of com.jetbrains.python.inspections.PyNewStyleStringFormatParser.Field in project intellij-community by JetBrains.

the class PyStringFormatParserTest method testNewStyleIncompleteAttrAndLookups.

public void testNewStyleIncompleteAttrAndLookups() {
    Field field;
    field = doParseAndGetFirstField("'{foo}'");
    assertEquals("foo", field.getFirstName());
    assertEmpty(field.getAttributesAndLookups());
    // recover the first name
    field = doParseAndGetFirstField("'{foo'");
    assertEquals("foo", field.getFirstName());
    assertEmpty(field.getAttributesAndLookups());
    field = doParseAndGetFirstField("'{foo");
    assertEquals("foo", field.getFirstName());
    assertEmpty(field.getAttributesAndLookups());
    field = doParseAndGetFirstField("'{0[foo].bar[baz]}'");
    assertOrderedEquals(field.getAttributesAndLookups(), "[foo]", ".bar", "[baz]");
    field = doParseAndGetFirstField("'{0[foo].bar[baz]'");
    assertOrderedEquals(field.getAttributesAndLookups(), "[foo]", ".bar", "[baz]");
    field = doParseAndGetFirstField("'{0[foo].bar[baz]");
    assertOrderedEquals(field.getAttributesAndLookups(), "[foo]", ".bar", "[baz]");
    // do not recover unfinished lookups
    field = doParseAndGetFirstField("'{0[foo].bar[ba}'");
    assertOrderedEquals(field.getAttributesAndLookups(), "[foo]", ".bar");
    field = doParseAndGetFirstField("'{0[foo].bar[ba!}'");
    assertOrderedEquals(field.getAttributesAndLookups(), "[foo]", ".bar");
    field = doParseAndGetFirstField("'{0[foo].bar[ba:}'");
    assertOrderedEquals(field.getAttributesAndLookups(), "[foo]", ".bar");
    field = doParseAndGetFirstField("'{0[foo].bar[ba'");
    assertOrderedEquals(field.getAttributesAndLookups(), "[foo]", ".bar");
    field = doParseAndGetFirstField("'{0[foo].bar[ba");
    assertOrderedEquals(field.getAttributesAndLookups(), "[foo]", ".bar");
    // do not recover illegal attributes
    field = doParseAndGetFirstField("'{0[foo].bar[baz]quux}'");
    assertOrderedEquals(field.getAttributesAndLookups(), "[foo]", ".bar", "[baz]");
    field = doParseAndGetFirstField("'{0[foo].bar[baz]quux!}'");
    assertOrderedEquals(field.getAttributesAndLookups(), "[foo]", ".bar", "[baz]");
    field = doParseAndGetFirstField("'{0[foo].bar[baz]quux:}'");
    assertOrderedEquals(field.getAttributesAndLookups(), "[foo]", ".bar", "[baz]");
    field = doParseAndGetFirstField("'{0[foo].bar[baz]quux'");
    assertOrderedEquals(field.getAttributesAndLookups(), "[foo]", ".bar", "[baz]");
    field = doParseAndGetFirstField("'{0[foo].bar[baz]quux");
    assertOrderedEquals(field.getAttributesAndLookups(), "[foo]", ".bar", "[baz]");
    field = doParseAndGetFirstField("'{0..}'");
    assertEquals("0", field.getFirstName());
    assertOrderedEquals(field.getAttributesAndLookups(), ".", ".");
    // recover attributes
    field = doParseAndGetFirstField("'{0[foo].}'");
    assertOrderedEquals(field.getAttributesAndLookups(), "[foo]", ".");
    field = doParseAndGetFirstField("'{0[foo].'");
    assertOrderedEquals(field.getAttributesAndLookups(), "[foo]", ".");
    field = doParseAndGetFirstField("'{0[foo].");
    assertOrderedEquals(field.getAttributesAndLookups(), "[foo]", ".");
    field = doParseAndGetFirstField("'{0[foo].bar}'");
    assertOrderedEquals(field.getAttributesAndLookups(), "[foo]", ".bar");
    field = doParseAndGetFirstField("'{0[foo].bar'");
    assertOrderedEquals(field.getAttributesAndLookups(), "[foo]", ".bar");
    field = doParseAndGetFirstField("'{0[foo].bar");
    assertOrderedEquals(field.getAttributesAndLookups(), "[foo]", ".bar");
}
Also used : Field(com.jetbrains.python.inspections.PyNewStyleStringFormatParser.Field)

Example 3 with Field

use of com.jetbrains.python.inspections.PyNewStyleStringFormatParser.Field in project intellij-community by JetBrains.

the class PyStringFormatParserTest method testNewStyleNestedFields.

public void testNewStyleNestedFields() {
    final Field field = doParseAndGetFirstField("u'{foo:{bar} {baz}}'");
    assertEquals("foo", field.getFirstName());
    final List<Field> nestedFields = field.getNestedFields();
    assertSize(2, nestedFields);
    assertEquals("bar", nestedFields.get(0).getFirstName());
    assertEquals("baz", nestedFields.get(1).getFirstName());
}
Also used : Field(com.jetbrains.python.inspections.PyNewStyleStringFormatParser.Field)

Example 4 with Field

use of com.jetbrains.python.inspections.PyNewStyleStringFormatParser.Field in project intellij-community by JetBrains.

the class PyStringFormatParserTest method testNewStyleUnclosedLookupEndsWithRightBrace.

public void testNewStyleUnclosedLookupEndsWithRightBrace() {
    final Field field = doParseAndGetFirstField("u'{0[}'");
    assertEquals(-1, field.getRightBraceOffset());
    assertEquals(6, field.getFieldEnd());
    assertEmpty(field.getAttributesAndLookups());
}
Also used : Field(com.jetbrains.python.inspections.PyNewStyleStringFormatParser.Field)

Example 5 with Field

use of com.jetbrains.python.inspections.PyNewStyleStringFormatParser.Field in project intellij-community by JetBrains.

the class PyStringFormatParserTest method testNewStyleAttrAndLookups.

public void testNewStyleAttrAndLookups() {
    Field field;
    field = doParseAndGetFirstField("u'{foo'");
    assertEquals("foo", field.getFirstName());
    assertEmpty(field.getAttributesAndLookups());
    field = doParseAndGetFirstField("u'{foo}'");
    assertEquals("foo", field.getFirstName());
    assertEmpty(field.getAttributesAndLookups());
    field = doParseAndGetFirstField("u'{foo.bar.baz}'");
    assertEquals("foo", field.getFirstName());
    assertOrderedEquals(field.getAttributesAndLookups(), ".bar", ".baz");
    field = doParseAndGetFirstField("u'{foo[bar][baz]}'");
    assertEquals("foo", field.getFirstName());
    assertOrderedEquals(field.getAttributesAndLookups(), "[bar]", "[baz]");
    field = doParseAndGetFirstField("u'{foo.bar[baz]}'");
    assertEquals("foo", field.getFirstName());
    assertOrderedEquals(field.getAttributesAndLookups(), ".bar", "[baz]");
    field = doParseAndGetFirstField("u'{foo.bar[baz}'");
    assertEquals("foo", field.getFirstName());
    assertOrderedEquals(field.getAttributesAndLookups(), ".bar");
    field = doParseAndGetFirstField("u'{foo[{bar[baz]}'");
    assertEquals("foo", field.getFirstName());
    assertOrderedEquals(field.getAttributesAndLookups(), "[{bar[baz]");
    field = doParseAndGetFirstField("u'{foo[{} {0} {bar.baz}]'");
    assertEquals("foo", field.getFirstName());
    assertOrderedEquals(field.getAttributesAndLookups(), "[{} {0} {bar.baz}]");
    field = doParseAndGetFirstField("u'{foo[bar]baz'");
    assertEquals("foo", field.getFirstName());
    assertOrderedEquals(field.getAttributesAndLookups(), "[bar]");
    field = doParseAndGetFirstField("'{0[foo][.!:][}]}'");
    assertEquals("0", field.getFirstName());
    assertOrderedEquals(field.getAttributesAndLookups(), "[foo]", "[.!:]", "[}]");
    field = doParseAndGetFirstField("'{.foo.bar}'");
    assertEmpty(field.getFirstName());
    assertEquals(TextRange.create(2, 2), field.getFirstNameRange());
    assertOrderedEquals(field.getAttributesAndLookups(), ".foo", ".bar");
    field = doParseAndGetFirstField("'{}'");
    assertEmpty(field.getFirstName());
    assertEquals(TextRange.create(2, 2), field.getFirstNameRange());
    field = doParseAndGetFirstField("'{:foo}'");
    assertEmpty(field.getFirstName());
    assertEquals(TextRange.create(2, 2), field.getFirstNameRange());
    field = doParseAndGetFirstField("'{!r:foo}'");
    assertEmpty(field.getFirstName());
    assertEquals(TextRange.create(2, 2), field.getFirstNameRange());
}
Also used : Field(com.jetbrains.python.inspections.PyNewStyleStringFormatParser.Field)

Aggregations

Field (com.jetbrains.python.inspections.PyNewStyleStringFormatParser.Field)10 ParseResult (com.jetbrains.python.inspections.PyNewStyleStringFormatParser.ParseResult)3 TextRange (com.intellij.openapi.util.TextRange)1 PsiElement (com.intellij.psi.PsiElement)1 PySubstitutionChunkReference (com.jetbrains.python.codeInsight.PySubstitutionChunkReference)1 NotNull (org.jetbrains.annotations.NotNull)1