public override void VisitApplication(Application appl) { signature = null; appl.Procedure.Accept(this); ProcedureSignature sig = signature; if (sig != null) { if (sig.Parameters.Length != appl.Arguments.Length) { throw new InvalidOperationException("Parameter count must match."); } } for (int i = 0; i < appl.Arguments.Length; ++i) { appl.Arguments[i].Accept(this); if (sig != null) { EnsureTypeVariable(sig.Parameters[i]); store.MergeClasses(appl.Arguments[i].TypeVariable, sig.Parameters[i].TypeVariable); } } EnsureTypeVariable(appl); }
public TypeVariable EnsureTypeVariable(Expression e) { var tv = store.EnsureExpressionTypeVariable(factory, e); var typeref = e.DataType.ResolveAs <TypeReference>(); if (typeref != null) { if (this.typeReferenceClasses.TryGetValue(typeref.Name, out var eq)) { store.MergeClasses(tv, eq.Representative); } else { this.typeReferenceClasses.Add(typeref.Name, tv.Class); } } return(tv); }
public void DtbEqClass() { Identifier id1 = new Identifier("foo", PrimitiveType.Word32, null); Identifier id2 = new Identifier("bar", PrimitiveType.Real32, null); id1.Accept(eqb); id2.Accept(eqb); store.MergeClasses(id1.TypeVariable, id2.TypeVariable); dtb.DataTypeTrait(id1.TypeVariable, id1.DataType); dtb.DataTypeTrait(id2.TypeVariable, id2.DataType); dtb.BuildEquivalenceClassDataTypes(); IList <EquivalenceClass> used = store.UsedEquivalenceClasses; Assert.AreEqual(1, used.Count); Verify("Typing/DtbEqClass.txt"); }
public void TystCopyClassToTypes() { TypeVariable tv1 = store.CreateTypeVariable(factory); TypeVariable tv2 = store.CreateTypeVariable(factory); Assert.IsNotNull(tv1.Class, "Expected store.EnsureTypeVariable to create an equivalence class"); Assert.IsNotNull(tv2.Class, "Expected store.EnsureTypeVariable to create an equivalence class"); EquivalenceClass e = store.MergeClasses(tv1, tv2); e.DataType = PrimitiveType.Word16; store.CopyClassDataTypesToTypeVariables(); foreach (TypeVariable tv in store.TypeVariables) { Assert.IsNotNull(tv.DataType); } }