@ -75,15 +75,7 @@ func (p *parser) loadDeps(exp hcl.Expression, exclude map[string]struct{}, allow
 
			
		
	
		
		
			
				
					
								if  allowMissing  &&  errors . Is ( err ,  errUndefined )  { 
			if  allowMissing  &&  errors . Is ( err ,  errUndefined )  { 
 
			
		
	
		
		
			
				
					
									continue 
				continue 
 
			
		
	
		
		
			
				
					
								} 
			} 
 
			
		
	
		
		
			
				
					
								return  hcl . Diagnostics { 
			return  wrapErrorDiagnostic ( "Invalid expression" ,  err ,  exp . Range ( ) . Ptr ( ) ,  exp . Range ( ) . Ptr ( ) ) 
 
			
				
				
			
		
	
		
		
			
				
					
									& hcl . Diagnostic { 
 
			
		
	
		
		
			
				
					
										Severity :  hcl . DiagError , 
 
			
		
	
		
		
			
				
					
										Summary :   "Invalid expression" , 
 
			
		
	
		
		
			
				
					
										Detail :    err . Error ( ) , 
 
			
		
	
		
		
			
				
					
										Subject :   exp . Range ( ) . Ptr ( ) , 
 
			
		
	
		
		
			
				
					
										Context :   exp . Range ( ) . Ptr ( ) , 
 
			
		
	
		
		
			
				
					
									} , 
 
			
		
	
		
		
			
				
					
								} 
 
			
		
	
		
		
	
		
		
			
				
					
							} 
		} 
 
			
		
	
		
		
			
				
					
						} 
	} 
 
			
		
	
		
		
			
				
					
					
 
			
		
	
	
		
		
			
				
					
						
							
								 
						
						
							
								 
						
						
					 
					@ -136,30 +128,14 @@ func (p *parser) loadDeps(exp hcl.Expression, exclude map[string]struct{}, allow
 
			
		
	
		
		
			
				
					
									if  allowMissing  &&  errors . Is ( err ,  errUndefined )  { 
				if  allowMissing  &&  errors . Is ( err ,  errUndefined )  { 
 
			
		
	
		
		
			
				
					
										continue 
					continue 
 
			
		
	
		
		
			
				
					
									} 
				} 
 
			
		
	
		
		
			
				
					
									return  hcl . Diagnostics { 
				return  wrapErrorDiagnostic ( "Invalid expression" ,  err ,  exp . Range ( ) . Ptr ( ) ,  exp . Range ( ) . Ptr ( ) ) 
 
			
				
				
			
		
	
		
		
			
				
					
										& hcl . Diagnostic { 
 
			
		
	
		
		
			
				
					
											Severity :  hcl . DiagError , 
 
			
		
	
		
		
			
				
					
											Summary :   "Invalid expression" , 
 
			
		
	
		
		
			
				
					
											Detail :    err . Error ( ) , 
 
			
		
	
		
		
			
				
					
											Subject :   v . SourceRange ( ) . Ptr ( ) , 
 
			
		
	
		
		
			
				
					
											Context :   v . SourceRange ( ) . Ptr ( ) , 
 
			
		
	
		
		
			
				
					
										} , 
 
			
		
	
		
		
			
				
					
									} 
 
			
		
	
		
		
	
		
		
			
				
					
								} 
			} 
 
			
		
	
		
		
			
				
					
							}  else  { 
		}  else  { 
 
			
		
	
		
		
			
				
					
								if  err  :=  p . resolveValue ( v . RootName ( ) ) ;  err  !=  nil  { 
			if  err  :=  p . resolveValue ( v . RootName ( ) ) ;  err  !=  nil  { 
 
			
		
	
		
		
			
				
					
									if  allowMissing  &&  errors . Is ( err ,  errUndefined )  { 
				if  allowMissing  &&  errors . Is ( err ,  errUndefined )  { 
 
			
		
	
		
		
			
				
					
										continue 
					continue 
 
			
		
	
		
		
			
				
					
									} 
				} 
 
			
		
	
		
		
			
				
					
									return  hcl . Diagnostics { 
				return  wrapErrorDiagnostic ( "Invalid expression" ,  err ,  exp . Range ( ) . Ptr ( ) ,  exp . Range ( ) . Ptr ( ) ) 
 
			
				
				
			
		
	
		
		
			
				
					
										& hcl . Diagnostic { 
 
			
		
	
		
		
			
				
					
											Severity :  hcl . DiagError , 
 
			
		
	
		
		
			
				
					
											Summary :   "Invalid expression" , 
 
			
		
	
		
		
			
				
					
											Detail :    err . Error ( ) , 
 
			
		
	
		
		
			
				
					
											Subject :   v . SourceRange ( ) . Ptr ( ) , 
 
			
		
	
		
		
			
				
					
											Context :   v . SourceRange ( ) . Ptr ( ) , 
 
			
		
	
		
		
			
				
					
										} , 
 
			
		
	
		
		
			
				
					
									} 
 
			
		
	
		
		
	
		
		
			
				
					
								} 
			} 
 
			
		
	
		
		
			
				
					
							} 
		} 
 
			
		
	
		
		
			
				
					
						} 
	} 
 
			
		
	
	
		
		
			
				
					
						
							
								 
						
						
							
								 
						
						
					 
					@ -325,14 +301,7 @@ func (p *parser) resolveValue(name string) (err error) {
 
			
		
	
		
		
			
				
					
					func  ( p  * parser )  resolveBlock ( block  * hcl . Block ,  target  * hcl . BodySchema )  ( err  error )  { func  ( p  * parser )  resolveBlock ( block  * hcl . Block ,  target  * hcl . BodySchema )  ( err  error )  {  
			
		
	
		
		
			
				
					
						name  :=  block . Labels [ 0 ] 
	name  :=  block . Labels [ 0 ] 
 
			
		
	
		
		
			
				
					
						if  err  :=  p . opt . ValidateLabel ( name ) ;  err  !=  nil  { 
	if  err  :=  p . opt . ValidateLabel ( name ) ;  err  !=  nil  { 
 
			
		
	
		
		
			
				
					
							return  hcl . Diagnostics { 
		return  wrapErrorDiagnostic ( "Invalid name" ,  err ,  & block . LabelRanges [ 0 ] ,  & block . LabelRanges [ 0 ] ) 
 
			
				
				
			
		
	
		
		
			
				
					
								& hcl . Diagnostic { 
 
			
		
	
		
		
			
				
					
									Severity :  hcl . DiagError , 
 
			
		
	
		
		
			
				
					
									Summary :   "Invalid name" , 
 
			
		
	
		
		
			
				
					
									Detail :    err . Error ( ) , 
 
			
		
	
		
		
			
				
					
									Subject :   & block . LabelRanges [ 0 ] , 
 
			
		
	
		
		
			
				
					
								} , 
 
			
		
	
		
		
			
				
					
							} 
 
			
		
	
		
		
	
		
		
			
				
					
						} 
	} 
 
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
						if  _ ,  ok  :=  p . doneB [ block ] ;  ! ok  { 
	if  _ ,  ok  :=  p . doneB [ block ] ;  ! ok  { 
 
			
		
	
	
		
		
			
				
					
						
							
								 
						
						
							
								 
						
						
					 
					@ -584,15 +553,7 @@ func Parse(b hcl.Body, opt Opt, val interface{}) hcl.Diagnostics {
 
			
		
	
		
		
			
				
					
									return  diags 
				return  diags 
 
			
		
	
		
		
			
				
					
								} 
			} 
 
			
		
	
		
		
			
				
					
								r  :=  p . vars [ k ] . Body . MissingItemRange ( ) 
			r  :=  p . vars [ k ] . Body . MissingItemRange ( ) 
 
			
		
	
		
		
			
				
					
								return  hcl . Diagnostics { 
			return  wrapErrorDiagnostic ( "Invalid value" ,  err ,  & r ,  & r ) 
 
			
				
				
			
		
	
		
		
			
				
					
									& hcl . Diagnostic { 
 
			
		
	
		
		
			
				
					
										Severity :  hcl . DiagError , 
 
			
		
	
		
		
			
				
					
										Summary :   "Invalid value" , 
 
			
		
	
		
		
			
				
					
										Detail :    err . Error ( ) , 
 
			
		
	
		
		
			
				
					
										Subject :   & r , 
 
			
		
	
		
		
			
				
					
										Context :   & r , 
 
			
		
	
		
		
			
				
					
									} , 
 
			
		
	
		
		
			
				
					
								} 
 
			
		
	
		
		
	
		
		
			
				
					
							} 
		} 
 
			
		
	
		
		
			
				
					
						} 
	} 
 
			
		
	
		
		
			
				
					
					
 
			
		
	
	
		
		
			
				
					
						
						
						
							
								 
						
					 
					@ -615,15 +576,7 @@ func Parse(b hcl.Body, opt Opt, val interface{}) hcl.Diagnostics {
 
			
		
	
		
		
			
				
					
										} 
					} 
 
			
		
	
		
		
			
				
					
									} 
				} 
 
			
		
	
		
		
			
				
					
								} 
			} 
 
			
		
	
		
		
			
				
					
								return  hcl . Diagnostics { 
			return  wrapErrorDiagnostic ( "Invalid function" ,  err ,  subject ,  context ) 
 
			
				
				
			
		
	
		
		
			
				
					
									& hcl . Diagnostic { 
 
			
		
	
		
		
			
				
					
										Severity :  hcl . DiagError , 
 
			
		
	
		
		
			
				
					
										Summary :   "Invalid function" , 
 
			
		
	
		
		
			
				
					
										Detail :    err . Error ( ) , 
 
			
		
	
		
		
			
				
					
										Subject :   subject , 
 
			
		
	
		
		
			
				
					
										Context :   context , 
 
			
		
	
		
		
			
				
					
									} , 
 
			
		
	
		
		
			
				
					
								} 
 
			
		
	
		
		
	
		
		
			
				
					
							} 
		} 
 
			
		
	
		
		
			
				
					
						} 
	} 
 
			
		
	
		
		
			
				
					
					
 
			
		
	
	
		
		
			
				
					
						
							
								 
						
						
							
								 
						
						
					 
					@ -684,15 +637,7 @@ func Parse(b hcl.Body, opt Opt, val interface{}) hcl.Diagnostics {
 
			
		
	
		
		
			
				
					
										continue 
					continue 
 
			
		
	
		
		
			
				
					
									} 
				} 
 
			
		
	
		
		
			
				
					
								}  else  { 
			}  else  { 
 
			
		
	
		
		
			
				
					
									return  hcl . Diagnostics { 
				return  wrapErrorDiagnostic ( "Invalid block" ,  err ,  & b . LabelRanges [ 0 ] ,  & b . DefRange ) 
 
			
				
				
			
		
	
		
		
			
				
					
										& hcl . Diagnostic { 
 
			
		
	
		
		
			
				
					
											Severity :  hcl . DiagError , 
 
			
		
	
		
		
			
				
					
											Summary :   "Invalid attribute" , 
 
			
		
	
		
		
			
				
					
											Detail :    err . Error ( ) , 
 
			
		
	
		
		
			
				
					
											Subject :   & b . LabelRanges [ 0 ] , 
 
			
		
	
		
		
			
				
					
											Context :   & b . DefRange , 
 
			
		
	
		
		
			
				
					
										} , 
 
			
		
	
		
		
			
				
					
									} 
 
			
		
	
		
		
	
		
		
			
				
					
								} 
			} 
 
			
		
	
		
		
			
				
					
							} 
		} 
 
			
		
	
		
		
			
				
					
					
 
			
		
	
	
		
		
			
				
					
						
							
								 
						
						
							
								 
						
						
					 
					@ -737,21 +682,34 @@ func Parse(b hcl.Body, opt Opt, val interface{}) hcl.Diagnostics {
 
			
		
	
		
		
			
				
					
								if  diags ,  ok  :=  err . ( hcl . Diagnostics ) ;  ok  { 
			if  diags ,  ok  :=  err . ( hcl . Diagnostics ) ;  ok  { 
 
			
		
	
		
		
			
				
					
									return  diags 
				return  diags 
 
			
		
	
		
		
			
				
					
								} 
			} 
 
			
		
	
		
		
			
				
					
								return  wrapErrorDiagnostic ( "Invalid attribute" ,  err ,  & p . attrs [ k ] . Range ,  & p . attrs [ k ] . Range ) 
 
			
		
	
		
		
			
				
					
							} 
 
			
		
	
		
		
			
				
					
						} 
 
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
						return  nil 
 
			
		
	
		
		
			
				
					
					}  
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					// wrapErrorDiagnostic wraps an error into a hcl.Diagnostics object.
  
			
		
	
		
		
			
				
					
					// If the error is already an hcl.Diagnostics object, it is returned as is.
  
			
		
	
		
		
			
				
					
					func  wrapErrorDiagnostic ( message  string ,  err  error ,  subject  * hcl . Range ,  context  * hcl . Range )  hcl . Diagnostics  {  
			
		
	
		
		
			
				
					
						switch  err  :=  err . ( type )  { 
 
			
		
	
		
		
			
				
					
						case  * hcl . Diagnostic : 
 
			
		
	
		
		
			
				
					
							return  hcl . Diagnostics { err } 
 
			
		
	
		
		
			
				
					
						case  hcl . Diagnostics : 
 
			
		
	
		
		
			
				
					
							return  err 
 
			
		
	
		
		
			
				
					
						default : 
 
			
		
	
		
		
			
				
					
							return  hcl . Diagnostics { 
		return  hcl . Diagnostics { 
 
			
		
	
		
		
			
				
					
								& hcl . Diagnostic { 
			& hcl . Diagnostic { 
 
			
		
	
		
		
			
				
					
									Severity :  hcl . DiagError , 
				Severity :  hcl . DiagError , 
 
			
		
	
		
		
			
				
					
										Summary :   "Invalid attribute" , 
				Summary :   message , 
 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
									Detail :    err . Error ( ) , 
				Detail :    err . Error ( ) , 
 
			
		
	
		
		
			
				
					
										Subject :   & p . attrs [ k ] . Range , 
				Subject :   subject , 
 
			
				
				
			
		
	
		
		
			
				
					
										Context :   & p . attrs [ k ] . Range , 
				Context :   context , 
 
			
				
				
			
		
	
		
		
	
		
		
	
		
		
			
				
					
								} , 
			} , 
 
			
		
	
		
		
			
				
					
							} 
		} 
 
			
		
	
		
		
			
				
					
						} 
	} 
 
			
		
	
		
		
			
				
					
					} }  
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
						return  nil 
 
			
		
	
		
		
			
				
					
					}  
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					func  setLabel ( v  reflect . Value ,  lbl  string )  int  { func  setLabel ( v  reflect . Value ,  lbl  string )  int  {  
			
		
	
		
		
			
				
					
						// cache field index?
 
	// cache field index?
 
 
			
		
	
		
		
			
				
					
						numFields  :=  v . Elem ( ) . Type ( ) . NumField ( ) 
	numFields  :=  v . Elem ( ) . Type ( ) . NumField ( )