Пример #1
0
 public virtual void AddContractNameAttribute(ManifestBuilder mfb,
                                              XmlNode node,
                                              MetaDataCustomAttribute data,
                                              string contractName)
 {
     mfb.AddAttribute(node, "contractName", contractName);
 }
Пример #2
0
    public static void Main(String[] args)
    {
        Console.WriteLine("MkMsil:");

        ArrayList streams = new ArrayList();

        foreach (string arg in args)
        {
            streams.Add(new MetaDataResolver.LoadedStream(arg,
                                                          Path.GetFullPath(arg),
                                                          new FileStream(arg,
                                                                         FileMode.Open,
                                                                         FileAccess.Read,
                                                                         FileShare.Read)));
        }

        Console.WriteLine("-----------------------------------------------------------------");
        MetaDataResolver resolver = new MetaDataResolver(streams, false, false, false);

        Console.WriteLine("-----------------------------------------------------------------");
        MetaDataResolver.ResolveCustomAttributes(new MetaDataResolver[] { resolver });
        Console.WriteLine("-----------------------------------------------------------------");

        MetaDataTypeDefinition shellCommandAttribute
            = resolver.ResolveName("Microsoft.Singularity.Shell.ShellCommandAttribute");

        Console.WriteLine("{0}", shellCommandAttribute);
        Console.WriteLine("-----------------------------------------------------------------");

#if DONT
        foreach (MetaData metadata in resolver.MetaDataList)
        {
            DumpMetaData(metadata);
        }
#endif

        foreach (MetaData metadata in resolver.MetaDataList)
        {
            foreach (MetaDataTypeDefinition type in metadata.TypeDefs)
            {
                foreach (MetaDataMethod method in type.Methods)
                {
                    MetaDataCustomAttribute attribute
                        = MethodFindAttribute(method, shellCommandAttribute);

                    if (attribute != null)
                    {
                        Console.WriteLine("new ShellCommand(\"{0}\", \"{1}\", new Command({2})),",
                                          attribute.FixedArgs[0],
                                          attribute.FixedArgs[1],
                                          method.Name);
                    }
                }
            }
        }
    }
Пример #3
0
    public XmlNode CreateNodeIndexed(MetaDataCustomAttribute data,
                                     TokenDefinition rule,
                                     int index
                                     )
    {
        XmlNode node = CreateNode(data, rule);

        AddAttribute(node, "id", index.ToString());
        return(node);
    }
Пример #4
0
    // This is the only way we create XML tags (except for Endpoints)
    public XmlNode CreateNode(MetaDataCustomAttribute data,
                              TokenDefinition rule)
    {
        XmlNode node = AddElement(null, rule.xmlTagName);

        // make an attribute for each constructor argument
        if (data.FixedArgs.Length != 0)
        {
            for (int i = 0; i < data.FixedArgs.Length; i++)
            {
                string name = rule.constructorFields[i];
                if (data.FixedArgs[i] == null)
                {
                    AddAttribute(node, name, "");
                }
                else
                {
                    string value = data.FixedArgs[i].ToString();
                    AddAttribute(node, name, value);
                }
            }
        }

        // make an attribute for each constructor-time property
        for (int i = 0; i < data.NamedArgs.Length; i++)
        {
            string name = rule.FindPropertyReplacement(data.NamedArgs[i].Name);
            object arg  = data.NamedArgs[i].Value;
            string value;
            if (arg == null)
            {
                // REVIEW: do we want "" or null here?
                value = null;
            }
            else
            {
                value = data.NamedArgs[i].Value.ToString();
                if (arg is System.UInt32)
                {
                    // We output unsigned types as 0x because they are generally
                    // hardware-related numbers which are documented in hexadecimal.
                    value = String.Format("0x{0:x}", arg);
                }
            }
            AddAttribute(node, name, value);
        }

        // make an attribute for each default field
        for (int i = 0; i < rule.defaultFields.Length; i += 2)
        {
            string name = rule.defaultFields[i];
            AddAttribute(node, name, rule.defaultFields[i + 1]);
        }
        return(node);
    }
