Beispiel #1
0
        public static JavaEditorBase Disconnect(IWpfTextView textView, Collection <ITextBuffer> subjectBuffers)
        {
            ServerProxy            javaPkgServer          = null;
            JavaEditor             javaEditor             = null;
            JavaUnconfiguredEditor javaUnconfiguredEditor = null;

            textView.Properties.TryGetProperty <ServerProxy>(typeof(ServerProxy), out javaPkgServer);
            textView.Properties.TryGetProperty <JavaEditor>(typeof(JavaEditor), out javaEditor);
            textView.Properties.TryGetProperty <JavaUnconfiguredEditor>(typeof(JavaUnconfiguredEditor), out javaUnconfiguredEditor);

            textView.Properties.RemoveProperty(typeof(JavaUnconfiguredEditor));
            textView.Properties.RemoveProperty(typeof(ServerProxy));
            textView.Properties.RemoveProperty(typeof(JavaEditor));

            foreach (var buffer in subjectBuffers)
            {
                buffer.Properties.RemoveProperty(typeof(JavaUnconfiguredEditor));
                buffer.Properties.RemoveProperty(typeof(ServerProxy));
                buffer.Properties.RemoveProperty(typeof(JavaEditor));
            }

            if (javaPkgServer != null && javaEditor != null && javaEditor.TypeRootIdentifier != null)
            {
                javaPkgServer.Send(javaEditor, ProtocolHandlers.CreateDisposeTypeRootRequest(javaEditor.TypeRootIdentifier)).ContinueWith((System.Threading.Tasks.Task <Protocol.Response> responseTask) =>
                {
                    JavaPkgServerMgr.ReleaseProxy(javaPkgServer);
                });
            }

            return(javaEditor != null ? (JavaEditorBase)javaEditor : (JavaEditorBase)javaUnconfiguredEditor);
        }
Beispiel #2
0
        public async System.Threading.Tasks.Task CollectSignatureLists(ISignatureHelpSession newSession)
        {
            JavaEditor javaEditor = null;

            if (TextBuffer.Properties.TryGetProperty <JavaEditor>(typeof(JavaEditor), out javaEditor) &&
                javaEditor.TypeRootIdentifier != null)
            {
                var textReader       = new TextSnapshotToTextReader(TextBuffer.CurrentSnapshot) as TextReader;
                var position         = newSession.GetTriggerPoint(TextBuffer).GetPosition(TextBuffer.CurrentSnapshot);
                var paramHelpRequest = ProtocolHandlers.CreateParamHelpRequest(
                    textReader,
                    javaEditor.TypeRootIdentifier,
                    position);
                var paramHelpResponse = await javaEditor.JavaPkgServer.Send(javaEditor, paramHelpRequest);

                if (paramHelpResponse.responseType == Protocol.Response.ResponseType.ParamHelp &&
                    paramHelpResponse.paramHelpResponse != null)
                {
                    if (paramHelpResponse.paramHelpResponse.status && paramHelpResponse.paramHelpResponse.signatures.Count != 0)
                    {
                        var applicableTo           = TextBuffer.CurrentSnapshot.CreateTrackingSpan(new Span(paramHelpResponse.paramHelpResponse.scopeStart, paramHelpResponse.paramHelpResponse.scopeLength), SpanTrackingMode.EdgeInclusive, 0);
                        int selectedParameterIndex = paramHelpResponse.paramHelpResponse.paramCount;
                        Signatures = TransformSignatures(TextBuffer, paramHelpResponse.paramHelpResponse.signatures, applicableTo, selectedParameterIndex);
                    }
                }
            }
        }
