Variable reference from $VAR to @VAR to avoid object conflict
This commit is contained in:
@@ -235,7 +235,7 @@ func (b *Builder) collectVariables(tree *index.ProjectTree) {
|
||||
func (b *Builder) evaluate(val parser.Value) parser.Value {
|
||||
switch v := val.(type) {
|
||||
case *parser.VariableReferenceValue:
|
||||
name := strings.TrimPrefix(v.Name, "$")
|
||||
name := strings.TrimPrefix(v.Name, "@")
|
||||
if res, ok := b.variables[name]; ok {
|
||||
return b.evaluate(res)
|
||||
}
|
||||
|
||||
@@ -400,7 +400,7 @@ func (pt *ProjectTree) indexValue(file string, val parser.Value) {
|
||||
})
|
||||
case *parser.VariableReferenceValue:
|
||||
pt.References = append(pt.References, Reference{
|
||||
Name: strings.TrimPrefix(v.Name, "$"),
|
||||
Name: strings.TrimPrefix(v.Name, "@"),
|
||||
Position: v.Position,
|
||||
File: file,
|
||||
IsVariable: true,
|
||||
|
||||
@@ -611,7 +611,7 @@ func HandleHover(params HoverParams) *Hover {
|
||||
} else if res.Reference.TargetVariable != nil {
|
||||
v := res.Reference.TargetVariable
|
||||
targetName = v.Name
|
||||
fullInfo = fmt.Sprintf("**Variable**: `%s`\nType: `%s`", v.Name, v.TypeExpr)
|
||||
fullInfo = fmt.Sprintf("**Variable**: `@%s`\nType: `%s`", v.Name, v.TypeExpr)
|
||||
if v.DefaultValue != nil {
|
||||
fullInfo += fmt.Sprintf("\nDefault: `%s`", valueToString(v.DefaultValue))
|
||||
}
|
||||
|
||||
@@ -36,6 +36,7 @@ const (
|
||||
TokenCaret
|
||||
TokenAmpersand
|
||||
TokenConcat
|
||||
TokenVariableReference
|
||||
)
|
||||
|
||||
type Token struct {
|
||||
@@ -184,6 +185,8 @@ func (l *Lexer) NextToken() Token {
|
||||
return l.lexString()
|
||||
case '#':
|
||||
return l.lexHashIdentifier()
|
||||
case '@':
|
||||
return l.lexVariableReference()
|
||||
case '$':
|
||||
return l.lexObjectIdentifier()
|
||||
}
|
||||
@@ -311,3 +314,14 @@ func (l *Lexer) lexHashIdentifier() Token {
|
||||
}
|
||||
return l.emit(TokenIdentifier)
|
||||
}
|
||||
|
||||
func (l *Lexer) lexVariableReference() Token {
|
||||
for {
|
||||
r := l.next()
|
||||
if unicode.IsLetter(r) || unicode.IsDigit(r) || r == '_' || r == '-' {
|
||||
continue
|
||||
}
|
||||
l.backup()
|
||||
return l.emit(TokenVariableReference)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -297,7 +297,7 @@ func (p *Parser) parseAtom() (Value, bool) {
|
||||
true
|
||||
case TokenIdentifier:
|
||||
return &ReferenceValue{Position: tok.Position, Value: tok.Value}, true
|
||||
case TokenObjectIdentifier:
|
||||
case TokenVariableReference:
|
||||
return &VariableReferenceValue{Position: tok.Position, Name: tok.Value}, true
|
||||
case TokenLBrace:
|
||||
arr := &ArrayValue{Position: tok.Position}
|
||||
|
||||
@@ -223,7 +223,7 @@ func (v *Validator) valueToInterface(val parser.Value, ctx *index.ProjectNode) i
|
||||
case *parser.ReferenceValue:
|
||||
return t.Value
|
||||
case *parser.VariableReferenceValue:
|
||||
name := strings.TrimPrefix(t.Name, "$")
|
||||
name := strings.TrimPrefix(t.Name, "@")
|
||||
if info := v.Tree.ResolveVariable(ctx, name); info != nil {
|
||||
if info.Def.DefaultValue != nil {
|
||||
return v.valueToInterface(info.Def.DefaultValue, ctx)
|
||||
@@ -525,7 +525,7 @@ func (v *Validator) getFieldValue(f *parser.Field, ctx *index.ProjectNode) strin
|
||||
case *parser.BoolValue:
|
||||
return strconv.FormatBool(val.Value)
|
||||
case *parser.VariableReferenceValue:
|
||||
name := strings.TrimPrefix(val.Name, "$")
|
||||
name := strings.TrimPrefix(val.Name, "@")
|
||||
if info := v.Tree.ResolveVariable(ctx, name); info != nil {
|
||||
if info.Def.DefaultValue != nil {
|
||||
return v.getFieldValue(&parser.Field{Value: info.Def.DefaultValue}, ctx)
|
||||
@@ -1126,7 +1126,7 @@ func (v *Validator) CheckVariables() {
|
||||
if ref.IsVariable && ref.TargetVariable == nil {
|
||||
v.Diagnostics = append(v.Diagnostics, Diagnostic{
|
||||
Level: LevelError,
|
||||
Message: fmt.Sprintf("Unresolved variable reference: '$%s'", ref.Name),
|
||||
Message: fmt.Sprintf("Unresolved variable reference: '@%s'", ref.Name),
|
||||
Position: ref.Position,
|
||||
File: ref.File,
|
||||
})
|
||||
|
||||
Reference in New Issue
Block a user