Пример #5
0
    public override void AddContractNameAttribute(ManifestBuilder mfb,
                                                  XmlNode node,
                                                  MetaDataCustomAttribute data,
                                                  string contractName)
    {
        // takes endpoint type as argument
        if (data.FixedArgs == null || data.FixedArgs.Length != 1)
        {
            mfb.Error("ServiceEndpoint attribute must have 1 type argument");
            return;
        }

        // now make it easy to split into name=value pairs by doing some
        // string replacing
        string ctorArgument = "contractName=" + data.FixedArgs[0];

        ctorArgument = ctorArgument.Replace("+", " endpointEnd=");
        ctorArgument = ctorArgument.Replace(", V", " v");
        ctorArgument = ctorArgument.Replace(", C", " c");
        ctorArgument = ctorArgument.Replace(", P", " p");
        ctorArgument = ctorArgument.Replace(",", " assembly=");

        // now we can split on ' ' and '=' to get name/value pairs
        string [] endpointConfig = ctorArgument.Split(' ');

        // grab only the contractName, ignore the rest
#if false
        foreach (string attrib in endpointConfig)
        {
            string [] pair = attrib.Split('=');
            if (pair.Length == 2)
            {
                string name  = pair[0];
                string value = pair[1];
                AddAttribute(node, name, value);
            }
        }
#else
        string [] pair = endpointConfig[0].Split('=');
        Debug.Assert(pair.Length == 2);
        string name = pair[0];
        Debug.Assert(name == "contractName");
        string value = pair[1];
        base.AddContractNameAttribute(mfb, node, data, value);
#endif
    }
Пример #6
0
    // Endpoints are special in a lot of ways, and require a special method
    public XmlNode CreateEndpointNode(MetaDataCustomAttribute data,
                                      EndpointDefinition rule,
                                      int index)
    {
        // assume that the constructor to an endpoint always takes one argument,
        // and that the argument looks like this:
        // "<discard*> contractname+Exp*,AssemblyName, Version=foo,
        //  Culture=bar, PublicKeyToken=fbar"

        // we'll parse this to get all the attributes of the top-level tag, and
        // then parse field that is being decorated to get the rest of the
        // information we need.

        // get the type of the field that is decorated:
        MetaDataObject t = (MetaDataObject)
                           ((MetaDataField)data.Parent).Signature.FieldType.ClassObject;

        // split the field to get the parts we need
        string typeName = t.FullName;

        typeName = typeName.Replace("<", ",");
        typeName = typeName.Replace(">", "");
        typeName = typeName.Replace("+", ",");

        string [] nameParts = typeName.Split(',');

        string contractName = nameParts[1];
        string impName      = contractName + ".Imp";
        string expName      = contractName + ".Exp";
        string stateName    = contractName + "." + nameParts[4];


        XmlNode impNode = GetEndpointHierarchy("imp", impName);
        XmlNode expNode = GetEndpointHierarchy("exp", expName);

        MetaDataTypeDefinition r1 = resolver.ResolveName(impName);
        MetaDataTypeDefinition r2 = resolver.ResolveName(expName);
        MetaDataTypeDefinition r3 = resolver.ResolveName(stateName);

        string startState = "";

        for (int i = 0; i < r3.Fields.Length; i++)
        {
            if (r3.Fields[i].Name == "Value")
            {
                startState = r3.Fields[0].DefaultValue.ToString();
                break;
            }
        }

        XmlNode node = manifest.CreateNode(XmlNodeType.Element,
                                           rule.xmlTagName, "");

        node.AppendChild(impNode);
        node.AppendChild(expNode);
        AddAttribute(node, "id", index.ToString());
        if (startState != "")
        {
            AddAttribute(node, "startStateId", startState);
        }

        // Contract name comes from either the attribute argument
        // or the TRef type depending on the endpoint kind
        rule.AddContractNameAttribute(this, node, data, contractName);

        // add an attribute for each constructor argument if there is one
        // This should only be true for input/ouput pipes
        if (rule.constructorFields != null && rule.constructorFields.Length != 0)
        {
            if (data.FixedArgs.Length != 0)
            {
                for (int i = 0; i < data.FixedArgs.Length; i++)
                {
                    if (rule.constructorFields[i] != null)
                    {
                        string name = rule.constructorFields[i];
                        if (data.FixedArgs[i] == null)
                        {
                            AddAttribute(node, name, "");
                        }
                        else
                        {
                            string value = data.FixedArgs[i].ToString();
                            AddAttribute(node, name, value);
                        }
                    }
                    else
                    {
                        Console.WriteLine(" fixed=({0}), no matching constructor?",
                                          data.FixedArgs[i] == null? null : data.FixedArgs[i].ToString());
                    }
                }
            }
        }

        return(node);
    }