Beispiel #3
0
        public async System.Threading.Tasks.Task CollectCompletionSets(ICompletionSession newSession)
        {
            JavaEditor javaEditor = null;

            if (TextBuffer.Properties.TryGetProperty <JavaEditor>(typeof(JavaEditor), out javaEditor) &&
                javaEditor.TypeRootIdentifier != null)
            {
                var textReader          = new TextSnapshotToTextReader(TextBuffer.CurrentSnapshot) as TextReader;
                var autocompleteRequest = ProtocolHandlers.CreateAutocompleteRequest(
                    textReader,
                    javaEditor.TypeRootIdentifier,
                    newSession.GetTriggerPoint(TextBuffer).GetPosition(TextBuffer.CurrentSnapshot));
                var autocompleteResponse = await javaEditor.JavaPkgServer.Send(javaEditor, autocompleteRequest);

                if (autocompleteResponse.responseType == Protocol.Response.ResponseType.Autocomplete &&
                    autocompleteResponse.autocompleteResponse != null)
                {
                    if (autocompleteResponse.autocompleteResponse.status && autocompleteResponse.autocompleteResponse.proposals.Count != 0)
                    {
                        CompletionSetList = new List <CompletionSet>();
                        var list = TransformCompletions(TextBuffer.CurrentSnapshot, autocompleteResponse.autocompleteResponse.proposals);
                        CompletionSetList.Add(new CompletionSet("Autocomplete", "Autocomplete", GetReplacementSpanFromCompletions(TextBuffer.CurrentSnapshot, autocompleteResponse.autocompleteResponse.proposals.First()), list, null)); // FindTokenSpanAtPosition(newSession.GetTriggerPoint(TextBuffer), newSession), list, null));
                    }
                }
            }
        }
        public ServerProxy Configure(string eclipsePath)
        {
            Telemetry.Client.Get().TrackEvent("App.ConfigureEditor");

            // Remove itself from properties
            TextView.Properties.RemoveProperty(typeof(JavaUnconfiguredEditor));

            // Set path in registry
            Registry.SetValue("HKEY_CURRENT_USER\\Software\\Microsoft\\JavaPkgSrv", "EclipseInstall", eclipsePath, RegistryValueKind.String);

            // Reboot editor
            var fileName         = VSHelpers.GetFileName(TextView);
            var eclipseWorkspace = EclipseWorkspace.FromFilePath(fileName);
            var javaPkgServer    = JavaPkgServerManager.GetProxy(eclipseWorkspace);
            var javaEditor       = new JavaEditor(SubjectBuffers, TextView, javaPkgServer, eclipseWorkspace);

            Telemetry.Client.Get().TrackEvent("App.EditorOpenConfigured");

            javaPkgServer.Send(javaEditor, ProtocolHandlers.CreateOpenTypeRootRequest(fileName)).ContinueWith((System.Threading.Tasks.Task <Protocol.Response> responseTask) =>
            {
                var openTypeResponse = responseTask.Result;

                if (openTypeResponse.responseType == Protocol.Response.ResponseType.OpenTypeRoot &&
                    openTypeResponse.openTypeRootResponse != null)
                {
                    javaEditor.TypeRootIdentifier = openTypeResponse.openTypeRootResponse.typeRootIdentifier;
                }
            });

            TextView.Properties.RemoveProperty(typeof(ServerProxy));
            TextView.Properties.AddProperty(typeof(ServerProxy), javaPkgServer);

            TextView.Properties.RemoveProperty(typeof(JavaEditor));
            TextView.Properties.AddProperty(typeof(JavaEditor), javaEditor);

            foreach (var buffer in SubjectBuffers)
            {
                buffer.Properties.RemoveProperty(typeof(JavaUnconfiguredEditor));
                buffer.Properties.RemoveProperty(typeof(ServerProxy));
                buffer.Properties.AddProperty(typeof(ServerProxy), javaPkgServer);
                buffer.Properties.RemoveProperty(typeof(JavaEditor));
                buffer.Properties.AddProperty(typeof(JavaEditor), javaEditor);

                JavaOutline outline = null;
                if (buffer.Properties.TryGetProperty <JavaOutline>(typeof(JavaOutline), out outline))
                {
                    outline.JavaEditor = javaEditor;
                }

                JavaSquiggles squiggles = null;
                if (buffer.Properties.TryGetProperty <JavaSquiggles>(typeof(JavaSquiggles), out squiggles))
                {
                    squiggles.JavaEditor = javaEditor;
                }
            }
            return(javaPkgServer);
        }
