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  }