mirror of
				https://github.com/KevinMidboe/linguist.git
				synced 2025-10-29 17:50:22 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			80 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			80 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| package compiler
 | |
| 
 | |
| import (
 | |
| 	"strings"
 | |
| 
 | |
| 	grammar "github.com/github/linguist/tools/grammars/proto"
 | |
| )
 | |
| 
 | |
| func (w *walker) checkInclude(rule *grammar.Rule) {
 | |
| 	include := rule.Include
 | |
| 
 | |
| 	if include == "" || include[0] == '#' || include[0] == '$' {
 | |
| 		return
 | |
| 	}
 | |
| 
 | |
| 	if alias, ok := GrammarAliases[include]; ok {
 | |
| 		rule.Include = alias
 | |
| 		return
 | |
| 	}
 | |
| 
 | |
| 	include = strings.Split(include, "#")[0]
 | |
| 	ok := w.Known[include]
 | |
| 	if !ok {
 | |
| 		if !w.Missing[include] {
 | |
| 			w.Missing[include] = true
 | |
| 			w.Errors = append(w.Errors, &MissingIncludeError{w.File, include})
 | |
| 		}
 | |
| 		rule.Include = ""
 | |
| 	}
 | |
| }
 | |
| 
 | |
| func (w *walker) checkRegexps(rule *grammar.Rule) {
 | |
| 	check := func(re string) string {
 | |
| 		re2, err := CheckPCRE(re)
 | |
| 		if err != nil {
 | |
| 			w.Errors = append(w.Errors, &InvalidRegexError{w.File, err})
 | |
| 		}
 | |
| 		return re2
 | |
| 	}
 | |
| 
 | |
| 	rule.Match = check(rule.Match)
 | |
| 	rule.Begin = check(rule.Begin)
 | |
| 	rule.While = check(rule.While)
 | |
| 	rule.End = check(rule.End)
 | |
| }
 | |
| 
 | |
| func (w *walker) walk(rule *grammar.Rule) {
 | |
| 	w.checkInclude(rule)
 | |
| 	w.checkRegexps(rule)
 | |
| 
 | |
| 	for _, rule := range rule.Patterns {
 | |
| 		w.walk(rule)
 | |
| 	}
 | |
| 	for _, rule := range rule.Captures {
 | |
| 		w.walk(rule)
 | |
| 	}
 | |
| 	for _, rule := range rule.BeginCaptures {
 | |
| 		w.walk(rule)
 | |
| 	}
 | |
| 	for _, rule := range rule.WhileCaptures {
 | |
| 		w.walk(rule)
 | |
| 	}
 | |
| 	for _, rule := range rule.EndCaptures {
 | |
| 		w.walk(rule)
 | |
| 	}
 | |
| 	for _, rule := range rule.Repository {
 | |
| 		w.walk(rule)
 | |
| 	}
 | |
| 	for _, rule := range rule.Injections {
 | |
| 		w.walk(rule)
 | |
| 	}
 | |
| }
 | |
| 
 | |
| type walker struct {
 | |
| 	File    *LoadedFile
 | |
| 	Known   map[string]bool
 | |
| 	Missing map[string]bool
 | |
| 	Errors  []error
 | |
| }
 |