예제 #1
0
        internal CPFileCodeOrchestrator GetFileOrchestrator(string fileName)
        {
            CPFileCodeOrchestrator cpfOrk = null;

            if (!filesOrchestrator.TryGetValue(fileName, out cpfOrk))
            {
                cpfOrk = new CPFileCodeOrchestrator();
                filesOrchestrator.Add(fileName, cpfOrk);
            }

            return(cpfOrk);
        }
예제 #2
0
        public override bool Execute()
        {
            try
            {
                TaskLogger.Log = Log;
                NetNamedPipeBinding binding = new NetNamedPipeBinding(NetNamedPipeSecurityMode.None);
                //int colon_pos = ProjectFullName.IndexOf(":");
                //string address = "net.pipe://localhost/ChartPoints/IPCChartPoint"; //!!!!!!!!!! move to vcxproj !!!!!!!!!!!!
                string          address = "net.pipe://localhost/IPCChartPoint/" + System.IO.Path.GetFullPath(ProjectFullName).ToLower();
                EndpointAddress ep      = new EndpointAddress(address);
                ipcChartPnt = ChannelFactory <IIPCChartPoint> .CreateChannel(binding, ep);

                CPClassLayout cpClassLayout = ipcChartPnt.GetInjectionData(ProjectName);
                if (cpClassLayout == null)
                {
                    //!!! Add log message
                    return(true);
                }
                filesOrchestrator = new SortedDictionary <string, CPFileCodeOrchestrator>();
                CPFileCodeOrchestrator fileCPOrk = null;
                foreach (CPTraceVar traceVar in cpClassLayout.traceVarPos.Values)
                {
                    //string traceVarName = "__cp_trace_" + traceVar.name;
                    foreach (var tracePos in traceVar.traceVarTracePos)
                    {
                        fileCPOrk = GetFileOrchestrator(tracePos.fileName);
                        //fileCPOrk.AddTransform(tracePos.pos.lineNum - 1, tracePos.pos.linePos - 1, traceVarName + ".trace();");
                        fileCPOrk.AddTransform(tracePos.pos.lineNum - 1, tracePos.pos.linePos - 1, "cptracer::tracer::pub_trace(" + traceVar.name + ");");
                    }
                    fileCPOrk = GetFileOrchestrator(traceVar.defPos.fileName);
                    //fileCPOrk.AddTransform(traceVar.defPos.pos.lineNum - 1, traceVar.defPos.pos.linePos - 1,
                    //  "cptracer::tracer_elem_impl<" + traceVar.type + "> " + traceVarName + ";");
                    if (traceVar.traceVarInitPos.Count == 0 && traceVar.injConstructorPos != null)
                    {
                        CPFileCodeOrchestrator fileConstrOrk = GetFileOrchestrator(traceVar.injConstructorPos.fileName);
                        fileConstrOrk.AddTransform(traceVar.injConstructorPos.pos.lineNum, traceVar.injConstructorPos.pos.linePos
                                                   ,
                                                   //"public:\n" + traceVar.className + "(){\n" + traceVarName + ".reg((uint64_t) &" + traceVar.name + ", \"" +
                                                   //traceVar.uniqueName + "\", cptracer::type_id<" + traceVar.type + ">::id);\n" + "}");
                                                   "public:\n" + traceVar.className + "(){\n" + "cptracer::tracer::pub_reg_elem(\"" +
                                                   traceVar.uniqueName + "\"," + traceVar.name + ");\n" + "}");
                    }
                    else
                    {
                        foreach (var varInitPos in traceVar.traceVarInitPos)
                        {
                            fileCPOrk = GetFileOrchestrator(varInitPos.fileName);
                            fileCPOrk.AddTransform(varInitPos.pos.lineNum, varInitPos.pos.linePos
                                                   ,
                                                   //traceVarName + ".reg((uint64_t) &" + traceVar.name + ", \"" + traceVar.uniqueName + "\", cptracer::type_id<" +
                                                   //traceVar.type + ">::id);");
                                                   "cptracer::tracer::pub_reg_elem(\"" + traceVar.uniqueName + "\"," + traceVar.name + ");\n");
                        }
                    }
                }
                // resource files
                string tempPath = System.IO.Path.GetTempPath();
                //bool res = CreateFileFromResource("CPInstrBuildTask.Resources.CPTracer_i.h", tempPath + "__cp__.CPTracer_i.h");
                bool   res            = CreateFileFromResource("CPInstrBuildTask.Resources.__cp__.tracer.h", tempPath + "__cp__.tracer.h");
                string tracerCppFName = tempPath + "__cp__.tracer.cpp";
                res = CreateFileFromResource("CPInstrBuildTask.Resources.__cp__.tracer.cpp", tracerCppFName);//!!! read, orchestrate & write instead of CreateFileFromResource !!!
                string content     = File.ReadAllText(tracerCppFName);
                string vsixExtPath = System.IO.Path.GetFullPath(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location)).ToLower();
                vsixExtPath = vsixExtPath.Replace(@"\", @"\\");
                string orcContent = content.Replace("#define PATH2DLL \"\"", "#define PATH2DLL \"" + vsixExtPath + "\"");
                File.WriteAllText(tracerCppFName, orcContent);
                //
                foreach (var traceInclPos in cpClassLayout.traceInclPos)
                {
                    fileCPOrk = GetFileOrchestrator(traceInclPos.Key);
                    fileCPOrk.AddTransform(traceInclPos.Value.lineNum, traceInclPos.Value.linePos, "#include \"__cp__.tracer.h\"");// "#include \"..\\tracer\\tracer.h\"");
                }
                foreach (var inclFilePos in cpClassLayout.includesPos)
                {
                    fileCPOrk = GetFileOrchestrator(inclFilePos.Value.pos.fileName);
                    ITextTransform inclTrans = new TextTransformReplace(inclFilePos.Value.inclOrig, inclFilePos.Value.inclReplace);
                    fileCPOrk.AddTransform(inclFilePos.Value.pos.pos.lineNum, inclFilePos.Value.pos.pos.linePos, inclTrans);
                }
                foreach (var fileOrk in filesOrchestrator)
                {
                    fileOrk.Value.Orchestrate(fileOrk.Key);
                }
                ArrayList items = new ArrayList();
                foreach (ITaskItem item in InputSrcFiles)
                {
                    CPFileCodeOrchestrator cpCodeOrk = null;
                    if (filesOrchestrator.TryGetValue(item.ItemSpec, out cpCodeOrk))
                    {
                        ITaskItem replacedItem = new TaskItem(tempPath + "__cp__." + item.ItemSpec);
                        items.Add(replacedItem);
                    }
                    else
                    {
                        items.Add(item);
                    }
                }
                ITaskItem tracerItem = new TaskItem(tempPath + "__cp__.tracer.cpp");// "..\\tracer\\tracer.cpp");
                items.Add(tracerItem);
                if (items.Count > 0)
                {
                    OutputSrcFiles  = (ITaskItem[])items.ToArray(typeof(ITaskItem));
                    SrcFilesChanged = true;
                }
                items.Clear();
                foreach (ITaskItem item in InputHeaderFiles)
                {
                    CPFileCodeOrchestrator cpCodeOrk = null;
                    if (filesOrchestrator.TryGetValue(item.ItemSpec, out cpCodeOrk))
                    {
                        ITaskItem replacedItem = new TaskItem(System.IO.Path.GetTempPath() + "__cp__." + item.ItemSpec);
                        items.Add(replacedItem);
                    }
                    else
                    {
                        items.Add(item);
                    }
                }
                if (items.Count > 0)
                {
                    OutputHeaderFiles  = (ITaskItem[])items.ToArray(typeof(ITaskItem));
                    HeaderFilesChanged = true;
                }
            }
            catch (Exception /*ex*/)
            {
                SrcFilesChanged    = false;
                HeaderFilesChanged = false;
            }

            return(true);
        }