Properly analyze member types
This commit is contained in:
		
							parent
							
								
									f817894b49
								
							
						
					
					
						commit
						c290b3a3d7
					
				| @ -1,5 +1,6 @@ | ||||
| package analyzer | ||||
| 
 | ||||
| import "fmt" | ||||
| import "git.tebibyte.media/arf/arf/types" | ||||
| import "git.tebibyte.media/arf/arf/parser" | ||||
| import "git.tebibyte.media/arf/arf/infoerr" | ||||
| @ -21,6 +22,7 @@ type TypeSection struct { | ||||
| type ObjectMember struct { | ||||
| 	locatable | ||||
| 	name string | ||||
| 	bitWidth uint64 | ||||
| 	 | ||||
| 	// even if there is a private permission in another module, we still | ||||
| 	// need to include it in the semantic analysis because we need to know | ||||
| @ -31,12 +33,18 @@ type ObjectMember struct { | ||||
| 	argument Argument | ||||
| } | ||||
| 
 | ||||
| // ToString returns all data stored within the member, in string form. | ||||
| func (member ObjectMember) ToString (indent int) (output string) { | ||||
| 	output += doIndent ( | ||||
| 		indent, | ||||
| 		member.name, " ", | ||||
| 		member.permission.ToString(), | ||||
| 		"\n") | ||||
| 		indent, "member ", | ||||
| 		member.permission.ToString(), " ", | ||||
| 		member.name) | ||||
| 
 | ||||
| 	if member.bitWidth > 0 { | ||||
| 		output += fmt.Sprint(" width ", member.bitWidth) | ||||
| 	} | ||||
| 
 | ||||
| 	output += "\n" | ||||
| 	output += member.what.ToString(indent + 1) | ||||
| 	return | ||||
| } | ||||
| @ -51,6 +59,9 @@ func (section TypeSection) ToString (indent int) (output string) { | ||||
| 	if section.argument != nil { | ||||
| 		output += section.argument.ToString(indent + 1) | ||||
| 	} | ||||
| 	for _, member := range section.members { | ||||
| 		output += member.ToString(indent + 1) | ||||
| 	} | ||||
| 	return | ||||
| } | ||||
| 
 | ||||
| @ -162,6 +173,7 @@ func (analyzer *analysisOperation) analyzeObjectMembers ( | ||||
| 		outputMember.location   = inputMember.Location() | ||||
| 		outputMember.name       = inputMember.Name() | ||||
| 		outputMember.permission = inputMember.Permission() | ||||
| 		outputMember.bitWidth   = inputMember.BitWidth() | ||||
| 		 | ||||
| 		inheritedMember, exists := | ||||
| 			inheritedSection.Member(inputMember.Name()) | ||||
| @ -213,6 +225,10 @@ func (analyzer *analysisOperation) analyzeObjectMembers ( | ||||
| 				return | ||||
| 			} | ||||
| 			 | ||||
| 			outputMember.what, err = analyzer.analyzeType ( | ||||
| 				inputMember.Type()) | ||||
| 			if err != nil { return } | ||||
| 			 | ||||
| 			// apply default value | ||||
| 			if !inputMember.Argument().Nil() { | ||||
| 				outputMember.argument, | ||||
|  | ||||
		Reference in New Issue
	
	Block a user