コード例 #1
0
        public static string NewDefinition([NotNull] DefinitionSite definition)
        {
            switch (definition.kind)
            {
            case DefinitionSiteKind.RETURN:
                return(string.Format("{0}:{1}", definition.kind, definition.method.Name));

            case DefinitionSiteKind.NEW:
                return(string.Format("INIT:{0}", definition.method.Name));

            case DefinitionSiteKind.PARAM:
                return(string.Format("{0}({1}):{2}", definition.kind, definition.argIndex, definition.method.Name));

            case DefinitionSiteKind.FIELD:
                return(string.Format("{0}:{1}", definition.kind, definition.field.Name));

            case DefinitionSiteKind.THIS:
            case DefinitionSiteKind.CONSTANT:
            case DefinitionSiteKind.UNKNOWN:
                return(definition.kind.ToString());

            default:
                throw new ArgumentOutOfRangeException();
            }
        }
コード例 #2
0
 public void RegisterDefinition(string id, DefinitionSite defSite)
 {
     if (NameResolver.IsExisting(id))
     {
         var q = NameResolver.Find(id);
         q.definition = defSite;
     }
 }
コード例 #3
0
        public void DefinitionByThisIsCorrectInitialized()
        {
            var actual   = DefinitionSites.CreateDefinitionByThis();
            var expected = new DefinitionSite
            {
                kind = DefinitionSiteKind.THIS
            };

            Assert.AreEqual(expected, actual);
        }
コード例 #4
0
        public void DefinitionByConstantIsCorrectInitialized()
        {
            var actual   = DefinitionSites.CreateDefinitionByConstant();
            var expected = new DefinitionSite
            {
                kind = DefinitionSiteKind.CONSTANT
            };

            Assert.AreEqual(expected, actual);
        }
コード例 #5
0
        public void UnknownDefinitionIsCorrectInitialized()
        {
            var actual   = DefinitionSites.CreateUnknownDefinitionSite();
            var expected = new DefinitionSite
            {
                kind = DefinitionSiteKind.UNKNOWN
            };

            Assert.AreEqual(expected, actual);
        }
コード例 #6
0
        public void InitDefinitionIsCorrectInitialized()
        {
            var actual   = DefinitionSites.CreateDefinitionByConstructor("LType.Create()LType;");
            var expected = new DefinitionSite
            {
                kind   = DefinitionSiteKind.NEW,
                method = new CoReMethodName("LType.Create()LType;")
            };

            Assert.AreEqual(expected, actual);
        }
コード例 #7
0
        public void FieldDefinitionIsCorrectInitialized()
        {
            var actual   = DefinitionSites.CreateDefinitionByField("LType.object;LType");
            var expected = new DefinitionSite
            {
                kind  = DefinitionSiteKind.FIELD,
                field = new CoReFieldName("LType.object;LType")
            };

            Assert.AreEqual(expected, actual);
        }
コード例 #8
0
        public void MethodReturnDefinitionIsCorrectInitialized()
        {
            var actual   = DefinitionSites.CreateDefinitionByReturn("LStrangeType.M()LType;");
            var expected = new DefinitionSite
            {
                kind   = DefinitionSiteKind.RETURN,
                method = new CoReMethodName("LStrangeType.M()LType;")
            };

            Assert.AreEqual(expected, actual);
        }
コード例 #9
0
        public void InitDefinitionByMethodNameIsCorrectInitialized()
        {
            var methodName = Names.Method("[System.Void, mscorlib, 4.0.0.0] [Decl,P1]..ctor()");
            var actual     = DefinitionSites.CreateDefinitionByConstructor(methodName);
            var expected   = new DefinitionSite
            {
                kind   = DefinitionSiteKind.NEW,
                method = methodName.ToCoReName()
            };

            Assert.AreEqual(expected, actual);
        }
コード例 #10
0
        public void FieldDefinitionByFieldNameIsCorrectInitialized()
        {
            var fieldName = Names.Field("[VType,P1] [Decl,P1]._fieldName");
            var actual    = DefinitionSites.CreateDefinitionByField(fieldName);
            var expected  = new DefinitionSite
            {
                kind  = DefinitionSiteKind.FIELD,
                field = fieldName.ToCoReName()
            };

            Assert.AreEqual(expected, actual);
        }
コード例 #11
0
        public void MethodReturnByMethodNameDefinitionIsCorrectInitialized()
        {
            var methodName = Names.Method("[RType,P1] [Decl,P1].MethodName()");
            var actual     = DefinitionSites.CreateDefinitionByReturn(methodName);
            var expected   = new DefinitionSite
            {
                kind   = DefinitionSiteKind.RETURN,
                method = methodName.ToCoReName()
            };

            Assert.AreEqual(expected, actual);
        }
コード例 #12
0
        public void ParameterDefinitionIsCorrectInitialized()
        {
            var actual   = DefinitionSites.CreateDefinitionByParam("LType.M(LOtherType;)LType;", 0);
            var expected = new DefinitionSite
            {
                kind     = DefinitionSiteKind.PARAM,
                method   = new CoReMethodName("LType.M(LOtherType;)LType;"),
                argIndex = 0
            };

            Assert.AreEqual(expected, actual);
        }
コード例 #13
0
        public void ParameterDefinitionByMethodNameIsCorrectInitialized()
        {
            var methodName = Names.Method("[RType,P1] [Decl,P1].method([PType, Pq1] length)");
            var actual     = DefinitionSites.CreateDefinitionByParam(methodName, 0);
            var expected   = new DefinitionSite
            {
                kind     = DefinitionSiteKind.PARAM,
                method   = methodName.ToCoReName(),
                argIndex = 0
            };

            Assert.AreEqual(expected, actual);
        }
