public override void Visit(TemplateAliasParameter p)
 {
     if (p.NameHash == DTokens.IncompleteIdHash)
     {
         halt = true;
         explicitlyNoCompletion = true;
     }
     else
     {
         base.Visit(p);
     }
 }
        bool IsMoreSpecialized(TemplateAliasParameter t1, TemplateAliasParameter t2, Dictionary <TemplateParameter, ISemantic> t1_DummyParamList)
        {
            if (t1.SpecializationExpression != null)
            {
                if (t2.SpecializationExpression == null)
                {
                    return(true);
                }
                // It's not needed to test both expressions for equality because they actually were equal to the given template instance argument
                // à la  'a = b, a = c => b = c'
                return(false);
            }
            else if (t1.SpecializationType != null)
            {
                if (t2.SpecializationType == null)
                {
                    return(true);
                }

                return(IsMoreSpecialized(t1.SpecializationType, t2, t1_DummyParamList));
            }
            return(false);
        }
		public virtual void Visit(TemplateAliasParameter p)
		{
			Visit((TemplateValueParameter)p);

			if (p.SpecializationType != null)
				p.SpecializationType.Accept(this);
			if (p.DefaultType != null)
				p.DefaultType.Accept(this);
		}
        bool Handle(TemplateAliasParameter p, ISemantic arg)
        {
            #region Handle parameter defaults
            if (arg == null)
            {
                if (p.DefaultExpression != null)
                {
                    var eval = Evaluation.EvaluateValue(p.DefaultExpression, ctxt);

                    if (eval == null)
                    {
                        return(false);
                    }

                    return(Set(p, eval, 0));
                }
                else if (p.DefaultType != null)
                {
                    var res = TypeDeclarationResolver.Resolve(p.DefaultType, ctxt);

                    if (res == null)
                    {
                        return(false);
                    }

                    bool ret = false;
                    foreach (var r in res)
                    {
                        if (!Set(p, r, 0))
                        {
                            ret = true;
                        }
                    }

                    if (ret)
                    {
                        return(false);
                    }
                }
                return(false);
            }
            #endregion

            #region Given argument must be a symbol - so no built-in type but a reference to a node or an expression
            var t = AbstractType.Get(arg);

            if (t == null)
            {
                return(false);
            }

            if (!(t is DSymbol))
            {
                while (t != null)
                {
                    if (t is PrimitiveType)                     // arg must not base on a primitive type.
                    {
                        return(false);
                    }

                    if (t is DerivedDataType)
                    {
                        t = ((DerivedDataType)t).Base;
                    }
                    else
                    {
                        break;
                    }
                }
            }
            #endregion

            #region Specialization check
            if (p.SpecializationExpression != null)
            {
                // LANGUAGE ISSUE: Can't do anything here - dmd won't let you use MyClass!(2) though you have class MyClass(alias X:2)
                return(false);
            }
            else if (p.SpecializationType != null)
            {
                // ditto
                return(false);
            }
            #endregion

            return(Set(p, arg, 0));
        }
