Fix parser.

This commit is contained in:
Rik van der Kleij 2019-02-12 20:26:11 +01:00
parent ed4438ad2b
commit cf722eb316
6 changed files with 43 additions and 25 deletions

View File

@ -2943,7 +2943,7 @@ public class HaskellParser implements PsiParser, LightPsiParser {
}
/* ********************************************************** */
// ((file_header_pragma | options_ghc_pragma) onl)*
// (file_header_pragma onl)*
public static boolean file_header(PsiBuilder b, int l) {
if (!recursion_guard_(b, l, "file_header")) return false;
Marker m = enter_section_(b, l, _NONE_, HS_FILE_HEADER, "<file header>");
@ -2956,35 +2956,51 @@ public class HaskellParser implements PsiParser, LightPsiParser {
return true;
}
// (file_header_pragma | options_ghc_pragma) onl
// file_header_pragma onl
private static boolean file_header_0(PsiBuilder b, int l) {
if (!recursion_guard_(b, l, "file_header_0")) return false;
boolean r;
Marker m = enter_section_(b);
r = file_header_0_0(b, l + 1);
r = file_header_pragma(b, l + 1);
r = r && onl(b, l + 1);
exit_section_(b, m, null, r);
return r;
}
// file_header_pragma | options_ghc_pragma
private static boolean file_header_0_0(PsiBuilder b, int l) {
if (!recursion_guard_(b, l, "file_header_0_0")) return false;
/* ********************************************************** */
// pragma NEWLINE | options_ghc_pragma NEWLINE | pragma | options_ghc_pragma
public static boolean file_header_pragma(PsiBuilder b, int l) {
if (!recursion_guard_(b, l, "file_header_pragma")) return false;
if (!nextTokenIs(b, "<file header pragma>", HS_OPTIONS_GHC, HS_PRAGMA_START)) return false;
boolean r;
r = file_header_pragma(b, l + 1);
Marker m = enter_section_(b, l, _NONE_, HS_FILE_HEADER_PRAGMA, "<file header pragma>");
r = file_header_pragma_0(b, l + 1);
if (!r) r = file_header_pragma_1(b, l + 1);
if (!r) r = pragma(b, l + 1);
if (!r) r = options_ghc_pragma(b, l + 1);
exit_section_(b, l, m, r, false, null);
return r;
}
/* ********************************************************** */
// pragma
public static boolean file_header_pragma(PsiBuilder b, int l) {
if (!recursion_guard_(b, l, "file_header_pragma")) return false;
if (!nextTokenIs(b, HS_PRAGMA_START)) return false;
// pragma NEWLINE
private static boolean file_header_pragma_0(PsiBuilder b, int l) {
if (!recursion_guard_(b, l, "file_header_pragma_0")) return false;
boolean r;
Marker m = enter_section_(b);
r = pragma(b, l + 1);
exit_section_(b, m, HS_FILE_HEADER_PRAGMA, r);
r = r && consumeToken(b, HS_NEWLINE);
exit_section_(b, m, null, r);
return r;
}
// options_ghc_pragma NEWLINE
private static boolean file_header_pragma_1(PsiBuilder b, int l) {
if (!recursion_guard_(b, l, "file_header_pragma_1")) return false;
boolean r;
Marker m = enter_section_(b);
r = options_ghc_pragma(b, l + 1);
r = r && consumeToken(b, HS_NEWLINE);
exit_section_(b, m, null, r);
return r;
}

View File

@ -10,7 +10,4 @@ public interface HaskellFileHeader extends HaskellCompositeElement {
@NotNull
List<HaskellFileHeaderPragma> getFileHeaderPragmaList();
@NotNull
List<HaskellOptionsGhcPragma> getOptionsGhcPragmaList();
}

View File

@ -2,6 +2,7 @@
package intellij.haskell.psi;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.List;
@ -10,4 +11,7 @@ public interface HaskellFileHeaderPragma extends HaskellCompositeElement {
@NotNull
List<HaskellGeneralPragmaContent> getGeneralPragmaContentList();
@Nullable
HaskellOptionsGhcPragma getOptionsGhcPragma();
}

View File

@ -6,7 +6,6 @@ import com.intellij.psi.PsiElementVisitor;
import com.intellij.psi.util.PsiTreeUtil;
import intellij.haskell.psi.HaskellFileHeader;
import intellij.haskell.psi.HaskellFileHeaderPragma;
import intellij.haskell.psi.HaskellOptionsGhcPragma;
import intellij.haskell.psi.HaskellVisitor;
import org.jetbrains.annotations.NotNull;
@ -33,10 +32,4 @@ public class HaskellFileHeaderImpl extends HaskellCompositeElementImpl implement
return PsiTreeUtil.getChildrenOfTypeAsList(this, HaskellFileHeaderPragma.class);
}
@Override
@NotNull
public List<HaskellOptionsGhcPragma> getOptionsGhcPragmaList() {
return PsiTreeUtil.getChildrenOfTypeAsList(this, HaskellOptionsGhcPragma.class);
}
}

View File

@ -6,8 +6,10 @@ import com.intellij.psi.PsiElementVisitor;
import com.intellij.psi.util.PsiTreeUtil;
import intellij.haskell.psi.HaskellFileHeaderPragma;
import intellij.haskell.psi.HaskellGeneralPragmaContent;
import intellij.haskell.psi.HaskellOptionsGhcPragma;
import intellij.haskell.psi.HaskellVisitor;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.List;
@ -32,4 +34,10 @@ public class HaskellFileHeaderPragmaImpl extends HaskellCompositeElementImpl imp
return PsiTreeUtil.getChildrenOfTypeAsList(this, HaskellGeneralPragmaContent.class);
}
@Override
@Nullable
public HaskellOptionsGhcPragma getOptionsGhcPragma() {
return PsiTreeUtil.getChildOfType(this, HaskellOptionsGhcPragma.class);
}
}

View File

@ -56,9 +56,9 @@ program ::= onl shebang_line? onl file_header onl module_bod
shebang_line ::= "#!" general_id+
options_ghc_pragma ::= OPTIONS_GHC
file_header ::= ((file_header_pragma | options_ghc_pragma) onl)*
file_header ::= (file_header_pragma onl)*
private pragma ::= PRAGMA_START (onl CON_ID? onl general_pragma_content? onl PRAGMA_END)+ {pin=1}
file_header_pragma ::= pragma
file_header_pragma ::= pragma NEWLINE | options_ghc_pragma NEWLINE | pragma | options_ghc_pragma
other_pragma ::= pragma