github.com/nevalang/neva@v0.23.1-0.20240507185603-7696a9bb8dda/internal/compiler/parser/listener.go (about) 1 package parser 2 3 import ( 4 "strings" 5 6 "github.com/nevalang/neva/internal/compiler" 7 generated "github.com/nevalang/neva/internal/compiler/parser/generated" 8 src "github.com/nevalang/neva/internal/compiler/sourcecode" 9 ) 10 11 func (s *treeShapeListener) EnterProg(actx *generated.ProgContext) { 12 s.file.Entities = map[string]src.Entity{} 13 s.file.Imports = map[string]src.Import{} 14 } 15 16 /* --- Import --- */ 17 18 func (s *treeShapeListener) EnterUseStmt(actx *generated.ImportStmtContext) { 19 imports := actx.AllImportDef() 20 if len(s.file.Imports) == 0 { // there could be multiple use statements in the file 21 s.file.Imports = make(map[string]src.Import, len(imports)) 22 } 23 } 24 25 func (s *treeShapeListener) EnterImportDef(actx *generated.ImportDefContext) { 26 path := actx.ImportPath() 27 pkgName := path.ImportPathPkg().GetText() 28 29 var modName string 30 if path.ImportPathMod() != nil { 31 modName = path.ImportPathMod().GetText() 32 } else { 33 modName = "std" 34 } 35 36 var alias string 37 if tmp := actx.ImportAlias(); tmp != nil { 38 alias = tmp.GetText() 39 } else { 40 parts := strings.Split(pkgName, "/") 41 alias = parts[len(parts)-1] 42 } 43 44 s.file.Imports[alias] = src.Import{ 45 Module: modName, 46 Package: pkgName, 47 } 48 } 49 50 /* --- Types --- */ 51 52 func (s *treeShapeListener) EnterTypeStmt(actx *generated.TypeStmtContext) { 53 single := actx.SingleTypeStmt() 54 55 if single != nil { 56 typeDef := single.TypeDef() 57 58 v, err := parseTypeDef(typeDef) 59 if err != nil { 60 panic(compiler.Error{Location: &s.loc}.Wrap(err)) 61 } 62 63 parsedEntity := v 64 parsedEntity.IsPublic = single.PUB_KW() != nil 65 name := typeDef.IDENTIFIER().GetText() 66 s.file.Entities[name] = parsedEntity 67 return 68 } 69 70 group := actx.GroupTypeStmt() 71 for i, typeDef := range group.AllTypeDef() { 72 parsedEntity, err := parseTypeDef(typeDef) 73 if err != nil { 74 panic(compiler.Error{Location: &s.loc}.Wrap(err)) 75 } 76 parsedEntity.IsPublic = group.PUB_KW(i) != nil 77 name := typeDef.IDENTIFIER().GetText() 78 s.file.Entities[name] = parsedEntity 79 } 80 } 81 82 /* --- Constants --- */ 83 84 func (s *treeShapeListener) EnterSingleConstStmt(actx *generated.SingleConstStmtContext) { 85 constDef := actx.ConstDef() 86 parsedEntity, err := parseConstDef(constDef) 87 if err != nil { 88 panic(compiler.Error{Location: &s.loc}.Wrap(err)) 89 } 90 parsedEntity.IsPublic = actx.PUB_KW() != nil 91 name := constDef.IDENTIFIER().GetText() 92 s.file.Entities[name] = parsedEntity 93 } 94 95 func (s *treeShapeListener) EnterGroupConstStmt(actx *generated.GroupConstStmtContext) { 96 for i, constDef := range actx.AllConstDef() { 97 parsedEntity, err := parseConstDef(constDef) 98 if err != nil { 99 panic(compiler.Error{Location: &s.loc}.Wrap(err)) 100 } 101 parsedEntity.IsPublic = actx.PUB_KW(i) != nil 102 name := constDef.IDENTIFIER().GetText() 103 s.file.Entities[name] = parsedEntity 104 } 105 } 106 107 /* --- Interfaces --- */ 108 109 func (s *treeShapeListener) EnterInterfaceStmt(actx *generated.InterfaceStmtContext) { 110 single := actx.SingleInterfaceStmt() 111 group := actx.GroupInterfaceStmt() 112 113 if single != nil { 114 name := single.InterfaceDef().IDENTIFIER().GetText() 115 v, err := parseInterfaceDef(single.InterfaceDef()) 116 if err != nil { 117 panic(compiler.Error{Location: &s.loc}.Wrap(err)) 118 } 119 s.file.Entities[name] = src.Entity{ 120 IsPublic: single.PUB_KW() != nil, 121 Kind: src.InterfaceEntity, 122 Interface: v, 123 } 124 return 125 } 126 127 for i, interfaceDef := range group.AllInterfaceDef() { 128 name := interfaceDef.IDENTIFIER().GetText() 129 130 v, err := parseInterfaceDef(interfaceDef) 131 if err != nil { 132 panic(compiler.Error{Location: &s.loc}.Wrap(err)) 133 } 134 135 s.file.Entities[name] = src.Entity{ 136 IsPublic: group.PUB_KW(i) != nil, 137 Kind: src.InterfaceEntity, 138 Interface: v, 139 } 140 } 141 } 142 143 /* --- Components --- */ 144 145 func (s *treeShapeListener) EnterCompStmt(actx *generated.CompStmtContext) { 146 single := actx.SingleCompStmt() 147 148 if single != nil { 149 compDef := single.CompDef() 150 parsedCompEntity, err := parseCompDef(compDef) 151 if err != nil { 152 panic(compiler.Error{Location: &s.loc}.Wrap(err)) 153 } 154 parsedCompEntity.IsPublic = single.PUB_KW() != nil 155 parsedCompEntity.Component.Directives = parseCompilerDirectives( 156 single.CompilerDirectives(), 157 ) 158 name := compDef.InterfaceDef().IDENTIFIER().GetText() 159 s.file.Entities[name] = parsedCompEntity 160 return 161 } 162 163 group := actx.GroupCompStmt() 164 for i, compDef := range group.AllCompDef() { 165 parsedCompEntity, err := parseCompDef(compDef) 166 if err != nil { 167 panic(compiler.Error{Location: &s.loc}.Wrap(err)) 168 } 169 parsedCompEntity.IsPublic = group.PUB_KW(i) != nil 170 parsedCompEntity.Component.Directives = parseCompilerDirectives( 171 group.CompilerDirectives(i), 172 ) 173 name := compDef.InterfaceDef().IDENTIFIER().GetText() 174 s.file.Entities[name] = parsedCompEntity 175 } 176 }