/// <summary> /// Create inheritance chain for given definition. /// </summary> /// <param name="definition">Definition which chain is registered.</param> private void createChain(RuntimeTypeDefinition definition) { var subChains = definition.GetSubChains(); var chain = new InheritanceChain(definition.TypeInfo, subChains); registerChain(chain); }
/// <summary> /// Creates the static property. /// </summary> /// <param name="definition">The definition.</param> /// <param name="method">The method.</param> /// <param name="name">The name.</param> /// <returns>RuntimeMethodGenerator.</returns> private RuntimeMethodGenerator _createStaticProperty(RuntimeTypeDefinition definition, MethodInfo method, string name) { var prefix = "_static_"; var generator = buildMethod(definition, method, method.Name.Substring(prefix.Length), true); return(generator); }
/// <summary> /// Register given definition into runtime assembly. /// </summary> /// <param name="definition">Registered definition.</param> private void buildDefinition(RuntimeTypeDefinition definition) { //every definition needs initialization definition.Initialize(this, this.TypeServices); //add static edits defined by built definition _globalEdits.AddRange(definition.StaticEdits); //every definition needs to register its chain createChain(definition); //get all methods defined by definition var methodGenerators = definition.GetMethods(); foreach (var generator in methodGenerators) { var item = new MethodItem(generator, generator.MethodInfo); _runtimeMethods.AddItem(item, generator.Implemented); } if (definition.ComponentInfo != null) { ComponentDiscovered(definition.ComponentInfo); } }
/// <summary> /// Build method generator from given method info. /// </summary> /// <param name="definition">Type where method is defined.</param> /// <param name="method">Method info defining method.</param> /// <param name="methodName">Name of defined method.</param> /// <param name="forceStatic">if set to <c>true</c> [force static].</param> /// <returns>Builder where method is built.</returns> private RuntimeMethodGenerator buildMethod(RuntimeTypeDefinition definition, MethodInfo method, string methodName, bool forceStatic = false) { var builder = new MethodBuilder(definition, methodName, forceStatic); builder.ThisObjectExpression = builder.DeclaringDefinitionConstant; builder.AdapterFor(method); return(builder.Build()); }
/// <summary> /// Creates the method. /// </summary> /// <param name="definition">The definition.</param> /// <param name="method">The method.</param> /// <param name="name">The name.</param> /// <returns>RuntimeMethodGenerator.</returns> private RuntimeMethodGenerator _createMethod(RuntimeTypeDefinition definition, MethodInfo method, string name) { if (name == "ctor") { name = Naming.CtorName; } var generator = buildMethod(definition, method, name); return(generator); }
/// <summary> /// Get method generators defined in given runtime type definition. /// </summary> /// <param name="definition">Definition which methods are resolved.</param> /// <returns>Method generators for defined methods.</returns> internal IEnumerable <RuntimeMethodGenerator> GetMethodGenerators(RuntimeTypeDefinition definition) { var result = new List <RuntimeMethodGenerator>(); foreach (var method in definition.GetType().GetMethods()) { var name = method.Name; //create method definition according to it's prefix foreach (var provider in _methodGeneratorProviders) { if (name.StartsWith(provider.Key)) { var notPrefixedName = name.Substring(provider.Key.Length); var generator = provider.Value(definition, method, notPrefixedName); result.Add(generator); break; } } } return(result); }
/// <summary> /// Creates the property. /// </summary> /// <param name="definition">The definition.</param> /// <param name="method">The method.</param> /// <param name="name">The name.</param> /// <returns>RuntimeMethodGenerator.</returns> private RuntimeMethodGenerator _createProperty(RuntimeTypeDefinition definition, MethodInfo method, string name) { var generator = buildMethod(definition, method, method.Name.Substring(1)); return(generator); }