173 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			173 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
package analyzer
 | 
						|
 | 
						|
import "fmt"
 | 
						|
 | 
						|
type IntLiteral    int64
 | 
						|
type UIntLiteral   uint64
 | 
						|
type FloatLiteral  float64
 | 
						|
type StringLiteral string
 | 
						|
type RuneLiteral   rune
 | 
						|
 | 
						|
// ToString outputs the data in the argument as a string.
 | 
						|
func (literal IntLiteral) ToString (indent int) (output string) {
 | 
						|
	output += doIndent(indent, fmt.Sprint("arg int ", literal, "\n"))
 | 
						|
	return
 | 
						|
}
 | 
						|
 | 
						|
// What returns the type of the argument
 | 
						|
func (literal IntLiteral) What () (what Type) {
 | 
						|
	what.actual = &PrimitiveI64
 | 
						|
	what.length = 1
 | 
						|
	return
 | 
						|
}
 | 
						|
 | 
						|
// canBePassedAs returns true if this literal can be implicitly cast to the
 | 
						|
// specified type, and false if it can't.
 | 
						|
func (literal IntLiteral) canBePassedAs (what Type) (allowed bool) {
 | 
						|
	// must be a singlular value
 | 
						|
	if !what.isSingular() { return }
 | 
						|
	
 | 
						|
	// can be passed to types that are signed numbers at a primitive level.
 | 
						|
	primitive := what.underlyingPrimitive()
 | 
						|
	switch primitive {
 | 
						|
	case
 | 
						|
		&PrimitiveF64,
 | 
						|
		&PrimitiveF32,
 | 
						|
		&PrimitiveI64,
 | 
						|
		&PrimitiveI32,
 | 
						|
		&PrimitiveI16,
 | 
						|
		&PrimitiveI8,
 | 
						|
		&PrimitiveInt:
 | 
						|
 | 
						|
		allowed = true
 | 
						|
	}
 | 
						|
	return
 | 
						|
}
 | 
						|
 | 
						|
// ToString outputs the data in the argument as a string.
 | 
						|
func (literal UIntLiteral) ToString (indent int) (output string) {
 | 
						|
	output += doIndent(indent, fmt.Sprint("arg uint ", literal, "\n"))
 | 
						|
	return
 | 
						|
}
 | 
						|
 | 
						|
// What returns the type of the argument
 | 
						|
func (literal UIntLiteral) What () (what Type) {
 | 
						|
	what.actual = &PrimitiveU64
 | 
						|
	what.length = 1
 | 
						|
	return
 | 
						|
}
 | 
						|
 | 
						|
// canBePassedAs returns true if this literal can be implicitly cast to the
 | 
						|
// specified type, and false if it can't.
 | 
						|
func (literal UIntLiteral) canBePassedAs (what Type) (allowed bool) {
 | 
						|
	// must be a singlular value
 | 
						|
	if !what.isSingular() { return }
 | 
						|
	
 | 
						|
	// can be passed to types that are numbers at a primitive level.
 | 
						|
	primitive := what.underlyingPrimitive()
 | 
						|
	switch primitive {
 | 
						|
	case
 | 
						|
		&PrimitiveF64,
 | 
						|
		&PrimitiveF32,
 | 
						|
		&PrimitiveI64,
 | 
						|
		&PrimitiveI32,
 | 
						|
		&PrimitiveI16,
 | 
						|
		&PrimitiveI8,
 | 
						|
		&PrimitiveInt,
 | 
						|
		&PrimitiveU64,
 | 
						|
		&PrimitiveU32,
 | 
						|
		&PrimitiveU16,
 | 
						|
		&PrimitiveU8,
 | 
						|
		&PrimitiveUInt:
 | 
						|
 | 
						|
		allowed = true
 | 
						|
	}
 | 
						|
	return
 | 
						|
}
 | 
						|
 | 
						|
// What returns the type of the argument
 | 
						|
func (literal FloatLiteral) What () (what Type) {
 | 
						|
	what.actual = &PrimitiveF64
 | 
						|
	what.length = 1
 | 
						|
	return
 | 
						|
}
 | 
						|
 | 
						|
// ToString outputs the data in the argument as a string.
 | 
						|
func (literal FloatLiteral) ToString (indent int) (output string) {
 | 
						|
	output += doIndent(indent, fmt.Sprint("arg float ", literal, "\n"))
 | 
						|
	return
 | 
						|
}
 | 
						|
 | 
						|
// canBePassedAs returns true if this literal can be implicitly cast to the
 | 
						|
// specified type, and false if it can't.
 | 
						|
func (literal FloatLiteral) canBePassedAs (what Type) (allowed bool) {
 | 
						|
	// must be a singlular value
 | 
						|
	if !what.isSingular() { return }
 | 
						|
 | 
						|
	// can be passed to types that are floats at a primitive level.
 | 
						|
	primitive := what.underlyingPrimitive()
 | 
						|
	switch primitive {
 | 
						|
	case
 | 
						|
		&PrimitiveF64,
 | 
						|
		&PrimitiveF32:
 | 
						|
 | 
						|
		allowed = true
 | 
						|
	}
 | 
						|
	return
 | 
						|
}
 | 
						|
 | 
						|
// What returns the type of the argument
 | 
						|
func (literal StringLiteral) What () (what Type) {
 | 
						|
	what.actual = &BuiltInString
 | 
						|
	what.length = 1
 | 
						|
	return
 | 
						|
}
 | 
						|
 | 
						|
// ToString outputs the data in the argument as a string.
 | 
						|
func (literal StringLiteral) ToString (indent int) (output string) {
 | 
						|
	output += doIndent(indent, fmt.Sprint("arg string \"", literal, "\"\n"))
 | 
						|
	return
 | 
						|
}
 | 
						|
 | 
						|
// canBePassedAs returns true if this literal can be implicitly cast to the
 | 
						|
// specified type, and false if it can't.
 | 
						|
func (literal StringLiteral) canBePassedAs (what Type) (allowed bool) {
 | 
						|
	// can be passed to types that are numbers at a primitive level, or
 | 
						|
	// types that can be reduced to a variable array pointing to numbers at
 | 
						|
	// a primitive level.
 | 
						|
 | 
						|
	reduced, worked := what.reduce()
 | 
						|
	if worked {
 | 
						|
		if !what.isSingular() { return }
 | 
						|
		if reduced.kind != TypeKindVariableArray { return }
 | 
						|
		what = reduced
 | 
						|
	}
 | 
						|
 | 
						|
	primitive := what.underlyingPrimitive()
 | 
						|
	switch primitive {
 | 
						|
	case
 | 
						|
		&PrimitiveF64,
 | 
						|
		&PrimitiveF32,
 | 
						|
		&PrimitiveI64,
 | 
						|
		&PrimitiveI32,
 | 
						|
		&PrimitiveI16,
 | 
						|
		&PrimitiveI8,
 | 
						|
		&PrimitiveInt,
 | 
						|
		&PrimitiveU64,
 | 
						|
		&PrimitiveU32,
 | 
						|
		&PrimitiveU16,
 | 
						|
		&PrimitiveU8,
 | 
						|
		&PrimitiveUInt:
 | 
						|
 | 
						|
		allowed = true
 | 
						|
	}
 | 
						|
	return
 | 
						|
}
 | 
						|
 | 
						|
// ToString outputs the data in the argument as a string.
 | 
						|
func (literal RuneLiteral) ToString (indent int) (output string) {
 | 
						|
	output += doIndent(indent, fmt.Sprint("arg rune '", literal, "'\n"))
 | 
						|
	return
 | 
						|
}
 | 
						|
 |