@@ -2607,7 +2607,7 @@ defmodule SpitfireTest do
26072607 <% end %>
26082608 '''
26092609
2610- assert Spitfire . parse ( code ) == { :error , :no_fuel_remaining }
2610+ assert { :error , _ast , _errors } = Spitfire . parse ( code )
26112611 end
26122612
26132613 test "doesn't drop the cursor node" do
@@ -2883,6 +2883,202 @@ defmodule SpitfireTest do
28832883
28842884 assert { :error , _ast , [ { [ line: 1 , column: 4 ] , "missing closing parentheses" } ] } = Spitfire . parse ( code )
28852885 end
2886+
2887+ test "missing braces for struct" do
2888+ assert { :error ,
2889+ { := , [ line: 1 , column: 6 ] ,
2890+ [
2891+ { :% , [ line: 1 , column: 1 ] ,
2892+ [
2893+ { :__aliases__ , [ last: [ line: 1 , column: 2 ] , line: 1 , column: 2 ] , [ :Foo ] } ,
2894+ { :%{} , [ ] , [ ] }
2895+ ] } ,
2896+ { :x , [ line: 1 , column: 8 ] , nil }
2897+ ] } ,
2898+ [ { [ line: 1 , column: 2 ] , "missing opening brace for struct %Foo" } ] } ==
2899+ Spitfire . parse ( "%Foo = x" )
2900+
2901+ assert { :error ,
2902+ { :% , [ line: 1 , column: 1 ] ,
2903+ [
2904+ { :__aliases__ , [ last: [ line: 1 , column: 2 ] , line: 1 , column: 2 ] , [ :Foo ] } ,
2905+ { :%{} , [ ] , [ ] }
2906+ ] } ,
2907+ [ { [ line: 1 , column: 2 ] , "missing opening brace for struct %Foo" } ] } ==
2908+ Spitfire . parse ( "%Foo" )
2909+
2910+ assert { :error ,
2911+ { := , [ line: 1 , column: 10 ] ,
2912+ [
2913+ { :% , [ line: 1 , column: 1 ] ,
2914+ [
2915+ { :__aliases__ , [ last: [ line: 1 , column: 6 ] , line: 1 , column: 2 ] , [ :Foo , :Bar ] } ,
2916+ { :%{} , [ ] , [ ] }
2917+ ] } ,
2918+ { :x , [ line: 1 , column: 12 ] , nil }
2919+ ] } ,
2920+ [ { [ line: 1 , column: 6 ] , "missing opening brace for struct %Foo.Bar" } ] } ==
2921+ Spitfire . parse ( "%Foo.Bar = x" )
2922+
2923+ assert { :error ,
2924+ { := , [ line: 1 , column: 13 ] ,
2925+ [
2926+ { :% , [ line: 1 , column: 1 ] ,
2927+ [
2928+ { :__aliases__ , [ last: [ line: 1 , column: 2 ] , line: 1 , column: 2 ] , [ :Foo ] } ,
2929+ { :%{} , [ closing: [ line: 1 , column: 11 ] , line: 1 , column: 6 ] , [ a: 42 ] }
2930+ ] } ,
2931+ { :x , [ line: 1 , column: 15 ] , nil }
2932+ ] } ,
2933+ [ { [ line: 1 , column: 2 ] , "missing opening brace for struct %Foo" } ] } ==
2934+ Spitfire . parse ( "%Foo a: 42} = x" )
2935+
2936+ assert { :error ,
2937+ { :% , [ line: 1 , column: 1 ] ,
2938+ [
2939+ { :__aliases__ , [ last: [ line: 1 , column: 2 ] , line: 1 , column: 2 ] , [ :Foo ] } ,
2940+ { :%{} , [ line: 1 , column: 6 ] , [ a: 1 ] }
2941+ ] } ,
2942+ [
2943+ { [ line: 1 , column: 2 ] , "missing opening brace for struct %Foo" } ,
2944+ { [ line: 1 , column: 9 ] , "missing closing brace for struct %Foo" }
2945+ ] } == Spitfire . parse ( "%Foo a: 1" )
2946+
2947+ assert { :error ,
2948+ { :% , [ line: 1 , column: 1 ] ,
2949+ [
2950+ { :__aliases__ , [ last: [ line: 1 , column: 2 ] , line: 1 , column: 2 ] , [ :Foo ] } ,
2951+ { :%{} , [ closing: [ line: 1 , column: 16 ] , line: 1 , column: 6 ] , [ a: 1 , b: 2 ] }
2952+ ] } ,
2953+ [ { [ line: 1 , column: 2 ] , "missing opening brace for struct %Foo" } ] } ==
2954+ Spitfire . parse ( "%Foo a: 1, b: 2}" )
2955+
2956+ assert { :error ,
2957+ { :% , [ line: 1 , column: 1 ] ,
2958+ [
2959+ { :__aliases__ , [ last: [ line: 1 , column: 2 ] , line: 1 , column: 2 ] , [ :Foo ] } ,
2960+ { :%{} , [ closing: [ line: 1 , column: 14 ] , line: 1 , column: 6 ] ,
2961+ [ { :| , [ line: 1 , column: 8 ] , [ { :x , [ line: 1 , column: 6 ] , nil } , [ a: 1 ] ] } ] }
2962+ ] } ,
2963+ [ { [ line: 1 , column: 2 ] , "missing opening brace for struct %Foo" } ] } ==
2964+ Spitfire . parse ( "%Foo x | a: 1}" )
2965+
2966+ assert { :error ,
2967+ { :% , [ line: 1 , column: 1 ] ,
2968+ [
2969+ { :__aliases__ , [ last: [ line: 1 , column: 2 ] , line: 1 , column: 2 ] , [ :Foo ] } ,
2970+ { :%{} , [ line: 1 , column: 6 ] , [ { :| , [ line: 1 , column: 8 ] , [ { :x , [ line: 1 , column: 6 ] , nil } , [ a: 1 ] ] } ] }
2971+ ] } ,
2972+ [
2973+ { [ line: 1 , column: 2 ] , "missing opening brace for struct %Foo" } ,
2974+ { [ line: 1 , column: 13 ] , "missing closing brace for struct %Foo" }
2975+ ] } == Spitfire . parse ( "%Foo x | a: 1" )
2976+
2977+ assert { :error ,
2978+ { :foo , [ closing: [ line: 1 , column: 15 ] , line: 1 , column: 1 ] ,
2979+ [
2980+ { :% , [ line: 1 , column: 5 ] ,
2981+ [
2982+ { :__aliases__ , [ last: [ line: 1 , column: 6 ] , line: 1 , column: 6 ] , [ :Bar ] } ,
2983+ { :%{} , [ closing: [ line: 1 , column: 14 ] , line: 1 , column: 10 ] , [ a: 1 ] }
2984+ ] }
2985+ ] } ,
2986+ [ { [ line: 1 , column: 6 ] , "missing opening brace for struct %Bar" } ] } ==
2987+ Spitfire . parse ( "foo(%Bar a: 1})" )
2988+
2989+ assert { :error ,
2990+ { :|> , [ line: 1 , column: 3 ] ,
2991+ [
2992+ { :x , [ line: 1 , column: 1 ] , nil } ,
2993+ { :% , [ line: 1 , column: 6 ] ,
2994+ [
2995+ { :__aliases__ , [ last: [ line: 1 , column: 7 ] , line: 1 , column: 7 ] , [ :Foo ] } ,
2996+ { :%{} , [ closing: [ line: 1 , column: 15 ] , line: 1 , column: 11 ] , [ a: 1 ] }
2997+ ] }
2998+ ] } ,
2999+ [ { [ line: 1 , column: 7 ] , "missing opening brace for struct %Foo" } ] } ==
3000+ Spitfire . parse ( "x |> %Foo a: 1}" )
3001+
3002+ # Nested structs
3003+ assert { :error ,
3004+ { :% , [ line: 1 , column: 1 ] ,
3005+ [
3006+ { :__aliases__ , [ last: [ line: 1 , column: 2 ] , line: 1 , column: 2 ] , [ :Outer ] } ,
3007+ { :%{} , [ closing: [ line: 1 , column: 26 ] , line: 1 , column: 7 ] ,
3008+ [
3009+ inner:
3010+ { :% , [ line: 1 , column: 15 ] ,
3011+ [
3012+ { :__aliases__ , [ last: [ line: 1 , column: 16 ] , line: 1 , column: 16 ] , [ :Inner ] } ,
3013+ { :%{} , [ closing: [ line: 1 , column: 26 ] , line: 1 , column: 22 ] , [ a: 1 ] }
3014+ ] }
3015+ ] }
3016+ ] } ,
3017+ [
3018+ { [ line: 1 , column: 16 ] , "missing opening brace for struct %Inner" } ,
3019+ { [ line: 1 , column: 26 ] , "missing closing brace for struct %Outer" }
3020+ ] } == Spitfire . parse ( "%Outer{inner: %Inner a: 1}" )
3021+
3022+ assert { :error ,
3023+ { :% , [ line: 1 , column: 1 ] ,
3024+ [
3025+ { :__aliases__ , [ last: [ line: 1 , column: 2 ] , line: 1 , column: 2 ] , [ :Outer ] } ,
3026+ { :%{} , [ closing: [ line: 1 , column: 27 ] , line: 1 , column: 8 ] ,
3027+ [
3028+ inner:
3029+ { :% , [ line: 1 , column: 15 ] ,
3030+ [
3031+ { :__aliases__ , [ last: [ line: 1 , column: 16 ] , line: 1 , column: 16 ] , [ :Inner ] } ,
3032+ { :%{} , [ closing: [ line: 1 , column: 26 ] , line: 1 , column: 21 ] , [ a: 1 ] }
3033+ ] }
3034+ ] }
3035+ ] } ,
3036+ [ { [ line: 1 , column: 2 ] , "missing opening brace for struct %Outer" } ] } ==
3037+ Spitfire . parse ( "%Outer inner: %Inner{a: 1}}" )
3038+
3039+ assert { :error ,
3040+ { :% , [ line: 1 , column: 1 ] ,
3041+ [
3042+ { :__aliases__ , [ last: [ line: 1 , column: 2 ] , line: 1 , column: 2 ] , [ :Outer ] } ,
3043+ { :%{} , [ closing: [ line: 1 , column: 27 ] , line: 1 , column: 8 ] ,
3044+ [
3045+ inner:
3046+ { :% , [ line: 1 , column: 15 ] ,
3047+ [
3048+ { :__aliases__ , [ last: [ line: 1 , column: 16 ] , line: 1 , column: 16 ] , [ :Inner ] } ,
3049+ { :%{} , [ closing: [ line: 1 , column: 26 ] , line: 1 , column: 22 ] , [ a: 1 ] }
3050+ ] }
3051+ ] }
3052+ ] } ,
3053+ [
3054+ { [ line: 1 , column: 2 ] , "missing opening brace for struct %Outer" } ,
3055+ { [ line: 1 , column: 16 ] , "missing opening brace for struct %Inner" }
3056+ ] } == Spitfire . parse ( "%Outer inner: %Inner a: 1}}" )
3057+
3058+ # Module attribute struct
3059+ assert { :error ,
3060+ { :% , [ line: 1 , column: 1 ] ,
3061+ [
3062+ { :@ , [ line: 1 , column: 2 ] , [ { :foo , [ line: 1 , column: 3 ] , nil } ] } ,
3063+ { :%{} , [ line: 1 , column: 7 ] , [ a: 1 ] }
3064+ ] } ,
3065+ [
3066+ { [ line: 1 , column: 3 ] , "missing opening brace for struct %@foo" } ,
3067+ { [ line: 1 , column: 10 ] , "missing closing brace for struct %@foo" }
3068+ ] } == Spitfire . parse ( "%@foo a: 1" )
3069+
3070+ # __MODULE__ struct
3071+ assert { :error ,
3072+ { :% , [ line: 1 , column: 1 ] ,
3073+ [
3074+ { :__MODULE__ , [ line: 1 , column: 2 ] , nil } ,
3075+ { :%{} , [ line: 1 , column: 13 ] , [ a: 1 ] }
3076+ ] } ,
3077+ [
3078+ { [ line: 1 , column: 2 ] , "missing opening brace for struct %__MODULE__" } ,
3079+ { [ line: 1 , column: 16 ] , "missing closing brace for struct %__MODULE__" }
3080+ ] } == Spitfire . parse ( "%__MODULE__ a: 1" )
3081+ end
28863082 end
28873083
28883084 describe "&parse_with_comments/2" do
0 commit comments