namespace arookas
{
	class sunYield : sunNode
	{
		public sunYield(sunSourceLocation location)
			: base(location)
		{

		}

		public override void Compile(sunContext context)
		{
			var builtinInfo = context.ResolveSystemBuiltin("yield");
			context.Text.CallBuiltin(builtinInfo.Index, 0);
			context.Text.Pop();
		}
	}

	class sunExit : sunNode
	{
		public sunExit(sunSourceLocation location)
			: base(location)
		{

		}

		public override void Compile(sunContext context)
		{
			var builtinInfo = context.ResolveSystemBuiltin("exit");
			context.Text.CallBuiltin(builtinInfo.Index, 0);
			context.Text.Pop();
		}
	}

	class sunDump : sunNode
	{
		public sunDump(sunSourceLocation location)
			: base(location)
		{

		}

		public override void Compile(sunContext context)
		{
			var builtinInfo = context.ResolveSystemBuiltin("dump");
			context.Text.CallBuiltin(builtinInfo.Index, 0);
			context.Text.Pop();
		}
	}

	class sunLock : sunNode
	{
		public sunLock(sunSourceLocation location)
			: base(location)
		{

		}

		public override void Compile(sunContext context)
		{
			var builtinInfo = context.ResolveSystemBuiltin("lock");
			context.Text.CallBuiltin(builtinInfo.Index, 0);
			context.Text.Pop();
		}
	}

	class sunUnlock : sunNode
	{
		public sunUnlock(sunSourceLocation location)
			: base(location)
		{

		}

		public override void Compile(sunContext context)
		{
			var builtinInfo = context.ResolveSystemBuiltin("unlock");
			context.Text.CallBuiltin(builtinInfo.Index, 0);
			context.Text.Pop();
		}
	}

	class sunIntCast : sunNode
	{
		public sunExpression Argument { get { return this[0] as sunExpression; } }

		public sunIntCast(sunSourceLocation location)
			: base(location)
		{

		}

		public override void Compile(sunContext context)
		{
			var builtinInfo = context.DeclareSystemBuiltin("int", false, "x");
			Argument.Compile(context);
			context.Text.CallBuiltin(builtinInfo.Index, 1);
		}
	}

	class sunFloatCast : sunNode
	{
		public sunExpression Argument { get { return this[0] as sunExpression; } }

		public sunFloatCast(sunSourceLocation location)
			: base(location)
		{

		}

		public override void Compile(sunContext context)
		{
			var builtinInfo = context.ResolveSystemBuiltin("float");
			Argument.Compile(context);
			context.Text.CallBuiltin(builtinInfo.Index, 1);
		}
	}

	class sunTypeofCast : sunNode
	{
		public sunExpression Argument { get { return this[0] as sunExpression; } }

		public sunTypeofCast(sunSourceLocation location)
			: base(location)
		{

		}

		public override void Compile(sunContext context)
		{
			var builtinInfo = context.ResolveSystemBuiltin("typeof");
			Argument.Compile(context);
			context.Text.CallBuiltin(builtinInfo.Index, 1);
		}
	}

	class sunPrint : sunNode
	{
		public sunNode ArgumentList { get { return this[0]; } }

		public sunPrint(sunSourceLocation location)
			: base(location)
		{

		}

		public override void Compile(sunContext context)
		{
			var builtinInfo = context.ResolveSystemBuiltin("print");
			ArgumentList.Compile(context);
			context.Text.CallBuiltin(builtinInfo.Index, ArgumentList.Count);
			context.Text.Pop();
		}
	}
}