diff --git a/smalidea/src/main/antlr3/smalideaParser.g b/smalidea/src/main/antlr3/smalideaParser.g index 8d04fbb9..e363674d 100644 --- a/smalidea/src/main/antlr3/smalideaParser.g +++ b/smalidea/src/main/antlr3/smalideaParser.g @@ -277,12 +277,12 @@ field } : FIELD_DIRECTIVE access_list - member_name COLON nonvoid_type_descriptor + member_name colon nonvoid_type_descriptor field_initializer? - ( END_FIELD_DIRECTIVE + ( end_field_directive | (ANNOTATION_DIRECTIVE)=> ( {annotationsMarker = mark();} ((ANNOTATION_DIRECTIVE)=> annotation)+ - (END_FIELD_DIRECTIVE {classAnnotations = false;})? + (end_field_directive {classAnnotations = false;})? ) | /*epsilon*/ ) @@ -300,11 +300,19 @@ field } }; catch [RecognitionException re] { - annotationsMarker.drop(); + if (annotationsMarker != null) { + annotationsMarker.drop(); + } recover(input, re); reportError(marker, re, false); } +colon + : COLON; + +end_field_directive + : END_FIELD_DIRECTIVE; + field_initializer @init { Marker marker = mark(); } : EQUAL literal diff --git a/smalidea/src/main/java/org/jf/smalidea/psi/impl/SmaliField.java b/smalidea/src/main/java/org/jf/smalidea/psi/impl/SmaliField.java index a5384ae4..7e9254e1 100644 --- a/smalidea/src/main/java/org/jf/smalidea/psi/impl/SmaliField.java +++ b/smalidea/src/main/java/org/jf/smalidea/psi/impl/SmaliField.java @@ -44,8 +44,6 @@ import org.jf.smalidea.psi.SmaliElementTypes; import org.jf.smalidea.psi.iface.SmaliModifierListOwner; import org.jf.smalidea.psi.stub.SmaliFieldStub; -import javax.annotation.Nonnull; - public class SmaliField extends SmaliStubBasedPsiElement implements PsiField, SmaliModifierListOwner { public SmaliField(@NotNull SmaliFieldStub stub) { super(stub, SmaliElementTypes.FIELD); @@ -55,14 +53,16 @@ public class SmaliField extends SmaliStubBasedPsiElement impleme super(node); } - @Nonnull @Override public String getName() { + @Nullable @Override public String getName() { SmaliFieldStub stub = getStub(); if (stub != null) { return stub.getName(); } SmaliMemberName smaliMemberName = findChildByClass(SmaliMemberName.class); - assert smaliMemberName != null; + if (smaliMemberName == null) { + return null; + } return smaliMemberName.getText(); } @@ -102,7 +102,11 @@ public class SmaliField extends SmaliStubBasedPsiElement impleme return factory.createTypeFromText(type, this); } PsiTypeElement typeElement = getTypeElement(); - assert typeElement != null; + if (typeElement == null) { + // If we don't have a type (i.e. syntax error), use Object as a safe-ish fallback + PsiElementFactory factory = JavaPsiFacade.getInstance(getProject()).getElementFactory(); + return factory.createTypeByFQClassName("java.lang.Object", getResolveScope()); + } return getTypeElement().getType(); } diff --git a/smalidea/src/main/java/org/jf/smalidea/psi/stub/SmaliFieldStub.java b/smalidea/src/main/java/org/jf/smalidea/psi/stub/SmaliFieldStub.java index 0e296243..9507c383 100644 --- a/smalidea/src/main/java/org/jf/smalidea/psi/stub/SmaliFieldStub.java +++ b/smalidea/src/main/java/org/jf/smalidea/psi/stub/SmaliFieldStub.java @@ -34,20 +34,21 @@ package org.jf.smalidea.psi.stub; import com.intellij.psi.stubs.StubBase; import com.intellij.psi.stubs.StubElement; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import org.jf.smalidea.psi.SmaliElementTypes; import org.jf.smalidea.psi.impl.SmaliField; public class SmaliFieldStub extends StubBase { - @NotNull private final String name; + @Nullable private final String name; @NotNull private final String type; - public SmaliFieldStub(StubElement parent, @NotNull String name, @NotNull String type) { + public SmaliFieldStub(StubElement parent, @Nullable String name, @NotNull String type) { super(parent, SmaliElementTypes.FIELD); this.name = name; this.type = type; } - @NotNull public String getName() { + @Nullable public String getName() { return name; } diff --git a/smalidea/src/main/java/org/jf/smalidea/psi/stub/element/SmaliFieldElementType.java b/smalidea/src/main/java/org/jf/smalidea/psi/stub/element/SmaliFieldElementType.java index f97d40bb..f4542a5b 100644 --- a/smalidea/src/main/java/org/jf/smalidea/psi/stub/element/SmaliFieldElementType.java +++ b/smalidea/src/main/java/org/jf/smalidea/psi/stub/element/SmaliFieldElementType.java @@ -36,6 +36,7 @@ import com.intellij.psi.stubs.IndexSink; import com.intellij.psi.stubs.StubElement; import com.intellij.psi.stubs.StubInputStream; import com.intellij.psi.stubs.StubOutputStream; +import com.intellij.util.io.StringRef; import org.jetbrains.annotations.NotNull; import org.jf.smalidea.psi.impl.SmaliField; import org.jf.smalidea.psi.stub.SmaliFieldStub; @@ -73,7 +74,13 @@ public class SmaliFieldElementType extends SmaliStubElementType + SmaliExtendsList(EXTENDS_LIST) + + SmaliImplementsList(IMPLEMENTS_LIST) + + SmaliField(FIELD) + SmaliModifierList(MODIFIER_LIST) + + PsiElement(FIELD_DIRECTIVE)('.field') + PsiElement(ACCESS_LIST) + + PsiErrorElement:no viable alternative at input '' + \ No newline at end of file