diff --git a/src/Compiler/FSComp.txt b/src/Compiler/FSComp.txt
index baf787606fb..15de383951f 100644
--- a/src/Compiler/FSComp.txt
+++ b/src/Compiler/FSComp.txt
@@ -1526,7 +1526,6 @@ notAFunctionButMaybeDeclaration,"This value is not a function and cannot be appl
3351,chkFeatureNotRuntimeSupported,"Feature '%s' is not supported by target runtime."
3352,typrelInterfaceMemberNoMostSpecificImplementation,"Interface member '%s' does not have a most specific implementation."
3353,chkFeatureNotSupportedInLibrary,"Feature '%s' requires the F# library for language version %s or greater."
-3360,parsEqualsMissingInTypeDefinition,"Unexpected token in type definition. Expected '=' after the type '%s'."
useSdkRefs,"Use reference assemblies for .NET framework references when available (Enabled by default)."
optsGetLangVersions,"Display the allowed values for language version."
optsSetLangVersion,"Specify language version such as 'latest' or 'preview'."
diff --git a/src/Compiler/Service/FSharpParseFileResults.fs b/src/Compiler/Service/FSharpParseFileResults.fs
index 67964dc1bc7..97f7c96acee 100644
--- a/src/Compiler/Service/FSharpParseFileResults.fs
+++ b/src/Compiler/Service/FSharpParseFileResults.fs
@@ -505,6 +505,24 @@ type FSharpParseFileResults(diagnostics: FSharpDiagnostic[], input: ParsedInput,
let result = SyntaxTraversal.Traverse(pos, input, visitor)
result.IsSome
+ member _.IsPositionWithinTypeDefinition pos =
+ let visitor =
+ { new SyntaxVisitorBase<_>() with
+ override _.VisitComponentInfo(path, _) =
+ let typeDefs =
+ path
+ |> List.filter (function
+ | SyntaxNode.SynModule (SynModuleDecl.Types _) -> true
+ | _ -> false)
+
+ match typeDefs with
+ | [] -> None
+ | _ -> Some true
+ }
+
+ let result = SyntaxTraversal.Traverse(pos, input, visitor)
+ result.IsSome
+
member _.IsBindingALambdaAtPosition pos =
let visitor =
{ new SyntaxVisitorBase<_>() with
diff --git a/src/Compiler/Service/FSharpParseFileResults.fsi b/src/Compiler/Service/FSharpParseFileResults.fsi
index ec18bcf8f7c..7ee4b8ba51f 100644
--- a/src/Compiler/Service/FSharpParseFileResults.fsi
+++ b/src/Compiler/Service/FSharpParseFileResults.fsi
@@ -68,6 +68,9 @@ type public FSharpParseFileResults =
/// Determines if the expression or pattern at the given position has a type annotation
member IsTypeAnnotationGivenAtPosition: pos -> bool
+ /// Determines if the given position is bound to a type definition
+ member IsPositionWithinTypeDefinition: pos -> bool
+
/// Determines if the binding at the given position is bound to a lambda expression
member IsBindingALambdaAtPosition: pos -> bool
diff --git a/src/Compiler/pars.fsy b/src/Compiler/pars.fsy
index 26414673888..f32554957eb 100644
--- a/src/Compiler/pars.fsy
+++ b/src/Compiler/pars.fsy
@@ -1588,24 +1588,6 @@ tyconDefn:
let trivia: SynTypeDefnTrivia = { LeadingKeyword = leadingKeyword; EqualsRange = None; WithKeyword = None }
SynTypeDefn($1, SynTypeDefnRepr.Simple(SynTypeDefnSimpleRepr.None($1.Range), $1.Range), [], None, $1.Range, trivia) }
- | typeNameInfo opt_equals tyconDefnRhsBlock
- { match $2 with
- | Some _ -> ()
- | None ->
- let (SynComponentInfo(_, _, _, lid, _, _, _, _)) = $1
- // While the spec doesn't allow long idents here, the parser doesn't enforce this, so take one ident
- let typeNameId = List.last lid
- raiseParseErrorAt (rhs parseState 2) (FSComp.SR.parsEqualsMissingInTypeDefinition(typeNameId.ToString()))
-
- let nameRange = rhs parseState 1
- let (tcDefRepr: SynTypeDefnRepr), mWith, members = $3 nameRange
- let declRange = unionRanges (rhs parseState 1) tcDefRepr.Range
- let mWhole = (declRange, members) ||> unionRangeWithListBy (fun (mem: SynMemberDefn) -> mem.Range)
-
- fun leadingKeyword ->
- let trivia: SynTypeDefnTrivia = { LeadingKeyword = leadingKeyword; EqualsRange = $2; WithKeyword = mWith }
- SynTypeDefn($1, tcDefRepr, members, None, mWhole, trivia) }
-
| typeNameInfo tyconDefnAugmentation
{ let mWithKwd, classDefns = $2
let m = (rhs parseState 1, classDefns) ||> unionRangeWithListBy (fun mem -> mem.Range)
@@ -1632,11 +1614,21 @@ tyconDefn:
let tcDefRepr =
match tcDefRepr, memberCtorPattern with
+ | SynTypeDefnRepr.Simple(SynTypeDefnSimpleRepr.None _, m), Some ctor ->
+ reportParseErrorAt m (FSComp.SR.parsEmptyTypeDefinition())
+ SynTypeDefnRepr.ObjectModel(SynTypeDefnKind.Unspecified, [ctor], unionRanges m mEquals)
+
+ | SynTypeDefnRepr.Simple(SynTypeDefnSimpleRepr.None mName, m), _ ->
+ reportParseErrorAt m (FSComp.SR.parsEmptyTypeDefinition())
+ tcDefRepr
+
| SynTypeDefnRepr.ObjectModel(k, cspec, m), Some ctor ->
SynTypeDefnRepr.ObjectModel(k, ctor :: cspec, m)
+
| _, Some ctor ->
reportParseErrorAt (rhs2 parseState 1 5) (FSComp.SR.parsOnlyClassCanTakeValueArguments ())
tcDefRepr
+
| _ ->
match az with
| Some(_, Some id) ->
@@ -1685,7 +1677,7 @@ tyconDefn:
fun leadingKeyword ->
let trivia = { SynTypeDefnTrivia.Zero with LeadingKeyword = leadingKeyword }
- SynTypeDefn($1, SynTypeDefnRepr.Simple(SynTypeDefnSimpleRepr.None(mName), mName), members, None, mName, trivia) }
+ SynTypeDefn($1, SynTypeDefnRepr.Simple(SynTypeDefnSimpleRepr.None(mName), mName), members, None, mWhole, trivia) }
/* The right-hand-side of a type definition */
@@ -1715,6 +1707,10 @@ tyconDefnRhsBlock:
let tcDefRepr, members = $2 nameRange (checkForMultipleAugmentations m ($4 @ optClassDefn) [])
tcDefRepr, mWith, members) }
+ | OBLOCKBEGIN oblockend
+ { fun mName ->
+ SynTypeDefnRepr.Simple(SynTypeDefnSimpleRepr.None mName, mName), None, [] }
+
| tyconDefnRhs opt_classDefn
{ let m = rhs parseState 1
let mWith, optClassDefn = $2
@@ -1775,7 +1771,7 @@ tyconClassDefn:
/* The right-hand-side of a object type definition where the class/interface/struct kind has not been specified */
classDefnBlockKindUnspecified:
- | OBLOCKBEGIN classDefnMembers recover
+ | OBLOCKBEGIN classDefnMembersAtLeastOne recover
{ if not $3 then reportParseErrorAt (rhs parseState 3) (FSComp.SR.parsUnexpectedEndOfFileTypeDefinition())
let mopt =
match $2 with
@@ -1783,7 +1779,7 @@ classDefnBlockKindUnspecified:
| _ -> None
false, $2, mopt }
- | OBLOCKBEGIN classDefnMembers oblockend
+ | OBLOCKBEGIN classDefnMembersAtLeastOne oblockend
{ let mopt =
match $2 with
| _ :: _ -> Some((rhs parseState 1, $2) ||> unionRangeWithListBy (fun (d: SynMemberDefn) -> d.Range))
diff --git a/src/Compiler/xlf/FSComp.txt.cs.xlf b/src/Compiler/xlf/FSComp.txt.cs.xlf
index 90e1cce8b45..e09e1762a53 100644
--- a/src/Compiler/xlf/FSComp.txt.cs.xlf
+++ b/src/Compiler/xlf/FSComp.txt.cs.xlf
@@ -802,11 +802,6 @@
Tady nebo před tímto místem začal neúplný interpolovaný doslovný řetězec.
-
- Unexpected token in type definition. Expected '=' after the type '{0}'.
- Neočekávaný token v definici typu. Za typem {0} se očekává =.
-
-
Expected a pattern after this point
Za tímto bodem byl očekáván vzor
diff --git a/src/Compiler/xlf/FSComp.txt.de.xlf b/src/Compiler/xlf/FSComp.txt.de.xlf
index 7d27833b09f..0a210f79b28 100644
--- a/src/Compiler/xlf/FSComp.txt.de.xlf
+++ b/src/Compiler/xlf/FSComp.txt.de.xlf
@@ -802,11 +802,6 @@
Unvollständige interpolierte ausführliche Zeichenfolge, die an oder vor dieser Stelle begonnen wurde.
-
- Unexpected token in type definition. Expected '=' after the type '{0}'.
- Unerwartetes Token in Typdefinition. Nach Typ "{0}" wurde "=" erwartet.
-
-
Expected a pattern after this point
Nach diesem Punkt wurde ein Muster erwartet.
diff --git a/src/Compiler/xlf/FSComp.txt.es.xlf b/src/Compiler/xlf/FSComp.txt.es.xlf
index a8e677179ba..02d718da76b 100644
--- a/src/Compiler/xlf/FSComp.txt.es.xlf
+++ b/src/Compiler/xlf/FSComp.txt.es.xlf
@@ -802,11 +802,6 @@
La cadena textual interpolada incompleta comenzaba aquí o antes.
-
- Unexpected token in type definition. Expected '=' after the type '{0}'.
- Token inesperado en la definición de tipo. Se esperaba "=" después del tipo "{0}".
-
-
Expected a pattern after this point
Se esperaba un patrón después de este punto
diff --git a/src/Compiler/xlf/FSComp.txt.fr.xlf b/src/Compiler/xlf/FSComp.txt.fr.xlf
index a22f959e7aa..bab2c985de1 100644
--- a/src/Compiler/xlf/FSComp.txt.fr.xlf
+++ b/src/Compiler/xlf/FSComp.txt.fr.xlf
@@ -802,11 +802,6 @@
Chaîne verbatim interpolée incomplète ayant débuté à cet emplacement ou avant
-
- Unexpected token in type definition. Expected '=' after the type '{0}'.
- Jeton inattendu dans la définition de type. Signe '=' attendu après le type '{0}'.
-
-
Expected a pattern after this point
Modèle attendu après ce point
diff --git a/src/Compiler/xlf/FSComp.txt.it.xlf b/src/Compiler/xlf/FSComp.txt.it.xlf
index 7d21cdb16a1..4c77bc07e09 100644
--- a/src/Compiler/xlf/FSComp.txt.it.xlf
+++ b/src/Compiler/xlf/FSComp.txt.it.xlf
@@ -802,11 +802,6 @@
La stringa verbatim interpolata incompleta inizia in questa posizione o prima di essa
-
- Unexpected token in type definition. Expected '=' after the type '{0}'.
- Token imprevisto nella definizione del tipo. Dopo il tipo '{0}' è previsto '='.
-
-
Expected a pattern after this point
Previsto un criterio dopo questa posizione
diff --git a/src/Compiler/xlf/FSComp.txt.ja.xlf b/src/Compiler/xlf/FSComp.txt.ja.xlf
index ad052e25d22..777a07b3cb1 100644
--- a/src/Compiler/xlf/FSComp.txt.ja.xlf
+++ b/src/Compiler/xlf/FSComp.txt.ja.xlf
@@ -802,11 +802,6 @@
この位置以前に始まった補間された逐語的文字列が不完全です
-
- Unexpected token in type definition. Expected '=' after the type '{0}'.
- 型定義に予期しないトークンがあります。型 '{0}' の後には '=' が必要です。
-
-
Expected a pattern after this point
このポイントの後にパターンが必要です
diff --git a/src/Compiler/xlf/FSComp.txt.ko.xlf b/src/Compiler/xlf/FSComp.txt.ko.xlf
index a003c8ae916..c938d79b00a 100644
--- a/src/Compiler/xlf/FSComp.txt.ko.xlf
+++ b/src/Compiler/xlf/FSComp.txt.ko.xlf
@@ -802,11 +802,6 @@
불완전한 보간 축자 문자열이 여기 또는 이전에서 시작되었습니다.
-
- Unexpected token in type definition. Expected '=' after the type '{0}'.
- 형식 정의에 예기치 않은 토큰이 있습니다. '{0}' 형식 뒤에 '='가 필요합니다.
-
-
Expected a pattern after this point
이 지점 뒤에 패턴이 필요합니다.
diff --git a/src/Compiler/xlf/FSComp.txt.pl.xlf b/src/Compiler/xlf/FSComp.txt.pl.xlf
index f829eaf8e68..5231b82185f 100644
--- a/src/Compiler/xlf/FSComp.txt.pl.xlf
+++ b/src/Compiler/xlf/FSComp.txt.pl.xlf
@@ -802,11 +802,6 @@
Niekompletny interpolowany dosłowny ciąg rozpoczęty w tym miejscu lub wcześniej
-
- Unexpected token in type definition. Expected '=' after the type '{0}'.
- Nieoczekiwany token w definicji typu. Oczekiwano znaku „=” po typie „{0}”.
-
-
Expected a pattern after this point
Oczekiwano wzorca po tym punkcie
diff --git a/src/Compiler/xlf/FSComp.txt.pt-BR.xlf b/src/Compiler/xlf/FSComp.txt.pt-BR.xlf
index cc2041d6026..fc778cdb2b8 100644
--- a/src/Compiler/xlf/FSComp.txt.pt-BR.xlf
+++ b/src/Compiler/xlf/FSComp.txt.pt-BR.xlf
@@ -802,11 +802,6 @@
A cadeia de caracteres verbatim interpolada incompleta foi iniciada aqui ou anteriormente
-
- Unexpected token in type definition. Expected '=' after the type '{0}'.
- Token inesperado na definição de tipo. Esperava-se '=' após o tipo '{0}'.
-
-
Expected a pattern after this point
Um padrão é esperado após este ponto
diff --git a/src/Compiler/xlf/FSComp.txt.ru.xlf b/src/Compiler/xlf/FSComp.txt.ru.xlf
index 49e6c92d5e8..da40f20306c 100644
--- a/src/Compiler/xlf/FSComp.txt.ru.xlf
+++ b/src/Compiler/xlf/FSComp.txt.ru.xlf
@@ -802,11 +802,6 @@
Неполная интерполированная буквальная строка, начатая в этой позиции или до нее
-
- Unexpected token in type definition. Expected '=' after the type '{0}'.
- Неожиданный токен в определении типа. После типа "{0}" ожидается "=".
-
-
Expected a pattern after this point
После этой точки ожидался шаблон
diff --git a/src/Compiler/xlf/FSComp.txt.tr.xlf b/src/Compiler/xlf/FSComp.txt.tr.xlf
index 5ea3abcc5ac..f8680d165ea 100644
--- a/src/Compiler/xlf/FSComp.txt.tr.xlf
+++ b/src/Compiler/xlf/FSComp.txt.tr.xlf
@@ -802,11 +802,6 @@
Tamamlanmamış düz metin arasına kod eklenmiş düz metin dizesi, burada veya daha önce başlıyordu
-
- Unexpected token in type definition. Expected '=' after the type '{0}'.
- Tür tanımında beklenmeyen belirteç var. '{0}' türünden sonra '=' bekleniyordu.
-
-
Expected a pattern after this point
Bu noktadan sonra bir desen bekleniyordu
diff --git a/src/Compiler/xlf/FSComp.txt.zh-Hans.xlf b/src/Compiler/xlf/FSComp.txt.zh-Hans.xlf
index e95ce09f131..ff70d448307 100644
--- a/src/Compiler/xlf/FSComp.txt.zh-Hans.xlf
+++ b/src/Compiler/xlf/FSComp.txt.zh-Hans.xlf
@@ -802,11 +802,6 @@
在此处或之前开始的内插逐字字符串不完整
-
- Unexpected token in type definition. Expected '=' after the type '{0}'.
- 类型定义中出现意外标记。类型“{0}”后应为 "="。
-
-
Expected a pattern after this point
此点之后应有一个模式
diff --git a/src/Compiler/xlf/FSComp.txt.zh-Hant.xlf b/src/Compiler/xlf/FSComp.txt.zh-Hant.xlf
index 994a149ea54..71ff3d47eea 100644
--- a/src/Compiler/xlf/FSComp.txt.zh-Hant.xlf
+++ b/src/Compiler/xlf/FSComp.txt.zh-Hant.xlf
@@ -802,11 +802,6 @@
未完成的插補逐字字串於此處或之前開始
-
- Unexpected token in type definition. Expected '=' after the type '{0}'.
- 型別定義中出現非預期的權杖。類型 '{0}' 之後應該要有 '='。
-
-
Expected a pattern after this point
在這個點之後必須有模式
diff --git a/tests/FSharp.Compiler.ComponentTests/Conformance/BasicGrammarElements/TypeAbbreviations/TypeAbbreviations.fs b/tests/FSharp.Compiler.ComponentTests/Conformance/BasicGrammarElements/TypeAbbreviations/TypeAbbreviations.fs
index a584aa2ca21..c186a0d33e9 100644
--- a/tests/FSharp.Compiler.ComponentTests/Conformance/BasicGrammarElements/TypeAbbreviations/TypeAbbreviations.fs
+++ b/tests/FSharp.Compiler.ComponentTests/Conformance/BasicGrammarElements/TypeAbbreviations/TypeAbbreviations.fs
@@ -128,7 +128,6 @@ module TypeAbbreviations =
|> shouldFail
|> withDiagnostics [
(Error 10, Line 8, Col 1, Line 8, Col 5, "Incomplete structured construct at or before this point in type definition")
- (Error 547, Line 6, Col 6, Line 6, Col 15, "A type definition requires one or more members or other declarations. If you intend to define an empty class, struct or interface, then use 'type ... = class end', 'interface end' or 'struct end'.")
]
//SOURCE=E_IncorrectRightSide_Keyword.fsx SCFLAGS="--test:ErrorRanges" # E_IncorrectRightSide_Keyword.fsx
diff --git a/tests/FSharp.Compiler.ComponentTests/ErrorMessages/TypeEqualsMissingTests.fs b/tests/FSharp.Compiler.ComponentTests/ErrorMessages/TypeEqualsMissingTests.fs
index 39612f2b27b..13d596019de 100644
--- a/tests/FSharp.Compiler.ComponentTests/ErrorMessages/TypeEqualsMissingTests.fs
+++ b/tests/FSharp.Compiler.ComponentTests/ErrorMessages/TypeEqualsMissingTests.fs
@@ -16,6 +16,6 @@ module ``Type definition missing equals`` =
type X | A | B
"""
FSharpDiagnosticSeverity.Error
- 3360
+ 10
(2, 8, 2, 9)
- "Unexpected token in type definition. Expected '=' after the type 'X'."
+ "Unexpected symbol '|' in type definition. Expected '=' or other token."
diff --git a/tests/FSharp.Compiler.Service.Tests/FSharp.Compiler.Service.SurfaceArea.netstandard20.debug.bsl b/tests/FSharp.Compiler.Service.Tests/FSharp.Compiler.Service.SurfaceArea.netstandard20.debug.bsl
index be1414fc12f..7b37b7db31d 100644
--- a/tests/FSharp.Compiler.Service.Tests/FSharp.Compiler.Service.SurfaceArea.netstandard20.debug.bsl
+++ b/tests/FSharp.Compiler.Service.Tests/FSharp.Compiler.Service.SurfaceArea.netstandard20.debug.bsl
@@ -2077,6 +2077,7 @@ FSharp.Compiler.CodeAnalysis.FSharpChecker: Void ClearCache(System.Collections.G
FSharp.Compiler.CodeAnalysis.FSharpChecker: Void ClearLanguageServiceRootCachesAndCollectAndFinalizeAllTransients()
FSharp.Compiler.CodeAnalysis.FSharpChecker: Void InvalidateAll()
FSharp.Compiler.CodeAnalysis.FSharpChecker: Void InvalidateConfiguration(FSharp.Compiler.CodeAnalysis.FSharpProjectOptions, Microsoft.FSharp.Core.FSharpOption`1[System.String])
+FSharp.Compiler.CodeAnalysis.FSharpParseFileResults: Boolean IsPositionWithinTypeDefinition(FSharp.Compiler.Text.Position)
FSharp.Compiler.CodeAnalysis.FSharpParseFileResults: Boolean IsBindingALambdaAtPosition(FSharp.Compiler.Text.Position)
FSharp.Compiler.CodeAnalysis.FSharpParseFileResults: Boolean IsPosContainedInApplication(FSharp.Compiler.Text.Position)
FSharp.Compiler.CodeAnalysis.FSharpParseFileResults: Boolean IsPositionContainedInACurriedParameter(FSharp.Compiler.Text.Position)
diff --git a/tests/FSharp.Compiler.Service.Tests/FSharp.Compiler.Service.SurfaceArea.netstandard20.release.bsl b/tests/FSharp.Compiler.Service.Tests/FSharp.Compiler.Service.SurfaceArea.netstandard20.release.bsl
index f4b2e93a5f4..4244b000693 100644
--- a/tests/FSharp.Compiler.Service.Tests/FSharp.Compiler.Service.SurfaceArea.netstandard20.release.bsl
+++ b/tests/FSharp.Compiler.Service.Tests/FSharp.Compiler.Service.SurfaceArea.netstandard20.release.bsl
@@ -2077,6 +2077,7 @@ FSharp.Compiler.CodeAnalysis.FSharpChecker: Void ClearCache(System.Collections.G
FSharp.Compiler.CodeAnalysis.FSharpChecker: Void ClearLanguageServiceRootCachesAndCollectAndFinalizeAllTransients()
FSharp.Compiler.CodeAnalysis.FSharpChecker: Void InvalidateAll()
FSharp.Compiler.CodeAnalysis.FSharpChecker: Void InvalidateConfiguration(FSharp.Compiler.CodeAnalysis.FSharpProjectOptions, Microsoft.FSharp.Core.FSharpOption`1[System.String])
+FSharp.Compiler.CodeAnalysis.FSharpParseFileResults: Boolean IsPositionWithinTypeDefinition(FSharp.Compiler.Text.Position)
FSharp.Compiler.CodeAnalysis.FSharpParseFileResults: Boolean IsBindingALambdaAtPosition(FSharp.Compiler.Text.Position)
FSharp.Compiler.CodeAnalysis.FSharpParseFileResults: Boolean IsPosContainedInApplication(FSharp.Compiler.Text.Position)
FSharp.Compiler.CodeAnalysis.FSharpParseFileResults: Boolean IsPositionContainedInACurriedParameter(FSharp.Compiler.Text.Position)
diff --git a/tests/service/data/SyntaxTree/Type/Abbreviation 01.fs b/tests/service/data/SyntaxTree/Type/Abbreviation 01.fs
new file mode 100644
index 00000000000..53e093c9838
--- /dev/null
+++ b/tests/service/data/SyntaxTree/Type/Abbreviation 01.fs
@@ -0,0 +1,3 @@
+module Module
+
+type T = int
diff --git a/tests/service/data/SyntaxTree/Type/Abbreviation 01.fs.bsl b/tests/service/data/SyntaxTree/Type/Abbreviation 01.fs.bsl
new file mode 100644
index 00000000000..f5ca6da29e6
--- /dev/null
+++ b/tests/service/data/SyntaxTree/Type/Abbreviation 01.fs.bsl
@@ -0,0 +1,22 @@
+ImplFile
+ (ParsedImplFileInput
+ ("/root/Type/Abbreviation 01.fs", false, QualifiedNameOfFile Module, [], [],
+ [SynModuleOrNamespace
+ ([Module], false, NamedModule,
+ [Types
+ ([SynTypeDefn
+ (SynComponentInfo
+ ([], None, [], [T],
+ PreXmlDoc ((3,0), FSharp.Compiler.Xml.XmlDocCollector),
+ false, None, (3,5--3,6)),
+ Simple
+ (TypeAbbrev
+ (Ok, LongIdent (SynLongIdent ([int], [], [None])),
+ (3,9--3,12)), (3,9--3,12)), [], None, (3,5--3,12),
+ { LeadingKeyword = Type (3,0--3,4)
+ EqualsRange = Some (3,7--3,8)
+ WithKeyword = None })], (3,0--3,12))],
+ PreXmlDoc ((1,0), FSharp.Compiler.Xml.XmlDocCollector), [], None,
+ (1,0--3,12), { LeadingKeyword = Module (1,0--1,6) })], (true, true),
+ { ConditionalDirectives = []
+ CodeComments = [] }, set []))
diff --git a/tests/service/data/SyntaxTree/Type/Abbreviation 02.fs b/tests/service/data/SyntaxTree/Type/Abbreviation 02.fs
new file mode 100644
index 00000000000..6275a33b1b5
--- /dev/null
+++ b/tests/service/data/SyntaxTree/Type/Abbreviation 02.fs
@@ -0,0 +1,3 @@
+module Module
+
+type T = global.Int
diff --git a/tests/service/data/SyntaxTree/Type/Abbreviation 02.fs.bsl b/tests/service/data/SyntaxTree/Type/Abbreviation 02.fs.bsl
new file mode 100644
index 00000000000..6d0a7728993
--- /dev/null
+++ b/tests/service/data/SyntaxTree/Type/Abbreviation 02.fs.bsl
@@ -0,0 +1,26 @@
+ImplFile
+ (ParsedImplFileInput
+ ("/root/Type/Abbreviation 02.fs", false, QualifiedNameOfFile Module, [], [],
+ [SynModuleOrNamespace
+ ([Module], false, NamedModule,
+ [Types
+ ([SynTypeDefn
+ (SynComponentInfo
+ ([], None, [], [T],
+ PreXmlDoc ((3,0), FSharp.Compiler.Xml.XmlDocCollector),
+ false, None, (3,5--3,6)),
+ Simple
+ (TypeAbbrev
+ (Ok,
+ LongIdent
+ (SynLongIdent
+ ([`global`; Int], [(3,15--3,16)],
+ [Some (OriginalNotation "global"); None])),
+ (3,9--3,19)), (3,9--3,19)), [], None, (3,5--3,19),
+ { LeadingKeyword = Type (3,0--3,4)
+ EqualsRange = Some (3,7--3,8)
+ WithKeyword = None })], (3,0--3,19))],
+ PreXmlDoc ((1,0), FSharp.Compiler.Xml.XmlDocCollector), [], None,
+ (1,0--3,19), { LeadingKeyword = Module (1,0--1,6) })], (true, true),
+ { ConditionalDirectives = []
+ CodeComments = [] }, set []))
diff --git a/tests/service/data/SyntaxTree/Type/Abbreviation 03.fs b/tests/service/data/SyntaxTree/Type/Abbreviation 03.fs
new file mode 100644
index 00000000000..3218b348a54
--- /dev/null
+++ b/tests/service/data/SyntaxTree/Type/Abbreviation 03.fs
@@ -0,0 +1,3 @@
+module Module
+
+type T = a
diff --git a/tests/service/data/SyntaxTree/Type/Abbreviation 03.fs.bsl b/tests/service/data/SyntaxTree/Type/Abbreviation 03.fs.bsl
new file mode 100644
index 00000000000..d2fb3a0cb2b
--- /dev/null
+++ b/tests/service/data/SyntaxTree/Type/Abbreviation 03.fs.bsl
@@ -0,0 +1,28 @@
+ImplFile
+ (ParsedImplFileInput
+ ("/root/Type/Abbreviation 03.fs", false, QualifiedNameOfFile Module, [], [],
+ [SynModuleOrNamespace
+ ([Module], false, NamedModule,
+ [Types
+ ([SynTypeDefn
+ (SynComponentInfo
+ ([], None, [], [T],
+ PreXmlDoc ((3,0), FSharp.Compiler.Xml.XmlDocCollector),
+ false, None, (3,5--3,6)),
+ Simple
+ (TypeAbbrev
+ (Ok,
+ App
+ (LongIdent (SynLongIdent ([a], [], [None])),
+ Some (3,10--3,11),
+ [LongIdent (SynLongIdent ([b], [], [None]));
+ LongIdent (SynLongIdent ([c], [], [None]))],
+ [(3,12--3,13)], Some (3,15--3,16), false, (3,9--3,16)),
+ (3,9--3,16)), (3,9--3,16)), [], None, (3,5--3,16),
+ { LeadingKeyword = Type (3,0--3,4)
+ EqualsRange = Some (3,7--3,8)
+ WithKeyword = None })], (3,0--3,16))],
+ PreXmlDoc ((1,0), FSharp.Compiler.Xml.XmlDocCollector), [], None,
+ (1,0--3,16), { LeadingKeyword = Module (1,0--1,6) })], (true, true),
+ { ConditionalDirectives = []
+ CodeComments = [] }, set []))
diff --git a/tests/service/data/SyntaxTree/Type/Abbreviation 04.fs b/tests/service/data/SyntaxTree/Type/Abbreviation 04.fs
new file mode 100644
index 00000000000..83595ed5e8b
--- /dev/null
+++ b/tests/service/data/SyntaxTree/Type/Abbreviation 04.fs
@@ -0,0 +1,3 @@
+module Module
+
+type T = (a -> b)
diff --git a/tests/service/data/SyntaxTree/Type/Abbreviation 04.fs.bsl b/tests/service/data/SyntaxTree/Type/Abbreviation 04.fs.bsl
new file mode 100644
index 00000000000..53dd6bbce50
--- /dev/null
+++ b/tests/service/data/SyntaxTree/Type/Abbreviation 04.fs.bsl
@@ -0,0 +1,27 @@
+ImplFile
+ (ParsedImplFileInput
+ ("/root/Type/Abbreviation 04.fs", false, QualifiedNameOfFile Module, [], [],
+ [SynModuleOrNamespace
+ ([Module], false, NamedModule,
+ [Types
+ ([SynTypeDefn
+ (SynComponentInfo
+ ([], None, [], [T],
+ PreXmlDoc ((3,0), FSharp.Compiler.Xml.XmlDocCollector),
+ false, None, (3,5--3,6)),
+ Simple
+ (TypeAbbrev
+ (Ok,
+ Paren
+ (Fun
+ (LongIdent (SynLongIdent ([a], [], [None])),
+ LongIdent (SynLongIdent ([b], [], [None])),
+ (3,10--3,16), { ArrowRange = (3,12--3,14) }),
+ (3,9--3,17)), (3,9--3,17)), (3,9--3,17)), [], None,
+ (3,5--3,17), { LeadingKeyword = Type (3,0--3,4)
+ EqualsRange = Some (3,7--3,8)
+ WithKeyword = None })], (3,0--3,17))],
+ PreXmlDoc ((1,0), FSharp.Compiler.Xml.XmlDocCollector), [], None,
+ (1,0--3,17), { LeadingKeyword = Module (1,0--1,6) })], (true, true),
+ { ConditionalDirectives = []
+ CodeComments = [] }, set []))
diff --git a/tests/service/data/SyntaxTree/Type/And 03.fs.bsl b/tests/service/data/SyntaxTree/Type/And 03.fs.bsl
index bf2b92aa99d..0334d8da564 100644
--- a/tests/service/data/SyntaxTree/Type/And 03.fs.bsl
+++ b/tests/service/data/SyntaxTree/Type/And 03.fs.bsl
@@ -21,10 +21,10 @@ ImplFile
([], None, [], [B],
PreXmlDoc ((5,4), FSharp.Compiler.Xml.XmlDocCollector),
false, None, (5,4--5,5)),
- ObjectModel (Unspecified, [], (7,0--7,0)), [], None,
- (5,4--7,0), { LeadingKeyword = And (5,0--5,3)
- EqualsRange = Some (5,6--5,7)
- WithKeyword = None });
+ Simple (None (5,4--5,7), (5,4--5,7)), [], None, (5,4--5,7),
+ { LeadingKeyword = And (5,0--5,3)
+ EqualsRange = Some (5,6--5,7)
+ WithKeyword = None });
SynTypeDefn
(SynComponentInfo
([], None, [], [C],
diff --git a/tests/service/data/SyntaxTree/Type/And 06.fs.bsl b/tests/service/data/SyntaxTree/Type/And 06.fs.bsl
index 6e0ad8564e5..45c17c9c934 100644
--- a/tests/service/data/SyntaxTree/Type/And 06.fs.bsl
+++ b/tests/service/data/SyntaxTree/Type/And 06.fs.bsl
@@ -21,10 +21,10 @@ ImplFile
([], None, [], [B],
PreXmlDoc ((5,4), FSharp.Compiler.Xml.XmlDocCollector),
false, None, (5,4--5,5)),
- ObjectModel (Unspecified, [], (5,6--5,6)), [], None,
- (5,4--5,7), { LeadingKeyword = And (5,0--5,3)
- EqualsRange = Some (5,6--5,7)
- WithKeyword = None })], (3,0--5,7))],
+ Simple (None (5,4--5,7), (5,4--5,7)), [], None, (5,4--5,7),
+ { LeadingKeyword = And (5,0--5,3)
+ EqualsRange = Some (5,6--5,7)
+ WithKeyword = None })], (3,0--5,7))],
PreXmlDoc ((1,0), FSharp.Compiler.Xml.XmlDocCollector), [], None,
(1,0--5,7), { LeadingKeyword = Module (1,0--1,6) })], (true, true),
{ ConditionalDirectives = []
diff --git a/tests/service/data/SyntaxTree/Type/Class 01.fs b/tests/service/data/SyntaxTree/Type/Class 01.fs
new file mode 100644
index 00000000000..c11c325c8dc
--- /dev/null
+++ b/tests/service/data/SyntaxTree/Type/Class 01.fs
@@ -0,0 +1,5 @@
+module Module
+
+type T = class end
+
+()
diff --git a/tests/service/data/SyntaxTree/Type/Class 01.fs.bsl b/tests/service/data/SyntaxTree/Type/Class 01.fs.bsl
new file mode 100644
index 00000000000..fe8be852708
--- /dev/null
+++ b/tests/service/data/SyntaxTree/Type/Class 01.fs.bsl
@@ -0,0 +1,20 @@
+ImplFile
+ (ParsedImplFileInput
+ ("/root/Type/Class 01.fs", false, QualifiedNameOfFile Module, [], [],
+ [SynModuleOrNamespace
+ ([Module], false, NamedModule,
+ [Types
+ ([SynTypeDefn
+ (SynComponentInfo
+ ([], None, [], [T],
+ PreXmlDoc ((3,0), FSharp.Compiler.Xml.XmlDocCollector),
+ false, None, (3,5--3,6)),
+ ObjectModel (Class, [], (3,9--3,18)), [], None, (3,5--3,18),
+ { LeadingKeyword = Type (3,0--3,4)
+ EqualsRange = Some (3,7--3,8)
+ WithKeyword = None })], (3,0--3,18));
+ Expr (Const (Unit, (5,0--5,2)), (5,0--5,2))],
+ PreXmlDoc ((1,0), FSharp.Compiler.Xml.XmlDocCollector), [], None,
+ (1,0--5,2), { LeadingKeyword = Module (1,0--1,6) })], (true, true),
+ { ConditionalDirectives = []
+ CodeComments = [] }, set []))
diff --git a/tests/service/data/SyntaxTree/Type/Class 02.fs b/tests/service/data/SyntaxTree/Type/Class 02.fs
new file mode 100644
index 00000000000..9dbd59732d7
--- /dev/null
+++ b/tests/service/data/SyntaxTree/Type/Class 02.fs
@@ -0,0 +1,8 @@
+module Module
+
+type T =
+ class
+ member this.P = 1
+ end
+
+()
diff --git a/tests/service/data/SyntaxTree/Type/Class 02.fs.bsl b/tests/service/data/SyntaxTree/Type/Class 02.fs.bsl
new file mode 100644
index 00000000000..f7e959d10a0
--- /dev/null
+++ b/tests/service/data/SyntaxTree/Type/Class 02.fs.bsl
@@ -0,0 +1,45 @@
+ImplFile
+ (ParsedImplFileInput
+ ("/root/Type/Class 02.fs", false, QualifiedNameOfFile Module, [], [],
+ [SynModuleOrNamespace
+ ([Module], false, NamedModule,
+ [Types
+ ([SynTypeDefn
+ (SynComponentInfo
+ ([], None, [], [T],
+ PreXmlDoc ((3,0), FSharp.Compiler.Xml.XmlDocCollector),
+ false, None, (3,5--3,6)),
+ ObjectModel
+ (Class,
+ [Member
+ (SynBinding
+ (None, Normal, false, false, [],
+ PreXmlDoc ((5,8), FSharp.Compiler.Xml.XmlDocCollector),
+ SynValData
+ (Some { IsInstance = true
+ IsDispatchSlot = false
+ IsOverrideOrExplicitImpl = false
+ IsFinal = false
+ GetterOrSetterIsCompilerGenerated = false
+ MemberKind = Member },
+ SynValInfo
+ ([[SynArgInfo ([], false, None)]; []],
+ SynArgInfo ([], false, None)), None),
+ LongIdent
+ (SynLongIdent
+ ([this; P], [(5,19--5,20)], [None; None]), None,
+ None, Pats [], None, (5,15--5,21)), None,
+ Const (Int32 1, (5,24--5,25)), (5,15--5,21),
+ NoneAtInvisible,
+ { LeadingKeyword = Member (5,8--5,14)
+ InlineKeyword = None
+ EqualsRange = Some (5,22--5,23) }), (5,8--5,25))],
+ (4,4--6,7)), [], None, (3,5--6,7),
+ { LeadingKeyword = Type (3,0--3,4)
+ EqualsRange = Some (3,7--3,8)
+ WithKeyword = None })], (3,0--6,7));
+ Expr (Const (Unit, (8,0--8,2)), (8,0--8,2))],
+ PreXmlDoc ((1,0), FSharp.Compiler.Xml.XmlDocCollector), [], None,
+ (1,0--8,2), { LeadingKeyword = Module (1,0--1,6) })], (true, true),
+ { ConditionalDirectives = []
+ CodeComments = [] }, set []))
diff --git a/tests/service/data/SyntaxTree/Type/Class 03.fs b/tests/service/data/SyntaxTree/Type/Class 03.fs
new file mode 100644
index 00000000000..111887432d7
--- /dev/null
+++ b/tests/service/data/SyntaxTree/Type/Class 03.fs
@@ -0,0 +1,7 @@
+module Module
+
+type T () =
+ class
+ end
+
+()
diff --git a/tests/service/data/SyntaxTree/Type/Class 03.fs.bsl b/tests/service/data/SyntaxTree/Type/Class 03.fs.bsl
new file mode 100644
index 00000000000..e3e58a8b719
--- /dev/null
+++ b/tests/service/data/SyntaxTree/Type/Class 03.fs.bsl
@@ -0,0 +1,30 @@
+ImplFile
+ (ParsedImplFileInput
+ ("/root/Type/Class 03.fs", false, QualifiedNameOfFile Module, [], [],
+ [SynModuleOrNamespace
+ ([Module], false, NamedModule,
+ [Types
+ ([SynTypeDefn
+ (SynComponentInfo
+ ([], None, [], [T],
+ PreXmlDoc ((3,0), FSharp.Compiler.Xml.XmlDocCollector),
+ false, None, (3,5--3,6)),
+ ObjectModel
+ (Class,
+ [ImplicitCtor
+ (None, [], SimplePats ([], [], (3,7--3,9)), None,
+ PreXmlDoc ((3,7), FSharp.Compiler.Xml.XmlDocCollector),
+ (3,5--3,6), { AsKeyword = None })], (4,4--5,7)), [],
+ Some
+ (ImplicitCtor
+ (None, [], SimplePats ([], [], (3,7--3,9)), None,
+ PreXmlDoc ((3,7), FSharp.Compiler.Xml.XmlDocCollector),
+ (3,5--3,6), { AsKeyword = None })), (3,5--5,7),
+ { LeadingKeyword = Type (3,0--3,4)
+ EqualsRange = Some (3,10--3,11)
+ WithKeyword = None })], (3,0--5,7));
+ Expr (Const (Unit, (7,0--7,2)), (7,0--7,2))],
+ PreXmlDoc ((1,0), FSharp.Compiler.Xml.XmlDocCollector), [], None,
+ (1,0--7,2), { LeadingKeyword = Module (1,0--1,6) })], (true, true),
+ { ConditionalDirectives = []
+ CodeComments = [] }, set []))
diff --git a/tests/service/data/SyntaxTree/Type/Class 04.fs b/tests/service/data/SyntaxTree/Type/Class 04.fs
new file mode 100644
index 00000000000..d6b429efa74
--- /dev/null
+++ b/tests/service/data/SyntaxTree/Type/Class 04.fs
@@ -0,0 +1,7 @@
+module Module
+
+type T private () =
+ class
+ end
+
+()
diff --git a/tests/service/data/SyntaxTree/Type/Class 04.fs.bsl b/tests/service/data/SyntaxTree/Type/Class 04.fs.bsl
new file mode 100644
index 00000000000..e137aa4ebfc
--- /dev/null
+++ b/tests/service/data/SyntaxTree/Type/Class 04.fs.bsl
@@ -0,0 +1,32 @@
+ImplFile
+ (ParsedImplFileInput
+ ("/root/Type/Class 04.fs", false, QualifiedNameOfFile Module, [], [],
+ [SynModuleOrNamespace
+ ([Module], false, NamedModule,
+ [Types
+ ([SynTypeDefn
+ (SynComponentInfo
+ ([], None, [], [T],
+ PreXmlDoc ((3,0), FSharp.Compiler.Xml.XmlDocCollector),
+ false, None, (3,5--3,6)),
+ ObjectModel
+ (Class,
+ [ImplicitCtor
+ (Some (Private (3,7--3,14)), [],
+ SimplePats ([], [], (3,15--3,17)), None,
+ PreXmlDoc ((3,7), FSharp.Compiler.Xml.XmlDocCollector),
+ (3,5--3,6), { AsKeyword = None })], (4,4--5,7)), [],
+ Some
+ (ImplicitCtor
+ (Some (Private (3,7--3,14)), [],
+ SimplePats ([], [], (3,15--3,17)), None,
+ PreXmlDoc ((3,7), FSharp.Compiler.Xml.XmlDocCollector),
+ (3,5--3,6), { AsKeyword = None })), (3,5--5,7),
+ { LeadingKeyword = Type (3,0--3,4)
+ EqualsRange = Some (3,18--3,19)
+ WithKeyword = None })], (3,0--5,7));
+ Expr (Const (Unit, (7,0--7,2)), (7,0--7,2))],
+ PreXmlDoc ((1,0), FSharp.Compiler.Xml.XmlDocCollector), [], None,
+ (1,0--7,2), { LeadingKeyword = Module (1,0--1,6) })], (true, true),
+ { ConditionalDirectives = []
+ CodeComments = [] }, set []))
diff --git a/tests/service/data/SyntaxTree/Type/Class 05.fs b/tests/service/data/SyntaxTree/Type/Class 05.fs
new file mode 100644
index 00000000000..0e0da369fe3
--- /dev/null
+++ b/tests/service/data/SyntaxTree/Type/Class 05.fs
@@ -0,0 +1,7 @@
+module Module
+
+type T [] () =
+ class
+ end
+
+()
diff --git a/tests/service/data/SyntaxTree/Type/Class 05.fs.bsl b/tests/service/data/SyntaxTree/Type/Class 05.fs.bsl
new file mode 100644
index 00000000000..903fa37b286
--- /dev/null
+++ b/tests/service/data/SyntaxTree/Type/Class 05.fs.bsl
@@ -0,0 +1,46 @@
+ImplFile
+ (ParsedImplFileInput
+ ("/root/Type/Class 05.fs", false, QualifiedNameOfFile Module, [], [],
+ [SynModuleOrNamespace
+ ([Module], false, NamedModule,
+ [Types
+ ([SynTypeDefn
+ (SynComponentInfo
+ ([], None, [], [T],
+ PreXmlDoc ((3,0), FSharp.Compiler.Xml.XmlDocCollector),
+ false, None, (3,5--3,6)),
+ ObjectModel
+ (Class,
+ [ImplicitCtor
+ (None,
+ [{ Attributes =
+ [{ TypeName = SynLongIdent ([A], [], [None])
+ ArgExpr = Const (Unit, (3,9--3,10))
+ Target = None
+ AppliesToGetterAndSetter = false
+ Range = (3,9--3,10) }]
+ Range = (3,7--3,12) }],
+ SimplePats ([], [], (3,13--3,15)), None,
+ PreXmlDoc ((3,7), FSharp.Compiler.Xml.XmlDocCollector),
+ (3,5--3,6), { AsKeyword = None })], (4,4--5,7)), [],
+ Some
+ (ImplicitCtor
+ (None,
+ [{ Attributes =
+ [{ TypeName = SynLongIdent ([A], [], [None])
+ ArgExpr = Const (Unit, (3,9--3,10))
+ Target = None
+ AppliesToGetterAndSetter = false
+ Range = (3,9--3,10) }]
+ Range = (3,7--3,12) }],
+ SimplePats ([], [], (3,13--3,15)), None,
+ PreXmlDoc ((3,7), FSharp.Compiler.Xml.XmlDocCollector),
+ (3,5--3,6), { AsKeyword = None })), (3,5--5,7),
+ { LeadingKeyword = Type (3,0--3,4)
+ EqualsRange = Some (3,16--3,17)
+ WithKeyword = None })], (3,0--5,7));
+ Expr (Const (Unit, (7,0--7,2)), (7,0--7,2))],
+ PreXmlDoc ((1,0), FSharp.Compiler.Xml.XmlDocCollector), [], None,
+ (1,0--7,2), { LeadingKeyword = Module (1,0--1,6) })], (true, true),
+ { ConditionalDirectives = []
+ CodeComments = [] }, set []))
diff --git a/tests/service/data/SyntaxTree/Type/Primary ctor 02.fs.bsl b/tests/service/data/SyntaxTree/Type/Primary ctor 02.fs.bsl
index 821925690b1..a770ed3442e 100644
--- a/tests/service/data/SyntaxTree/Type/Primary ctor 02.fs.bsl
+++ b/tests/service/data/SyntaxTree/Type/Primary ctor 02.fs.bsl
@@ -14,15 +14,15 @@ ImplFile
[ImplicitCtor
(None, [], SimplePats ([], [], (3,6--3,8)), None,
PreXmlDoc ((3,6), FSharp.Compiler.Xml.XmlDocCollector),
- (3,5--3,6), { AsKeyword = None })], (5,0--5,0)), [],
+ (3,5--3,6), { AsKeyword = None })], (3,5--3,10)), [],
Some
(ImplicitCtor
(None, [], SimplePats ([], [], (3,6--3,8)), None,
PreXmlDoc ((3,6), FSharp.Compiler.Xml.XmlDocCollector),
- (3,5--3,6), { AsKeyword = None })), (3,5--5,0),
+ (3,5--3,6), { AsKeyword = None })), (3,5--3,10),
{ LeadingKeyword = Type (3,0--3,4)
EqualsRange = Some (3,9--3,10)
- WithKeyword = None })], (3,0--5,0));
+ WithKeyword = None })], (3,0--3,10));
Expr (Const (Unit, (5,0--5,2)), (5,0--5,2))],
PreXmlDoc ((1,0), FSharp.Compiler.Xml.XmlDocCollector), [], None,
(1,0--5,2), { LeadingKeyword = Module (1,0--1,6) })], (true, true),
diff --git a/tests/service/data/SyntaxTree/Type/Primary ctor 04.fs.bsl b/tests/service/data/SyntaxTree/Type/Primary ctor 04.fs.bsl
index 8affb14690e..4fbcdb810b7 100644
--- a/tests/service/data/SyntaxTree/Type/Primary ctor 04.fs.bsl
+++ b/tests/service/data/SyntaxTree/Type/Primary ctor 04.fs.bsl
@@ -14,17 +14,17 @@ ImplFile
[ImplicitCtor
(None, [], SimplePats ([], [], (3,6--3,8)), None,
PreXmlDoc ((3,6), FSharp.Compiler.Xml.XmlDocCollector),
- (3,5--3,6), { AsKeyword = None })], (3,9--3,9)), [],
+ (3,5--3,6), { AsKeyword = None })], (3,5--3,10)), [],
Some
(ImplicitCtor
(None, [], SimplePats ([], [], (3,6--3,8)), None,
PreXmlDoc ((3,6), FSharp.Compiler.Xml.XmlDocCollector),
- (3,5--3,6), { AsKeyword = None })), (3,5--3,9),
+ (3,5--3,6), { AsKeyword = None })), (3,5--3,10),
{ LeadingKeyword = Type (3,0--3,4)
EqualsRange = Some (3,9--3,10)
- WithKeyword = None })], (3,0--3,9))],
+ WithKeyword = None })], (3,0--3,10))],
PreXmlDoc ((1,0), FSharp.Compiler.Xml.XmlDocCollector), [], None,
- (1,0--3,9), { LeadingKeyword = Module (1,0--1,6) })], (true, true),
+ (1,0--3,10), { LeadingKeyword = Module (1,0--1,6) })], (true, true),
{ ConditionalDirectives = []
CodeComments = [] }, set []))
diff --git a/tests/service/data/SyntaxTree/Type/Struct 01.fs b/tests/service/data/SyntaxTree/Type/Struct 01.fs
new file mode 100644
index 00000000000..25401c89409
--- /dev/null
+++ b/tests/service/data/SyntaxTree/Type/Struct 01.fs
@@ -0,0 +1,3 @@
+module Module
+
+type S = struct end
diff --git a/tests/service/data/SyntaxTree/Type/Struct 01.fs.bsl b/tests/service/data/SyntaxTree/Type/Struct 01.fs.bsl
new file mode 100644
index 00000000000..9996befe9da
--- /dev/null
+++ b/tests/service/data/SyntaxTree/Type/Struct 01.fs.bsl
@@ -0,0 +1,19 @@
+ImplFile
+ (ParsedImplFileInput
+ ("/root/Type/Struct 01.fs", false, QualifiedNameOfFile Module, [], [],
+ [SynModuleOrNamespace
+ ([Module], false, NamedModule,
+ [Types
+ ([SynTypeDefn
+ (SynComponentInfo
+ ([], None, [], [S],
+ PreXmlDoc ((3,0), FSharp.Compiler.Xml.XmlDocCollector),
+ false, None, (3,5--3,6)),
+ ObjectModel (Struct, [], (3,9--3,19)), [], None, (3,5--3,19),
+ { LeadingKeyword = Type (3,0--3,4)
+ EqualsRange = Some (3,7--3,8)
+ WithKeyword = None })], (3,0--3,19))],
+ PreXmlDoc ((1,0), FSharp.Compiler.Xml.XmlDocCollector), [], None,
+ (1,0--3,19), { LeadingKeyword = Module (1,0--1,6) })], (true, true),
+ { ConditionalDirectives = []
+ CodeComments = [] }, set []))
diff --git a/tests/service/data/SyntaxTree/Type/Struct 02.fs b/tests/service/data/SyntaxTree/Type/Struct 02.fs
new file mode 100644
index 00000000000..d7397ea29cd
--- /dev/null
+++ b/tests/service/data/SyntaxTree/Type/Struct 02.fs
@@ -0,0 +1,6 @@
+module Module
+
+type S =
+ struct
+ val Field: int
+ end
diff --git a/tests/service/data/SyntaxTree/Type/Struct 02.fs.bsl b/tests/service/data/SyntaxTree/Type/Struct 02.fs.bsl
new file mode 100644
index 00000000000..5ed03aa81bd
--- /dev/null
+++ b/tests/service/data/SyntaxTree/Type/Struct 02.fs.bsl
@@ -0,0 +1,28 @@
+ImplFile
+ (ParsedImplFileInput
+ ("/root/Type/Struct 02.fs", false, QualifiedNameOfFile Module, [], [],
+ [SynModuleOrNamespace
+ ([Module], false, NamedModule,
+ [Types
+ ([SynTypeDefn
+ (SynComponentInfo
+ ([], None, [], [S],
+ PreXmlDoc ((3,0), FSharp.Compiler.Xml.XmlDocCollector),
+ false, None, (3,5--3,6)),
+ ObjectModel
+ (Struct,
+ [ValField
+ (SynField
+ ([], false, Some Field,
+ LongIdent (SynLongIdent ([int], [], [None])), false,
+ PreXmlDoc ((5,8), FSharp.Compiler.Xml.XmlDocCollector),
+ None, (5,12--5,22),
+ { LeadingKeyword = Some (Val (5,8--5,11)) }),
+ (5,8--5,22))], (4,4--6,7)), [], None, (3,5--6,7),
+ { LeadingKeyword = Type (3,0--3,4)
+ EqualsRange = Some (3,7--3,8)
+ WithKeyword = None })], (3,0--6,7))],
+ PreXmlDoc ((1,0), FSharp.Compiler.Xml.XmlDocCollector), [], None,
+ (1,0--6,7), { LeadingKeyword = Module (1,0--1,6) })], (true, true),
+ { ConditionalDirectives = []
+ CodeComments = [] }, set []))
diff --git a/tests/service/data/SyntaxTree/Type/SynTypeDefnWithObjectModelClassContainsTheRangeOfTheEqualsSign.fs b/tests/service/data/SyntaxTree/Type/SynTypeDefnWithObjectModelClassContainsTheRangeOfTheEqualsSign.fs
deleted file mode 100644
index 9adae91b8b7..00000000000
--- a/tests/service/data/SyntaxTree/Type/SynTypeDefnWithObjectModelClassContainsTheRangeOfTheEqualsSign.fs
+++ /dev/null
@@ -1,4 +0,0 @@
-
-type Foobar () =
- class
- end
diff --git a/tests/service/data/SyntaxTree/Type/SynTypeDefnWithObjectModelClassContainsTheRangeOfTheEqualsSign.fs.bsl b/tests/service/data/SyntaxTree/Type/SynTypeDefnWithObjectModelClassContainsTheRangeOfTheEqualsSign.fs.bsl
deleted file mode 100644
index 0de04ed069a..00000000000
--- a/tests/service/data/SyntaxTree/Type/SynTypeDefnWithObjectModelClassContainsTheRangeOfTheEqualsSign.fs.bsl
+++ /dev/null
@@ -1,32 +0,0 @@
-ImplFile
- (ParsedImplFileInput
- ("/root/Type/SynTypeDefnWithObjectModelClassContainsTheRangeOfTheEqualsSign.fs",
- false,
- QualifiedNameOfFile
- SynTypeDefnWithObjectModelClassContainsTheRangeOfTheEqualsSign, [], [],
- [SynModuleOrNamespace
- ([SynTypeDefnWithObjectModelClassContainsTheRangeOfTheEqualsSign],
- false, AnonModule,
- [Types
- ([SynTypeDefn
- (SynComponentInfo
- ([], None, [], [Foobar],
- PreXmlDoc ((2,0), FSharp.Compiler.Xml.XmlDocCollector),
- false, None, (2,5--2,11)),
- ObjectModel
- (Class,
- [ImplicitCtor
- (None, [], SimplePats ([], [], (2,12--2,14)), None,
- PreXmlDoc ((2,12), FSharp.Compiler.Xml.XmlDocCollector),
- (2,5--2,11), { AsKeyword = None })], (3,4--4,7)), [],
- Some
- (ImplicitCtor
- (None, [], SimplePats ([], [], (2,12--2,14)), None,
- PreXmlDoc ((2,12), FSharp.Compiler.Xml.XmlDocCollector),
- (2,5--2,11), { AsKeyword = None })), (2,5--4,7),
- { LeadingKeyword = Type (2,0--2,4)
- EqualsRange = Some (2,15--2,16)
- WithKeyword = None })], (2,0--4,7))], PreXmlDocEmpty, [],
- None, (2,0--5,0), { LeadingKeyword = None })], (true, true),
- { ConditionalDirectives = []
- CodeComments = [] }, set []))
diff --git a/tests/service/data/SyntaxTree/Type/Type 03.fs.bsl b/tests/service/data/SyntaxTree/Type/Type 03.fs.bsl
index 47258d8b728..9cb15932e4c 100644
--- a/tests/service/data/SyntaxTree/Type/Type 03.fs.bsl
+++ b/tests/service/data/SyntaxTree/Type/Type 03.fs.bsl
@@ -9,10 +9,10 @@ ImplFile
([], None, [], [T],
PreXmlDoc ((3,0), FSharp.Compiler.Xml.XmlDocCollector),
false, None, (3,5--3,6)),
- ObjectModel (Unspecified, [], (5,0--5,0)), [], None,
- (3,5--5,0), { LeadingKeyword = Type (3,0--3,4)
- EqualsRange = Some (3,7--3,8)
- WithKeyword = None })], (3,0--5,0));
+ Simple (None (3,5--3,8), (3,5--3,8)), [], None, (3,5--3,8),
+ { LeadingKeyword = Type (3,0--3,4)
+ EqualsRange = Some (3,7--3,8)
+ WithKeyword = None })], (3,0--3,8));
Expr (Const (Unit, (5,0--5,2)), (5,0--5,2))],
PreXmlDoc ((1,0), FSharp.Compiler.Xml.XmlDocCollector), [], None,
(1,0--5,2), { LeadingKeyword = Module (1,0--1,6) })], (true, true),
diff --git a/tests/service/data/SyntaxTree/Type/Type 04.fs.bsl b/tests/service/data/SyntaxTree/Type/Type 04.fs.bsl
index 65fc3926189..83a744a8417 100644
--- a/tests/service/data/SyntaxTree/Type/Type 04.fs.bsl
+++ b/tests/service/data/SyntaxTree/Type/Type 04.fs.bsl
@@ -9,10 +9,10 @@ ImplFile
([], None, [], [T1],
PreXmlDoc ((3,0), FSharp.Compiler.Xml.XmlDocCollector),
false, None, (3,5--3,7)),
- ObjectModel (Unspecified, [], (5,0--5,0)), [], None,
- (3,5--5,0), { LeadingKeyword = Type (3,0--3,4)
- EqualsRange = Some (3,8--3,9)
- WithKeyword = None })], (3,0--5,0));
+ Simple (None (3,5--3,9), (3,5--3,9)), [], None, (3,5--3,9),
+ { LeadingKeyword = Type (3,0--3,4)
+ EqualsRange = Some (3,8--3,9)
+ WithKeyword = None })], (3,0--3,9));
Types
([SynTypeDefn
(SynComponentInfo
diff --git a/tests/service/data/SyntaxTree/Type/Type 05.fs.bsl b/tests/service/data/SyntaxTree/Type/Type 05.fs.bsl
index d5de1801c1c..ab92f140113 100644
--- a/tests/service/data/SyntaxTree/Type/Type 05.fs.bsl
+++ b/tests/service/data/SyntaxTree/Type/Type 05.fs.bsl
@@ -9,10 +9,10 @@ ImplFile
([], None, [], [T1],
PreXmlDoc ((3,0), FSharp.Compiler.Xml.XmlDocCollector),
false, None, (3,5--3,7)),
- ObjectModel (Unspecified, [], (5,0--5,0)), [], None,
- (3,5--5,0), { LeadingKeyword = Type (3,0--3,4)
- EqualsRange = Some (3,8--3,9)
- WithKeyword = None });
+ Simple (None (3,5--3,9), (3,5--3,9)), [], None, (3,5--3,9),
+ { LeadingKeyword = Type (3,0--3,4)
+ EqualsRange = Some (3,8--3,9)
+ WithKeyword = None });
SynTypeDefn
(SynComponentInfo
([], None, [], [T2],
diff --git a/tests/service/data/SyntaxTree/Type/Type 06.fs.bsl b/tests/service/data/SyntaxTree/Type/Type 06.fs.bsl
index c113ea3c208..48e453af537 100644
--- a/tests/service/data/SyntaxTree/Type/Type 06.fs.bsl
+++ b/tests/service/data/SyntaxTree/Type/Type 06.fs.bsl
@@ -9,10 +9,10 @@ ImplFile
([], None, [], [],
PreXmlDoc ((3,0), FSharp.Compiler.Xml.XmlDocCollector),
false, None, (3,5--3,6)),
- ObjectModel (Unspecified, [], (3,5--3,5)), [], None,
- (3,5--3,6), { LeadingKeyword = Type (3,0--3,4)
- EqualsRange = Some (3,5--3,6)
- WithKeyword = None })], (3,0--3,6))],
+ Simple (None (3,5--3,6), (3,5--3,6)), [], None, (3,5--3,6),
+ { LeadingKeyword = Type (3,0--3,4)
+ EqualsRange = Some (3,5--3,6)
+ WithKeyword = None })], (3,0--3,6))],
PreXmlDoc ((1,0), FSharp.Compiler.Xml.XmlDocCollector), [], None,
(1,0--3,6), { LeadingKeyword = Module (1,0--1,6) })], (true, true),
{ ConditionalDirectives = []
diff --git a/tests/service/data/SyntaxTree/Type/Type 11.fs b/tests/service/data/SyntaxTree/Type/Type 11.fs
new file mode 100644
index 00000000000..f640106b52d
--- /dev/null
+++ b/tests/service/data/SyntaxTree/Type/Type 11.fs
@@ -0,0 +1,5 @@
+module Module
+
+type T() =
+
+()
diff --git a/tests/service/data/SyntaxTree/Type/Type 11.fs.bsl b/tests/service/data/SyntaxTree/Type/Type 11.fs.bsl
new file mode 100644
index 00000000000..fb9f7a3d57e
--- /dev/null
+++ b/tests/service/data/SyntaxTree/Type/Type 11.fs.bsl
@@ -0,0 +1,32 @@
+ImplFile
+ (ParsedImplFileInput
+ ("/root/Type/Type 11.fs", false, QualifiedNameOfFile Module, [], [],
+ [SynModuleOrNamespace
+ ([Module], false, NamedModule,
+ [Types
+ ([SynTypeDefn
+ (SynComponentInfo
+ ([], None, [], [T],
+ PreXmlDoc ((3,0), FSharp.Compiler.Xml.XmlDocCollector),
+ false, None, (3,5--3,6)),
+ ObjectModel
+ (Unspecified,
+ [ImplicitCtor
+ (None, [], SimplePats ([], [], (3,6--3,8)), None,
+ PreXmlDoc ((3,6), FSharp.Compiler.Xml.XmlDocCollector),
+ (3,5--3,6), { AsKeyword = None })], (3,5--3,10)), [],
+ Some
+ (ImplicitCtor
+ (None, [], SimplePats ([], [], (3,6--3,8)), None,
+ PreXmlDoc ((3,6), FSharp.Compiler.Xml.XmlDocCollector),
+ (3,5--3,6), { AsKeyword = None })), (3,5--3,10),
+ { LeadingKeyword = Type (3,0--3,4)
+ EqualsRange = Some (3,9--3,10)
+ WithKeyword = None })], (3,0--3,10));
+ Expr (Const (Unit, (5,0--5,2)), (5,0--5,2))],
+ PreXmlDoc ((1,0), FSharp.Compiler.Xml.XmlDocCollector), [], None,
+ (1,0--5,2), { LeadingKeyword = Module (1,0--1,6) })], (true, true),
+ { ConditionalDirectives = []
+ CodeComments = [] }, set []))
+
+(3,5)-(3,7) parse error A type definition requires one or more members or other declarations. If you intend to define an empty class, struct or interface, then use 'type ... = class end', 'interface end' or 'struct end'.
diff --git a/tests/service/data/SyntaxTree/Type/Type 12.fs b/tests/service/data/SyntaxTree/Type/Type 12.fs
new file mode 100644
index 00000000000..e27562b2ffd
--- /dev/null
+++ b/tests/service/data/SyntaxTree/Type/Type 12.fs
@@ -0,0 +1,5 @@
+module Module
+
+type X | A | B
+
+()
diff --git a/tests/service/data/SyntaxTree/Type/Type 12.fs.bsl b/tests/service/data/SyntaxTree/Type/Type 12.fs.bsl
new file mode 100644
index 00000000000..9bacae3a626
--- /dev/null
+++ b/tests/service/data/SyntaxTree/Type/Type 12.fs.bsl
@@ -0,0 +1,21 @@
+ImplFile
+ (ParsedImplFileInput
+ ("/root/Type/Type 12.fs", false, QualifiedNameOfFile Module, [], [],
+ [SynModuleOrNamespace
+ ([Module], false, NamedModule,
+ [Types
+ ([SynTypeDefn
+ (SynComponentInfo
+ ([], None, [], [X],
+ PreXmlDoc ((3,0), FSharp.Compiler.Xml.XmlDocCollector),
+ false, None, (3,5--3,6)),
+ Simple (None (3,5--3,6), (3,5--3,6)), [], None, (3,5--3,6),
+ { LeadingKeyword = Type (3,0--3,4)
+ EqualsRange = None
+ WithKeyword = None })], (3,0--3,6))],
+ PreXmlDoc ((1,0), FSharp.Compiler.Xml.XmlDocCollector), [], None,
+ (1,0--3,6), { LeadingKeyword = Module (1,0--1,6) })], (true, true),
+ { ConditionalDirectives = []
+ CodeComments = [] }, set []))
+
+(3,7)-(3,8) parse error Unexpected symbol '|' in type definition. Expected '=' or other token.
diff --git a/vsintegration/src/FSharp.Editor/CodeFixes/AddMissingEqualsToTypeDefinition.fs b/vsintegration/src/FSharp.Editor/CodeFixes/AddMissingEqualsToTypeDefinition.fs
index 07896e9743b..46e5d096a9b 100644
--- a/vsintegration/src/FSharp.Editor/CodeFixes/AddMissingEqualsToTypeDefinition.fs
+++ b/vsintegration/src/FSharp.Editor/CodeFixes/AddMissingEqualsToTypeDefinition.fs
@@ -16,26 +16,35 @@ type internal AddMissingEqualsToTypeDefinitionCodeFixProvider() =
static let title = SR.AddMissingEqualsToTypeDefinition()
- override _.FixableDiagnosticIds = ImmutableArray.Create "FS3360"
+ override _.FixableDiagnosticIds = ImmutableArray.Create "FS0010"
override this.RegisterCodeFixesAsync context = context.RegisterFsharpFix this
interface IFSharpCodeFixProvider with
member _.GetCodeFixIfAppliesAsync context =
cancellableTask {
- let! range = context.GetErrorRangeAsync()
+ let message =
+ context.Diagnostics
+ |> Seq.exactlyOne
+ |> fun d -> d.Descriptor.MessageFormat.ToString()
- let! parseResults = context.Document.GetFSharpParseResultsAsync(nameof AddMissingEqualsToTypeDefinitionCodeFixProvider)
-
- if parseResults.IsTypeName range then
+ // this should eliminate 99.9% of germs
+ if not <| message.Contains "=" then
return None
-
else
- return
- Some
- {
- Name = CodeFix.AddMissingEqualsToTypeDefinition
- Message = title
- Changes = [ TextChange(TextSpan(context.Span.Start, 0), "= ") ]
- }
+
+ let! range = context.GetErrorRangeAsync()
+ let! parseResults = context.Document.GetFSharpParseResultsAsync(nameof AddMissingEqualsToTypeDefinitionCodeFixProvider)
+
+ if not <| parseResults.IsPositionWithinTypeDefinition range.Start then
+ return None
+
+ else
+ return
+ Some
+ {
+ Name = CodeFix.AddMissingEqualsToTypeDefinition
+ Message = title
+ Changes = [ TextChange(TextSpan(context.Span.Start, 0), "= ") ]
+ }
}
diff --git a/vsintegration/tests/FSharp.Editor.Tests/CodeFixes/AddMissingEqualsToTypeDefinitionTests.fs b/vsintegration/tests/FSharp.Editor.Tests/CodeFixes/AddMissingEqualsToTypeDefinitionTests.fs
index 0b3e28bb830..4b02e503e54 100644
--- a/vsintegration/tests/FSharp.Editor.Tests/CodeFixes/AddMissingEqualsToTypeDefinitionTests.fs
+++ b/vsintegration/tests/FSharp.Editor.Tests/CodeFixes/AddMissingEqualsToTypeDefinitionTests.fs
@@ -8,10 +8,10 @@ open Xunit
open CodeFixTestFramework
let private codeFix = AddMissingEqualsToTypeDefinitionCodeFixProvider()
-let private diagnostic = 3360 // Unexpected token in type def...
+let private diagnostic = 0010 // Unexpected symbol...
[]
-let ``Fixes FS0360 for missing equals in type def - simple types`` () =
+let ``Fixes FS0010 for missing equals in type def - simple types`` () =
let code =
"""
type Song { Artist : string; Title : int }
@@ -32,7 +32,7 @@ type Song = { Artist : string; Title : int }
Assert.Equal(expected, actual)
[]
-let ``Fixes FS0360 for missing equals in type def - records`` () =
+let ``Fixes FS0010 for missing equals in type def - records`` () =
let code =
"""
type Name Name of string
@@ -52,19 +52,10 @@ type Name = Name of string
Assert.Equal(expected, actual)
-[]
-// apparently this throws the same error hah
-let ``Doesn't fix FS0360 for invalid interface defs`` () =
- let code =
- """
-type IA<'b> =
- abstract Foo : int -> int
-
-type IB<'b> =
- inherit IA<'b>
- inherit IA
-"""
-
+[]
+[]
+[]
+let ``Doesn't fix FS0010 for random unexpected symbols`` code =
let expected = None
let actual = codeFix |> tryFix code diagnostic