Beispiel #5
0
        public async Task ParseAsync()
        {
            FileParseResponse = null;
            TokenSource       = new CancellationTokenSource();
            var token      = TokenSource.Token;
            var textReader = new TextSnapshotToTextReader(TextSnapshot) as TextReader;

            await Task.Run(async() =>
            {
                // Trottle down parsing; wait another 200ms
                Thread.Sleep(TimeSpan.FromMilliseconds(200));
                if (token.IsCancellationRequested)
                {
                    return;
                }

                Trace.WriteLine("[@@ Java parser] getting ready to parse");
                var astRequest  = ProtocolHandlers.CreateFileParseRequest(textReader, VSHelpers.GetFileName(Parent.TextView));
                var astResponse = await Parent.JavaPkgServer.Send(Parent, astRequest);
                if (astResponse.responseType == Protocol.Response.ResponseType.FileParseStatus && astResponse.fileParseResponse != null)
                {
                    Trace.WriteLine(String.Format("Response from server: {0} {1}",
                                                  astResponse.fileParseResponse.status.ToString(),
                                                  string.IsNullOrEmpty(astResponse.fileParseResponse.errorMessage) ? astResponse.fileParseResponse.errorMessage : astResponse.fileParseResponse.fileIdentifier.ToString()));

                    if (astResponse.fileParseResponse.status)
                    {
                        // We have a successful parse; now we keep going asking questions about the AST
                        FileParseResponse = astResponse.fileParseResponse;

                        // Squiggles
                        var messagesRequest  = ProtocolHandlers.CreateFileParseMessagesRequest(astResponse.fileParseResponse.fileIdentifier);
                        var messagesResponse = await Parent.JavaPkgServer.Send(Parent, messagesRequest);
                        if (messagesResponse.responseType == Protocol.Response.ResponseType.FileParseMessages && messagesResponse.fileParseMessagesResponse != null)
                        {
                            Parent.Fire_FileParseMessagesAvailable(this, messagesResponse.fileParseMessagesResponse);
                        }

                        // Outline
                        var outlineRequest  = ProtocolHandlers.CreateOutlineFileRequest(astResponse.fileParseResponse.fileIdentifier);
                        var outlineResponse = await Parent.JavaPkgServer.Send(Parent, outlineRequest);
                        if (outlineResponse.responseType == Protocol.Response.ResponseType.OutlineResults && outlineResponse.outlineResultResponse != null)
                        {
                            Parent.Fire_OutlineResponseAvailable(this, outlineResponse.outlineResultResponse);
                        }

                        // We leave the AST in the cache in order to service any QuickInfo operations
                    }
                }
            }, token);
        }
Beispiel #6
0
        public void Dispose()
        {
            if (!isDisposed)
            {
                if (Parser != null && Parser.FileParseResponse != null)
                {
                    // Once we're done, we remove the AST from javapkgsrv cache
                    var doneRequest       = ProtocolHandlers.CreateDoneWithFileRequest(Parser.FileParseResponse.fileIdentifier);
                    var fireAndForgetTask = Parser.Parent.JavaPkgServer.Send(Parser.Parent, doneRequest);

                    this.Parser = null;
                }

                this.isDisposed = true;
            }
        }
