Skip to content

Commit

Permalink
refs #411; parse BlockArguments
Browse files Browse the repository at this point in the history
  • Loading branch information
carymrobbins committed Nov 27, 2019
1 parent c16ca89 commit 6ee68ba
Show file tree
Hide file tree
Showing 10 changed files with 573 additions and 176 deletions.
338 changes: 167 additions & 171 deletions gen/com/haskforce/parser/HaskellParser.java

Large diffs are not rendered by default.

1 change: 1 addition & 0 deletions resources/META-INF/plugin.xml
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
<b>v0.3.44</b>
<ul>
<li>Detect stack 2 build task dependency source links (#409)</li>
<li>Parse BlockArguments (#411)</li>
</ul>
<b>v0.3.43</b>
<ul>
Expand Down
13 changes: 8 additions & 5 deletions src/com/haskforce/Haskell.bnf
Original file line number Diff line number Diff line change
Expand Up @@ -410,12 +410,7 @@ private infixexp0 ::= '-'* lexp
letexp ::= "let" decls ["in" exp]

private lexp ::= LCASETOK altslist
| '\' (apat | thaexp)+ "->" exp
| letexp
| "if" exp [semi] "then" exp [semi] "else" exp
| "case" exp "of" altslist
| "do" open stmts close
| "mdo" open stmts close
// proc might just be a variable name.
| "proc" (aexp "->" exp | aexp*)
| aexp+ {pin(".*")=2}
Expand All @@ -424,6 +419,14 @@ private aexp ::= parensplice exp i ')'
| singlequote i (qvar | qcon)
| idsplice
| thquote i qcon

// Parsing these here to handle BlockArguments
| '\' (apat | thaexp)+ "->" exp
| "if" exp [semi] "then" exp [semi] "else" exp
| "case" exp "of" altslist
| "do" open stmts close
| "mdo" open stmts close

| literal
| thaexp
| '(#' i '#)'
Expand Down
1 change: 1 addition & 0 deletions tests/com/haskforce/highlighting/HaskellLexerTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ public HaskellLexerTest() {

/* Borrow the test inputs from ParserTest. */
public void testArrow00001() { doTest(true, true); }
public void testBlockArguments00001() { doTest(true, true); }
public void testCase00001() { doTest(true, true); }
public void testDefaultSignatures00001() { doTest(true, true); }
public void testDerivingStrategies00001() { doTest(true, true); }
Expand Down
1 change: 1 addition & 0 deletions tests/com/haskforce/parser/HaskellParserTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ public HaskellParserTest() {
public void testAStack00001() { doTest(true, true); }

public void testArrow00001() { doTest(true, true); }
public void testBlockArguments00001() { doTest(true, true); }
public void testCase00001() { doTest(true, true); }
public void testCPP00001() { doTest(true, true); }
public void testDefaultSignatures00001() { doTest(true, true); }
Expand Down
1 change: 1 addition & 0 deletions tests/com/haskforce/parser/HaskellParsingLexerTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ protected Lexer createLexer() {

/* Borrow the test inputs from ParserTest. */
public void testArrow00001() { doTest(true, true); }
public void testBlockArguments00001() { doTest(true, true); }
public void testCase00001() { doTest(true, true); }
public void testDefaultSignatures00001() { doTest(true, true); }
public void testDerivingStrategies00001() { doTest(true, true); }
Expand Down
91 changes: 91 additions & 0 deletions tests/gold/lexer/expected/BlockArguments00001.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,91 @@
HaskellTokenType.module ('module')
WHITE_SPACE (' ')
HaskellTokenType.conidRegexp ('BlockArguments00001')
WHITE_SPACE (' ')
HaskellTokenType.where ('where')
WHITE_SPACE ('\n\n')
HaskellTokenType.varidRegexp ('spec')
WHITE_SPACE (' ')
HaskellTokenType.:: ('::')
WHITE_SPACE (' ')
HaskellTokenType.conidRegexp ('Spec')
WHITE_SPACE ('\n')
HaskellTokenType.varidRegexp ('spec')
WHITE_SPACE (' ')
HaskellTokenType.= ('=')
WHITE_SPACE (' ')
HaskellTokenType.do ('do')
WHITE_SPACE ('\n ')
HaskellTokenType.varidRegexp ('describe')
WHITE_SPACE (' ')
HaskellTokenType." ('"')
HaskellTokenType.STRINGTOKEN ('BlockArguments')
HaskellTokenType." ('"')
WHITE_SPACE (' ')
HaskellTokenType.do ('do')
WHITE_SPACE ('\n ')
HaskellTokenType.varidRegexp ('it')
WHITE_SPACE (' ')
HaskellTokenType." ('"')
HaskellTokenType.STRINGTOKEN ('is parsed in HaskForce')
HaskellTokenType." ('"')
WHITE_SPACE (' ')
HaskellTokenType.Varsym ('$')
WHITE_SPACE (' ')
HaskellTokenType.varidRegexp ('test')
WHITE_SPACE (' ')
HaskellTokenType.\ ('\')
HaskellTokenType.conidRegexp ('Resources')
WHITE_SPACE (' ')
HaskellTokenType.{ ('{')
WHITE_SPACE (' ')
HaskellTokenType... ('..')
WHITE_SPACE (' ')
HaskellTokenType.} ('}')
WHITE_SPACE (' ')
HaskellTokenType.-> ('->')
WHITE_SPACE (' ')
HaskellTokenType.do ('do')
WHITE_SPACE ('\n ')
HaskellTokenType.varidRegexp ('thing')
WHITE_SPACE (' ')
HaskellTokenType.Infix varid ('`shouldReturn`')
WHITE_SPACE (' ')
HaskellTokenType.[ ('[')
HaskellTokenType.] (']')
WHITE_SPACE ('\n ')
HaskellTokenType.varidRegexp ('other')
WHITE_SPACE (' ')
HaskellTokenType.Varsym ('>>=')
WHITE_SPACE (' ')
HaskellTokenType.varidRegexp ('expectPatternM')
WHITE_SPACE (' ')
HaskellTokenType.\ ('\')
HaskellTokenType.[ ('[')
HaskellTokenType.conidRegexp ('Obj')
WHITE_SPACE (' ')
HaskellTokenType.{ ('{')
WHITE_SPACE (' ')
HaskellTokenType.varidRegexp ('foo')
HaskellTokenType., (',')
WHITE_SPACE (' ')
HaskellTokenType.varidRegexp ('bar')
WHITE_SPACE (' ')
HaskellTokenType.} ('}')
HaskellTokenType.] (']')
WHITE_SPACE (' ')
HaskellTokenType.-> ('->')
WHITE_SPACE (' ')
HaskellTokenType.do ('do')
WHITE_SPACE ('\n ')
HaskellTokenType.varidRegexp ('foo')
WHITE_SPACE (' ')
HaskellTokenType.Infix varid ('`shouldBe`')
WHITE_SPACE (' ')
HaskellTokenType.integertoken ('1')
WHITE_SPACE ('\n ')
HaskellTokenType.varidRegexp ('bar')
WHITE_SPACE (' ')
HaskellTokenType.Infix varid ('`shouldBe`')
WHITE_SPACE (' ')
HaskellTokenType.chartoken (''b'')
10 changes: 10 additions & 0 deletions tests/gold/parser/BlockArguments00001.hs
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
module BlockArguments00001 where

spec :: Spec
spec = do
describe "BlockArguments" do
it "is parsed in HaskForce" $ test \Resources { .. } -> do
thing `shouldReturn` []
other >>= expectPatternM \[Obj { foo, bar }] -> do
foo `shouldBe` 1
bar `shouldBe` 'b'
148 changes: 148 additions & 0 deletions tests/gold/parser/expected/BlockArguments00001.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,148 @@
Haskell File
MODULEDECL
PsiElement(HaskellTokenType.module)('module')
QCONID
CONID
PsiElement(HaskellTokenType.conidRegexp)('BlockArguments00001')
PsiElement(HaskellTokenType.where)('where')
BODY
GENDECL
VARS
VARID
PsiElement(HaskellTokenType.varidRegexp)('spec')
PsiElement(HaskellTokenType.::)('::')
CTYPE
TYPEE
ATYPE
OQTYCON
QTYCON
TYCON
CONID
PsiElement(HaskellTokenType.conidRegexp)('Spec')
FUNORPATDECL
PAT
VARID
PsiElement(HaskellTokenType.varidRegexp)('spec')
RHS
PsiElement(HaskellTokenType.=)('=')
EXP
PsiElement(HaskellTokenType.do)('do')
STMTS
EXP
QVAR
QVARID
VARID
PsiElement(HaskellTokenType.varidRegexp)('describe')
PSTRINGTOKEN
PsiElement(HaskellTokenType.")('"')
PsiElement(HaskellTokenType.STRINGTOKEN)('BlockArguments')
PsiElement(HaskellTokenType.")('"')
PsiElement(HaskellTokenType.do)('do')
STMTS
EXP
QVAR
QVARID
VARID
PsiElement(HaskellTokenType.varidRegexp)('it')
PSTRINGTOKEN
PsiElement(HaskellTokenType.")('"')
PsiElement(HaskellTokenType.STRINGTOKEN)('is parsed in HaskForce')
PsiElement(HaskellTokenType.")('"')
QOP
QVAROP
QVARSYM
VARSYM
PsiElement(HaskellTokenType.$)('$')
QVAR
QVARID
VARID
PsiElement(HaskellTokenType.varidRegexp)('test')
PsiElement(HaskellTokenType.\)('\')
QCON
QCONID
CONID
PsiElement(HaskellTokenType.conidRegexp)('Resources')
PsiElement(HaskellTokenType.{)('{')
PsiElement(HaskellTokenType...)('..')
PsiElement(HaskellTokenType.})('}')
PsiElement(HaskellTokenType.->)('->')
EXP
PsiElement(HaskellTokenType.do)('do')
STMTS
EXP
QVAR
QVARID
VARID
PsiElement(HaskellTokenType.varidRegexp)('thing')
QOP
QVAROP
PsiElement(HaskellTokenType.`)('`')
QVARID
VARID
PsiElement(HaskellTokenType.varidRegexp)('shouldReturn')
PsiElement(HaskellTokenType.`)('`')
PsiElement(HaskellTokenType.[)('[')
PsiElement(HaskellTokenType.])(']')
EXP
QVAR
QVARID
VARID
PsiElement(HaskellTokenType.varidRegexp)('other')
QOP
QVAROP
QVARSYM
VARSYM
PsiElement(HaskellTokenType.Varsym)('>>=')
QVAR
QVARID
VARID
PsiElement(HaskellTokenType.varidRegexp)('expectPatternM')
PsiElement(HaskellTokenType.\)('\')
PsiElement(HaskellTokenType.[)('[')
PAT
QCON
QCONID
CONID
PsiElement(HaskellTokenType.conidRegexp)('Obj')
PsiElement(HaskellTokenType.{)('{')
QVAR
QVARID
VARID
PsiElement(HaskellTokenType.varidRegexp)('foo')
PsiElement(HaskellTokenType.,)(',')
QVAR
QVARID
VARID
PsiElement(HaskellTokenType.varidRegexp)('bar')
PsiElement(HaskellTokenType.})('}')
PsiElement(HaskellTokenType.])(']')
PsiElement(HaskellTokenType.->)('->')
EXP
PsiElement(HaskellTokenType.do)('do')
STMTS
EXP
QVAR
QVARID
VARID
PsiElement(HaskellTokenType.varidRegexp)('foo')
QOP
QVAROP
PsiElement(HaskellTokenType.`)('`')
QVARID
VARID
PsiElement(HaskellTokenType.varidRegexp)('shouldBe')
PsiElement(HaskellTokenType.`)('`')
PsiElement(HaskellTokenType.integertoken)('1')
EXP
QVAR
QVARID
VARID
PsiElement(HaskellTokenType.varidRegexp)('bar')
QOP
QVAROP
PsiElement(HaskellTokenType.`)('`')
QVARID
VARID
PsiElement(HaskellTokenType.varidRegexp)('shouldBe')
PsiElement(HaskellTokenType.`)('`')
PsiElement(HaskellTokenType.chartoken)(''b'')
Loading

0 comments on commit 6ee68ba

Please sign in to comment.