private ElementCtorInfo GetElementCtor(MidElementDecl elementDecl)
{
ElementCtorInfo result;
if (_elementCtors.TryGetValue(elementDecl, out result))
return result;
string name = "Ctor_" + elementDecl.Name.ToString();
var inputAttributes = (from a in elementDecl.Attributes
where a.Exp == null // \todo: real test for input-ness
select a).ToArray();
result = new ElementCtorInfo(
name,
elementDecl,
inputAttributes);
var span = new Span();
span.WriteLine("void {0}(", name);
var resultType = EmitType(elementDecl);
bool first = true;
var resultParam = DeclareOutParam("__result", resultType, span, ref first);
foreach (var a in inputAttributes)
{
var attrName = MapName(a);
var attrType = EmitType(a.Type);
var attrParam = DeclareParam(
attrName,
attrType,
span,
ref first);
_attrVals[a] = attrParam;
}
span.WriteLine(")");
span.WriteLine("{");
var resultAttrs = (from a in elementDecl.Attributes
where a.IsOutput
select EmitAttribRef(a, span)).ToArray();
var resultVal = new TupleValHLSL(
(IAggTypeHLSL) resultType,
resultAttrs);
Assign(resultParam, resultVal, span);
span.WriteLine("}");
_subroutineHeaderSpan.Add(span);
_elementCtors[elementDecl] = result;
return result;
}