Beispiel #7
0
        public async Task UpdateParameterCount(JavaMethodSignature signature, int position)
        {
            if (signature == null || signature.Parameters.Count == 0)
            {
                return;
            }

            JavaEditor javaEditor = null;

            if (TextBuffer.Properties.TryGetProperty <JavaEditor>(typeof(JavaEditor), out javaEditor))
            {
                var paramsSpan = signature.ApplicableToSpan.GetSpan(TextBuffer.CurrentSnapshot);
                var callSpan   = new Span(paramsSpan.Start - 1, paramsSpan.Length + 2);

                var callText      = TextBuffer.CurrentSnapshot.GetText(callSpan);
                var callPosition  = position - callSpan.Start; // position is relative to the whole document
                var updateRequest = ProtocolHandlers.CreateParamHelpPositionUpdateRequest(callText, callPosition);
                try
                {
                    var updateResponse = await javaEditor.JavaPkgServer.Send(javaEditor, updateRequest);

                    if (updateResponse.responseType == Protocol.Response.ResponseType.ParamHelpPositionUpdate &&
                        updateResponse.paramHelpPositionUpdateResponse != null)
                    {
                        if (updateResponse.paramHelpPositionUpdateResponse.status)
                        {
                            if (signature.Parameters.Count > updateResponse.paramHelpPositionUpdateResponse.paramCount)
                            {
                                signature.CurrentParameter = signature.Parameters[updateResponse.paramHelpPositionUpdateResponse.paramCount];
                            }
                            else
                            {
                                signature.CurrentParameter = signature.Parameters.Last();
                            }
                        }
                    }
                }
                catch (TaskCanceledException tce)
                {
                    // Repeated cursor movement may lead to many update requests. Some will get cancelled by the ServerProxy
                }
            }
        }
