@@ -12,7 +12,7 @@ open Microsoft.CodeAnalysis.Text
1212open Microsoft.CodeAnalysis .Editor .Shared .Utilities
1313open Microsoft.CodeAnalysis .Host
1414open Microsoft.CodeAnalysis .Host .Mef
15-
15+ open Microsoft. CodeAnalysis . Classification
1616open Microsoft.VisualStudio .Text .BraceCompletion
1717open Microsoft.VisualStudio .Text .Operations
1818open Microsoft.VisualStudio .Text
@@ -312,6 +312,38 @@ module private Parenthesis =
312312[<Literal>]
313313let CloseCharacter = ')'
314314
315+ module private CurlyBrackets =
316+
317+ [<Literal>]
318+ let OpenCharacter = '{'
319+
320+ [<Literal>]
321+ let CloseCharacter = '}'
322+
323+ module private SquareBrackets =
324+
325+ [<Literal>]
326+ let OpenCharacter = '['
327+
328+ [<Literal>]
329+ let CloseCharacter = ']'
330+
331+ module private DoubleQuote =
332+
333+ [<Literal>]
334+ let OpenCharacter = '"'
335+
336+ [<Literal>]
337+ let CloseCharacter = '"'
338+
339+ module private VerticalBar =
340+
341+ [<Literal>]
342+ let OpenCharacter = '|'
343+
344+ [<Literal>]
345+ let CloseCharacter = '|'
346+
315347type internal ParenthesisCompletionSession () =
316348
317349interface IEditorBraceCompletionSessionwith
@@ -330,24 +362,79 @@ type internal ParenthesisCompletionSession () =
330362// TODO: Implement this for F#
331363true
332364
365+ type internal DoubleQuoteCompletionSession () =
366+
367+ interface IEditorBraceCompletionSessionwith
368+
369+ member this.AfterReturn ( _session , _cancellationToken ) =
370+ ()
371+
372+ member this.AfterStart ( _session , _cancellationToken ) =
373+ ()
374+
375+ member this.AllowOverType ( _session , _cancellationToken ) =
376+ // TODO: Implement this for F#
377+ true
378+
379+ member this.CheckOpeningPoint ( _session , _cancellationToken ) =
380+ // TODO: Implement this for F#
381+ true
382+
383+ type internal VerticalBarCompletionSession () =
384+
385+ interface IEditorBraceCompletionSessionwith
386+
387+ member this.AfterReturn ( _session , _cancellationToken ) =
388+ ()
389+
390+ member this.AfterStart ( _session , _cancellationToken ) =
391+ ()
392+
393+ member this.AllowOverType ( _session , _cancellationToken ) =
394+ // TODO: Implement this for F#
395+ true
396+
397+ member this.CheckOpeningPoint ( _session , _cancellationToken ) =
398+ let sourceCode = _ session.TextView.TextSnapshot
399+ //let document = _session.TextView.TextSnapshot.GetOpenDocumentInCurrentContextWithChanges()
400+ let position = _ session.TextView.Caret.Position.BufferPosition.Position
401+ let ret = sourceCode.GetText( position-2 , 1 ) = " {" && sourceCode.GetText( position, 1 ) = " }"
402+ || sourceCode.GetText( position-2 , 1 ) = " [" && sourceCode.GetText( position, 1 ) = " ]"
403+ ret
404+
333405[<ExportLanguageService( typeof< IEditorBraceCompletionSessionFactory>, FSharpConstants.FSharpLanguageName) >]
334406type internal FSharpEditorBraceCompletionSessionFactory () =
335407inherit ForegroundThreadAffinitizedObject()
336408
337409member __.IsSupportedOpeningBrace openingBrace =
338410match openingBracewith
339- | Parenthesis.OpenCharacter-> true
411+ | Parenthesis.OpenCharacter| CurlyBrackets.OpenCharacter| SquareBrackets.OpenCharacter
412+ | DoubleQuote.OpenCharacter| VerticalBar.OpenCharacter-> true
340413| _ -> false
341414
342- member this.CheckCodeContext ( _document , _position , _openingBrace , _cancellationToken ) =
343- this.AssertIsForeground();
344-
345- // TODO: We need to know if we are inside a F# comment. If we are, then don't do automatic completion.
346- true
415+ member this.CheckCodeContext ( _document : Document , _position : int , _openingBrace , _cancellationToken ) =
416+ this.AssertIsForeground()
417+ // TODO: We need to know if we are inside a F# comment. If we are, then don't do automatic completion.
418+ let sourceCodeTask = _ document.GetTextAsync(_ cancellationToken)
419+ sourceCodeTask.Wait(_ cancellationToken)
420+ let sourceCode = sourceCodeTask.Result
421+ let colorizationData = Tokenizer.getColorizationData(_ document.Id, sourceCode, TextSpan(_ position-1 , 1 ), Some(_ document.FilePath), [], _ cancellationToken)
422+ colorizationData.Exists( fun classifiedSpan ->
423+ classifiedSpan.TextSpan.IntersectsWith_ position&&
424+ (
425+ match classifiedSpan.ClassificationTypewith
426+ | ClassificationTypeNames.Comment
427+ | ClassificationTypeNames.StringLiteral-> false
428+ | _ -> true // anything else is a valid classification type
429+ ))
347430
348431member this.CreateEditorSession ( _document : Document , _openingPosition : int , openingBrace : char , _cancellationToken : CancellationToken ) =
349432match openingBracewith
350433| Parenthesis.OpenCharacter-> ParenthesisCompletionSession() :> IEditorBraceCompletionSession
434+ | CurlyBrackets.OpenCharacter-> ParenthesisCompletionSession() :> IEditorBraceCompletionSession
435+ | SquareBrackets.OpenCharacter-> ParenthesisCompletionSession() :> IEditorBraceCompletionSession
436+ | VerticalBar.OpenCharacter-> VerticalBarCompletionSession() :> IEditorBraceCompletionSession
437+ | DoubleQuote.OpenCharacter-> DoubleQuoteCompletionSession() :> IEditorBraceCompletionSession
351438| _ -> null
352439
353440interface IEditorBraceCompletionSessionFactorywith
@@ -363,6 +450,10 @@ type internal FSharpEditorBraceCompletionSessionFactory () =
363450[<Export( typeof< IBraceCompletionSessionProvider>) >]
364451[<ContentType( FSharpConstants.FSharpContentTypeName) >]
365452[<BracePair( Parenthesis.OpenCharacter, Parenthesis.CloseCharacter) >]
453+ [<BracePair( CurlyBrackets.OpenCharacter, CurlyBrackets.CloseCharacter) >]
454+ [<BracePair( SquareBrackets.OpenCharacter, SquareBrackets.CloseCharacter) >]
455+ [<BracePair( DoubleQuote.OpenCharacter, DoubleQuote.CloseCharacter) >]
456+ [<BracePair( VerticalBar.OpenCharacter, VerticalBar.CloseCharacter) >]
366457type internal FSharpBraceCompletionSessionProvider
367458[<ImportingConstructor>]
368459(