view dmd/TypeInstance.d @ 0:10317f0c89a5

Initial commit
author korDen
date Sat, 24 Oct 2009 08:42:06 +0400
parents
children 5c9b78899f5d
line wrap: on
line source

module dmd.TypeInstance;

import dmd.TypeQualified;
import dmd.TemplateInstance;
import dmd.MOD;
import dmd.MATCH;
import dmd.Loc;
import dmd.Global;
import dmd.Type;
import dmd.OutBuffer;
import dmd.HdrGenState;
import dmd.Dsymbol;
import dmd.Expression;
import dmd.Scope;
import dmd.ArrayTypes;
import dmd.TY;

/* Similar to TypeIdentifier, but with a TemplateInstance as the root
 */
class TypeInstance : TypeQualified
{
    TemplateInstance tempinst;

    this(Loc loc, TemplateInstance tempinst)
	{
		super(Tinstance, loc);
		this.tempinst = tempinst;
	}
	
version (DumbClone) {
} else {
	Type clone()
	{
		assert(false);
	}
}
	
    Type syntaxCopy()
	{
		assert(false);
	}
	
    //char *toChars();
	
    //void toDecoBuffer(OutBuffer *buf, int flag);
	
    void toCBuffer2(OutBuffer buf, HdrGenState* hgs, MOD mod)
	{
		assert(false);
	}
	
    void resolve(Loc loc, Scope sc, Expression* pe, Type* pt, Dsymbol* ps)
	{
		// Note close similarity to TypeIdentifier::resolve()
		Dsymbol s;

		*pe = null;
		*pt = null;
		*ps = null;

	static if (false) {
		if (!idents.dim)
		{
			error(loc, "template instance '%s' has no identifier", toChars());
			return;
		}
	}
		//id = (Identifier *)idents.data[0];
		//printf("TypeInstance::resolve(sc = %p, idents = '%s')\n", sc, id->toChars());
		s = tempinst;
		if (s)
			s.semantic(sc);
		resolveHelper(loc, sc, s, null, pe, pt, ps);
		if (*pt)
			*pt = (*pt).addMod(mod);
		//printf("pt = '%s'\n", (*pt)->toChars());
	}
	
    Type semantic(Loc loc, Scope sc)
	{
		assert(false);
	}
	
    Dsymbol toDsymbol(Scope sc)
	{
		Type t;
		Expression e;
		Dsymbol s;

		//printf("TypeInstance::semantic(%s)\n", toChars());

		if (sc.parameterSpecialization)
		{
			uint errors = global.errors;
			global.gag++;

			resolve(loc, sc, &e, &t, &s);

			global.gag--;
			if (errors != global.errors)
			{   
				if (global.gag == 0)
					global.errors = errors;

				return null;
			}
		}
		else
			resolve(loc, sc, &e, &t, &s);

		return s;
	}
	
    MATCH deduceType(Scope sc, Type tparam, TemplateParameters parameters, Objects dedtypes)
	{
		assert(false);
	}
}