Merge pull request 'fix-nil-void-type' (#36) from fix-nil-void-type into main
Reviewed-on: sashakoshka/fspl#36
This commit is contained in:
		
						commit
						b44e4f3f9d
					
				| @ -36,15 +36,19 @@ func (this *Tree) canAssign ( | ||||
| 	fail := func () error { | ||||
| 		switch mode { | ||||
| 		case strict: | ||||
| 			return errors.Errorf(pos, "expected %v", destination) | ||||
| 			return errors.Errorf ( | ||||
| 				pos, "expected %v", | ||||
| 				entity.FormatType(destination)) | ||||
| 		case weak: | ||||
| 			return errors.Errorf ( | ||||
| 				pos, "cannot use %v as %v", | ||||
| 				source, destination) | ||||
| 				entity.FormatType(source), | ||||
| 				entity.FormatType(destination)) | ||||
| 		case structural:  | ||||
| 			return errors.Errorf ( | ||||
| 				pos, "cannot convert from %v to %v", | ||||
| 				source, destination) | ||||
| 				entity.FormatType(source), | ||||
| 				entity.FormatType(destination)) | ||||
| 		default: | ||||
| 			panic(fmt.Sprint ( | ||||
| 				"BUG: analyzer doesnt know about mode", mode)) | ||||
| @ -152,7 +156,8 @@ func (this *Tree) canAssignCoerce ( | ||||
| 	fail := func () error { | ||||
| 		return errors.Errorf ( | ||||
| 			pos, "cannot convert from %v to %v", | ||||
| 			source, destination) | ||||
| 				entity.FormatType(source), | ||||
| 				entity.FormatType(destination)) | ||||
| 	} | ||||
| 
 | ||||
| 	destination = ReduceToBase(destination) | ||||
| @ -222,7 +227,9 @@ func (this *Tree) canAssignSliceArray ( | ||||
| ) error { | ||||
| 	err := this.canAssign(pos, destination.Element, strict, source.Element) | ||||
| 	if err != nil { | ||||
| 		return errors.Errorf(pos, "expected %v", destination) | ||||
| 		return errors.Errorf ( | ||||
| 			pos, "expected %v", | ||||
| 			entity.FormatType(destination)) | ||||
| 	} else { | ||||
| 		return nil | ||||
| 	} | ||||
|  | ||||
| @ -378,7 +378,9 @@ func (this *Tree) analyzeOperation ( | ||||
| 	error, | ||||
| ) { | ||||
| 	wrongInto := func () (entity.Expression, error) { | ||||
| 		return nil, errors.Errorf(operation.Position, "expected %v", into) | ||||
| 		return nil, errors.Errorf ( | ||||
| 			operation.Position, "expected %v", | ||||
| 			entity.FormatType(into)) | ||||
| 	} | ||||
| 
 | ||||
| 	wrongArgCount := func () (entity.Expression, error) { | ||||
| @ -578,18 +580,21 @@ func (this *Tree) analyzeMemberAccess ( | ||||
| 		referenced, ok := ReduceToBase(sourceTypeAny.Referenced).(*entity.TypeStruct) | ||||
| 		if !ok { | ||||
| 			return nil, errors.Errorf ( | ||||
| 				access.Position, "cannot access members of %v", source) | ||||
| 				access.Position, "cannot access members of %v", | ||||
| 				source) | ||||
| 		} | ||||
| 		sourceType = referenced | ||||
| 	default: | ||||
| 		return nil, errors.Errorf ( | ||||
| 			access.Position, "cannot access members of %v", source) | ||||
| 			access.Position, "cannot access members of %v", | ||||
| 			source) | ||||
| 	} | ||||
| 
 | ||||
| 	member, ok := sourceType.MemberMap[access.Member] | ||||
| 	if !ok { | ||||
| 		return nil, errors.Errorf ( | ||||
| 			access.Position, "no member %v", access) | ||||
| 			access.Position, "no member %v", | ||||
| 			access) | ||||
| 	} | ||||
| 	 | ||||
| 	err = this.canAssign(access.Position, into, mode, member.Type()) | ||||
| @ -665,7 +670,9 @@ func (this *Tree) analyzeBreak ( | ||||
| 	error, | ||||
| ) { | ||||
| 	if into != nil { | ||||
| 		return nil, errors.Errorf(brk.Position, "expected %v", into) | ||||
| 		return nil, errors.Errorf ( | ||||
| 			brk.Position, "expected %v", | ||||
| 			entity.FormatType(into)) | ||||
| 	} | ||||
| 
 | ||||
| 	loop, ok := this.topLoop() | ||||
| @ -700,7 +707,9 @@ func (this *Tree) analyzeReturn ( | ||||
| 	error, | ||||
| ) { | ||||
| 	if into != nil { | ||||
| 		return nil, errors.Errorf(ret.Position, "expected %v", into) | ||||
| 		return nil, errors.Errorf ( | ||||
| 			ret.Position, "expected %v", | ||||
| 			entity.FormatType(into)) | ||||
| 	} | ||||
| 
 | ||||
| 	ret.Declaration, _ = this.topDeclaration() | ||||
|  | ||||
| @ -15,13 +15,13 @@ func (this *Tree) analyzeLiteralInt ( | ||||
| 	if !isNumeric(into) { | ||||
| 		return nil, errors.Errorf ( | ||||
| 			literal.Position, "cannot use integer literal as %v", | ||||
| 			into) | ||||
| 			entity.FormatType(into)) | ||||
| 	} | ||||
| 
 | ||||
| 	if isInteger(into) && !inRange(into, int64(literal.Value)) { | ||||
| 		return nil, errors.Errorf ( | ||||
| 			literal.Position, "integer literal out of range for type %v", | ||||
| 			into) | ||||
| 			entity.FormatType(into)) | ||||
| 	} | ||||
| 
 | ||||
| 	literal.Ty = into | ||||
| @ -39,7 +39,7 @@ func (this *Tree) analyzeLiteralFloat ( | ||||
| 	if !isFloat(into) { | ||||
| 		return nil, errors.Errorf ( | ||||
| 			literal.Position, "cannot use float literal as %v", | ||||
| 			into) | ||||
| 			entity.FormatType(into)) | ||||
| 	} | ||||
| 
 | ||||
| 	literal.Ty = into | ||||
| @ -59,7 +59,7 @@ func (this *Tree) analyzeLiteralString ( | ||||
| 	errCantUse := func () error { | ||||
| 		return errors.Errorf ( | ||||
| 			literal.Position, "cannot use string literal as %v", | ||||
| 			into) | ||||
| 			entity.FormatType(into)) | ||||
| 	} | ||||
| 
 | ||||
| 	fillUTF32 := func () { | ||||
| @ -86,13 +86,13 @@ func (this *Tree) analyzeLiteralString ( | ||||
| 				literal.Position, | ||||
| 				"cannot fit string literal of length " + | ||||
| 				"%v into %v", | ||||
| 				length, into) | ||||
| 				length, entity.FormatType(into)) | ||||
| 		} else if length < 1 { | ||||
| 			return nil, errors.Errorf ( | ||||
| 				literal.Position, | ||||
| 				"string literal must have data when " + | ||||
| 				"assigning to %v", | ||||
| 				into) | ||||
| 				entity.FormatType(into)) | ||||
| 		} | ||||
| 	case *entity.TypeArray: | ||||
| 		element := ReduceToBase(base.Element) | ||||
| @ -176,7 +176,7 @@ func (this *Tree) analyzeLiteralArray ( | ||||
| 	default: | ||||
| 		return nil, errors.Errorf ( | ||||
| 			literal.Position, "cannot use array literal as %v", | ||||
| 			into) | ||||
| 			entity.FormatType(into)) | ||||
| 	} | ||||
| 
 | ||||
