@@ -726,6 +726,56 @@ defmodule SpitfireTest do
726726 end
727727 end
728728
729+ test "parses structs" do
730+ codes = [
731+ { ~s'''
732+ %Foo.Bar{}
733+ ''' ,
734+ { :% , [ line: 1 , column: 1 ] ,
735+ [
736+ { :__aliases__ , [ last: [ line: 1 , column: 2 ] , line: 1 , column: 2 ] , [ :Foo , :Bar ] } ,
737+ { :%{} , [ closing: [ line: 1 , column: 6 ] , line: 1 , column: 5 ] , [ ] }
738+ ] } } ,
739+ { ~s' %Foo.Bar{name: "alice", height: 73}' ,
740+ { :% , [ line: 1 , column: 1 ] ,
741+ [
742+ { :__aliases__ , [ last: [ line: 1 , column: 6 ] , line: 1 , column: 2 ] , [ :Foo , :Bar ] } ,
743+ { :%{} , [ closing: [ line: 1 , column: 35 ] , line: 1 , column: 9 ] , [ name: "alice" , height: 73 ] }
744+ ] } } ,
745+ {
746+ ~s' %Foo.Bar{name: name, properties: %Properties{key: key, value: get_value()}}' ,
747+ { :% , [ line: 1 , column: 1 ] ,
748+ [
749+ { :__aliases__ , [ last: [ line: 1 , column: 6 ] , line: 1 , column: 2 ] , [ :Foo , :Bar ] } ,
750+ { :%{} , [ closing: [ line: 1 , column: 75 ] , line: 1 , column: 9 ] ,
751+ [
752+ name: { :name , [ line: 1 , column: 16 ] , Elixir } ,
753+ properties:
754+ { :% , [ line: 1 , column: 34 ] ,
755+ [
756+ { :__aliases__ , [ last: [ line: 1 , column: 35 ] , line: 1 , column: 35 ] , [ :Properties ] } ,
757+ { :%{} , [ closing: [ line: 1 , column: 74 ] , line: 1 , column: 45 ] ,
758+ [
759+ key: { :key , [ line: 1 , column: 51 ] , Elixir } ,
760+ value: { :get_value , [ closing: [ line: 1 , column: 73 ] , line: 1 , column: 63 ] , [ ] }
761+ ] }
762+ ] }
763+ ] }
764+ ] }
765+ } ,
766+ { ~S' %__MODULE__{foo: bar}' ,
767+ { :% , [ line: 1 , column: 1 ] ,
768+ [
769+ { :__MODULE__ , [ line: 1 , column: 2 ] , Elixir } ,
770+ { :%{} , [ closing: [ line: 1 , column: 21 ] , line: 1 , column: 12 ] , [ foo: { :bar , [ line: 1 , column: 18 ] , Elixir } ] }
771+ ] } }
772+ ]
773+
774+ for { code , expected } <- codes do
775+ assert Spitfire . parse ( code ) == { :ok , expected }
776+ end
777+ end
778+
729779 test "parses operators" do
730780 codes = [
731781 { ~s'''
@@ -2592,11 +2642,151 @@ defmodule SpitfireTest do
25922642 assert Spitfire . parse ( code ) == { :ok , expected }
25932643 end
25942644 end
2645+
2646+ test "parses special keywords" do
2647+ codes = [
2648+ { "__MODULE__" , { :__MODULE__ , [ line: 1 , column: 1 ] , Elixir } }
2649+ ]
2650+
2651+ for { code , expected } <- codes do
2652+ assert Spitfire . parse ( code ) == { :ok , expected }
2653+ end
2654+ end
2655+
2656+ test "from nextls test" do
2657+ code = ~S'''
2658+ defmodule Foo do
2659+ defstruct [:foo, bar: "yo"]
2660+
2661+ defmodule State do
2662+ defstruct [:yo]
2663+
2664+ def new(attrs) do
2665+ struct(%__MODULE__{}, attrs)
2666+ end
2667+ end
2668+
2669+ @spec run(any(), any(), any()) :: :something
2670+ def run(foo, bar, baz) do
2671+ :something
2672+ end
2673+ end
2674+ '''
2675+
2676+ assert Spitfire . parse ( code ) ==
2677+ { :ok ,
2678+ { :defmodule , [ do: [ line: 1 , column: 15 ] , end: [ line: 16 , column: 1 ] , line: 1 , column: 1 ] ,
2679+ [
2680+ { :__aliases__ , [ line: 1 , column: 11 ] , [ :Foo ] } ,
2681+ [
2682+ do:
2683+ { :__block__ , [ ] ,
2684+ [
2685+ { :defstruct ,
2686+ [
2687+ end_of_expression: [ newlines: 2 , line: 2 , column: 30 ] ,
2688+ line: 2 ,
2689+ column: 3
2690+ ] , [ [ :foo , { :bar , "yo" } ] ] } ,
2691+ { :defmodule ,
2692+ [
2693+ end_of_expression: [ newlines: 2 , line: 10 , column: 6 ] ,
2694+ do: [ line: 4 , column: 19 ] ,
2695+ end: [ line: 10 , column: 3 ] ,
2696+ line: 4 ,
2697+ column: 3
2698+ ] ,
2699+ [
2700+ { :__aliases__ , [ line: 4 , column: 13 ] , [ :State ] } ,
2701+ [
2702+ do:
2703+ { :__block__ , [ ] ,
2704+ [
2705+ { :defstruct ,
2706+ [
2707+ end_of_expression: [ newlines: 2 , line: 5 , column: 20 ] ,
2708+ line: 5 ,
2709+ column: 5
2710+ ] , [ [ :yo ] ] } ,
2711+ { :def ,
2712+ [
2713+ do: [ line: 7 , column: 20 ] ,
2714+ end: [ line: 9 , column: 5 ] ,
2715+ line: 7 ,
2716+ column: 5
2717+ ] ,
2718+ [
2719+ { :new , [ closing: [ line: 7 , column: 18 ] , line: 7 , column: 9 ] ,
2720+ [ { :attrs , [ line: 7 , column: 13 ] , Elixir } ] } ,
2721+ [
2722+ do:
2723+ { :struct , [ closing: [ line: 8 , column: 34 ] , line: 8 , column: 7 ] ,
2724+ [
2725+ { :% , [ line: 8 , column: 14 ] ,
2726+ [
2727+ { :__MODULE__ , [ line: 8 , column: 15 ] , Elixir } ,
2728+ { :%{} ,
2729+ [
2730+ closing: [ line: 8 , column: 26 ] ,
2731+ line: 8 ,
2732+ column: 25
2733+ ] , [ ] }
2734+ ] } ,
2735+ { :attrs , [ line: 8 , column: 29 ] , Elixir }
2736+ ] }
2737+ ]
2738+ ] }
2739+ ] }
2740+ ]
2741+ ] } ,
2742+ { :@ ,
2743+ [
2744+ end_of_expression: [ newlines: 1 , line: 12 , column: 47 ] ,
2745+ line: 12 ,
2746+ column: 3
2747+ ] ,
2748+ [
2749+ { :spec , [ line: 12 , column: 4 ] ,
2750+ [
2751+ { :"::" , [ line: 12 , column: 34 ] ,
2752+ [
2753+ { :run , [ closing: [ line: 12 , column: 32 ] , line: 12 , column: 9 ] ,
2754+ [
2755+ { :any , [ closing: [ line: 12 , column: 17 ] , line: 12 , column: 13 ] , [ ] } ,
2756+ { :any , [ closing: [ line: 12 , column: 24 ] , line: 12 , column: 20 ] , [ ] } ,
2757+ { :any , [ closing: [ line: 12 , column: 31 ] , line: 12 , column: 27 ] , [ ] }
2758+ ] } ,
2759+ :something
2760+ ] }
2761+ ] }
2762+ ] } ,
2763+ { :def ,
2764+ [
2765+ do: [ line: 13 , column: 26 ] ,
2766+ end: [ line: 15 , column: 3 ] ,
2767+ line: 13 ,
2768+ column: 3
2769+ ] ,
2770+ [
2771+ { :run , [ closing: [ line: 13 , column: 24 ] , line: 13 , column: 7 ] ,
2772+ [
2773+ { :foo , [ line: 13 , column: 11 ] , Elixir } ,
2774+ { :bar , [ line: 13 , column: 16 ] , Elixir } ,
2775+ { :baz , [ line: 13 , column: 21 ] , Elixir }
2776+ ] } ,
2777+ [ do: :something ]
2778+ ] }
2779+ ] }
2780+ ]
2781+ ] } }
2782+ end
25952783 end
25962784
25972785 describe "code with errors" do
2786+ # TODO: this needs a change to the tokenizer i believe, or a way to splice out the unknown token
2787+ @ tag :skip
25982788 test "unknown prefix operator" do
2599- code = "foo % bar"
2789+ code = "foo $ bar, baz "
26002790
26012791 assert Spitfire . parse ( code ) ==
26022792 { :error , { :foo , [ line: 1 , column: 1 ] , [ { :__error__ , [ line: 1 , column: 5 ] , [ "unknown token: %" ] } ] } ,
0 commit comments