Beispiel #8
0
        internal async Task RequestQuickInfo(ITextView textView, ITrackingPoint triggerPoint)
        {
            JavaEditor javaEditor = null;

            if (TextBuffer.Properties.TryGetProperty <JavaEditor>(typeof(JavaEditor), out javaEditor) &&
                javaEditor.TypeRootIdentifier != null)
            {
                var textReader        = new TextSnapshotToTextReader(TextBuffer.CurrentSnapshot) as TextReader;
                var position          = triggerPoint.GetPosition(TextBuffer.CurrentSnapshot);
                var quickInfoRequest  = ProtocolHandlers.CreateQuickInfoRequest(textReader, javaEditor.TypeRootIdentifier, position);
                var quickInfoResponse = await javaEditor.JavaPkgServer.Send(javaEditor, quickInfoRequest);

                if (quickInfoResponse.responseType == Protocol.Response.ResponseType.QuickInfo &&
                    quickInfoResponse.quickInfoResponse != null)
                {
                    foreach (var element in quickInfoResponse.quickInfoResponse.elements)
                    {
                        QuickInfoContent.Add(element.definition); // TODO: Better javadoc rendering + "\n\n" + element.javaDoc;
                    }
                }
            }
        }
        public async Task Run(IVsEditorAdaptersFactoryService editorFactory)
        {
            JavaEditor javaEditor = null;

            if (TextView.Properties.TryGetProperty <JavaEditor>(typeof(JavaEditor), out javaEditor) &&
                javaEditor.TypeRootIdentifier != null)
            {
                var textReader             = new TextSnapshotToTextReader(TextView.TextBuffer.CurrentSnapshot) as TextReader;
                var position               = CaretPoint.Position;
                var findDefinitionRequest  = ProtocolHandlers.CreateFindDefinitionRequest(textReader, javaEditor.TypeRootIdentifier, position);
                var findDefinitionResponse = await javaEditor.JavaPkgServer.Send(javaEditor, findDefinitionRequest);

                if (findDefinitionResponse.responseType == Protocol.Response.ResponseType.FindDefinition && findDefinitionResponse.findDefinitionResponse != null)
                {
                    var           elements = findDefinitionResponse.findDefinitionResponse.elements;
                    StringBuilder sb       = new StringBuilder();
                    foreach (var element in elements)
                    {
                        if (element.hasSource && element.filePath.EndsWith(".java"))
                        {
                            Telemetry.Client.Get().TrackEvent("App.OpenSourceFile");

                            string fullPath = element.filePath; // (findDefinitionResponse.findDefinitionResponse.workspaceRootPath + element.filePath).Replace('/', '\\');
                            var    window   = VSHelpers.OpenDocument(fullPath, null);
                            var    textView = VSHelpers.GetWpfTextView(VSHelpers.GetTextView(window));

                            textView.Caret.MoveTo(new SnapshotPoint(textView.TextBuffer.CurrentSnapshot, element.positionStart));
                            textView.Selection.Select(new SnapshotSpan(textView.TextBuffer.CurrentSnapshot, element.positionStart, element.positionLength), false);
                            textView.Caret.EnsureVisible();
                        }
                        else if (element.hasSource && element.filePath.EndsWith(".jar"))
                        {
                            Telemetry.Client.Get().TrackEvent("App.OpenSourceFileFromJar");

                            string folderName = Path.GetTempPath() + ".javacache" + Path.DirectorySeparatorChar + Path.GetFileName(element.filePath);
                            string fileName   = folderName + Path.DirectorySeparatorChar + element.fileName;

                            // Check first if window is already opened
                            var window = VSHelpers.IsDocumentOpened(fileName);
                            if (window != null)
                            {
                                // Bring to front
                                window.Show();
                            }
                            else
                            {
                                // If no editor is opened, create (or recreate) the temp file
                                string contents = element.fileContents;

                                Directory.CreateDirectory(folderName);
                                using (StreamWriter sw = new StreamWriter(fileName))
                                    sw.Write(element.fileContents);

                                JavaEditorFactory.DefinitionCache[fileName] =
                                    new Tuple <EclipseWorkspace, Protocol.TypeRootIdentifier>(javaEditor.EclipseWorkspace, element.typeRootIdentifier);

                                // Write info to be able to reconnect temp file to ISense services on reload
                                using (StreamWriter sw = new StreamWriter(fileName + ".id"))
                                {
                                    sw.WriteLine(javaEditor.EclipseWorkspace.Name);
                                    sw.WriteLine(element.typeRootIdentifier.handle);
                                }

                                // Open in editor as a readonly file
                                window = VSHelpers.OpenDocument(fileName, null);
                            }

                            var textView     = VSHelpers.GetWpfTextView(VSHelpers.GetTextView(window));
                            var vsTextBuffer = VSHelpers.GetTextBuffer(editorFactory, textView.TextBuffer);
                            VSHelpers.MakeEditorReadOnly(vsTextBuffer, true);

                            textView.Caret.MoveTo(new SnapshotPoint(textView.TextBuffer.CurrentSnapshot, element.positionStart));
                            textView.Selection.Select(new SnapshotSpan(textView.TextBuffer.CurrentSnapshot, element.positionStart, element.positionLength), false);
                            textView.Caret.EnsureVisible();
                        }
                        else
                        {
                            // TODO: Prompt user to map source file to class file
                            // TODO: Show disasembly if no mapping
                            MessageBox.Show("Cannot navigate to symbol " + element.definition + ". Source not available.", "Source not found");
                            Telemetry.Client.Get().TrackEvent("App.OpenSourceFileNoSource");
                        }
                        break; // TODO: Handle ambiguous symbol resolution
                    }
                    if (elements.Count > 1)
                    {
                        Telemetry.Client.Get().TrackEvent("App.OpenSourceFileAmbiguousSymbol");
                    }
                }
            }
        }