コード例 #14
0
        private Query CreateQueryWithDefaults(ITypeName type, DefinitionSite def, params IMethodName[] methods)
        {
            var query = new Query
            {
                type       = type.ToCoReName(),
                classCtx   = SomeType.ToCoReName(),
                methodCtx  = SomeMethodName.ToCoReName(),
                definition = def
            };

            foreach (IMethodName method in methods)
            {
                query.sites.Add(CallSites.CreateReceiverCallSite(method));
            }
            return(query);
        }
コード例 #15
0
        private DefinitionSite ReadDefSite(JsonReader reader)
        {
            var ds  = new DefinitionSite();
            var obj = JObject.Load(reader);

            // kind
            var kindToken = obj.GetValue("kind");
            var kindStr   = kindToken.Value <string>();
            DefinitionSiteKind dsk;

            Enum.TryParse(kindStr, out dsk);
            ds.kind = dsk;

            // field
            var fieldToken = obj.GetValue("field");

            if (fieldToken != null)
            {
                var fieldStr = fieldToken.Value <string>();
                if (fieldStr != null)
                {
                    ds.field = new CoReFieldName(fieldStr);
                }
            }

            // method
            var methodToken = obj.GetValue("method");

            if (methodToken != null)
            {
                var methodStr = methodToken.Value <string>();
                if (methodStr != null)
                {
                    ds.method = new CoReMethodName(methodStr);
                }
            }

            // argIndex
            var argToken = obj.GetValue("argIndex");

            if (argToken != null)
            {
                ds.argIndex = argToken.Value <int>();
            }

            return(ds);
        }
コード例 #16
0
        private Query Usage(ITypeName type, DefinitionSite defSite, params string[] calls)
        {
            var q = new Query
            {
                type       = type.ToCoReName(),
                definition = defSite
            };

            foreach (var shortCall in calls)
            {
                var mStr = string.Format("[{0}] [{1}].{2}()", "System.Void", "A,P", shortCall);
                var m    = Names.Method(mStr);
                var call = CallSites.CreateReceiverCallSite(m);
                q.sites.Add(call);
            }
            return(q);
        }
コード例 #17
0
        private Query NewQueryFor(CoReTypeName type, DefinitionSite defSite)
        {
            var q = new Query();

            AllQueries.Add(q);
            try
            {
                q.definition = defSite;
                q.type       = type;
                q.classCtx   = Enclosings.Type.ToCoReName();
                q.methodCtx  = Enclosings.Method.ToCoReName();
                return(q);
            }
            catch (Exception)
            {
                Console.WriteLine("failed to create new Query, falling back to Unknown");
                return(q);
            }
        }
コード例 #18
0
        public void DefineVariable(string id, CoReTypeName type, DefinitionSite defSite)
        {
            if (NameResolver.IsExistingInCurrentScope(id))
            {
                return;
            }

            if (NameResolver.IsExistingInCurrentScope(type))
            {
                var q = NameResolver.Find(type);
                NameResolver.Register(id, q);
            }
            else
            {
                var q = NewQueryFor(type, defSite);
                NameResolver.Register(id, q);
                NameResolver.Register(type, q);
            }
        }
コード例 #19
0
        public void DefinitionSiteSerialization_NullValues()
        {
            var obj = new DefinitionSite
            {
                kind   = DefinitionSiteKind.THIS,
                field  = null,
                method = null
            };

            var json = "{" + Environment.NewLine +
                       "    \"kind\": \"THIS\"" + Environment.NewLine +
                       "}";

            var actualJson = obj.ToFormattedJson();

            Assert.AreEqual(json, actualJson);
            var other = json.ParseJsonTo <DefinitionSite>();

            Assert.AreEqual(obj, other);
        }
コード例 #20
0
        public void DefinitionSiteSerialization_DefaultArgIndexIsNotSerialized()
        {
            var obj = new DefinitionSite
            {
                kind   = DefinitionSiteKind.THIS,
                field  = Names.Field("[F,P] [T,P].f").ToCoReName(),
                method = Names.Method("[R,P] [T,P].M()").ToCoReName()
            };

            var json = "{" + Environment.NewLine +
                       "    \"kind\": \"THIS\"," + Environment.NewLine +
                       "    \"field\": \"LT.f;LF\"," + Environment.NewLine +
                       "    \"method\": \"LT.M()LR;\"" + Environment.NewLine +
                       "}";

            var actualJson = obj.ToFormattedJson();

            Assert.AreEqual(json, actualJson);
            var other = json.ParseJsonTo <DefinitionSite>();

            Assert.AreEqual(obj, other);
        }
コード例 #21
0
        private void Write(JsonWriter writer, DefinitionSite defSite)
        {
            writer.WriteStartObject();

            writer.WritePropertyName("kind");
            writer.WriteValue(defSite.kind.ToString());
            if (defSite.field != null)
            {
                writer.WritePropertyName("field");
                Write(writer, defSite.field);
            }
            if (defSite.method != null)
            {
                writer.WritePropertyName("method");
                Write(writer, defSite.method);
            }
            if (defSite.argIndex != 0)
            {
                writer.WritePropertyName("argIndex");
                writer.WriteValue(defSite.argIndex);
            }

            writer.WriteEndObject();
        }
コード例 #22
0
        protected void AssertSingleQueryWithDefinition(DefinitionSite expected)
        {
            var actual = AssertSingleQuery().definition;

            Assert.AreEqual(expected, actual);
        }
コード例 #23
0
 public void DefineVariable(string id, ITypeName type, DefinitionSite defSite)
 {
     DefineVariable(id, type.ToCoReName(), defSite);
 }