| 	for index, element := range literal.Elements { | ||||
| @ -201,7 +201,7 @@ func (this *Tree) analyzeLiteralStruct ( | ||||
| 	if !ok { | ||||
| 		return nil, errors.Errorf ( | ||||
| 			literal.Position, "cannot use struct literal as %v", | ||||
| 			into) | ||||
| 			entity.FormatType(into)) | ||||
| 	} | ||||
| 
 | ||||
| 	literal, err := this.assembleStructLiteralMap(literal) | ||||
| @ -235,7 +235,7 @@ func (this *Tree) analyzeLiteralBoolean ( | ||||
| 	if !isBoolean(into) { | ||||
| 		return nil, errors.Errorf ( | ||||
| 			literal.Position, "cannot use boolean literal as %v", | ||||
| 			into) | ||||
| 			entity.FormatType(into)) | ||||
| 	} | ||||
| 
 | ||||
| 	literal.Ty = into | ||||
|  | ||||
| @ -162,3 +162,19 @@ testString (test, | ||||
| Bird: (~ [fly] [land]) | ||||
| `) | ||||
| } | ||||
| 
 | ||||
| func TestTypeIntegerLiteralVoid (test *testing.T) { | ||||
| testStringErr (test, | ||||
| "cannot use integer literal as Void", 2, 10, | ||||
| ` | ||||
| [main] = 5 | ||||
| `) | ||||
| } | ||||
| 
 | ||||
| func TestTypeStringLiteralVoid (test *testing.T) { | ||||
| testStringErr (test, | ||||
| "cannot use string literal as Void", 2, 10, | ||||
| ` | ||||
| [main] = 'hello' | ||||
| `) | ||||
| } | ||||
|  | ||||
| @ -208,3 +208,13 @@ func TypesEqual (left, right Type) bool { | ||||
| 	if  left == nil                    { return true  } | ||||
| 	return left.Equals(right) | ||||
| } | ||||
| 
 | ||||
| // FormatType returns a string representing a type. If the type is nil, it | ||||
| // returns "Void". | ||||
| func FormatType (ty Type) string { | ||||
| 	if ty == nil { | ||||
| 		return "Void" | ||||
| 	} else { | ||||
| 		return ty.String() | ||||
| 	} | ||||
| } | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user