Beispiel #10
0
        public static JavaEditor Configure(IWpfTextView textView, Collection <ITextBuffer> subjectBuffers)
        {
            var oldEditor = Disconnect(textView, subjectBuffers);

            EclipseWorkspace eclipseWorkspace = null;

            Protocol.TypeRootIdentifier presetTypeRootIdentifier = null;

            string fileName = VSHelpers.GetFileName(textView);

            if (DefinitionCache.ContainsKey(fileName))
            {
                eclipseWorkspace         = DefinitionCache[fileName].Item1;
                presetTypeRootIdentifier = DefinitionCache[fileName].Item2;
                DefinitionCache.Remove(fileName);
            }
            else if (File.Exists(fileName + ".id"))
            {
                string[] info = File.ReadAllLines(fileName + ".id");
                if (info.Length >= 2)
                {
                    eclipseWorkspace                = EclipseWorkspace.FromRootPath(info[0]);
                    presetTypeRootIdentifier        = new Protocol.TypeRootIdentifier();
                    presetTypeRootIdentifier.handle = info[1];
                }
            }
            else
            {
                eclipseWorkspace = EclipseWorkspace.FromFilePath(fileName);
            }

            var        javaPkgServer = JavaPkgServerMgr.GetProxy(eclipseWorkspace);
            JavaEditor javaEditor    = null;

            if (javaPkgServer != null)
            {
                textView.Properties.AddProperty(typeof(ServerProxy), javaPkgServer);

                javaEditor = textView.Properties.GetOrCreateSingletonProperty <JavaEditor>(() => new JavaEditor(subjectBuffers, textView, javaPkgServer, eclipseWorkspace));
                Telemetry.Client.Get().TrackEvent("App.EditorOpenConfigured");

                if (presetTypeRootIdentifier == null)
                {
                    javaPkgServer.Send(javaEditor, ProtocolHandlers.CreateOpenTypeRootRequest(fileName)).ContinueWith((System.Threading.Tasks.Task <Protocol.Response> responseTask) =>
                    {
                        var openTypeResponse = responseTask.Result;

                        if (openTypeResponse.responseType == Protocol.Response.ResponseType.OpenTypeRoot &&
                            openTypeResponse.openTypeRootResponse != null)
                        {
                            javaEditor.TypeRootIdentifier = openTypeResponse.openTypeRootResponse.typeRootIdentifier;
                        }
                    });
                }
                else if (File.Exists(fileName + ".id"))
                {
                    // Reopening a .class file from the cache
                    javaPkgServer.Send(javaEditor, ProtocolHandlers.CreataAddTypeRootRequest(presetTypeRootIdentifier)).ContinueWith((System.Threading.Tasks.Task <Protocol.Response> responseTask) =>
                    {
                        var addTypeResponse = responseTask.Result;

                        if (addTypeResponse.responseType == Protocol.Response.ResponseType.AddTypeRoot &&
                            addTypeResponse.addTypeRootResponse != null)
                        {
                            javaEditor.TypeRootIdentifier = addTypeResponse.addTypeRootResponse.typeRootIdentifier;
                        }
                    });
                    javaEditor.DisableParsing(); // No need to parse .class files from .jar for squiggles
                }
                else
                {
                    // Usually preset when opening a source file from a .jar via gotodef
                    javaEditor.TypeRootIdentifier = presetTypeRootIdentifier;
                    javaEditor.DisableParsing(); // No need to parse .class files from .jar for squiggles
                }
            }
            else
            {
                return(null);
            }

            if (oldEditor != null)
            {
                oldEditor.Fire_EditorReplaced(javaEditor);
            }

            foreach (var buffer in subjectBuffers)
            {
                buffer.Properties.AddProperty(typeof(ServerProxy), javaPkgServer);
                buffer.Properties.AddProperty(typeof(JavaEditor), javaEditor);

                JavaOutline outline = null;
                if (buffer.Properties.TryGetProperty <JavaOutline>(typeof(JavaOutline), out outline))
                {
                    outline.JavaEditor = javaEditor;
                }

                JavaSquiggles squiggles = null;
                if (buffer.Properties.TryGetProperty <JavaSquiggles>(typeof(JavaSquiggles), out squiggles))
                {
                    squiggles.JavaEditor = javaEditor;
                }
            }
            return(javaEditor);
        }