...
This commit is contained in:
@@ -1,38 +1,13 @@
|
|||||||
namespace main
|
namespace main
|
||||||
|
|
||||||
struct Ape {
|
|
||||||
name: string
|
|
||||||
age: i64
|
|
||||||
}
|
|
||||||
|
|
||||||
struct Human {
|
struct Human {
|
||||||
parent: Ape
|
|
||||||
name: string
|
name: string
|
||||||
age: i64
|
age: i64
|
||||||
}
|
}
|
||||||
|
|
||||||
export func main(args: []^string) {
|
export func main(args: []^string) {
|
||||||
// c::printf("%d\n", args.count)
|
|
||||||
|
|
||||||
// let i: i64
|
|
||||||
|
|
||||||
// while i < args.count {
|
|
||||||
// c::printf("%s\n", args[i])
|
|
||||||
// i = i + 1
|
|
||||||
// }
|
|
||||||
|
|
||||||
let human = alloc Human {
|
let human = alloc Human {
|
||||||
parent = alloc Ape {
|
|
||||||
name = "john"
|
|
||||||
age = 24
|
|
||||||
}
|
|
||||||
age = 23
|
age = 23
|
||||||
name = "oliver"
|
name = "oliver"
|
||||||
}
|
}
|
||||||
|
|
||||||
c::printf("%s is %d years old\n", human.name, human.age)
|
|
||||||
c::printf("parent name is %s\n", human.parent.name)
|
|
||||||
|
|
||||||
// human.name = "hubert"
|
|
||||||
// human.age = 92
|
|
||||||
}
|
}
|
||||||
@@ -4,48 +4,58 @@ namespace Nub.Lang.Frontend.Typing;
|
|||||||
|
|
||||||
public abstract class NubType
|
public abstract class NubType
|
||||||
{
|
{
|
||||||
protected NubType(string name)
|
|
||||||
{
|
|
||||||
Name = name;
|
|
||||||
}
|
|
||||||
|
|
||||||
public string Name { get; }
|
|
||||||
|
|
||||||
public static bool IsCompatibleWith(NubType sourceType, NubType targetType)
|
public static bool IsCompatibleWith(NubType sourceType, NubType targetType)
|
||||||
{
|
{
|
||||||
return targetType.Equals(NubPrimitiveType.Any) || sourceType.Equals(targetType);
|
return targetType.Equals(NubPrimitiveType.Any) || sourceType.Equals(targetType);
|
||||||
}
|
}
|
||||||
|
|
||||||
public override bool Equals(object? obj) => obj is NubType item && Name.Equals(item.Name);
|
public abstract override bool Equals(object? obj);
|
||||||
public override int GetHashCode() => HashCode.Combine(Name);
|
public abstract override int GetHashCode();
|
||||||
public override string ToString() => Name;
|
public abstract override string ToString();
|
||||||
}
|
}
|
||||||
|
|
||||||
public class NubStructType(string @namespace, string name) : NubType(name)
|
public class NubStructType(string @namespace, string name) : NubType
|
||||||
{
|
{
|
||||||
public string Namespace { get; } = @namespace;
|
public string Namespace { get; } = @namespace;
|
||||||
|
public string Name { get; } = name;
|
||||||
|
|
||||||
|
public override bool Equals(object? obj)
|
||||||
|
{
|
||||||
|
return obj is NubStructType other && other.Namespace == Namespace && other.Name == Name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public override int GetHashCode()
|
||||||
|
{
|
||||||
|
return HashCode.Combine(Namespace, Name);
|
||||||
|
}
|
||||||
|
|
||||||
|
public override string ToString()
|
||||||
|
{
|
||||||
|
return $"{Namespace}::{Name}";
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public class NubPointerType(NubType baseType) : NubType("^" + baseType)
|
public class NubPointerType(NubType baseType) : NubType
|
||||||
{
|
{
|
||||||
public NubType BaseType { get; } = baseType;
|
public NubType BaseType { get; } = baseType;
|
||||||
|
|
||||||
public override bool Equals(object? obj)
|
public override bool Equals(object? obj)
|
||||||
{
|
{
|
||||||
if (obj is NubPointerType other)
|
return obj is NubPointerType other && BaseType.Equals(other.BaseType);
|
||||||
{
|
|
||||||
return BaseType.Equals(other.BaseType);
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public override int GetHashCode()
|
public override int GetHashCode()
|
||||||
{
|
{
|
||||||
return HashCode.Combine(base.GetHashCode(), BaseType);
|
return HashCode.Combine(BaseType);
|
||||||
|
}
|
||||||
|
|
||||||
|
public override string ToString()
|
||||||
|
{
|
||||||
|
return "^" + BaseType;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public class NubArrayType(NubType baseType) : NubType("[]" + baseType)
|
public class NubArrayType(NubType baseType) : NubType
|
||||||
{
|
{
|
||||||
public NubType BaseType { get; } = baseType;
|
public NubType BaseType { get; } = baseType;
|
||||||
|
|
||||||
@@ -60,11 +70,16 @@ public class NubArrayType(NubType baseType) : NubType("[]" + baseType)
|
|||||||
|
|
||||||
public override int GetHashCode()
|
public override int GetHashCode()
|
||||||
{
|
{
|
||||||
return HashCode.Combine(base.GetHashCode(), BaseType);
|
return HashCode.Combine(BaseType);
|
||||||
|
}
|
||||||
|
|
||||||
|
public override string ToString()
|
||||||
|
{
|
||||||
|
return "[]" + BaseType;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public class NubPrimitiveType(PrimitiveTypeKind kind) : NubType(KindToString(kind))
|
public class NubPrimitiveType(PrimitiveTypeKind kind) : NubType
|
||||||
{
|
{
|
||||||
public PrimitiveTypeKind Kind { get; } = kind;
|
public PrimitiveTypeKind Kind { get; } = kind;
|
||||||
|
|
||||||
@@ -108,7 +123,17 @@ public class NubPrimitiveType(PrimitiveTypeKind kind) : NubType(KindToString(kin
|
|||||||
return kind != null;
|
return kind != null;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static string KindToString(PrimitiveTypeKind kind)
|
public override bool Equals(object? obj)
|
||||||
|
{
|
||||||
|
return obj is NubPrimitiveType other && other.Kind == Kind;
|
||||||
|
}
|
||||||
|
|
||||||
|
public override int GetHashCode()
|
||||||
|
{
|
||||||
|
return HashCode.Combine(Kind);
|
||||||
|
}
|
||||||
|
|
||||||
|
public override string ToString()
|
||||||
{
|
{
|
||||||
return kind switch
|
return kind switch
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user