Ejemplo n.º 1
0
        private AmmyProject GetAmmyProject(string filename, out string projectName)
        {
            AmmyProject cachedProject;

            var genericProject = DteHelpers.GetProjectByFilename(filename);

            if (genericProject == null || genericProject.Kind == EnvDTE.Constants.vsProjectKindMisc)
            {
                throw new CompilerServiceException("Project not found for file: " + filename);
            }

            projectName = genericProject.Name;

            if (_projectCaches.TryGetValue(projectName, out cachedProject))
            {
                var cachedReferences = cachedProject.References.Select(r => r.Path).ToList();
                var cachedFiles      = GetCachedFiles(cachedProject);

                var newProject = new AmmyProject(cachedReferences, cachedFiles, cachedProject.CSharpProject, cachedProject.FsProject.Data, cachedProject.FsProject.ProjectDir, cachedProject.OutputPath, cachedProject.RootNamespace, cachedProject.AssemblyName, cachedProject.TargetPath);
                return(newProject);
            }

            var projectItems    = DteHelpers.GetFileList(genericProject);
            var ammyFileMetas   = GetAmmyFileMetas(projectItems);
            var sourceFilenames = projectItems.Select(pi => DteHelpers.GetFilename(pi)).ToArray();
            var project         = (VSProject)genericProject.Object;
            var fullPath        = genericProject.Properties.Item("FullPath").Value.ToString();
            var objRelativePath = genericProject.ConfigurationManager.ActiveConfiguration.Properties.Item("IntermediatePath").Value.ToString();
            var outputPath      = genericProject.ConfigurationManager.ActiveConfiguration.Properties.Item("OutputPath").Value.ToString();
            var outputFileName  = genericProject.Properties.Item("OutputFileName").Value.ToString();
            var targetPath      = Path.Combine(fullPath, outputPath, outputFileName);
            var rootNamespace   = genericProject.Properties.Item("RootNamespace").Value.ToString();
            var assemblyName    = genericProject.Properties.Item("AssemblyName").Value.ToString();
            //var hostAssemblyPath = Path.Combine(outputDir, outputFileName);
            var references      = GetReferences(project);
            var compilationData = NeedReferenceRefresh(references) ? null : LatestResult?.CompilationData;
            var csharpProject   = new CSharpProject(fullPath, sourceFilenames);
            var ammyProject     = new AmmyProject(references, ammyFileMetas, csharpProject, compilationData, fullPath, objRelativePath, rootNamespace, assemblyName, targetPath);

            _projectCaches[projectName] = ammyProject;
            SubscribeToReferenceChanges(project, projectName);

            return(ammyProject);
        }
Ejemplo n.º 2
0
        private void DteEventHandlers(DTE dte)
        {
            var events2 = dte.Events as Events2;

            if (events2 == null)
            {
                return;
            }

            var solutionEvents = events2.SolutionEvents;
            var piEvents       = events2.ProjectItemsEvents;
            var dEvents        = events2.DebuggerEvents;
            var documentEvents = events2.DocumentEvents;

            AmmyProject project;

            documentEvents.DocumentSaved += document => {
                if (document.FullName.EndsWith(".cs"))
                {
                    LatestResult?.AmmyProject.CSharpProject.MarkAsDirty(document.FullName);
                }
            };

            solutionEvents.ProjectAdded += project1 => {
                var ammyFilename = DteHelpers.GetFileList(project1)
                                   .Select(pi => DteHelpers.GetFilename(pi))
                                   .FirstOrDefault(f => f.EndsWith(".ammy"));

                if (ammyFilename != null)
                {
                    Compile(ammyFilename, false);
                }
            };

            dEvents.OnEnterDesignMode += reason => {
                LatestResult?.AmmyProject.Context.ClearBindingConverters();
                _isDebugging = false;
            };

            dEvents.OnEnterRunMode += reason => {
                LatestResult?.AmmyProject.Context.ClearBindingConverters();

                if (!_isDebugging && LatestResult?.AmmyProject.PlatformName == "XamarinForms")
                {
                    var result = _adbService.SetupAdbForwarding();

                    if (!result && !AmmySettings.SuppressAdbWarning)
                    {
                        MessageBox.Show("Ammy cannot find `adb.exe`" + Environment.NewLine + Environment.NewLine +
                                        "You can specify `adb.exe` path in settings window (top right corner)" + Environment.NewLine +
                                        "Or you can also suppress this warning in the same settings window");
                    }
                }

                _isDebugging = true;
            };

            piEvents.ItemAdded += item => {
                _projectCaches.TryRemove(item.ContainingProject.Name, out project);
            };
            piEvents.ItemRemoved += item => {
                _projectCaches.TryRemove(item.ContainingProject.Name, out project);
            };
            piEvents.ItemRenamed += (item, name) => {
                _projectCaches.TryRemove(item.ContainingProject.Name, out project);
            };

            _eventContainers.Add(piEvents);
            _eventContainers.Add(solutionEvents);
            _eventContainers.Add(dEvents);
            _eventContainers.Add(documentEvents);
        }
Ejemplo n.º 3
0
 private IReadOnlyList <AmmyFileMeta> GetAmmyFileMetas(ProjectItem[] projectItems)
 {
     return(projectItems.Where(pi => string.Equals(Path.GetExtension(DteHelpers.GetFilename(pi)), ".ammy", StringComparison.InvariantCultureIgnoreCase))
            .SelectMany(pi => new[] { ToAmmyFileMeta(DteHelpers.GetFilename(pi), pi) })
            .ToList());
 }