Beispiel #5
0
		TemplateParameter TemplateParameter(DNode parent)
		{
			CodeLocation startLoc;

			// TemplateThisParameter
			if (laKind == (This))
			{
				Step();

				startLoc = t.Location;
				var end = t.EndLocation;

				var ret= new TemplateThisParameter(TemplateParameter(parent), parent) { Location=startLoc, EndLocation=end };
				LastParsedObject = ret;
				return ret;
			}

			// TemplateTupleParameter
			else if (laKind == (Identifier) && Lexer.CurrentPeekToken.Kind == TripleDot)
			{
				Step();
				startLoc = t.Location;
				var id = t.Value;
				Step();

				var ret=new TemplateTupleParameter(id, startLoc, parent) { Location=startLoc, EndLocation=t.EndLocation	};
				LastParsedObject = ret;
				return ret;
			}

			// TemplateAliasParameter
			else if (laKind == (Alias))
			{
				Step();

				startLoc = t.Location;
				TemplateAliasParameter al;

				if(Expect(Identifier))
					al = new TemplateAliasParameter(t.Value, t.Location, parent);
				else
					al = new TemplateAliasParameter(0, CodeLocation.Empty, parent);
				al.Location = startLoc;
				LastParsedObject = al;

				// TODO?:
				// alias BasicType Declarator TemplateAliasParameterSpecialization_opt TemplateAliasParameterDefault_opt

				// TemplateAliasParameterSpecialization
				if (laKind == (Colon))
				{
					Step();

					AllowWeakTypeParsing=true;
					al.SpecializationType = Type();
					AllowWeakTypeParsing=false;

					if (al.SpecializationType==null)
						al.SpecializationExpression = ConditionalExpression();
				}

				// TemplateAliasParameterDefault
				if (laKind == (Assign))
				{
					Step();

					AllowWeakTypeParsing=true;
					al.DefaultType = Type();
					AllowWeakTypeParsing=false;

					if (al.DefaultType==null)
						al.DefaultExpression = ConditionalExpression();
				}
				al.EndLocation = t.EndLocation;
				return al;
			}

			// TemplateTypeParameter
			else if (laKind == (Identifier) && (Lexer.CurrentPeekToken.Kind == (Colon) || Lexer.CurrentPeekToken.Kind == (Assign) || Lexer.CurrentPeekToken.Kind == (Comma) || Lexer.CurrentPeekToken.Kind == (CloseParenthesis)))
			{
				Expect(Identifier);
				var tt = new TemplateTypeParameter(t.Value, t.Location, parent) { Location = t.Location };
				LastParsedObject = tt;

				if (laKind == Colon)
				{
					Step();
					tt.Specialization = Type();
				}

				if (laKind == Assign)
				{
					Step();
					tt.Default = Type();
				}
				tt.EndLocation = t.EndLocation;
				return tt;
			}

			// TemplateValueParameter
			startLoc = la.Location;
			var bt = BasicType();
			var dv = Declarator(bt,false, null);

			if (dv == null) {
				SynErr (t.Kind, "Declarator expected for parsing template value parameter");
				return null;
			}

			var tv = new TemplateValueParameter(dv.NameHash, dv.NameLocation, parent) { 
				Location=la.Location,
				Type = dv.Type
			};
			LastParsedObject = tv;

			if (laKind == (Colon))
			{
				Step();
				tv.SpecializationExpression = ConditionalExpression();
			}

			if (laKind == (Assign))
			{
				Step();
				tv.DefaultExpression = AssignExpression();
			}
			tv.EndLocation = t.EndLocation;
			return tv;
		}
 public ulong Visit(TemplateAliasParameter templateAliasParameter)
 {
     return(1002143);
 }
		bool IsMoreSpecialized(TemplateAliasParameter t1, TemplateAliasParameter t2, Dictionary<int,ISemantic> t1_DummyParamList)
		{
			if (t1.SpecializationExpression != null)
			{
				if(t2.SpecializationExpression == null)
					return true;
				// It's not needed to test both expressions for equality because they actually were equal to the given template instance argument
				// à la  'a = b, a = c => b = c'
				return false;
			}
			else if (t1.SpecializationType != null)
			{
				if (t2.SpecializationType == null)
					return true;

				return IsMoreSpecialized(t1.SpecializationType, t2, t1_DummyParamList);
			}
			return false;
		}
		bool Handle(TemplateAliasParameter p, ISemantic arg)
		{
			#region Handle parameter defaults
			if (arg == null)
			{
				if (p.DefaultExpression != null)
				{
					var eval = Evaluation.EvaluateValue(p.DefaultExpression, ctxt);

					if (eval == null)
						return false;

					return Set(p, eval, 0);
				}
				else if (p.DefaultType != null)
				{
					var res = TypeDeclarationResolver.Resolve(p.DefaultType, ctxt);

					if (res == null)
						return false;

					bool ret = false;
					foreach(var r in res)
						if (!Set(p, r, 0))
						{
							ret = true;
						}

					if (ret)
						return false;
				}
				return false;
			}
			#endregion

			#region Given argument must be a symbol - so no built-in type but a reference to a node or an expression
			var t=AbstractType.Get(arg);
			
			if (t == null)
				return false;
			
			if(!(t is DSymbol))
				while (t != null)
				{
					if (t is PrimitiveType) // arg must not base on a primitive type.
						return false;
	
					if (t is DerivedDataType)
						t = ((DerivedDataType)t).Base;
					else
						break;
				}
			#endregion

			#region Specialization check
			if (p.SpecializationExpression != null)
			{
				// LANGUAGE ISSUE: Can't do anything here - dmd won't let you use MyClass!(2) though you have class MyClass(alias X:2)
				return false;
			}
			else if (p.SpecializationType != null)
			{
				// ditto
				return false;
			}
			#endregion

			return Set(p,arg,0);
		}