From b952b7263a87de5366b30a315744fb2f78207fce Mon Sep 17 00:00:00 2001 From: Don Syme Date: Tue, 13 Mar 2018 18:35:17 +0000 Subject: [PATCH 001/160] anonymous record types implementation --- src/absil/il.fs | 4 + src/absil/il.fsi | 1 + .../FSharp.Compiler.Private/FSComp.fs | 1942 +++++++++-------- .../FSharp.Compiler.Private/FSComp.resx | 20 +- src/fsharp/CompileOps.fs | 6 +- src/fsharp/ConstraintSolver.fs | 92 +- src/fsharp/FSComp.txt | 8 +- src/fsharp/FSStrings.resx | 6 + src/fsharp/FindUnsolved.fs | 33 +- src/fsharp/IlxGen.fs | 1887 ++++++++-------- src/fsharp/IlxGen.fsi | 7 +- src/fsharp/InnerLambdasToTopLevelFuncs.fs | 4 +- src/fsharp/LexFilter.fs | 25 +- src/fsharp/NameResolution.fs | 62 +- src/fsharp/NameResolution.fsi | 6 + src/fsharp/NicePrint.fs | 9 + src/fsharp/Optimizer.fs | 36 +- src/fsharp/PostInferenceChecks.fs | 60 +- src/fsharp/PostInferenceChecks.fsi | 4 +- src/fsharp/QuotationTranslator.fs | 18 + src/fsharp/TastOps.fs | 77 +- src/fsharp/TastOps.fsi | 16 +- src/fsharp/TastPickle.fs | 172 +- src/fsharp/TypeChecker.fs | 199 +- src/fsharp/ast.fs | 92 +- src/fsharp/fsc.fs | 13 +- src/fsharp/fsi/fsi.fs | 2 +- src/fsharp/infos.fs | 2 + src/fsharp/layout.fs | 2 + src/fsharp/layout.fsi | 2 + src/fsharp/lex.fsl | 2 + src/fsharp/pars.fsy | 207 +- src/fsharp/service/ServiceAssemblyContent.fs | 8 +- src/fsharp/service/ServiceDeclarationLists.fs | 5 + .../service/ServiceInterfaceStubGenerator.fs | 6 +- src/fsharp/service/ServiceLexing.fs | 8 +- .../service/ServiceParamInfoLocations.fs | 4 +- src/fsharp/service/ServiceParseTreeWalk.fs | 11 +- src/fsharp/service/ServiceStructure.fs | 5 +- src/fsharp/service/ServiceUntypedParse.fs | 20 +- src/fsharp/service/ServiceXmlDocParser.fs | 3 +- src/fsharp/symbols/Exprs.fs | 2 +- src/fsharp/symbols/SymbolHelpers.fs | 19 + src/fsharp/symbols/SymbolPatterns.fs | 4 +- src/fsharp/symbols/Symbols.fs | 142 +- src/fsharp/symbols/Symbols.fsi | 29 +- src/fsharp/tast.fs | 76 +- src/fsharp/xlf/FSComp.txt.cs.xlf | 30 + src/fsharp/xlf/FSComp.txt.de.xlf | 30 + src/fsharp/xlf/FSComp.txt.en.xlf | 30 + src/fsharp/xlf/FSComp.txt.es.xlf | 30 + src/fsharp/xlf/FSComp.txt.fr.xlf | 30 + src/fsharp/xlf/FSComp.txt.it.xlf | 30 + src/fsharp/xlf/FSComp.txt.ja.xlf | 30 + src/fsharp/xlf/FSComp.txt.ko.xlf | 30 + src/fsharp/xlf/FSComp.txt.pl.xlf | 30 + src/fsharp/xlf/FSComp.txt.pt-BR.xlf | 30 + src/fsharp/xlf/FSComp.txt.ru.xlf | 30 + src/fsharp/xlf/FSComp.txt.tr.xlf | 30 + src/fsharp/xlf/FSComp.txt.zh-Hans.xlf | 30 + src/fsharp/xlf/FSComp.txt.zh-Hant.xlf | 30 + src/fsharp/xlf/FSStrings.cs.xlf | 10 + src/fsharp/xlf/FSStrings.de.xlf | 10 + src/fsharp/xlf/FSStrings.en.xlf | 10 + src/fsharp/xlf/FSStrings.es.xlf | 10 + src/fsharp/xlf/FSStrings.fr.xlf | 10 + src/fsharp/xlf/FSStrings.it.xlf | 10 + src/fsharp/xlf/FSStrings.ja.xlf | 10 + src/fsharp/xlf/FSStrings.ko.xlf | 10 + src/fsharp/xlf/FSStrings.pl.xlf | 10 + src/fsharp/xlf/FSStrings.pt-BR.xlf | 10 + src/fsharp/xlf/FSStrings.ru.xlf | 10 + src/fsharp/xlf/FSStrings.tr.xlf | 10 + src/fsharp/xlf/FSStrings.zh-Hans.xlf | 10 + src/fsharp/xlf/FSStrings.zh-Hant.xlf | 10 + src/utils/sformat.fs | 2 + src/utils/sformat.fsi | 2 + tests/fsharp/core/anon/lib.fs | 209 ++ tests/fsharp/core/anon/test.fsx | 83 + tests/fsharp/core/fsi-load/test.fsx | 3 + .../core/queriesOverIQueryable/test.fsx | 116 +- tests/fsharp/tests.fs | 38 + tests/fsharp/typecheck/sigs/neg103.bsl | 24 + tests/fsharp/typecheck/sigs/neg103.fs | 20 + tests/fsharp/typecheck/sigs/neg103.vsbsl | 24 + tests/fsharp/typecheck/sigs/neg104.bsl | 20 + tests/fsharp/typecheck/sigs/neg104.fs | 13 + tests/fsharp/typecheck/sigs/neg104.vsbsl | 24 + .../BasicApplication/E_PostfixType01.fs | 2 +- .../BasicApplication/E_PostfixType03.fs | 2 +- .../OCamlCompat/MultiArgumentGenericType.fs | 2 +- tests/scripts/compiler-perf-results.txt | 6 + tests/service/Common.fs | 3 + tests/service/ProjectAnalysisTests.fs | 82 + 94 files changed, 4247 insertions(+), 2346 deletions(-) create mode 100644 tests/fsharp/core/anon/lib.fs create mode 100644 tests/fsharp/core/anon/test.fsx create mode 100644 tests/fsharp/typecheck/sigs/neg103.bsl create mode 100644 tests/fsharp/typecheck/sigs/neg103.fs create mode 100644 tests/fsharp/typecheck/sigs/neg103.vsbsl create mode 100644 tests/fsharp/typecheck/sigs/neg104.bsl create mode 100644 tests/fsharp/typecheck/sigs/neg104.fs create mode 100644 tests/fsharp/typecheck/sigs/neg104.vsbsl diff --git a/src/absil/il.fs b/src/absil/il.fs index 3316f156e6e..abb71e0ce9e 100644 --- a/src/absil/il.fs +++ b/src/absil/il.fs @@ -293,8 +293,12 @@ module SHA1 = let (_h0,_h1,_h2,h3,h4) = sha1Hash { stream = s; pos = 0; eof = false } // the result of the SHA algorithm is stored in registers 3 and 4 Array.map byte [| b0 h4; b1 h4; b2 h4; b3 h4; b0 h3; b1 h3; b2 h3; b3 h3; |] + let sha1HashInt64 s = + let (_h0,_h1,_h2,h3,h4) = sha1Hash { stream = s; pos = 0; eof = false } // the result of the SHA algorithm is stored in registers 3 and 4 + (int64 h3 <<< 32) ||| int64 h4 let sha1HashBytes s = SHA1.sha1HashBytes s +let sha1HashInt64 s = SHA1.sha1HashInt64 s // -------------------------------------------------------------------- // diff --git a/src/absil/il.fsi b/src/absil/il.fsi index cb24a7180a9..02ef056daaf 100644 --- a/src/absil/il.fsi +++ b/src/absil/il.fsi @@ -1934,6 +1934,7 @@ val isILTypedReferenceTy: ILType -> bool val isILDoubleTy: ILType -> bool val isILSingleTy: ILType -> bool +val sha1HashInt64 : byte[] -> int64 /// Get a public key token from a public key. val sha1HashBytes : byte[] -> byte[] (* SHA1 hash *) diff --git a/src/buildfromsource/FSharp.Compiler.Private/FSComp.fs b/src/buildfromsource/FSharp.Compiler.Private/FSComp.fs index ac222406a21..a88526f0fe7 100644 --- a/src/buildfromsource/FSharp.Compiler.Private/FSComp.fs +++ b/src/buildfromsource/FSharp.Compiler.Private/FSComp.fs @@ -1429,2883 +1429,2901 @@ type internal SR private() = /// Unmatched '{' /// (Originally from ..\FSComp.txt:442) static member parsUnmatchedBrace() = (604, GetStringFunc("parsUnmatchedBrace",",,,") ) - /// Field bindings must have the form 'id = expr;' + /// Unmatched '{|' /// (Originally from ..\FSComp.txt:443) + static member parsUnmatchedBraceBar() = (605, GetStringFunc("parsUnmatchedBraceBar",",,,") ) + /// Field bindings must have the form 'id = expr;' + /// (Originally from ..\FSComp.txt:444) static member parsFieldBinding() = (609, GetStringFunc("parsFieldBinding",",,,") ) /// This member is not permitted in an object implementation - /// (Originally from ..\FSComp.txt:444) + /// (Originally from ..\FSComp.txt:445) static member parsMemberIllegalInObjectImplementation() = (610, GetStringFunc("parsMemberIllegalInObjectImplementation",",,,") ) /// Missing function body - /// (Originally from ..\FSComp.txt:445) + /// (Originally from ..\FSComp.txt:446) static member parsMissingFunctionBody() = (611, GetStringFunc("parsMissingFunctionBody",",,,") ) /// Syntax error in labelled type argument - /// (Originally from ..\FSComp.txt:446) + /// (Originally from ..\FSComp.txt:447) static member parsSyntaxErrorInLabeledType() = (613, GetStringFunc("parsSyntaxErrorInLabeledType",",,,") ) /// Unexpected infix operator in type expression - /// (Originally from ..\FSComp.txt:447) + /// (Originally from ..\FSComp.txt:448) static member parsUnexpectedInfixOperator() = (615, GetStringFunc("parsUnexpectedInfixOperator",",,,") ) /// The syntax '(typ,...,typ) ident' is not used in F# code. Consider using 'ident' instead - /// (Originally from ..\FSComp.txt:448) + /// (Originally from ..\FSComp.txt:449) static member parsMultiArgumentGenericTypeFormDeprecated() = (GetStringFunc("parsMultiArgumentGenericTypeFormDeprecated",",,,") ) /// Invalid literal in type - /// (Originally from ..\FSComp.txt:449) + /// (Originally from ..\FSComp.txt:450) static member parsInvalidLiteralInType() = (618, GetStringFunc("parsInvalidLiteralInType",",,,") ) /// Unexpected infix operator in unit-of-measure expression. Legal operators are '*', '/' and '^'. - /// (Originally from ..\FSComp.txt:450) + /// (Originally from ..\FSComp.txt:451) static member parsUnexpectedOperatorForUnitOfMeasure() = (619, GetStringFunc("parsUnexpectedOperatorForUnitOfMeasure",",,,") ) /// Unexpected integer literal in unit-of-measure expression - /// (Originally from ..\FSComp.txt:451) + /// (Originally from ..\FSComp.txt:452) static member parsUnexpectedIntegerLiteralForUnitOfMeasure() = (620, GetStringFunc("parsUnexpectedIntegerLiteralForUnitOfMeasure",",,,") ) /// Syntax error: unexpected type parameter specification - /// (Originally from ..\FSComp.txt:452) + /// (Originally from ..\FSComp.txt:453) static member parsUnexpectedTypeParameter() = (621, GetStringFunc("parsUnexpectedTypeParameter",",,,") ) /// Mismatched quotation operator name, beginning with '%s' - /// (Originally from ..\FSComp.txt:453) + /// (Originally from ..\FSComp.txt:454) static member parsMismatchedQuotationName(a0 : System.String) = (622, GetStringFunc("parsMismatchedQuotationName",",,,%s,,,") a0) /// Active pattern case identifiers must begin with an uppercase letter - /// (Originally from ..\FSComp.txt:454) + /// (Originally from ..\FSComp.txt:455) static member parsActivePatternCaseMustBeginWithUpperCase() = (623, GetStringFunc("parsActivePatternCaseMustBeginWithUpperCase",",,,") ) /// The '|' character is not permitted in active pattern case identifiers - /// (Originally from ..\FSComp.txt:455) + /// (Originally from ..\FSComp.txt:456) static member parsActivePatternCaseContainsPipe() = (624, GetStringFunc("parsActivePatternCaseContainsPipe",",,,") ) /// Denominator must not be 0 in unit-of-measure exponent - /// (Originally from ..\FSComp.txt:456) + /// (Originally from ..\FSComp.txt:457) static member parsIllegalDenominatorForMeasureExponent() = (625, GetStringFunc("parsIllegalDenominatorForMeasureExponent",",,,") ) /// No '=' symbol should follow a 'namespace' declaration - /// (Originally from ..\FSComp.txt:457) + /// (Originally from ..\FSComp.txt:458) static member parsNoEqualShouldFollowNamespace() = (GetStringFunc("parsNoEqualShouldFollowNamespace",",,,") ) /// The syntax 'module ... = struct .. end' is not used in F# code. Consider using 'module ... = begin .. end' - /// (Originally from ..\FSComp.txt:458) + /// (Originally from ..\FSComp.txt:459) static member parsSyntaxModuleStructEndDeprecated() = (GetStringFunc("parsSyntaxModuleStructEndDeprecated",",,,") ) /// The syntax 'module ... : sig .. end' is not used in F# code. Consider using 'module ... = begin .. end' - /// (Originally from ..\FSComp.txt:459) + /// (Originally from ..\FSComp.txt:460) static member parsSyntaxModuleSigEndDeprecated() = (GetStringFunc("parsSyntaxModuleSigEndDeprecated",",,,") ) /// A static field was used where an instance field is expected - /// (Originally from ..\FSComp.txt:460) + /// (Originally from ..\FSComp.txt:461) static member tcStaticFieldUsedWhenInstanceFieldExpected() = (627, GetStringFunc("tcStaticFieldUsedWhenInstanceFieldExpected",",,,") ) /// Method '%s' is not accessible from this code location - /// (Originally from ..\FSComp.txt:461) + /// (Originally from ..\FSComp.txt:462) static member tcMethodNotAccessible(a0 : System.String) = (629, GetStringFunc("tcMethodNotAccessible",",,,%s,,,") a0) /// Implicit product of measures following / - /// (Originally from ..\FSComp.txt:463) + /// (Originally from ..\FSComp.txt:464) static member tcImplicitMeasureFollowingSlash() = (632, GetStringFunc("tcImplicitMeasureFollowingSlash",",,,") ) /// Unexpected SynMeasure.Anon - /// (Originally from ..\FSComp.txt:464) + /// (Originally from ..\FSComp.txt:465) static member tcUnexpectedMeasureAnon() = (633, GetStringFunc("tcUnexpectedMeasureAnon",",,,") ) /// Non-zero constants cannot have generic units. For generic zero, write 0.0<_>. - /// (Originally from ..\FSComp.txt:465) + /// (Originally from ..\FSComp.txt:466) static member tcNonZeroConstantCannotHaveGenericUnit() = (634, GetStringFunc("tcNonZeroConstantCannotHaveGenericUnit",",,,") ) /// In sequence expressions, results are generated using 'yield' - /// (Originally from ..\FSComp.txt:466) + /// (Originally from ..\FSComp.txt:467) static member tcSeqResultsUseYield() = (635, GetStringFunc("tcSeqResultsUseYield",",,,") ) /// Unexpected big rational constant - /// (Originally from ..\FSComp.txt:467) + /// (Originally from ..\FSComp.txt:468) static member tcUnexpectedBigRationalConstant() = (GetStringFunc("tcUnexpectedBigRationalConstant",",,,") ) /// Units-of-measure supported only on float, float32, decimal and signed integer types - /// (Originally from ..\FSComp.txt:468) + /// (Originally from ..\FSComp.txt:469) static member tcInvalidTypeForUnitsOfMeasure() = (636, GetStringFunc("tcInvalidTypeForUnitsOfMeasure",",,,") ) /// Unexpected Const_uint16array - /// (Originally from ..\FSComp.txt:469) + /// (Originally from ..\FSComp.txt:470) static member tcUnexpectedConstUint16Array() = (GetStringFunc("tcUnexpectedConstUint16Array",",,,") ) /// Unexpected Const_bytearray - /// (Originally from ..\FSComp.txt:470) + /// (Originally from ..\FSComp.txt:471) static member tcUnexpectedConstByteArray() = (GetStringFunc("tcUnexpectedConstByteArray",",,,") ) /// A parameter with attributes must also be given a name, e.g. '[] Name : Type' - /// (Originally from ..\FSComp.txt:471) + /// (Originally from ..\FSComp.txt:472) static member tcParameterRequiresName() = (640, GetStringFunc("tcParameterRequiresName",",,,") ) /// Return values cannot have names - /// (Originally from ..\FSComp.txt:472) + /// (Originally from ..\FSComp.txt:473) static member tcReturnValuesCannotHaveNames() = (641, GetStringFunc("tcReturnValuesCannotHaveNames",",,,") ) /// MemberKind.PropertyGetSet only expected in parse trees - /// (Originally from ..\FSComp.txt:473) + /// (Originally from ..\FSComp.txt:474) static member tcMemberKindPropertyGetSetNotExpected() = (GetStringFunc("tcMemberKindPropertyGetSetNotExpected",",,,") ) /// Namespaces cannot contain values. Consider using a module to hold your value declarations. - /// (Originally from ..\FSComp.txt:474) + /// (Originally from ..\FSComp.txt:475) static member tcNamespaceCannotContainValues() = (201, GetStringFunc("tcNamespaceCannotContainValues",",,,") ) /// Namespaces cannot contain extension members except in the same file and namespace declaration group where the type is defined. Consider using a module to hold declarations of extension members. - /// (Originally from ..\FSComp.txt:475) + /// (Originally from ..\FSComp.txt:476) static member tcNamespaceCannotContainExtensionMembers() = (644, GetStringFunc("tcNamespaceCannotContainExtensionMembers",",,,") ) /// Multiple visibility attributes have been specified for this identifier - /// (Originally from ..\FSComp.txt:476) + /// (Originally from ..\FSComp.txt:477) static member tcMultipleVisibilityAttributes() = (645, GetStringFunc("tcMultipleVisibilityAttributes",",,,") ) /// Multiple visibility attributes have been specified for this identifier. 'let' bindings in classes are always private, as are any 'let' bindings inside expressions. - /// (Originally from ..\FSComp.txt:477) + /// (Originally from ..\FSComp.txt:478) static member tcMultipleVisibilityAttributesWithLet() = (646, GetStringFunc("tcMultipleVisibilityAttributesWithLet",",,,") ) /// The name '(%s)' should not be used as a member name. To define comparison semantics for a type, implement the 'System.IComparable' interface. If defining a static member for use from other CLI languages then use the name '%s' instead. - /// (Originally from ..\FSComp.txt:478) + /// (Originally from ..\FSComp.txt:479) static member tcInvalidMethodNameForRelationalOperator(a0 : System.String, a1 : System.String) = (GetStringFunc("tcInvalidMethodNameForRelationalOperator",",,,%s,,,%s,,,") a0 a1) /// The name '(%s)' should not be used as a member name. To define equality semantics for a type, override the 'Object.Equals' member. If defining a static member for use from other CLI languages then use the name '%s' instead. - /// (Originally from ..\FSComp.txt:479) + /// (Originally from ..\FSComp.txt:480) static member tcInvalidMethodNameForEquality(a0 : System.String, a1 : System.String) = (GetStringFunc("tcInvalidMethodNameForEquality",",,,%s,,,%s,,,") a0 a1) /// The name '(%s)' should not be used as a member name. If defining a static member for use from other CLI languages then use the name '%s' instead. - /// (Originally from ..\FSComp.txt:480) + /// (Originally from ..\FSComp.txt:481) static member tcInvalidMemberName(a0 : System.String, a1 : System.String) = (GetStringFunc("tcInvalidMemberName",",,,%s,,,%s,,,") a0 a1) /// The name '(%s)' should not be used as a member name because it is given a standard definition in the F# library over fixed types - /// (Originally from ..\FSComp.txt:481) + /// (Originally from ..\FSComp.txt:482) static member tcInvalidMemberNameFixedTypes(a0 : System.String) = (GetStringFunc("tcInvalidMemberNameFixedTypes",",,,%s,,,") a0) /// The '%s' operator should not normally be redefined. To define overloaded comparison semantics for a particular type, implement the 'System.IComparable' interface in the definition of that type. - /// (Originally from ..\FSComp.txt:482) + /// (Originally from ..\FSComp.txt:483) static member tcInvalidOperatorDefinitionRelational(a0 : System.String) = (GetStringFunc("tcInvalidOperatorDefinitionRelational",",,,%s,,,") a0) /// The '%s' operator should not normally be redefined. To define equality semantics for a type, override the 'Object.Equals' member in the definition of that type. - /// (Originally from ..\FSComp.txt:483) + /// (Originally from ..\FSComp.txt:484) static member tcInvalidOperatorDefinitionEquality(a0 : System.String) = (GetStringFunc("tcInvalidOperatorDefinitionEquality",",,,%s,,,") a0) /// The '%s' operator should not normally be redefined. Consider using a different operator name - /// (Originally from ..\FSComp.txt:484) + /// (Originally from ..\FSComp.txt:485) static member tcInvalidOperatorDefinition(a0 : System.String) = (GetStringFunc("tcInvalidOperatorDefinition",",,,%s,,,") a0) /// The '%s' operator cannot be redefined. Consider using a different operator name - /// (Originally from ..\FSComp.txt:485) + /// (Originally from ..\FSComp.txt:486) static member tcInvalidIndexOperatorDefinition(a0 : System.String) = (GetStringFunc("tcInvalidIndexOperatorDefinition",",,,%s,,,") a0) /// Expected module or namespace parent %s - /// (Originally from ..\FSComp.txt:486) + /// (Originally from ..\FSComp.txt:487) static member tcExpectModuleOrNamespaceParent(a0 : System.String) = (GetStringFunc("tcExpectModuleOrNamespaceParent",",,,%s,,,") a0) /// The struct, record or union type '%s' implements the interface 'System.IComparable' explicitly. You must apply the 'CustomComparison' attribute to the type. - /// (Originally from ..\FSComp.txt:487) + /// (Originally from ..\FSComp.txt:488) static member tcImplementsIComparableExplicitly(a0 : System.String) = (647, GetStringFunc("tcImplementsIComparableExplicitly",",,,%s,,,") a0) /// The struct, record or union type '%s' implements the interface 'System.IComparable<_>' explicitly. You must apply the 'CustomComparison' attribute to the type, and should also provide a consistent implementation of the non-generic interface System.IComparable. - /// (Originally from ..\FSComp.txt:488) + /// (Originally from ..\FSComp.txt:489) static member tcImplementsGenericIComparableExplicitly(a0 : System.String) = (648, GetStringFunc("tcImplementsGenericIComparableExplicitly",",,,%s,,,") a0) /// The struct, record or union type '%s' implements the interface 'System.IStructuralComparable' explicitly. Apply the 'CustomComparison' attribute to the type. - /// (Originally from ..\FSComp.txt:489) + /// (Originally from ..\FSComp.txt:490) static member tcImplementsIStructuralComparableExplicitly(a0 : System.String) = (649, GetStringFunc("tcImplementsIStructuralComparableExplicitly",",,,%s,,,") a0) /// This record contains fields from inconsistent types - /// (Originally from ..\FSComp.txt:490) + /// (Originally from ..\FSComp.txt:491) static member tcRecordFieldInconsistentTypes() = (656, GetStringFunc("tcRecordFieldInconsistentTypes",",,,") ) /// DLLImport stubs cannot be inlined - /// (Originally from ..\FSComp.txt:491) + /// (Originally from ..\FSComp.txt:492) static member tcDllImportStubsCannotBeInlined() = (657, GetStringFunc("tcDllImportStubsCannotBeInlined",",,,") ) /// Structs may only bind a 'this' parameter at member declarations - /// (Originally from ..\FSComp.txt:492) + /// (Originally from ..\FSComp.txt:493) static member tcStructsCanOnlyBindThisAtMemberDeclaration() = (658, GetStringFunc("tcStructsCanOnlyBindThisAtMemberDeclaration",",,,") ) /// Unexpected expression at recursive inference point - /// (Originally from ..\FSComp.txt:493) + /// (Originally from ..\FSComp.txt:494) static member tcUnexpectedExprAtRecInfPoint() = (659, GetStringFunc("tcUnexpectedExprAtRecInfPoint",",,,") ) /// This code is less generic than required by its annotations because the explicit type variable '%s' could not be generalized. It was constrained to be '%s'. - /// (Originally from ..\FSComp.txt:494) + /// (Originally from ..\FSComp.txt:495) static member tcLessGenericBecauseOfAnnotation(a0 : System.String, a1 : System.String) = (660, GetStringFunc("tcLessGenericBecauseOfAnnotation",",,,%s,,,%s,,,") a0 a1) /// One or more of the explicit class or function type variables for this binding could not be generalized, because they were constrained to other types - /// (Originally from ..\FSComp.txt:495) + /// (Originally from ..\FSComp.txt:496) static member tcConstrainedTypeVariableCannotBeGeneralized() = (661, GetStringFunc("tcConstrainedTypeVariableCannotBeGeneralized",",,,") ) /// A generic type parameter has been used in a way that constrains it to always be '%s' - /// (Originally from ..\FSComp.txt:496) + /// (Originally from ..\FSComp.txt:497) static member tcGenericParameterHasBeenConstrained(a0 : System.String) = (662, GetStringFunc("tcGenericParameterHasBeenConstrained",",,,%s,,,") a0) /// This type parameter has been used in a way that constrains it to always be '%s' - /// (Originally from ..\FSComp.txt:497) + /// (Originally from ..\FSComp.txt:498) static member tcTypeParameterHasBeenConstrained(a0 : System.String) = (663, GetStringFunc("tcTypeParameterHasBeenConstrained",",,,%s,,,") a0) /// The type parameters inferred for this value are not stable under the erasure of type abbreviations. This is due to the use of type abbreviations which drop or reorder type parameters, e.g. \n\ttype taggedInt<'a> = int or\n\ttype swap<'a,'b> = 'b * 'a.\nConsider declaring the type parameters for this value explicitly, e.g.\n\tlet f<'a,'b> ((x,y) : swap<'b,'a>) : swap<'a,'b> = (y,x). - /// (Originally from ..\FSComp.txt:498) + /// (Originally from ..\FSComp.txt:499) static member tcTypeParametersInferredAreNotStable() = (664, GetStringFunc("tcTypeParametersInferredAreNotStable",",,,") ) /// Explicit type parameters may only be used on module or member bindings - /// (Originally from ..\FSComp.txt:499) + /// (Originally from ..\FSComp.txt:500) static member tcExplicitTypeParameterInvalid() = (665, GetStringFunc("tcExplicitTypeParameterInvalid",",,,") ) /// You must explicitly declare either all or no type parameters when overriding a generic abstract method - /// (Originally from ..\FSComp.txt:500) + /// (Originally from ..\FSComp.txt:501) static member tcOverridingMethodRequiresAllOrNoTypeParameters() = (666, GetStringFunc("tcOverridingMethodRequiresAllOrNoTypeParameters",",,,") ) /// The field labels and expected type of this record expression or pattern do not uniquely determine a corresponding record type - /// (Originally from ..\FSComp.txt:501) + /// (Originally from ..\FSComp.txt:502) static member tcFieldsDoNotDetermineUniqueRecordType() = (667, GetStringFunc("tcFieldsDoNotDetermineUniqueRecordType",",,,") ) /// The field '%s' appears twice in this record expression or pattern - /// (Originally from ..\FSComp.txt:502) + /// (Originally from ..\FSComp.txt:503) static member tcFieldAppearsTwiceInRecord(a0 : System.String) = (668, GetStringFunc("tcFieldAppearsTwiceInRecord",",,,%s,,,") a0) /// Unknown union case - /// (Originally from ..\FSComp.txt:503) + /// (Originally from ..\FSComp.txt:504) static member tcUnknownUnion() = (669, GetStringFunc("tcUnknownUnion",",,,") ) /// This code is not sufficiently generic. The type variable %s could not be generalized because it would escape its scope. - /// (Originally from ..\FSComp.txt:504) + /// (Originally from ..\FSComp.txt:505) static member tcNotSufficientlyGenericBecauseOfScope(a0 : System.String) = (670, GetStringFunc("tcNotSufficientlyGenericBecauseOfScope",",,,%s,,,") a0) /// A property cannot have explicit type parameters. Consider using a method instead. - /// (Originally from ..\FSComp.txt:505) + /// (Originally from ..\FSComp.txt:506) static member tcPropertyRequiresExplicitTypeParameters() = (671, GetStringFunc("tcPropertyRequiresExplicitTypeParameters",",,,") ) /// A constructor cannot have explicit type parameters. Consider using a static construction method instead. - /// (Originally from ..\FSComp.txt:506) + /// (Originally from ..\FSComp.txt:507) static member tcConstructorCannotHaveTypeParameters() = (672, GetStringFunc("tcConstructorCannotHaveTypeParameters",",,,") ) /// This instance member needs a parameter to represent the object being invoked. Make the member static or use the notation 'member x.Member(args) = ...'. - /// (Originally from ..\FSComp.txt:507) + /// (Originally from ..\FSComp.txt:508) static member tcInstanceMemberRequiresTarget() = (673, GetStringFunc("tcInstanceMemberRequiresTarget",",,,") ) /// Unexpected source-level property specification in syntax tree - /// (Originally from ..\FSComp.txt:508) + /// (Originally from ..\FSComp.txt:509) static member tcUnexpectedPropertyInSyntaxTree() = (674, GetStringFunc("tcUnexpectedPropertyInSyntaxTree",",,,") ) /// A static initializer requires an argument - /// (Originally from ..\FSComp.txt:509) + /// (Originally from ..\FSComp.txt:510) static member tcStaticInitializerRequiresArgument() = (675, GetStringFunc("tcStaticInitializerRequiresArgument",",,,") ) /// An object constructor requires an argument - /// (Originally from ..\FSComp.txt:510) + /// (Originally from ..\FSComp.txt:511) static member tcObjectConstructorRequiresArgument() = (676, GetStringFunc("tcObjectConstructorRequiresArgument",",,,") ) /// This static member should not have a 'this' parameter. Consider using the notation 'member Member(args) = ...'. - /// (Originally from ..\FSComp.txt:511) + /// (Originally from ..\FSComp.txt:512) static member tcStaticMemberShouldNotHaveThis() = (677, GetStringFunc("tcStaticMemberShouldNotHaveThis",",,,") ) /// An explicit static initializer should use the syntax 'static new(args) = expr' - /// (Originally from ..\FSComp.txt:512) + /// (Originally from ..\FSComp.txt:513) static member tcExplicitStaticInitializerSyntax() = (678, GetStringFunc("tcExplicitStaticInitializerSyntax",",,,") ) /// An explicit object constructor should use the syntax 'new(args) = expr' - /// (Originally from ..\FSComp.txt:513) + /// (Originally from ..\FSComp.txt:514) static member tcExplicitObjectConstructorSyntax() = (679, GetStringFunc("tcExplicitObjectConstructorSyntax",",,,") ) /// Unexpected source-level property specification - /// (Originally from ..\FSComp.txt:514) + /// (Originally from ..\FSComp.txt:515) static member tcUnexpectedPropertySpec() = (680, GetStringFunc("tcUnexpectedPropertySpec",",,,") ) /// This form of object expression is not used in F#. Use 'member this.MemberName ... = ...' to define member implementations in object expressions. - /// (Originally from ..\FSComp.txt:515) + /// (Originally from ..\FSComp.txt:516) static member tcObjectExpressionFormDeprecated() = (GetStringFunc("tcObjectExpressionFormDeprecated",",,,") ) /// Invalid declaration - /// (Originally from ..\FSComp.txt:516) + /// (Originally from ..\FSComp.txt:517) static member tcInvalidDeclaration() = (682, GetStringFunc("tcInvalidDeclaration",",,,") ) /// Attributes are not allowed within patterns - /// (Originally from ..\FSComp.txt:517) + /// (Originally from ..\FSComp.txt:518) static member tcAttributesInvalidInPatterns() = (683, GetStringFunc("tcAttributesInvalidInPatterns",",,,") ) /// The generic function '%s' must be given explicit type argument(s) - /// (Originally from ..\FSComp.txt:518) + /// (Originally from ..\FSComp.txt:519) static member tcFunctionRequiresExplicitTypeArguments(a0 : System.String) = (685, GetStringFunc("tcFunctionRequiresExplicitTypeArguments",",,,%s,,,") a0) /// The method or function '%s' should not be given explicit type argument(s) because it does not declare its type parameters explicitly - /// (Originally from ..\FSComp.txt:519) + /// (Originally from ..\FSComp.txt:520) static member tcDoesNotAllowExplicitTypeArguments(a0 : System.String) = (686, GetStringFunc("tcDoesNotAllowExplicitTypeArguments",",,,%s,,,") a0) /// This value, type or method expects %d type parameter(s) but was given %d - /// (Originally from ..\FSComp.txt:520) + /// (Originally from ..\FSComp.txt:521) static member tcTypeParameterArityMismatch(a0 : System.Int32, a1 : System.Int32) = (687, GetStringFunc("tcTypeParameterArityMismatch",",,,%d,,,%d,,,") a0 a1) /// The default, zero-initializing constructor of a struct type may only be used if all the fields of the struct type admit default initialization - /// (Originally from ..\FSComp.txt:521) + /// (Originally from ..\FSComp.txt:522) static member tcDefaultStructConstructorCall() = (688, GetStringFunc("tcDefaultStructConstructorCall",",,,") ) /// Couldn't find Dispose on IDisposable, or it was overloaded - /// (Originally from ..\FSComp.txt:522) + /// (Originally from ..\FSComp.txt:523) static member tcCouldNotFindIDisposable() = (GetStringFunc("tcCouldNotFindIDisposable",",,,") ) /// This value is not a literal and cannot be used in a pattern - /// (Originally from ..\FSComp.txt:523) + /// (Originally from ..\FSComp.txt:524) static member tcNonLiteralCannotBeUsedInPattern() = (689, GetStringFunc("tcNonLiteralCannotBeUsedInPattern",",,,") ) /// This field is readonly - /// (Originally from ..\FSComp.txt:524) + /// (Originally from ..\FSComp.txt:525) static member tcFieldIsReadonly() = (690, GetStringFunc("tcFieldIsReadonly",",,,") ) /// Named arguments must appear after all other arguments - /// (Originally from ..\FSComp.txt:525) + /// (Originally from ..\FSComp.txt:526) static member tcNameArgumentsMustAppearLast() = (691, GetStringFunc("tcNameArgumentsMustAppearLast",",,,") ) /// This function value is being used to construct a delegate type whose signature includes a byref argument. You must use an explicit lambda expression taking %d arguments. - /// (Originally from ..\FSComp.txt:526) + /// (Originally from ..\FSComp.txt:527) static member tcFunctionRequiresExplicitLambda(a0 : System.Int32) = (692, GetStringFunc("tcFunctionRequiresExplicitLambda",",,,%d,,,") a0) /// The type '%s' is not a type whose values can be enumerated with this syntax, i.e. is not compatible with either seq<_>, IEnumerable<_> or IEnumerable and does not have a GetEnumerator method - /// (Originally from ..\FSComp.txt:527) + /// (Originally from ..\FSComp.txt:528) static member tcTypeCannotBeEnumerated(a0 : System.String) = (693, GetStringFunc("tcTypeCannotBeEnumerated",",,,%s,,,") a0) /// This recursive binding uses an invalid mixture of recursive forms - /// (Originally from ..\FSComp.txt:528) + /// (Originally from ..\FSComp.txt:529) static member tcInvalidMixtureOfRecursiveForms() = (695, GetStringFunc("tcInvalidMixtureOfRecursiveForms",",,,") ) /// This is not a valid object construction expression. Explicit object constructors must either call an alternate constructor or initialize all fields of the object and specify a call to a super class constructor. - /// (Originally from ..\FSComp.txt:529) + /// (Originally from ..\FSComp.txt:530) static member tcInvalidObjectConstructionExpression() = (696, GetStringFunc("tcInvalidObjectConstructionExpression",",,,") ) /// Invalid constraint - /// (Originally from ..\FSComp.txt:530) + /// (Originally from ..\FSComp.txt:531) static member tcInvalidConstraint() = (697, GetStringFunc("tcInvalidConstraint",",,,") ) /// Invalid constraint: the type used for the constraint is sealed, which means the constraint could only be satisfied by at most one solution - /// (Originally from ..\FSComp.txt:531) + /// (Originally from ..\FSComp.txt:532) static member tcInvalidConstraintTypeSealed() = (698, GetStringFunc("tcInvalidConstraintTypeSealed",",,,") ) /// An 'enum' constraint must be of the form 'enum' - /// (Originally from ..\FSComp.txt:532) + /// (Originally from ..\FSComp.txt:533) static member tcInvalidEnumConstraint() = (699, GetStringFunc("tcInvalidEnumConstraint",",,,") ) /// 'new' constraints must take one argument of type 'unit' and return the constructed type - /// (Originally from ..\FSComp.txt:533) + /// (Originally from ..\FSComp.txt:534) static member tcInvalidNewConstraint() = (700, GetStringFunc("tcInvalidNewConstraint",",,,") ) /// This property has an invalid type. Properties taking multiple indexer arguments should have types of the form 'ty1 * ty2 -> ty3'. Properties returning functions should have types of the form '(ty1 -> ty2)'. - /// (Originally from ..\FSComp.txt:534) + /// (Originally from ..\FSComp.txt:535) static member tcInvalidPropertyType() = (701, GetStringFunc("tcInvalidPropertyType",",,,") ) /// Expected unit-of-measure parameter, not type parameter. Explicit unit-of-measure parameters must be marked with the [] attribute. - /// (Originally from ..\FSComp.txt:535) + /// (Originally from ..\FSComp.txt:536) static member tcExpectedUnitOfMeasureMarkWithAttribute() = (702, GetStringFunc("tcExpectedUnitOfMeasureMarkWithAttribute",",,,") ) /// Expected type parameter, not unit-of-measure parameter - /// (Originally from ..\FSComp.txt:536) + /// (Originally from ..\FSComp.txt:537) static member tcExpectedTypeParameter() = (703, GetStringFunc("tcExpectedTypeParameter",",,,") ) /// Expected type, not unit-of-measure - /// (Originally from ..\FSComp.txt:537) + /// (Originally from ..\FSComp.txt:538) static member tcExpectedTypeNotUnitOfMeasure() = (704, GetStringFunc("tcExpectedTypeNotUnitOfMeasure",",,,") ) /// Expected unit-of-measure, not type - /// (Originally from ..\FSComp.txt:538) + /// (Originally from ..\FSComp.txt:539) static member tcExpectedUnitOfMeasureNotType() = (705, GetStringFunc("tcExpectedUnitOfMeasureNotType",",,,") ) /// Units-of-measure cannot be used as prefix arguments to a type. Rewrite as postfix arguments in angle brackets. - /// (Originally from ..\FSComp.txt:539) + /// (Originally from ..\FSComp.txt:540) static member tcInvalidUnitsOfMeasurePrefix() = (706, GetStringFunc("tcInvalidUnitsOfMeasurePrefix",",,,") ) /// Unit-of-measure cannot be used in type constructor application - /// (Originally from ..\FSComp.txt:540) + /// (Originally from ..\FSComp.txt:541) static member tcUnitsOfMeasureInvalidInTypeConstructor() = (707, GetStringFunc("tcUnitsOfMeasureInvalidInTypeConstructor",",,,") ) /// This control construct may only be used if the computation expression builder defines a '%s' method - /// (Originally from ..\FSComp.txt:541) + /// (Originally from ..\FSComp.txt:542) static member tcRequireBuilderMethod(a0 : System.String) = (708, GetStringFunc("tcRequireBuilderMethod",",,,%s,,,") a0) /// This type has no nested types - /// (Originally from ..\FSComp.txt:542) + /// (Originally from ..\FSComp.txt:543) static member tcTypeHasNoNestedTypes() = (709, GetStringFunc("tcTypeHasNoNestedTypes",",,,") ) /// Unexpected %s in type expression - /// (Originally from ..\FSComp.txt:543) + /// (Originally from ..\FSComp.txt:544) static member tcUnexpectedSymbolInTypeExpression(a0 : System.String) = (711, GetStringFunc("tcUnexpectedSymbolInTypeExpression",",,,%s,,,") a0) /// Type parameter cannot be used as type constructor - /// (Originally from ..\FSComp.txt:544) + /// (Originally from ..\FSComp.txt:545) static member tcTypeParameterInvalidAsTypeConstructor() = (712, GetStringFunc("tcTypeParameterInvalidAsTypeConstructor",",,,") ) /// Illegal syntax in type expression - /// (Originally from ..\FSComp.txt:545) + /// (Originally from ..\FSComp.txt:546) static member tcIllegalSyntaxInTypeExpression() = (713, GetStringFunc("tcIllegalSyntaxInTypeExpression",",,,") ) /// Anonymous unit-of-measure cannot be nested inside another unit-of-measure expression - /// (Originally from ..\FSComp.txt:546) + /// (Originally from ..\FSComp.txt:547) static member tcAnonymousUnitsOfMeasureCannotBeNested() = (714, GetStringFunc("tcAnonymousUnitsOfMeasureCannotBeNested",",,,") ) /// Anonymous type variables are not permitted in this declaration - /// (Originally from ..\FSComp.txt:547) + /// (Originally from ..\FSComp.txt:548) static member tcAnonymousTypeInvalidInDeclaration() = (715, GetStringFunc("tcAnonymousTypeInvalidInDeclaration",",,,") ) /// Unexpected / in type - /// (Originally from ..\FSComp.txt:548) + /// (Originally from ..\FSComp.txt:549) static member tcUnexpectedSlashInType() = (716, GetStringFunc("tcUnexpectedSlashInType",",,,") ) /// Unexpected type arguments - /// (Originally from ..\FSComp.txt:549) + /// (Originally from ..\FSComp.txt:550) static member tcUnexpectedTypeArguments() = (717, GetStringFunc("tcUnexpectedTypeArguments",",,,") ) /// Optional arguments are only permitted on type members - /// (Originally from ..\FSComp.txt:550) + /// (Originally from ..\FSComp.txt:551) static member tcOptionalArgsOnlyOnMembers() = (718, GetStringFunc("tcOptionalArgsOnlyOnMembers",",,,") ) /// Name '%s' not bound in pattern context - /// (Originally from ..\FSComp.txt:551) + /// (Originally from ..\FSComp.txt:552) static member tcNameNotBoundInPattern(a0 : System.String) = (719, GetStringFunc("tcNameNotBoundInPattern",",,,%s,,,") a0) /// Non-primitive numeric literal constants cannot be used in pattern matches because they can be mapped to multiple different types through the use of a NumericLiteral module. Consider using replacing with a variable, and use 'when = ' at the end of the match clause. - /// (Originally from ..\FSComp.txt:552) + /// (Originally from ..\FSComp.txt:553) static member tcInvalidNonPrimitiveLiteralInPatternMatch() = (720, GetStringFunc("tcInvalidNonPrimitiveLiteralInPatternMatch",",,,") ) /// Type arguments cannot be specified here - /// (Originally from ..\FSComp.txt:553) + /// (Originally from ..\FSComp.txt:554) static member tcInvalidTypeArgumentUsage() = (721, GetStringFunc("tcInvalidTypeArgumentUsage",",,,") ) /// Only active patterns returning exactly one result may accept arguments - /// (Originally from ..\FSComp.txt:554) + /// (Originally from ..\FSComp.txt:555) static member tcRequireActivePatternWithOneResult() = (722, GetStringFunc("tcRequireActivePatternWithOneResult",",,,") ) /// Invalid argument to parameterized pattern label - /// (Originally from ..\FSComp.txt:555) + /// (Originally from ..\FSComp.txt:556) static member tcInvalidArgForParameterizedPattern() = (723, GetStringFunc("tcInvalidArgForParameterizedPattern",",,,") ) /// Internal error. Invalid index into active pattern array - /// (Originally from ..\FSComp.txt:556) + /// (Originally from ..\FSComp.txt:557) static member tcInvalidIndexIntoActivePatternArray() = (724, GetStringFunc("tcInvalidIndexIntoActivePatternArray",",,,") ) /// This union case does not take arguments - /// (Originally from ..\FSComp.txt:557) + /// (Originally from ..\FSComp.txt:558) static member tcUnionCaseDoesNotTakeArguments() = (725, GetStringFunc("tcUnionCaseDoesNotTakeArguments",",,,") ) /// This union case takes one argument - /// (Originally from ..\FSComp.txt:558) + /// (Originally from ..\FSComp.txt:559) static member tcUnionCaseRequiresOneArgument() = (726, GetStringFunc("tcUnionCaseRequiresOneArgument",",,,") ) /// This union case expects %d arguments in tupled form - /// (Originally from ..\FSComp.txt:559) + /// (Originally from ..\FSComp.txt:560) static member tcUnionCaseExpectsTupledArguments(a0 : System.Int32) = (727, GetStringFunc("tcUnionCaseExpectsTupledArguments",",,,%d,,,") a0) /// Field '%s' is not static - /// (Originally from ..\FSComp.txt:560) + /// (Originally from ..\FSComp.txt:561) static member tcFieldIsNotStatic(a0 : System.String) = (728, GetStringFunc("tcFieldIsNotStatic",",,,%s,,,") a0) /// This field is not a literal and cannot be used in a pattern - /// (Originally from ..\FSComp.txt:561) + /// (Originally from ..\FSComp.txt:562) static member tcFieldNotLiteralCannotBeUsedInPattern() = (729, GetStringFunc("tcFieldNotLiteralCannotBeUsedInPattern",",,,") ) /// This is not a variable, constant, active recognizer or literal - /// (Originally from ..\FSComp.txt:562) + /// (Originally from ..\FSComp.txt:563) static member tcRequireVarConstRecogOrLiteral() = (730, GetStringFunc("tcRequireVarConstRecogOrLiteral",",,,") ) /// This is not a valid pattern - /// (Originally from ..\FSComp.txt:563) + /// (Originally from ..\FSComp.txt:564) static member tcInvalidPattern() = (731, GetStringFunc("tcInvalidPattern",",,,") ) /// Character range matches have been removed in F#. Consider using a 'when' pattern guard instead. - /// (Originally from ..\FSComp.txt:564) + /// (Originally from ..\FSComp.txt:565) static member tcUseWhenPatternGuard() = (GetStringFunc("tcUseWhenPatternGuard",",,,") ) /// Illegal pattern - /// (Originally from ..\FSComp.txt:565) + /// (Originally from ..\FSComp.txt:566) static member tcIllegalPattern() = (733, GetStringFunc("tcIllegalPattern",",,,") ) /// Syntax error - unexpected '?' symbol - /// (Originally from ..\FSComp.txt:566) + /// (Originally from ..\FSComp.txt:567) static member tcSyntaxErrorUnexpectedQMark() = (734, GetStringFunc("tcSyntaxErrorUnexpectedQMark",",,,") ) /// Expected %d expressions, got %d - /// (Originally from ..\FSComp.txt:567) + /// (Originally from ..\FSComp.txt:568) static member tcExpressionCountMisMatch(a0 : System.Int32, a1 : System.Int32) = (735, GetStringFunc("tcExpressionCountMisMatch",",,,%d,,,%d,,,") a0 a1) /// TcExprUndelayed: delayed - /// (Originally from ..\FSComp.txt:568) + /// (Originally from ..\FSComp.txt:569) static member tcExprUndelayed() = (736, GetStringFunc("tcExprUndelayed",",,,") ) /// This expression form may only be used in sequence and computation expressions - /// (Originally from ..\FSComp.txt:569) + /// (Originally from ..\FSComp.txt:570) static member tcExpressionRequiresSequence() = (737, GetStringFunc("tcExpressionRequiresSequence",",,,") ) /// Invalid object expression. Objects without overrides or interfaces should use the expression form 'new Type(args)' without braces. - /// (Originally from ..\FSComp.txt:570) + /// (Originally from ..\FSComp.txt:571) static member tcInvalidObjectExpressionSyntaxForm() = (738, GetStringFunc("tcInvalidObjectExpressionSyntaxForm",",,,") ) /// Invalid object, sequence or record expression - /// (Originally from ..\FSComp.txt:571) + /// (Originally from ..\FSComp.txt:572) static member tcInvalidObjectSequenceOrRecordExpression() = (739, GetStringFunc("tcInvalidObjectSequenceOrRecordExpression",",,,") ) /// Invalid record, sequence or computation expression. Sequence expressions should be of the form 'seq { ... }' - /// (Originally from ..\FSComp.txt:572) + /// (Originally from ..\FSComp.txt:573) static member tcInvalidSequenceExpressionSyntaxForm() = (740, GetStringFunc("tcInvalidSequenceExpressionSyntaxForm",",,,") ) /// This list or array expression includes an element of the form 'if ... then ... else'. Parenthesize this expression to indicate it is an individual element of the list or array, to disambiguate this from a list generated using a sequence expression - /// (Originally from ..\FSComp.txt:573) + /// (Originally from ..\FSComp.txt:574) static member tcExpressionWithIfRequiresParenthesis() = (GetStringFunc("tcExpressionWithIfRequiresParenthesis",",,,") ) /// Unable to parse format string '%s' - /// (Originally from ..\FSComp.txt:574) + /// (Originally from ..\FSComp.txt:575) static member tcUnableToParseFormatString(a0 : System.String) = (741, GetStringFunc("tcUnableToParseFormatString",",,,%s,,,") a0) /// This list expression exceeds the maximum size for list literals. Use an array for larger literals and call Array.ToList. - /// (Originally from ..\FSComp.txt:575) + /// (Originally from ..\FSComp.txt:576) static member tcListLiteralMaxSize() = (742, GetStringFunc("tcListLiteralMaxSize",",,,") ) /// The expression form 'expr then expr' may only be used as part of an explicit object constructor - /// (Originally from ..\FSComp.txt:576) + /// (Originally from ..\FSComp.txt:577) static member tcExpressionFormRequiresObjectConstructor() = (743, GetStringFunc("tcExpressionFormRequiresObjectConstructor",",,,") ) /// Named arguments cannot be given to member trait calls - /// (Originally from ..\FSComp.txt:577) + /// (Originally from ..\FSComp.txt:578) static member tcNamedArgumentsCannotBeUsedInMemberTraits() = (744, GetStringFunc("tcNamedArgumentsCannotBeUsedInMemberTraits",",,,") ) /// This is not a valid name for an enumeration case - /// (Originally from ..\FSComp.txt:578) + /// (Originally from ..\FSComp.txt:579) static member tcNotValidEnumCaseName() = (745, GetStringFunc("tcNotValidEnumCaseName",",,,") ) /// This field is not mutable - /// (Originally from ..\FSComp.txt:579) + /// (Originally from ..\FSComp.txt:580) static member tcFieldIsNotMutable() = (746, GetStringFunc("tcFieldIsNotMutable",",,,") ) /// This construct may only be used within list, array and sequence expressions, e.g. expressions of the form 'seq { ... }', '[ ... ]' or '[| ... |]'. These use the syntax 'for ... in ... do ... yield...' to generate elements - /// (Originally from ..\FSComp.txt:580) + /// (Originally from ..\FSComp.txt:581) static member tcConstructRequiresListArrayOrSequence() = (747, GetStringFunc("tcConstructRequiresListArrayOrSequence",",,,") ) /// This construct may only be used within computation expressions. To return a value from an ordinary function simply write the expression without 'return'. - /// (Originally from ..\FSComp.txt:581) + /// (Originally from ..\FSComp.txt:582) static member tcConstructRequiresComputationExpressions() = (748, GetStringFunc("tcConstructRequiresComputationExpressions",",,,") ) /// This construct may only be used within sequence or computation expressions - /// (Originally from ..\FSComp.txt:582) + /// (Originally from ..\FSComp.txt:583) static member tcConstructRequiresSequenceOrComputations() = (749, GetStringFunc("tcConstructRequiresSequenceOrComputations",",,,") ) /// This construct may only be used within computation expressions - /// (Originally from ..\FSComp.txt:583) + /// (Originally from ..\FSComp.txt:584) static member tcConstructRequiresComputationExpression() = (750, GetStringFunc("tcConstructRequiresComputationExpression",",,,") ) /// Invalid indexer expression - /// (Originally from ..\FSComp.txt:584) + /// (Originally from ..\FSComp.txt:585) static member tcInvalidIndexerExpression() = (751, GetStringFunc("tcInvalidIndexerExpression",",,,") ) /// The operator 'expr.[idx]' has been used on an object of indeterminate type based on information prior to this program point. Consider adding further type constraints - /// (Originally from ..\FSComp.txt:585) + /// (Originally from ..\FSComp.txt:586) static member tcObjectOfIndeterminateTypeUsedRequireTypeConstraint() = (752, GetStringFunc("tcObjectOfIndeterminateTypeUsedRequireTypeConstraint",",,,") ) /// Cannot inherit from a variable type - /// (Originally from ..\FSComp.txt:586) + /// (Originally from ..\FSComp.txt:587) static member tcCannotInheritFromVariableType() = (753, GetStringFunc("tcCannotInheritFromVariableType",",,,") ) /// Calls to object constructors on type parameters cannot be given arguments - /// (Originally from ..\FSComp.txt:587) + /// (Originally from ..\FSComp.txt:588) static member tcObjectConstructorsOnTypeParametersCannotTakeArguments() = (754, GetStringFunc("tcObjectConstructorsOnTypeParametersCannotTakeArguments",",,,") ) /// The 'CompiledName' attribute cannot be used with this language element - /// (Originally from ..\FSComp.txt:588) + /// (Originally from ..\FSComp.txt:589) static member tcCompiledNameAttributeMisused() = (755, GetStringFunc("tcCompiledNameAttributeMisused",",,,") ) /// '%s' may only be used with named types - /// (Originally from ..\FSComp.txt:589) + /// (Originally from ..\FSComp.txt:590) static member tcNamedTypeRequired(a0 : System.String) = (756, GetStringFunc("tcNamedTypeRequired",",,,%s,,,") a0) /// 'inherit' cannot be used on interface types. Consider implementing the interface by using 'interface ... with ... end' instead. - /// (Originally from ..\FSComp.txt:590) + /// (Originally from ..\FSComp.txt:591) static member tcInheritCannotBeUsedOnInterfaceType() = (757, GetStringFunc("tcInheritCannotBeUsedOnInterfaceType",",,,") ) /// 'new' cannot be used on interface types. Consider using an object expression '{ new ... with ... }' instead. - /// (Originally from ..\FSComp.txt:591) + /// (Originally from ..\FSComp.txt:592) static member tcNewCannotBeUsedOnInterfaceType() = (758, GetStringFunc("tcNewCannotBeUsedOnInterfaceType",",,,") ) /// Instances of this type cannot be created since it has been marked abstract or not all methods have been given implementations. Consider using an object expression '{ new ... with ... }' instead. - /// (Originally from ..\FSComp.txt:592) + /// (Originally from ..\FSComp.txt:593) static member tcAbstractTypeCannotBeInstantiated() = (759, GetStringFunc("tcAbstractTypeCannotBeInstantiated",",,,") ) /// It is recommended that objects supporting the IDisposable interface are created using the syntax 'new Type(args)', rather than 'Type(args)' or 'Type' as a function value representing the constructor, to indicate that resources may be owned by the generated value - /// (Originally from ..\FSComp.txt:593) + /// (Originally from ..\FSComp.txt:594) static member tcIDisposableTypeShouldUseNew() = (760, GetStringFunc("tcIDisposableTypeShouldUseNew",",,,") ) /// '%s' may only be used to construct object types - /// (Originally from ..\FSComp.txt:594) + /// (Originally from ..\FSComp.txt:595) static member tcSyntaxCanOnlyBeUsedToCreateObjectTypes(a0 : System.String) = (761, GetStringFunc("tcSyntaxCanOnlyBeUsedToCreateObjectTypes",",,,%s,,,") a0) /// Constructors for the type '%s' must directly or indirectly call its implicit object constructor. Use a call to the implicit object constructor instead of a record expression. - /// (Originally from ..\FSComp.txt:595) + /// (Originally from ..\FSComp.txt:596) static member tcConstructorRequiresCall(a0 : System.String) = (762, GetStringFunc("tcConstructorRequiresCall",",,,%s,,,") a0) /// The field '%s' has been given a value, but is not present in the type '%s' - /// (Originally from ..\FSComp.txt:596) + /// (Originally from ..\FSComp.txt:597) static member tcUndefinedField(a0 : System.String, a1 : System.String) = (763, GetStringFunc("tcUndefinedField",",,,%s,,,%s,,,") a0 a1) /// No assignment given for field '%s' of type '%s' - /// (Originally from ..\FSComp.txt:597) + /// (Originally from ..\FSComp.txt:598) static member tcFieldRequiresAssignment(a0 : System.String, a1 : System.String) = (764, GetStringFunc("tcFieldRequiresAssignment",",,,%s,,,%s,,,") a0 a1) /// Extraneous fields have been given values - /// (Originally from ..\FSComp.txt:598) + /// (Originally from ..\FSComp.txt:599) static member tcExtraneousFieldsGivenValues() = (765, GetStringFunc("tcExtraneousFieldsGivenValues",",,,") ) /// Only overrides of abstract and virtual members may be specified in object expressions - /// (Originally from ..\FSComp.txt:599) + /// (Originally from ..\FSComp.txt:600) static member tcObjectExpressionsCanOnlyOverrideAbstractOrVirtual() = (766, GetStringFunc("tcObjectExpressionsCanOnlyOverrideAbstractOrVirtual",",,,") ) /// The member '%s' does not correspond to any abstract or virtual method available to override or implement. - /// (Originally from ..\FSComp.txt:600) + /// (Originally from ..\FSComp.txt:601) static member tcNoAbstractOrVirtualMemberFound(a0 : System.String) = (767, GetStringFunc("tcNoAbstractOrVirtualMemberFound",",,,%s,,,") a0) /// The type %s contains the member '%s' but it is not a virtual or abstract method that is available to override or implement. - /// (Originally from ..\FSComp.txt:601) + /// (Originally from ..\FSComp.txt:602) static member tcMemberFoundIsNotAbstractOrVirtual(a0 : System.String, a1 : System.String) = (767, GetStringFunc("tcMemberFoundIsNotAbstractOrVirtual",",,,%s,,,%s,,,") a0 a1) /// The member '%s' does not accept the correct number of arguments. %d argument(s) are expected, but %d were given. The required signature is '%s'.%s - /// (Originally from ..\FSComp.txt:602) + /// (Originally from ..\FSComp.txt:603) static member tcArgumentArityMismatch(a0 : System.String, a1 : System.Int32, a2 : System.Int32, a3 : System.String, a4 : System.String) = (768, GetStringFunc("tcArgumentArityMismatch",",,,%s,,,%d,,,%d,,,%s,,,%s,,,") a0 a1 a2 a3 a4) /// The member '%s' does not accept the correct number of arguments. One overload accepts %d arguments, but %d were given. The required signature is '%s'.%s - /// (Originally from ..\FSComp.txt:603) + /// (Originally from ..\FSComp.txt:604) static member tcArgumentArityMismatchOneOverload(a0 : System.String, a1 : System.Int32, a2 : System.Int32, a3 : System.String, a4 : System.String) = (769, GetStringFunc("tcArgumentArityMismatchOneOverload",",,,%s,,,%d,,,%d,,,%s,,,%s,,,") a0 a1 a2 a3 a4) /// A simple method name is required here - /// (Originally from ..\FSComp.txt:604) + /// (Originally from ..\FSComp.txt:605) static member tcSimpleMethodNameRequired() = (770, GetStringFunc("tcSimpleMethodNameRequired",",,,") ) /// The types System.ValueType, System.Enum, System.Delegate, System.MulticastDelegate and System.Array cannot be used as super types in an object expression or class - /// (Originally from ..\FSComp.txt:605) + /// (Originally from ..\FSComp.txt:606) static member tcPredefinedTypeCannotBeUsedAsSuperType() = (771, GetStringFunc("tcPredefinedTypeCannotBeUsedAsSuperType",",,,") ) /// 'new' must be used with a named type - /// (Originally from ..\FSComp.txt:606) + /// (Originally from ..\FSComp.txt:607) static member tcNewMustBeUsedWithNamedType() = (772, GetStringFunc("tcNewMustBeUsedWithNamedType",",,,") ) /// Cannot create an extension of a sealed type - /// (Originally from ..\FSComp.txt:607) + /// (Originally from ..\FSComp.txt:608) static member tcCannotCreateExtensionOfSealedType() = (773, GetStringFunc("tcCannotCreateExtensionOfSealedType",",,,") ) /// No arguments may be given when constructing a record value - /// (Originally from ..\FSComp.txt:608) + /// (Originally from ..\FSComp.txt:609) static member tcNoArgumentsForRecordValue() = (774, GetStringFunc("tcNoArgumentsForRecordValue",",,,") ) /// Interface implementations cannot be given on construction expressions - /// (Originally from ..\FSComp.txt:609) + /// (Originally from ..\FSComp.txt:610) static member tcNoInterfaceImplementationForConstructionExpression() = (775, GetStringFunc("tcNoInterfaceImplementationForConstructionExpression",",,,") ) /// Object construction expressions may only be used to implement constructors in class types - /// (Originally from ..\FSComp.txt:610) + /// (Originally from ..\FSComp.txt:611) static member tcObjectConstructionCanOnlyBeUsedInClassTypes() = (776, GetStringFunc("tcObjectConstructionCanOnlyBeUsedInClassTypes",",,,") ) /// Only simple bindings of the form 'id = expr' can be used in construction expressions - /// (Originally from ..\FSComp.txt:611) + /// (Originally from ..\FSComp.txt:612) static member tcOnlySimpleBindingsCanBeUsedInConstructionExpressions() = (777, GetStringFunc("tcOnlySimpleBindingsCanBeUsedInConstructionExpressions",",,,") ) /// Objects must be initialized by an object construction expression that calls an inherited object constructor and assigns a value to each field - /// (Originally from ..\FSComp.txt:612) + /// (Originally from ..\FSComp.txt:613) static member tcObjectsMustBeInitializedWithObjectExpression() = (778, GetStringFunc("tcObjectsMustBeInitializedWithObjectExpression",",,,") ) /// Expected an interface type - /// (Originally from ..\FSComp.txt:613) + /// (Originally from ..\FSComp.txt:614) static member tcExpectedInterfaceType() = (779, GetStringFunc("tcExpectedInterfaceType",",,,") ) /// Constructor expressions for interfaces do not take arguments - /// (Originally from ..\FSComp.txt:614) + /// (Originally from ..\FSComp.txt:615) static member tcConstructorForInterfacesDoNotTakeArguments() = (780, GetStringFunc("tcConstructorForInterfacesDoNotTakeArguments",",,,") ) /// This object constructor requires arguments - /// (Originally from ..\FSComp.txt:615) + /// (Originally from ..\FSComp.txt:616) static member tcConstructorRequiresArguments() = (781, GetStringFunc("tcConstructorRequiresArguments",",,,") ) /// 'new' may only be used with object constructors - /// (Originally from ..\FSComp.txt:616) + /// (Originally from ..\FSComp.txt:617) static member tcNewRequiresObjectConstructor() = (782, GetStringFunc("tcNewRequiresObjectConstructor",",,,") ) /// At least one override did not correctly implement its corresponding abstract member - /// (Originally from ..\FSComp.txt:617) + /// (Originally from ..\FSComp.txt:618) static member tcAtLeastOneOverrideIsInvalid() = (783, GetStringFunc("tcAtLeastOneOverrideIsInvalid",",,,") ) /// This numeric literal requires that a module '%s' defining functions FromZero, FromOne, FromInt32, FromInt64 and FromString be in scope - /// (Originally from ..\FSComp.txt:618) + /// (Originally from ..\FSComp.txt:619) static member tcNumericLiteralRequiresModule(a0 : System.String) = (784, GetStringFunc("tcNumericLiteralRequiresModule",",,,%s,,,") a0) /// Invalid record construction - /// (Originally from ..\FSComp.txt:619) + /// (Originally from ..\FSComp.txt:620) static member tcInvalidRecordConstruction() = (785, GetStringFunc("tcInvalidRecordConstruction",",,,") ) /// The expression form { expr with ... } may only be used with record types. To build object types use { new Type(...) with ... } - /// (Originally from ..\FSComp.txt:620) + /// (Originally from ..\FSComp.txt:621) static member tcExpressionFormRequiresRecordTypes() = (786, GetStringFunc("tcExpressionFormRequiresRecordTypes",",,,") ) /// The inherited type is not an object model type - /// (Originally from ..\FSComp.txt:621) + /// (Originally from ..\FSComp.txt:622) static member tcInheritedTypeIsNotObjectModelType() = (787, GetStringFunc("tcInheritedTypeIsNotObjectModelType",",,,") ) /// Object construction expressions (i.e. record expressions with inheritance specifications) may only be used to implement constructors in object model types. Use 'new ObjectType(args)' to construct instances of object model types outside of constructors - /// (Originally from ..\FSComp.txt:622) + /// (Originally from ..\FSComp.txt:623) static member tcObjectConstructionExpressionCanOnlyImplementConstructorsInObjectModelTypes() = (788, GetStringFunc("tcObjectConstructionExpressionCanOnlyImplementConstructorsInObjectModelTypes",",,,") ) /// '{ }' is not a valid expression. Records must include at least one field. Empty sequences are specified by using Seq.empty or an empty list '[]'. - /// (Originally from ..\FSComp.txt:623) + /// (Originally from ..\FSComp.txt:624) static member tcEmptyRecordInvalid() = (789, GetStringFunc("tcEmptyRecordInvalid",",,,") ) /// This type is not a record type. Values of class and struct types must be created using calls to object constructors. - /// (Originally from ..\FSComp.txt:624) + /// (Originally from ..\FSComp.txt:625) static member tcTypeIsNotARecordTypeNeedConstructor() = (790, GetStringFunc("tcTypeIsNotARecordTypeNeedConstructor",",,,") ) /// This type is not a record type - /// (Originally from ..\FSComp.txt:625) + /// (Originally from ..\FSComp.txt:626) static member tcTypeIsNotARecordType() = (791, GetStringFunc("tcTypeIsNotARecordType",",,,") ) /// This construct is ambiguous as part of a computation expression. Nested expressions may be written using 'let _ = (...)' and nested computations using 'let! res = builder { ... }'. - /// (Originally from ..\FSComp.txt:626) + /// (Originally from ..\FSComp.txt:627) static member tcConstructIsAmbiguousInComputationExpression() = (792, GetStringFunc("tcConstructIsAmbiguousInComputationExpression",",,,") ) /// This construct is ambiguous as part of a sequence expression. Nested expressions may be written using 'let _ = (...)' and nested sequences using 'yield! seq {... }'. - /// (Originally from ..\FSComp.txt:627) + /// (Originally from ..\FSComp.txt:628) static member tcConstructIsAmbiguousInSequenceExpression() = (793, GetStringFunc("tcConstructIsAmbiguousInSequenceExpression",",,,") ) /// 'do!' cannot be used within sequence expressions - /// (Originally from ..\FSComp.txt:628) + /// (Originally from ..\FSComp.txt:629) static member tcDoBangIllegalInSequenceExpression() = (794, GetStringFunc("tcDoBangIllegalInSequenceExpression",",,,") ) /// The use of 'let! x = coll' in sequence expressions is not permitted. Use 'for x in coll' instead. - /// (Originally from ..\FSComp.txt:629) + /// (Originally from ..\FSComp.txt:630) static member tcUseForInSequenceExpression() = (795, GetStringFunc("tcUseForInSequenceExpression",",,,") ) /// 'try'/'with' cannot be used within sequence expressions - /// (Originally from ..\FSComp.txt:630) + /// (Originally from ..\FSComp.txt:631) static member tcTryIllegalInSequenceExpression() = (796, GetStringFunc("tcTryIllegalInSequenceExpression",",,,") ) /// In sequence expressions, multiple results are generated using 'yield!' - /// (Originally from ..\FSComp.txt:631) + /// (Originally from ..\FSComp.txt:632) static member tcUseYieldBangForMultipleResults() = (797, GetStringFunc("tcUseYieldBangForMultipleResults",",,,") ) /// Invalid assignment - /// (Originally from ..\FSComp.txt:632) + /// (Originally from ..\FSComp.txt:633) static member tcInvalidAssignment() = (799, GetStringFunc("tcInvalidAssignment",",,,") ) /// Invalid use of a type name - /// (Originally from ..\FSComp.txt:633) + /// (Originally from ..\FSComp.txt:634) static member tcInvalidUseOfTypeName() = (800, GetStringFunc("tcInvalidUseOfTypeName",",,,") ) /// This type has no accessible object constructors - /// (Originally from ..\FSComp.txt:634) + /// (Originally from ..\FSComp.txt:635) static member tcTypeHasNoAccessibleConstructor() = (801, GetStringFunc("tcTypeHasNoAccessibleConstructor",",,,") ) /// Invalid use of an interface type - /// (Originally from ..\FSComp.txt:637) + /// (Originally from ..\FSComp.txt:638) static member tcInvalidUseOfInterfaceType() = (804, GetStringFunc("tcInvalidUseOfInterfaceType",",,,") ) /// Invalid use of a delegate constructor. Use the syntax 'new Type(args)' or just 'Type(args)'. - /// (Originally from ..\FSComp.txt:638) + /// (Originally from ..\FSComp.txt:639) static member tcInvalidUseOfDelegate() = (805, GetStringFunc("tcInvalidUseOfDelegate",",,,") ) /// Property '%s' is not static - /// (Originally from ..\FSComp.txt:639) + /// (Originally from ..\FSComp.txt:640) static member tcPropertyIsNotStatic(a0 : System.String) = (806, GetStringFunc("tcPropertyIsNotStatic",",,,%s,,,") a0) /// Property '%s' is not readable - /// (Originally from ..\FSComp.txt:640) + /// (Originally from ..\FSComp.txt:641) static member tcPropertyIsNotReadable(a0 : System.String) = (807, GetStringFunc("tcPropertyIsNotReadable",",,,%s,,,") a0) /// This lookup cannot be used here - /// (Originally from ..\FSComp.txt:641) + /// (Originally from ..\FSComp.txt:642) static member tcLookupMayNotBeUsedHere() = (808, GetStringFunc("tcLookupMayNotBeUsedHere",",,,") ) /// Property '%s' is static - /// (Originally from ..\FSComp.txt:642) + /// (Originally from ..\FSComp.txt:643) static member tcPropertyIsStatic(a0 : System.String) = (809, GetStringFunc("tcPropertyIsStatic",",,,%s,,,") a0) /// Property '%s' cannot be set - /// (Originally from ..\FSComp.txt:643) + /// (Originally from ..\FSComp.txt:644) static member tcPropertyCannotBeSet1(a0 : System.String) = (810, GetStringFunc("tcPropertyCannotBeSet1",",,,%s,,,") a0) /// Constructors must be applied to arguments and cannot be used as first-class values. If necessary use an anonymous function '(fun arg1 ... argN -> new Type(arg1,...,argN))'. - /// (Originally from ..\FSComp.txt:644) + /// (Originally from ..\FSComp.txt:645) static member tcConstructorsCannotBeFirstClassValues() = (811, GetStringFunc("tcConstructorsCannotBeFirstClassValues",",,,") ) /// The syntax 'expr.id' may only be used with record labels, properties and fields - /// (Originally from ..\FSComp.txt:645) + /// (Originally from ..\FSComp.txt:646) static member tcSyntaxFormUsedOnlyWithRecordLabelsPropertiesAndFields() = (812, GetStringFunc("tcSyntaxFormUsedOnlyWithRecordLabelsPropertiesAndFields",",,,") ) /// Event '%s' is static - /// (Originally from ..\FSComp.txt:646) + /// (Originally from ..\FSComp.txt:647) static member tcEventIsStatic(a0 : System.String) = (813, GetStringFunc("tcEventIsStatic",",,,%s,,,") a0) /// Event '%s' is not static - /// (Originally from ..\FSComp.txt:647) + /// (Originally from ..\FSComp.txt:648) static member tcEventIsNotStatic(a0 : System.String) = (814, GetStringFunc("tcEventIsNotStatic",",,,%s,,,") a0) /// The named argument '%s' did not match any argument or mutable property - /// (Originally from ..\FSComp.txt:648) + /// (Originally from ..\FSComp.txt:649) static member tcNamedArgumentDidNotMatch(a0 : System.String) = (815, GetStringFunc("tcNamedArgumentDidNotMatch",",,,%s,,,") a0) /// One or more of the overloads of this method has curried arguments. Consider redesigning these members to take arguments in tupled form. - /// (Originally from ..\FSComp.txt:649) + /// (Originally from ..\FSComp.txt:650) static member tcOverloadsCannotHaveCurriedArguments() = (816, GetStringFunc("tcOverloadsCannotHaveCurriedArguments",",,,") ) /// The unnamed arguments do not form a prefix of the arguments of the method called - /// (Originally from ..\FSComp.txt:650) + /// (Originally from ..\FSComp.txt:651) static member tcUnnamedArgumentsDoNotFormPrefix() = (GetStringFunc("tcUnnamedArgumentsDoNotFormPrefix",",,,") ) /// Static optimization conditionals are only for use within the F# library - /// (Originally from ..\FSComp.txt:651) + /// (Originally from ..\FSComp.txt:652) static member tcStaticOptimizationConditionalsOnlyForFSharpLibrary() = (817, GetStringFunc("tcStaticOptimizationConditionalsOnlyForFSharpLibrary",",,,") ) /// The corresponding formal argument is not optional - /// (Originally from ..\FSComp.txt:652) + /// (Originally from ..\FSComp.txt:653) static member tcFormalArgumentIsNotOptional() = (818, GetStringFunc("tcFormalArgumentIsNotOptional",",,,") ) /// Invalid optional assignment to a property or field - /// (Originally from ..\FSComp.txt:653) + /// (Originally from ..\FSComp.txt:654) static member tcInvalidOptionalAssignmentToPropertyOrField() = (819, GetStringFunc("tcInvalidOptionalAssignmentToPropertyOrField",",,,") ) /// A delegate constructor must be passed a single function value - /// (Originally from ..\FSComp.txt:654) + /// (Originally from ..\FSComp.txt:655) static member tcDelegateConstructorMustBePassed() = (820, GetStringFunc("tcDelegateConstructorMustBePassed",",,,") ) /// A binding cannot be marked both 'use' and 'rec' - /// (Originally from ..\FSComp.txt:655) + /// (Originally from ..\FSComp.txt:656) static member tcBindingCannotBeUseAndRec() = (821, GetStringFunc("tcBindingCannotBeUseAndRec",",,,") ) /// The 'VolatileField' attribute may only be used on 'let' bindings in classes - /// (Originally from ..\FSComp.txt:656) + /// (Originally from ..\FSComp.txt:657) static member tcVolatileOnlyOnClassLetBindings() = (823, GetStringFunc("tcVolatileOnlyOnClassLetBindings",",,,") ) /// Attributes are not permitted on 'let' bindings in expressions - /// (Originally from ..\FSComp.txt:657) + /// (Originally from ..\FSComp.txt:658) static member tcAttributesAreNotPermittedOnLetBindings() = (824, GetStringFunc("tcAttributesAreNotPermittedOnLetBindings",",,,") ) /// The 'DefaultValue' attribute may only be used on 'val' declarations - /// (Originally from ..\FSComp.txt:658) + /// (Originally from ..\FSComp.txt:659) static member tcDefaultValueAttributeRequiresVal() = (825, GetStringFunc("tcDefaultValueAttributeRequiresVal",",,,") ) /// The 'ConditionalAttribute' attribute may only be used on members - /// (Originally from ..\FSComp.txt:659) + /// (Originally from ..\FSComp.txt:660) static member tcConditionalAttributeRequiresMembers() = (826, GetStringFunc("tcConditionalAttributeRequiresMembers",",,,") ) /// This is not a valid name for an active pattern - /// (Originally from ..\FSComp.txt:660) + /// (Originally from ..\FSComp.txt:661) static member tcInvalidActivePatternName() = (827, GetStringFunc("tcInvalidActivePatternName",",,,") ) /// The 'EntryPointAttribute' attribute may only be used on function definitions in modules - /// (Originally from ..\FSComp.txt:661) + /// (Originally from ..\FSComp.txt:662) static member tcEntryPointAttributeRequiresFunctionInModule() = (828, GetStringFunc("tcEntryPointAttributeRequiresFunctionInModule",",,,") ) /// Mutable values cannot be marked 'inline' - /// (Originally from ..\FSComp.txt:662) + /// (Originally from ..\FSComp.txt:663) static member tcMutableValuesCannotBeInline() = (829, GetStringFunc("tcMutableValuesCannotBeInline",",,,") ) /// Mutable values cannot have generic parameters - /// (Originally from ..\FSComp.txt:663) + /// (Originally from ..\FSComp.txt:664) static member tcMutableValuesMayNotHaveGenericParameters() = (830, GetStringFunc("tcMutableValuesMayNotHaveGenericParameters",",,,") ) /// Mutable function values should be written 'let mutable f = (fun args -> ...)' - /// (Originally from ..\FSComp.txt:664) + /// (Originally from ..\FSComp.txt:665) static member tcMutableValuesSyntax() = (831, GetStringFunc("tcMutableValuesSyntax",",,,") ) /// Only functions may be marked 'inline' - /// (Originally from ..\FSComp.txt:665) + /// (Originally from ..\FSComp.txt:666) static member tcOnlyFunctionsCanBeInline() = (832, GetStringFunc("tcOnlyFunctionsCanBeInline",",,,") ) /// A literal value cannot be given the [] or [] attributes - /// (Originally from ..\FSComp.txt:666) + /// (Originally from ..\FSComp.txt:667) static member tcIllegalAttributesForLiteral() = (833, GetStringFunc("tcIllegalAttributesForLiteral",",,,") ) /// A literal value cannot be marked 'mutable' - /// (Originally from ..\FSComp.txt:667) + /// (Originally from ..\FSComp.txt:668) static member tcLiteralCannotBeMutable() = (834, GetStringFunc("tcLiteralCannotBeMutable",",,,") ) /// A literal value cannot be marked 'inline' - /// (Originally from ..\FSComp.txt:668) + /// (Originally from ..\FSComp.txt:669) static member tcLiteralCannotBeInline() = (835, GetStringFunc("tcLiteralCannotBeInline",",,,") ) /// Literal values cannot have generic parameters - /// (Originally from ..\FSComp.txt:669) + /// (Originally from ..\FSComp.txt:670) static member tcLiteralCannotHaveGenericParameters() = (836, GetStringFunc("tcLiteralCannotHaveGenericParameters",",,,") ) /// This is not a valid constant expression - /// (Originally from ..\FSComp.txt:670) + /// (Originally from ..\FSComp.txt:671) static member tcInvalidConstantExpression() = (837, GetStringFunc("tcInvalidConstantExpression",",,,") ) /// This type is not accessible from this code location - /// (Originally from ..\FSComp.txt:671) + /// (Originally from ..\FSComp.txt:672) static member tcTypeIsInaccessible() = (838, GetStringFunc("tcTypeIsInaccessible",",,,") ) /// Unexpected condition in imported assembly: failed to decode AttributeUsage attribute - /// (Originally from ..\FSComp.txt:672) + /// (Originally from ..\FSComp.txt:673) static member tcUnexpectedConditionInImportedAssembly() = (839, GetStringFunc("tcUnexpectedConditionInImportedAssembly",",,,") ) /// Unrecognized attribute target. Valid attribute targets are 'assembly', 'module', 'type', 'method', 'property', 'return', 'param', 'field', 'event', 'constructor'. - /// (Originally from ..\FSComp.txt:673) + /// (Originally from ..\FSComp.txt:674) static member tcUnrecognizedAttributeTarget() = (840, GetStringFunc("tcUnrecognizedAttributeTarget",",,,") ) /// This attribute is not valid for use on this language element. Assembly attributes should be attached to a 'do ()' declaration, if necessary within an F# module. - /// (Originally from ..\FSComp.txt:674) + /// (Originally from ..\FSComp.txt:675) static member tcAttributeIsNotValidForLanguageElementUseDo() = (841, GetStringFunc("tcAttributeIsNotValidForLanguageElementUseDo",",,,") ) /// This attribute is not valid for use on this language element - /// (Originally from ..\FSComp.txt:675) + /// (Originally from ..\FSComp.txt:676) static member tcAttributeIsNotValidForLanguageElement() = (842, GetStringFunc("tcAttributeIsNotValidForLanguageElement",",,,") ) /// Optional arguments cannot be used in custom attributes - /// (Originally from ..\FSComp.txt:676) + /// (Originally from ..\FSComp.txt:677) static member tcOptionalArgumentsCannotBeUsedInCustomAttribute() = (843, GetStringFunc("tcOptionalArgumentsCannotBeUsedInCustomAttribute",",,,") ) /// This property cannot be set - /// (Originally from ..\FSComp.txt:677) + /// (Originally from ..\FSComp.txt:678) static member tcPropertyCannotBeSet0() = (844, GetStringFunc("tcPropertyCannotBeSet0",",,,") ) /// This property or field was not found on this custom attribute type - /// (Originally from ..\FSComp.txt:678) + /// (Originally from ..\FSComp.txt:679) static member tcPropertyOrFieldNotFoundInAttribute() = (845, GetStringFunc("tcPropertyOrFieldNotFoundInAttribute",",,,") ) /// A custom attribute must be a reference type - /// (Originally from ..\FSComp.txt:679) + /// (Originally from ..\FSComp.txt:680) static member tcCustomAttributeMustBeReferenceType() = (846, GetStringFunc("tcCustomAttributeMustBeReferenceType",",,,") ) /// The number of args for a custom attribute does not match the expected number of args for the attribute constructor - /// (Originally from ..\FSComp.txt:680) + /// (Originally from ..\FSComp.txt:681) static member tcCustomAttributeArgumentMismatch() = (847, GetStringFunc("tcCustomAttributeArgumentMismatch",",,,") ) /// A custom attribute must invoke an object constructor - /// (Originally from ..\FSComp.txt:681) + /// (Originally from ..\FSComp.txt:682) static member tcCustomAttributeMustInvokeConstructor() = (848, GetStringFunc("tcCustomAttributeMustInvokeConstructor",",,,") ) /// Attribute expressions must be calls to object constructors - /// (Originally from ..\FSComp.txt:682) + /// (Originally from ..\FSComp.txt:683) static member tcAttributeExpressionsMustBeConstructorCalls() = (849, GetStringFunc("tcAttributeExpressionsMustBeConstructorCalls",",,,") ) /// This attribute cannot be used in this version of F# - /// (Originally from ..\FSComp.txt:683) + /// (Originally from ..\FSComp.txt:684) static member tcUnsupportedAttribute() = (850, GetStringFunc("tcUnsupportedAttribute",",,,") ) /// Invalid inline specification - /// (Originally from ..\FSComp.txt:684) + /// (Originally from ..\FSComp.txt:685) static member tcInvalidInlineSpecification() = (851, GetStringFunc("tcInvalidInlineSpecification",",,,") ) /// 'use' bindings must be of the form 'use = ' - /// (Originally from ..\FSComp.txt:685) + /// (Originally from ..\FSComp.txt:686) static member tcInvalidUseBinding() = (852, GetStringFunc("tcInvalidUseBinding",",,,") ) /// Abstract members are not permitted in an augmentation - they must be defined as part of the type itself - /// (Originally from ..\FSComp.txt:686) + /// (Originally from ..\FSComp.txt:687) static member tcAbstractMembersIllegalInAugmentation() = (853, GetStringFunc("tcAbstractMembersIllegalInAugmentation",",,,") ) /// Method overrides and interface implementations are not permitted here - /// (Originally from ..\FSComp.txt:687) + /// (Originally from ..\FSComp.txt:688) static member tcMethodOverridesIllegalHere() = (854, GetStringFunc("tcMethodOverridesIllegalHere",",,,") ) /// No abstract or interface member was found that corresponds to this override - /// (Originally from ..\FSComp.txt:688) + /// (Originally from ..\FSComp.txt:689) static member tcNoMemberFoundForOverride() = (855, GetStringFunc("tcNoMemberFoundForOverride",",,,") ) /// This override takes a different number of arguments to the corresponding abstract member. The following abstract members were found:%s - /// (Originally from ..\FSComp.txt:689) + /// (Originally from ..\FSComp.txt:690) static member tcOverrideArityMismatch(a0 : System.String) = (856, GetStringFunc("tcOverrideArityMismatch",",,,%s,,,") a0) /// This method already has a default implementation - /// (Originally from ..\FSComp.txt:690) + /// (Originally from ..\FSComp.txt:691) static member tcDefaultImplementationAlreadyExists() = (857, GetStringFunc("tcDefaultImplementationAlreadyExists",",,,") ) /// The method implemented by this default is ambiguous - /// (Originally from ..\FSComp.txt:691) + /// (Originally from ..\FSComp.txt:692) static member tcDefaultAmbiguous() = (858, GetStringFunc("tcDefaultAmbiguous",",,,") ) /// No abstract property was found that corresponds to this override - /// (Originally from ..\FSComp.txt:692) + /// (Originally from ..\FSComp.txt:693) static member tcNoPropertyFoundForOverride() = (859, GetStringFunc("tcNoPropertyFoundForOverride",",,,") ) /// This property overrides or implements an abstract property but the abstract property doesn't have a corresponding %s - /// (Originally from ..\FSComp.txt:693) + /// (Originally from ..\FSComp.txt:694) static member tcAbstractPropertyMissingGetOrSet(a0 : System.String) = (860, GetStringFunc("tcAbstractPropertyMissingGetOrSet",",,,%s,,,") a0) /// Invalid signature for set member - /// (Originally from ..\FSComp.txt:694) + /// (Originally from ..\FSComp.txt:695) static member tcInvalidSignatureForSet() = (861, GetStringFunc("tcInvalidSignatureForSet",",,,") ) /// This new member hides the abstract member '%s'. Rename the member or use 'override' instead. - /// (Originally from ..\FSComp.txt:695) + /// (Originally from ..\FSComp.txt:696) static member tcNewMemberHidesAbstractMember(a0 : System.String) = (864, GetStringFunc("tcNewMemberHidesAbstractMember",",,,%s,,,") a0) /// This new member hides the abstract member '%s' once tuples, functions, units of measure and/or provided types are erased. Rename the member or use 'override' instead. - /// (Originally from ..\FSComp.txt:696) + /// (Originally from ..\FSComp.txt:697) static member tcNewMemberHidesAbstractMemberWithSuffix(a0 : System.String) = (864, GetStringFunc("tcNewMemberHidesAbstractMemberWithSuffix",",,,%s,,,") a0) /// Interfaces cannot contain definitions of static initializers - /// (Originally from ..\FSComp.txt:697) + /// (Originally from ..\FSComp.txt:698) static member tcStaticInitializersIllegalInInterface() = (865, GetStringFunc("tcStaticInitializersIllegalInInterface",",,,") ) /// Interfaces cannot contain definitions of object constructors - /// (Originally from ..\FSComp.txt:698) + /// (Originally from ..\FSComp.txt:699) static member tcObjectConstructorsIllegalInInterface() = (866, GetStringFunc("tcObjectConstructorsIllegalInInterface",",,,") ) /// Interfaces cannot contain definitions of member overrides - /// (Originally from ..\FSComp.txt:699) + /// (Originally from ..\FSComp.txt:700) static member tcMemberOverridesIllegalInInterface() = (867, GetStringFunc("tcMemberOverridesIllegalInInterface",",,,") ) /// Interfaces cannot contain definitions of concrete members. You may need to define a constructor on your type to indicate that the type is a class. - /// (Originally from ..\FSComp.txt:700) + /// (Originally from ..\FSComp.txt:701) static member tcConcreteMembersIllegalInInterface() = (868, GetStringFunc("tcConcreteMembersIllegalInInterface",",,,") ) /// Constructors cannot be specified in exception augmentations - /// (Originally from ..\FSComp.txt:701) + /// (Originally from ..\FSComp.txt:702) static member tcConstructorsDisallowedInExceptionAugmentation() = (869, GetStringFunc("tcConstructorsDisallowedInExceptionAugmentation",",,,") ) /// Structs cannot have an object constructor with no arguments. This is a restriction imposed on all CLI languages as structs automatically support a default constructor. - /// (Originally from ..\FSComp.txt:702) + /// (Originally from ..\FSComp.txt:703) static member tcStructsCannotHaveConstructorWithNoArguments() = (870, GetStringFunc("tcStructsCannotHaveConstructorWithNoArguments",",,,") ) /// Constructors cannot be defined for this type - /// (Originally from ..\FSComp.txt:703) + /// (Originally from ..\FSComp.txt:704) static member tcConstructorsIllegalForThisType() = (871, GetStringFunc("tcConstructorsIllegalForThisType",",,,") ) /// Recursive bindings that include member specifications can only occur as a direct augmentation of a type - /// (Originally from ..\FSComp.txt:704) + /// (Originally from ..\FSComp.txt:705) static member tcRecursiveBindingsWithMembersMustBeDirectAugmentation() = (872, GetStringFunc("tcRecursiveBindingsWithMembersMustBeDirectAugmentation",",,,") ) /// Only simple variable patterns can be bound in 'let rec' constructs - /// (Originally from ..\FSComp.txt:705) + /// (Originally from ..\FSComp.txt:706) static member tcOnlySimplePatternsInLetRec() = (873, GetStringFunc("tcOnlySimplePatternsInLetRec",",,,") ) /// Only record fields and simple, non-recursive 'let' bindings may be marked mutable - /// (Originally from ..\FSComp.txt:706) + /// (Originally from ..\FSComp.txt:707) static member tcOnlyRecordFieldsAndSimpleLetCanBeMutable() = (874, GetStringFunc("tcOnlyRecordFieldsAndSimpleLetCanBeMutable",",,,") ) /// This member is not sufficiently generic - /// (Originally from ..\FSComp.txt:707) + /// (Originally from ..\FSComp.txt:708) static member tcMemberIsNotSufficientlyGeneric() = (875, GetStringFunc("tcMemberIsNotSufficientlyGeneric",",,,") ) /// A declaration may only be the [] attribute if a constant value is also given, e.g. 'val x : int = 1' - /// (Originally from ..\FSComp.txt:708) + /// (Originally from ..\FSComp.txt:709) static member tcLiteralAttributeRequiresConstantValue() = (876, GetStringFunc("tcLiteralAttributeRequiresConstantValue",",,,") ) /// A declaration may only be given a value in a signature if the declaration has the [] attribute - /// (Originally from ..\FSComp.txt:709) + /// (Originally from ..\FSComp.txt:710) static member tcValueInSignatureRequiresLiteralAttribute() = (877, GetStringFunc("tcValueInSignatureRequiresLiteralAttribute",",,,") ) /// Thread-static and context-static variables must be static and given the [] attribute to indicate that the value is initialized to the default value on each new thread - /// (Originally from ..\FSComp.txt:710) + /// (Originally from ..\FSComp.txt:711) static member tcThreadStaticAndContextStaticMustBeStatic() = (878, GetStringFunc("tcThreadStaticAndContextStaticMustBeStatic",",,,") ) /// Volatile fields must be marked 'mutable' and cannot be thread-static - /// (Originally from ..\FSComp.txt:711) + /// (Originally from ..\FSComp.txt:712) static member tcVolatileFieldsMustBeMutable() = (879, GetStringFunc("tcVolatileFieldsMustBeMutable",",,,") ) /// Uninitialized 'val' fields must be mutable and marked with the '[]' attribute. Consider using a 'let' binding instead of a 'val' field. - /// (Originally from ..\FSComp.txt:712) + /// (Originally from ..\FSComp.txt:713) static member tcUninitializedValFieldsMustBeMutable() = (880, GetStringFunc("tcUninitializedValFieldsMustBeMutable",",,,") ) /// Static 'val' fields in types must be mutable, private and marked with the '[]' attribute. They are initialized to the 'null' or 'zero' value for their type. Consider also using a 'static let mutable' binding in a class type. - /// (Originally from ..\FSComp.txt:713) + /// (Originally from ..\FSComp.txt:714) static member tcStaticValFieldsMustBeMutableAndPrivate() = (881, GetStringFunc("tcStaticValFieldsMustBeMutableAndPrivate",",,,") ) /// This field requires a name - /// (Originally from ..\FSComp.txt:714) + /// (Originally from ..\FSComp.txt:715) static member tcFieldRequiresName() = (882, GetStringFunc("tcFieldRequiresName",",,,") ) /// Invalid namespace, module, type or union case name - /// (Originally from ..\FSComp.txt:715) + /// (Originally from ..\FSComp.txt:716) static member tcInvalidNamespaceModuleTypeUnionName() = (883, GetStringFunc("tcInvalidNamespaceModuleTypeUnionName",",,,") ) /// Explicit type declarations for constructors must be of the form 'ty1 * ... * tyN -> resTy'. Parentheses may be required around 'resTy' - /// (Originally from ..\FSComp.txt:716) + /// (Originally from ..\FSComp.txt:717) static member tcIllegalFormForExplicitTypeDeclaration() = (884, GetStringFunc("tcIllegalFormForExplicitTypeDeclaration",",,,") ) /// Return types of union cases must be identical to the type being defined, up to abbreviations - /// (Originally from ..\FSComp.txt:717) + /// (Originally from ..\FSComp.txt:718) static member tcReturnTypesForUnionMustBeSameAsType() = (885, GetStringFunc("tcReturnTypesForUnionMustBeSameAsType",",,,") ) /// This is not a valid value for an enumeration literal - /// (Originally from ..\FSComp.txt:718) + /// (Originally from ..\FSComp.txt:719) static member tcInvalidEnumerationLiteral() = (886, GetStringFunc("tcInvalidEnumerationLiteral",",,,") ) /// The type '%s' is not an interface type - /// (Originally from ..\FSComp.txt:719) + /// (Originally from ..\FSComp.txt:720) static member tcTypeIsNotInterfaceType1(a0 : System.String) = (887, GetStringFunc("tcTypeIsNotInterfaceType1",",,,%s,,,") a0) /// Duplicate specification of an interface - /// (Originally from ..\FSComp.txt:720) + /// (Originally from ..\FSComp.txt:721) static member tcDuplicateSpecOfInterface() = (888, GetStringFunc("tcDuplicateSpecOfInterface",",,,") ) /// A field/val declaration is not permitted here - /// (Originally from ..\FSComp.txt:721) + /// (Originally from ..\FSComp.txt:722) static member tcFieldValIllegalHere() = (889, GetStringFunc("tcFieldValIllegalHere",",,,") ) /// A inheritance declaration is not permitted here - /// (Originally from ..\FSComp.txt:722) + /// (Originally from ..\FSComp.txt:723) static member tcInheritIllegalHere() = (890, GetStringFunc("tcInheritIllegalHere",",,,") ) /// This declaration opens the module '%s', which is marked as 'RequireQualifiedAccess'. Adjust your code to use qualified references to the elements of the module instead, e.g. 'List.map' instead of 'map'. This change will ensure that your code is robust as new constructs are added to libraries. - /// (Originally from ..\FSComp.txt:723) + /// (Originally from ..\FSComp.txt:724) static member tcModuleRequiresQualifiedAccess(a0 : System.String) = (892, GetStringFunc("tcModuleRequiresQualifiedAccess",",,,%s,,,") a0) /// This declaration opens the namespace or module '%s' through a partially qualified path. Adjust this code to use the full path of the namespace. This change will make your code more robust as new constructs are added to the F# and CLI libraries. - /// (Originally from ..\FSComp.txt:724) + /// (Originally from ..\FSComp.txt:725) static member tcOpenUsedWithPartiallyQualifiedPath(a0 : System.String) = (893, GetStringFunc("tcOpenUsedWithPartiallyQualifiedPath",",,,%s,,,") a0) /// Local class bindings cannot be marked inline. Consider lifting the definition out of the class or else do not mark it as inline. - /// (Originally from ..\FSComp.txt:725) + /// (Originally from ..\FSComp.txt:726) static member tcLocalClassBindingsCannotBeInline() = (894, GetStringFunc("tcLocalClassBindingsCannotBeInline",",,,") ) /// Type abbreviations cannot have members - /// (Originally from ..\FSComp.txt:726) + /// (Originally from ..\FSComp.txt:727) static member tcTypeAbbreviationsMayNotHaveMembers() = (895, GetStringFunc("tcTypeAbbreviationsMayNotHaveMembers",",,,") ) /// As of F# 4.1, the accessibility of type abbreviations is checked at compile-time. Consider changing the accessibility of the type abbreviation. Ignoring this warning might lead to runtime errors. - /// (Originally from ..\FSComp.txt:727) + /// (Originally from ..\FSComp.txt:728) static member tcTypeAbbreviationsCheckedAtCompileTime() = (GetStringFunc("tcTypeAbbreviationsCheckedAtCompileTime",",,,") ) /// Enumerations cannot have members - /// (Originally from ..\FSComp.txt:728) + /// (Originally from ..\FSComp.txt:729) static member tcEnumerationsMayNotHaveMembers() = (896, GetStringFunc("tcEnumerationsMayNotHaveMembers",",,,") ) /// Measure declarations may have only static members - /// (Originally from ..\FSComp.txt:729) + /// (Originally from ..\FSComp.txt:730) static member tcMeasureDeclarationsRequireStaticMembers() = (897, GetStringFunc("tcMeasureDeclarationsRequireStaticMembers",",,,") ) /// Structs cannot contain 'do' bindings because the default constructor for structs would not execute these bindings - /// (Originally from ..\FSComp.txt:730) + /// (Originally from ..\FSComp.txt:731) static member tcStructsMayNotContainDoBindings() = (GetStringFunc("tcStructsMayNotContainDoBindings",",,,") ) /// Structs cannot contain value definitions because the default constructor for structs will not execute these bindings. Consider adding additional arguments to the primary constructor for the type. - /// (Originally from ..\FSComp.txt:731) + /// (Originally from ..\FSComp.txt:732) static member tcStructsMayNotContainLetBindings() = (901, GetStringFunc("tcStructsMayNotContainLetBindings",",,,") ) /// Static value definitions may only be used in types with a primary constructor. Consider adding arguments to the type definition, e.g. 'type X(args) = ...'. - /// (Originally from ..\FSComp.txt:732) + /// (Originally from ..\FSComp.txt:733) static member tcStaticLetBindingsRequireClassesWithImplicitConstructors() = (902, GetStringFunc("tcStaticLetBindingsRequireClassesWithImplicitConstructors",",,,") ) /// Measure declarations may have only static members: constructors are not available - /// (Originally from ..\FSComp.txt:733) + /// (Originally from ..\FSComp.txt:734) static member tcMeasureDeclarationsRequireStaticMembersNotConstructors() = (904, GetStringFunc("tcMeasureDeclarationsRequireStaticMembersNotConstructors",",,,") ) /// A member and a local class binding both have the name '%s' - /// (Originally from ..\FSComp.txt:734) + /// (Originally from ..\FSComp.txt:735) static member tcMemberAndLocalClassBindingHaveSameName(a0 : System.String) = (905, GetStringFunc("tcMemberAndLocalClassBindingHaveSameName",",,,%s,,,") a0) /// Type abbreviations cannot have interface declarations - /// (Originally from ..\FSComp.txt:735) + /// (Originally from ..\FSComp.txt:736) static member tcTypeAbbreviationsCannotHaveInterfaceDeclaration() = (906, GetStringFunc("tcTypeAbbreviationsCannotHaveInterfaceDeclaration",",,,") ) /// Enumerations cannot have interface declarations - /// (Originally from ..\FSComp.txt:736) + /// (Originally from ..\FSComp.txt:737) static member tcEnumerationsCannotHaveInterfaceDeclaration() = (907, GetStringFunc("tcEnumerationsCannotHaveInterfaceDeclaration",",,,") ) /// This type is not an interface type - /// (Originally from ..\FSComp.txt:737) + /// (Originally from ..\FSComp.txt:738) static member tcTypeIsNotInterfaceType0() = (908, GetStringFunc("tcTypeIsNotInterfaceType0",",,,") ) /// All implemented interfaces should be declared on the initial declaration of the type - /// (Originally from ..\FSComp.txt:738) + /// (Originally from ..\FSComp.txt:739) static member tcAllImplementedInterfacesShouldBeDeclared() = (909, GetStringFunc("tcAllImplementedInterfacesShouldBeDeclared",",,,") ) /// A default implementation of this interface has already been added because the explicit implementation of the interface was not specified at the definition of the type - /// (Originally from ..\FSComp.txt:739) + /// (Originally from ..\FSComp.txt:740) static member tcDefaultImplementationForInterfaceHasAlreadyBeenAdded() = (910, GetStringFunc("tcDefaultImplementationForInterfaceHasAlreadyBeenAdded",",,,") ) /// This member is not permitted in an interface implementation - /// (Originally from ..\FSComp.txt:740) + /// (Originally from ..\FSComp.txt:741) static member tcMemberNotPermittedInInterfaceImplementation() = (911, GetStringFunc("tcMemberNotPermittedInInterfaceImplementation",",,,") ) /// This declaration element is not permitted in an augmentation - /// (Originally from ..\FSComp.txt:741) + /// (Originally from ..\FSComp.txt:742) static member tcDeclarationElementNotPermittedInAugmentation() = (912, GetStringFunc("tcDeclarationElementNotPermittedInAugmentation",",,,") ) /// Types cannot contain nested type definitions - /// (Originally from ..\FSComp.txt:742) + /// (Originally from ..\FSComp.txt:743) static member tcTypesCannotContainNestedTypes() = (913, GetStringFunc("tcTypesCannotContainNestedTypes",",,,") ) /// type, exception or module - /// (Originally from ..\FSComp.txt:743) + /// (Originally from ..\FSComp.txt:744) static member tcTypeExceptionOrModule() = (GetStringFunc("tcTypeExceptionOrModule",",,,") ) /// type or module - /// (Originally from ..\FSComp.txt:744) + /// (Originally from ..\FSComp.txt:745) static member tcTypeOrModule() = (GetStringFunc("tcTypeOrModule",",,,") ) /// The struct, record or union type '%s' implements the interface 'System.IStructuralEquatable' explicitly. Apply the 'CustomEquality' attribute to the type. - /// (Originally from ..\FSComp.txt:745) + /// (Originally from ..\FSComp.txt:746) static member tcImplementsIStructuralEquatableExplicitly(a0 : System.String) = (914, GetStringFunc("tcImplementsIStructuralEquatableExplicitly",",,,%s,,,") a0) /// The struct, record or union type '%s' implements the interface 'System.IEquatable<_>' explicitly. Apply the 'CustomEquality' attribute to the type and provide a consistent implementation of the non-generic override 'System.Object.Equals(obj)'. - /// (Originally from ..\FSComp.txt:746) + /// (Originally from ..\FSComp.txt:747) static member tcImplementsIEquatableExplicitly(a0 : System.String) = (915, GetStringFunc("tcImplementsIEquatableExplicitly",",,,%s,,,") a0) /// Explicit type specifications cannot be used for exception constructors - /// (Originally from ..\FSComp.txt:747) + /// (Originally from ..\FSComp.txt:748) static member tcExplicitTypeSpecificationCannotBeUsedForExceptionConstructors() = (916, GetStringFunc("tcExplicitTypeSpecificationCannotBeUsedForExceptionConstructors",",,,") ) /// Exception abbreviations should not have argument lists - /// (Originally from ..\FSComp.txt:748) + /// (Originally from ..\FSComp.txt:749) static member tcExceptionAbbreviationsShouldNotHaveArgumentList() = (917, GetStringFunc("tcExceptionAbbreviationsShouldNotHaveArgumentList",",,,") ) /// Abbreviations for Common IL exceptions cannot take arguments - /// (Originally from ..\FSComp.txt:749) + /// (Originally from ..\FSComp.txt:750) static member tcAbbreviationsFordotNetExceptionsCannotTakeArguments() = (918, GetStringFunc("tcAbbreviationsFordotNetExceptionsCannotTakeArguments",",,,") ) /// Exception abbreviations must refer to existing exceptions or F# types deriving from System.Exception - /// (Originally from ..\FSComp.txt:750) + /// (Originally from ..\FSComp.txt:751) static member tcExceptionAbbreviationsMustReferToValidExceptions() = (919, GetStringFunc("tcExceptionAbbreviationsMustReferToValidExceptions",",,,") ) /// Abbreviations for Common IL exception types must have a matching object constructor - /// (Originally from ..\FSComp.txt:751) + /// (Originally from ..\FSComp.txt:752) static member tcAbbreviationsFordotNetExceptionsMustHaveMatchingObjectConstructor() = (920, GetStringFunc("tcAbbreviationsFordotNetExceptionsMustHaveMatchingObjectConstructor",",,,") ) /// Not an exception - /// (Originally from ..\FSComp.txt:752) + /// (Originally from ..\FSComp.txt:753) static member tcNotAnException() = (921, GetStringFunc("tcNotAnException",",,,") ) /// Invalid module name - /// (Originally from ..\FSComp.txt:754) + /// (Originally from ..\FSComp.txt:755) static member tcInvalidModuleName() = (924, GetStringFunc("tcInvalidModuleName",",,,") ) /// Invalid type extension - /// (Originally from ..\FSComp.txt:755) + /// (Originally from ..\FSComp.txt:756) static member tcInvalidTypeExtension() = (925, GetStringFunc("tcInvalidTypeExtension",",,,") ) /// The attributes of this type specify multiple kinds for the type - /// (Originally from ..\FSComp.txt:756) + /// (Originally from ..\FSComp.txt:757) static member tcAttributesOfTypeSpecifyMultipleKindsForType() = (926, GetStringFunc("tcAttributesOfTypeSpecifyMultipleKindsForType",",,,") ) /// The kind of the type specified by its attributes does not match the kind implied by its definition - /// (Originally from ..\FSComp.txt:757) + /// (Originally from ..\FSComp.txt:758) static member tcKindOfTypeSpecifiedDoesNotMatchDefinition() = (927, GetStringFunc("tcKindOfTypeSpecifiedDoesNotMatchDefinition",",,,") ) /// Measure definitions cannot have type parameters - /// (Originally from ..\FSComp.txt:758) + /// (Originally from ..\FSComp.txt:759) static member tcMeasureDefinitionsCannotHaveTypeParameters() = (928, GetStringFunc("tcMeasureDefinitionsCannotHaveTypeParameters",",,,") ) /// This type requires a definition - /// (Originally from ..\FSComp.txt:759) + /// (Originally from ..\FSComp.txt:760) static member tcTypeRequiresDefinition() = (929, GetStringFunc("tcTypeRequiresDefinition",",,,") ) /// This type abbreviation has one or more declared type parameters that do not appear in the type being abbreviated. Type abbreviations must use all declared type parameters in the type being abbreviated. Consider removing one or more type parameters, or use a concrete type definition that wraps an underlying type, such as 'type C<'a> = C of ...'. - /// (Originally from ..\FSComp.txt:760) + /// (Originally from ..\FSComp.txt:761) static member tcTypeAbbreviationHasTypeParametersMissingOnType() = (GetStringFunc("tcTypeAbbreviationHasTypeParametersMissingOnType",",,,") ) /// Structs, interfaces, enums and delegates cannot inherit from other types - /// (Originally from ..\FSComp.txt:761) + /// (Originally from ..\FSComp.txt:762) static member tcStructsInterfacesEnumsDelegatesMayNotInheritFromOtherTypes() = (931, GetStringFunc("tcStructsInterfacesEnumsDelegatesMayNotInheritFromOtherTypes",",,,") ) /// Types cannot inherit from multiple concrete types - /// (Originally from ..\FSComp.txt:762) + /// (Originally from ..\FSComp.txt:763) static member tcTypesCannotInheritFromMultipleConcreteTypes() = (932, GetStringFunc("tcTypesCannotInheritFromMultipleConcreteTypes",",,,") ) /// Records, union, abbreviations and struct types cannot have the 'AllowNullLiteral' attribute - /// (Originally from ..\FSComp.txt:763) + /// (Originally from ..\FSComp.txt:764) static member tcRecordsUnionsAbbreviationsStructsMayNotHaveAllowNullLiteralAttribute() = (934, GetStringFunc("tcRecordsUnionsAbbreviationsStructsMayNotHaveAllowNullLiteralAttribute",",,,") ) /// Types with the 'AllowNullLiteral' attribute may only inherit from or implement types which also allow the use of the null literal - /// (Originally from ..\FSComp.txt:764) + /// (Originally from ..\FSComp.txt:765) static member tcAllowNullTypesMayOnlyInheritFromAllowNullTypes() = (935, GetStringFunc("tcAllowNullTypesMayOnlyInheritFromAllowNullTypes",",,,") ) /// Generic types cannot be given the 'StructLayout' attribute - /// (Originally from ..\FSComp.txt:765) + /// (Originally from ..\FSComp.txt:766) static member tcGenericTypesCannotHaveStructLayout() = (936, GetStringFunc("tcGenericTypesCannotHaveStructLayout",",,,") ) /// Only structs and classes without primary constructors may be given the 'StructLayout' attribute - /// (Originally from ..\FSComp.txt:766) + /// (Originally from ..\FSComp.txt:767) static member tcOnlyStructsCanHaveStructLayout() = (937, GetStringFunc("tcOnlyStructsCanHaveStructLayout",",,,") ) /// The representation of this type is hidden by the signature. It must be given an attribute such as [], [] or [] to indicate the characteristics of the type. - /// (Originally from ..\FSComp.txt:767) + /// (Originally from ..\FSComp.txt:768) static member tcRepresentationOfTypeHiddenBySignature() = (938, GetStringFunc("tcRepresentationOfTypeHiddenBySignature",",,,") ) /// Only classes may be given the 'AbstractClass' attribute - /// (Originally from ..\FSComp.txt:768) + /// (Originally from ..\FSComp.txt:769) static member tcOnlyClassesCanHaveAbstract() = (939, GetStringFunc("tcOnlyClassesCanHaveAbstract",",,,") ) /// Only types representing units-of-measure may be given the 'Measure' attribute - /// (Originally from ..\FSComp.txt:769) + /// (Originally from ..\FSComp.txt:770) static member tcOnlyTypesRepresentingUnitsOfMeasureCanHaveMeasure() = (940, GetStringFunc("tcOnlyTypesRepresentingUnitsOfMeasureCanHaveMeasure",",,,") ) /// Accessibility modifiers are not permitted on overrides or interface implementations - /// (Originally from ..\FSComp.txt:770) + /// (Originally from ..\FSComp.txt:771) static member tcOverridesCannotHaveVisibilityDeclarations() = (941, GetStringFunc("tcOverridesCannotHaveVisibilityDeclarations",",,,") ) /// Discriminated union types are always sealed - /// (Originally from ..\FSComp.txt:771) + /// (Originally from ..\FSComp.txt:772) static member tcTypesAreAlwaysSealedDU() = (942, GetStringFunc("tcTypesAreAlwaysSealedDU",",,,") ) /// Record types are always sealed - /// (Originally from ..\FSComp.txt:772) + /// (Originally from ..\FSComp.txt:773) static member tcTypesAreAlwaysSealedRecord() = (942, GetStringFunc("tcTypesAreAlwaysSealedRecord",",,,") ) /// Assembly code types are always sealed - /// (Originally from ..\FSComp.txt:773) + /// (Originally from ..\FSComp.txt:774) static member tcTypesAreAlwaysSealedAssemblyCode() = (942, GetStringFunc("tcTypesAreAlwaysSealedAssemblyCode",",,,") ) /// Struct types are always sealed - /// (Originally from ..\FSComp.txt:774) + /// (Originally from ..\FSComp.txt:775) static member tcTypesAreAlwaysSealedStruct() = (942, GetStringFunc("tcTypesAreAlwaysSealedStruct",",,,") ) /// Delegate types are always sealed - /// (Originally from ..\FSComp.txt:775) + /// (Originally from ..\FSComp.txt:776) static member tcTypesAreAlwaysSealedDelegate() = (942, GetStringFunc("tcTypesAreAlwaysSealedDelegate",",,,") ) /// Enum types are always sealed - /// (Originally from ..\FSComp.txt:776) + /// (Originally from ..\FSComp.txt:777) static member tcTypesAreAlwaysSealedEnum() = (942, GetStringFunc("tcTypesAreAlwaysSealedEnum",",,,") ) /// Interface types and delegate types cannot contain fields - /// (Originally from ..\FSComp.txt:777) + /// (Originally from ..\FSComp.txt:778) static member tcInterfaceTypesAndDelegatesCannotContainFields() = (943, GetStringFunc("tcInterfaceTypesAndDelegatesCannotContainFields",",,,") ) /// Abbreviated types cannot be given the 'Sealed' attribute - /// (Originally from ..\FSComp.txt:778) + /// (Originally from ..\FSComp.txt:779) static member tcAbbreviatedTypesCannotBeSealed() = (944, GetStringFunc("tcAbbreviatedTypesCannotBeSealed",",,,") ) /// Cannot inherit a sealed type - /// (Originally from ..\FSComp.txt:779) + /// (Originally from ..\FSComp.txt:780) static member tcCannotInheritFromSealedType() = (945, GetStringFunc("tcCannotInheritFromSealedType",",,,") ) /// Cannot inherit from interface type. Use interface ... with instead. - /// (Originally from ..\FSComp.txt:780) + /// (Originally from ..\FSComp.txt:781) static member tcCannotInheritFromInterfaceType() = (946, GetStringFunc("tcCannotInheritFromInterfaceType",",,,") ) /// Struct types cannot contain abstract members - /// (Originally from ..\FSComp.txt:781) + /// (Originally from ..\FSComp.txt:782) static member tcStructTypesCannotContainAbstractMembers() = (947, GetStringFunc("tcStructTypesCannotContainAbstractMembers",",,,") ) /// Interface types cannot be sealed - /// (Originally from ..\FSComp.txt:782) + /// (Originally from ..\FSComp.txt:783) static member tcInterfaceTypesCannotBeSealed() = (948, GetStringFunc("tcInterfaceTypesCannotBeSealed",",,,") ) /// Delegate specifications must be of the form 'typ -> typ' - /// (Originally from ..\FSComp.txt:783) + /// (Originally from ..\FSComp.txt:784) static member tcInvalidDelegateSpecification() = (949, GetStringFunc("tcInvalidDelegateSpecification",",,,") ) /// Delegate specifications must not be curried types. Use 'typ * ... * typ -> typ' for multi-argument delegates, and 'typ -> (typ -> typ)' for delegates returning function values. - /// (Originally from ..\FSComp.txt:784) + /// (Originally from ..\FSComp.txt:785) static member tcDelegatesCannotBeCurried() = (950, GetStringFunc("tcDelegatesCannotBeCurried",",,,") ) /// Literal enumerations must have type int, uint, int16, uint16, int64, uint64, byte, sbyte or char - /// (Originally from ..\FSComp.txt:785) + /// (Originally from ..\FSComp.txt:786) static member tcInvalidTypeForLiteralEnumeration() = (951, GetStringFunc("tcInvalidTypeForLiteralEnumeration",",,,") ) /// This type definition involves an immediate cyclic reference through an abbreviation - /// (Originally from ..\FSComp.txt:787) + /// (Originally from ..\FSComp.txt:788) static member tcTypeDefinitionIsCyclic() = (953, GetStringFunc("tcTypeDefinitionIsCyclic",",,,") ) /// This type definition involves an immediate cyclic reference through a struct field or inheritance relation - /// (Originally from ..\FSComp.txt:788) + /// (Originally from ..\FSComp.txt:789) static member tcTypeDefinitionIsCyclicThroughInheritance() = (954, GetStringFunc("tcTypeDefinitionIsCyclicThroughInheritance",",,,") ) /// The syntax 'type X with ...' is reserved for augmentations. Types whose representations are hidden but which have members are now declared in signatures using 'type X = ...'. You may also need to add the '[] attribute to the type definition in the signature - /// (Originally from ..\FSComp.txt:789) + /// (Originally from ..\FSComp.txt:790) static member tcReservedSyntaxForAugmentation() = (GetStringFunc("tcReservedSyntaxForAugmentation",",,,") ) /// Members that extend interface, delegate or enum types must be placed in a module separate to the definition of the type. This module must either have the AutoOpen attribute or be opened explicitly by client code to bring the extension members into scope. - /// (Originally from ..\FSComp.txt:790) + /// (Originally from ..\FSComp.txt:791) static member tcMembersThatExtendInterfaceMustBePlacedInSeparateModule() = (956, GetStringFunc("tcMembersThatExtendInterfaceMustBePlacedInSeparateModule",",,,") ) /// One or more of the declared type parameters for this type extension have a missing or wrong type constraint not matching the original type constraints on '%s' - /// (Originally from ..\FSComp.txt:791) + /// (Originally from ..\FSComp.txt:792) static member tcDeclaredTypeParametersForExtensionDoNotMatchOriginal(a0 : System.String) = (957, GetStringFunc("tcDeclaredTypeParametersForExtensionDoNotMatchOriginal",",,,%s,,,") a0) /// Type definitions may only have one 'inherit' specification and it must be the first declaration - /// (Originally from ..\FSComp.txt:792) + /// (Originally from ..\FSComp.txt:793) static member tcTypeDefinitionsWithImplicitConstructionMustHaveOneInherit() = (959, GetStringFunc("tcTypeDefinitionsWithImplicitConstructionMustHaveOneInherit",",,,") ) /// 'let' and 'do' bindings must come before member and interface definitions in type definitions - /// (Originally from ..\FSComp.txt:793) + /// (Originally from ..\FSComp.txt:794) static member tcTypeDefinitionsWithImplicitConstructionMustHaveLocalBindingsBeforeMembers() = (960, GetStringFunc("tcTypeDefinitionsWithImplicitConstructionMustHaveLocalBindingsBeforeMembers",",,,") ) /// This 'inherit' declaration specifies the inherited type but no arguments. Consider supplying arguments, e.g. 'inherit BaseType(args)'. - /// (Originally from ..\FSComp.txt:794) + /// (Originally from ..\FSComp.txt:795) static member tcInheritDeclarationMissingArguments() = (961, GetStringFunc("tcInheritDeclarationMissingArguments",",,,") ) /// This 'inherit' declaration has arguments, but is not in a type with a primary constructor. Consider adding arguments to your type definition, e.g. 'type X(args) = ...'. - /// (Originally from ..\FSComp.txt:795) + /// (Originally from ..\FSComp.txt:796) static member tcInheritConstructionCallNotPartOfImplicitSequence() = (962, GetStringFunc("tcInheritConstructionCallNotPartOfImplicitSequence",",,,") ) /// This definition may only be used in a type with a primary constructor. Consider adding arguments to your type definition, e.g. 'type X(args) = ...'. - /// (Originally from ..\FSComp.txt:796) + /// (Originally from ..\FSComp.txt:797) static member tcLetAndDoRequiresImplicitConstructionSequence() = (963, GetStringFunc("tcLetAndDoRequiresImplicitConstructionSequence",",,,") ) /// Type abbreviations cannot have augmentations - /// (Originally from ..\FSComp.txt:797) + /// (Originally from ..\FSComp.txt:798) static member tcTypeAbbreviationsCannotHaveAugmentations() = (964, GetStringFunc("tcTypeAbbreviationsCannotHaveAugmentations",",,,") ) /// The path '%s' is a namespace. A module abbreviation may not abbreviate a namespace. - /// (Originally from ..\FSComp.txt:798) + /// (Originally from ..\FSComp.txt:799) static member tcModuleAbbreviationForNamespace(a0 : System.String) = (965, GetStringFunc("tcModuleAbbreviationForNamespace",",,,%s,,,") a0) /// The type '%s' is used in an invalid way. A value prior to '%s' has an inferred type involving '%s', which is an invalid forward reference. - /// (Originally from ..\FSComp.txt:799) + /// (Originally from ..\FSComp.txt:800) static member tcTypeUsedInInvalidWay(a0 : System.String, a1 : System.String, a2 : System.String) = (966, GetStringFunc("tcTypeUsedInInvalidWay",",,,%s,,,%s,,,%s,,,") a0 a1 a2) /// The member '%s' is used in an invalid way. A use of '%s' has been inferred prior to the definition of '%s', which is an invalid forward reference. - /// (Originally from ..\FSComp.txt:800) + /// (Originally from ..\FSComp.txt:801) static member tcMemberUsedInInvalidWay(a0 : System.String, a1 : System.String, a2 : System.String) = (967, GetStringFunc("tcMemberUsedInInvalidWay",",,,%s,,,%s,,,%s,,,") a0 a1 a2) /// The attribute 'AutoOpen(\"%s\")' in the assembly '%s' did not refer to a valid module or namespace in that assembly and has been ignored - /// (Originally from ..\FSComp.txt:803) + /// (Originally from ..\FSComp.txt:804) static member tcAttributeAutoOpenWasIgnored(a0 : System.String, a1 : System.String) = (970, GetStringFunc("tcAttributeAutoOpenWasIgnored",",,,%s,,,%s,,,") a0 a1) /// Undefined value '%s' - /// (Originally from ..\FSComp.txt:804) + /// (Originally from ..\FSComp.txt:805) static member ilUndefinedValue(a0 : System.String) = (971, GetStringFunc("ilUndefinedValue",",,,%s,,,") a0) /// Label %s not found - /// (Originally from ..\FSComp.txt:805) + /// (Originally from ..\FSComp.txt:806) static member ilLabelNotFound(a0 : System.String) = (972, GetStringFunc("ilLabelNotFound",",,,%s,,,") a0) /// Incorrect number of type arguments to local call - /// (Originally from ..\FSComp.txt:806) + /// (Originally from ..\FSComp.txt:807) static member ilIncorrectNumberOfTypeArguments() = (973, GetStringFunc("ilIncorrectNumberOfTypeArguments",",,,") ) /// Dynamic invocation of %s is not supported - /// (Originally from ..\FSComp.txt:807) + /// (Originally from ..\FSComp.txt:808) static member ilDynamicInvocationNotSupported(a0 : System.String) = (GetStringFunc("ilDynamicInvocationNotSupported",",,,%s,,,") a0) /// Taking the address of a literal field is invalid - /// (Originally from ..\FSComp.txt:808) + /// (Originally from ..\FSComp.txt:809) static member ilAddressOfLiteralFieldIsInvalid() = (975, GetStringFunc("ilAddressOfLiteralFieldIsInvalid",",,,") ) /// This operation involves taking the address of a value '%s' represented using a local variable or other special representation. This is invalid. - /// (Originally from ..\FSComp.txt:809) + /// (Originally from ..\FSComp.txt:810) static member ilAddressOfValueHereIsInvalid(a0 : System.String) = (976, GetStringFunc("ilAddressOfValueHereIsInvalid",",,,%s,,,") a0) /// Custom marshallers cannot be specified in F# code. Consider using a C# helper function. - /// (Originally from ..\FSComp.txt:810) + /// (Originally from ..\FSComp.txt:811) static member ilCustomMarshallersCannotBeUsedInFSharp() = (980, GetStringFunc("ilCustomMarshallersCannotBeUsedInFSharp",",,,") ) /// The MarshalAs attribute could not be decoded - /// (Originally from ..\FSComp.txt:811) + /// (Originally from ..\FSComp.txt:812) static member ilMarshalAsAttributeCannotBeDecoded() = (981, GetStringFunc("ilMarshalAsAttributeCannotBeDecoded",",,,") ) /// The signature for this external function contains type parameters. Constrain the argument and return types to indicate the types of the corresponding C function. - /// (Originally from ..\FSComp.txt:812) + /// (Originally from ..\FSComp.txt:813) static member ilSignatureForExternalFunctionContainsTypeParameters() = (982, GetStringFunc("ilSignatureForExternalFunctionContainsTypeParameters",",,,") ) /// The DllImport attribute could not be decoded - /// (Originally from ..\FSComp.txt:813) + /// (Originally from ..\FSComp.txt:814) static member ilDllImportAttributeCouldNotBeDecoded() = (983, GetStringFunc("ilDllImportAttributeCouldNotBeDecoded",",,,") ) /// Literal fields cannot be set - /// (Originally from ..\FSComp.txt:814) + /// (Originally from ..\FSComp.txt:815) static member ilLiteralFieldsCannotBeSet() = (984, GetStringFunc("ilLiteralFieldsCannotBeSet",",,,") ) /// GenSetStorage: %s was represented as a static method but was not an appropriate lambda expression - /// (Originally from ..\FSComp.txt:815) + /// (Originally from ..\FSComp.txt:816) static member ilStaticMethodIsNotLambda(a0 : System.String) = (985, GetStringFunc("ilStaticMethodIsNotLambda",",,,%s,,,") a0) /// Mutable variables cannot escape their method - /// (Originally from ..\FSComp.txt:816) + /// (Originally from ..\FSComp.txt:817) static member ilMutableVariablesCannotEscapeMethod() = (986, GetStringFunc("ilMutableVariablesCannotEscapeMethod",",,,") ) /// Compiler error: unexpected unrealized value - /// (Originally from ..\FSComp.txt:817) + /// (Originally from ..\FSComp.txt:818) static member ilUnexpectedUnrealizedValue() = (987, GetStringFunc("ilUnexpectedUnrealizedValue",",,,") ) /// Main module of program is empty: nothing will happen when it is run - /// (Originally from ..\FSComp.txt:818) + /// (Originally from ..\FSComp.txt:819) static member ilMainModuleEmpty() = (988, GetStringFunc("ilMainModuleEmpty",",,,") ) /// This type cannot be used for a literal field - /// (Originally from ..\FSComp.txt:819) + /// (Originally from ..\FSComp.txt:820) static member ilTypeCannotBeUsedForLiteralField() = (989, GetStringFunc("ilTypeCannotBeUsedForLiteralField",",,,") ) /// Unexpected GetSet annotation on a property - /// (Originally from ..\FSComp.txt:820) + /// (Originally from ..\FSComp.txt:821) static member ilUnexpectedGetSetAnnotation() = (990, GetStringFunc("ilUnexpectedGetSetAnnotation",",,,") ) /// The FieldOffset attribute could not be decoded - /// (Originally from ..\FSComp.txt:821) + /// (Originally from ..\FSComp.txt:822) static member ilFieldOffsetAttributeCouldNotBeDecoded() = (991, GetStringFunc("ilFieldOffsetAttributeCouldNotBeDecoded",",,,") ) /// The StructLayout attribute could not be decoded - /// (Originally from ..\FSComp.txt:822) + /// (Originally from ..\FSComp.txt:823) static member ilStructLayoutAttributeCouldNotBeDecoded() = (992, GetStringFunc("ilStructLayoutAttributeCouldNotBeDecoded",",,,") ) /// The DefaultAugmentation attribute could not be decoded - /// (Originally from ..\FSComp.txt:823) + /// (Originally from ..\FSComp.txt:824) static member ilDefaultAugmentationAttributeCouldNotBeDecoded() = (993, GetStringFunc("ilDefaultAugmentationAttributeCouldNotBeDecoded",",,,") ) /// Reflected definitions cannot contain uses of the prefix splice operator '%%' - /// (Originally from ..\FSComp.txt:824) + /// (Originally from ..\FSComp.txt:825) static member ilReflectedDefinitionsCannotUseSliceOperator() = (994, GetStringFunc("ilReflectedDefinitionsCannotUseSliceOperator",",,,") ) /// Problem with codepage '%d': %s - /// (Originally from ..\FSComp.txt:825) + /// (Originally from ..\FSComp.txt:826) static member optsProblemWithCodepage(a0 : System.Int32, a1 : System.String) = (1000, GetStringFunc("optsProblemWithCodepage",",,,%d,,,%s,,,") a0 a1) /// Copyright (c) Microsoft Corporation. All Rights Reserved. - /// (Originally from ..\FSComp.txt:826) + /// (Originally from ..\FSComp.txt:827) static member optsCopyright() = (GetStringFunc("optsCopyright",",,,") ) /// Freely distributed under the MIT Open Source License. https://github.com/Microsoft/visualfsharp/blob/master/License.txt - /// (Originally from ..\FSComp.txt:827) + /// (Originally from ..\FSComp.txt:828) static member optsCopyrightCommunity() = (GetStringFunc("optsCopyrightCommunity",",,,") ) /// Name of the output file (Short form: -o) - /// (Originally from ..\FSComp.txt:828) + /// (Originally from ..\FSComp.txt:829) static member optsNameOfOutputFile() = (GetStringFunc("optsNameOfOutputFile",",,,") ) /// Build a console executable - /// (Originally from ..\FSComp.txt:829) + /// (Originally from ..\FSComp.txt:830) static member optsBuildConsole() = (GetStringFunc("optsBuildConsole",",,,") ) /// Build a Windows executable - /// (Originally from ..\FSComp.txt:830) + /// (Originally from ..\FSComp.txt:831) static member optsBuildWindows() = (GetStringFunc("optsBuildWindows",",,,") ) /// Build a library (Short form: -a) - /// (Originally from ..\FSComp.txt:831) + /// (Originally from ..\FSComp.txt:832) static member optsBuildLibrary() = (GetStringFunc("optsBuildLibrary",",,,") ) /// Build a module that can be added to another assembly - /// (Originally from ..\FSComp.txt:832) + /// (Originally from ..\FSComp.txt:833) static member optsBuildModule() = (GetStringFunc("optsBuildModule",",,,") ) /// Delay-sign the assembly using only the public portion of the strong name key - /// (Originally from ..\FSComp.txt:833) + /// (Originally from ..\FSComp.txt:834) static member optsDelaySign() = (GetStringFunc("optsDelaySign",",,,") ) /// Public-sign the assembly using only the public portion of the strong name key, and mark the assembly as signed - /// (Originally from ..\FSComp.txt:834) + /// (Originally from ..\FSComp.txt:835) static member optsPublicSign() = (GetStringFunc("optsPublicSign",",,,") ) /// Write the xmldoc of the assembly to the given file - /// (Originally from ..\FSComp.txt:835) + /// (Originally from ..\FSComp.txt:836) static member optsWriteXml() = (GetStringFunc("optsWriteXml",",,,") ) /// Specify a strong name key file - /// (Originally from ..\FSComp.txt:836) + /// (Originally from ..\FSComp.txt:837) static member optsStrongKeyFile() = (GetStringFunc("optsStrongKeyFile",",,,") ) /// Specify a strong name key container - /// (Originally from ..\FSComp.txt:837) + /// (Originally from ..\FSComp.txt:838) static member optsStrongKeyContainer() = (GetStringFunc("optsStrongKeyContainer",",,,") ) /// Limit which platforms this code can run on: x86, Itanium, x64, anycpu32bitpreferred, or anycpu. The default is anycpu. - /// (Originally from ..\FSComp.txt:838) + /// (Originally from ..\FSComp.txt:839) static member optsPlatform() = (GetStringFunc("optsPlatform",",,,") ) /// Only include optimization information essential for implementing inlined constructs. Inhibits cross-module inlining but improves binary compatibility. - /// (Originally from ..\FSComp.txt:839) + /// (Originally from ..\FSComp.txt:840) static member optsNoOpt() = (GetStringFunc("optsNoOpt",",,,") ) /// Don't add a resource to the generated assembly containing F#-specific metadata - /// (Originally from ..\FSComp.txt:840) + /// (Originally from ..\FSComp.txt:841) static member optsNoInterface() = (GetStringFunc("optsNoInterface",",,,") ) /// Print the inferred interface of the assembly to a file - /// (Originally from ..\FSComp.txt:841) + /// (Originally from ..\FSComp.txt:842) static member optsSig() = (GetStringFunc("optsSig",",,,") ) /// Reference an assembly (Short form: -r) - /// (Originally from ..\FSComp.txt:842) + /// (Originally from ..\FSComp.txt:843) static member optsReference() = (GetStringFunc("optsReference",",,,") ) /// Specify a Win32 resource file (.res) - /// (Originally from ..\FSComp.txt:843) + /// (Originally from ..\FSComp.txt:844) static member optsWin32res() = (GetStringFunc("optsWin32res",",,,") ) /// Specify a Win32 manifest file - /// (Originally from ..\FSComp.txt:844) + /// (Originally from ..\FSComp.txt:845) static member optsWin32manifest() = (GetStringFunc("optsWin32manifest",",,,") ) /// Do not include the default Win32 manifest - /// (Originally from ..\FSComp.txt:845) + /// (Originally from ..\FSComp.txt:846) static member optsNowin32manifest() = (GetStringFunc("optsNowin32manifest",",,,") ) /// Embed all source files in the portable PDB file - /// (Originally from ..\FSComp.txt:846) + /// (Originally from ..\FSComp.txt:847) static member optsEmbedAllSource() = (GetStringFunc("optsEmbedAllSource",",,,") ) /// Embed specific source files in the portable PDB file - /// (Originally from ..\FSComp.txt:847) + /// (Originally from ..\FSComp.txt:848) static member optsEmbedSource() = (GetStringFunc("optsEmbedSource",",,,") ) /// Source link information file to embed in the portable PDB file - /// (Originally from ..\FSComp.txt:848) + /// (Originally from ..\FSComp.txt:849) static member optsSourceLink() = (GetStringFunc("optsSourceLink",",,,") ) /// --embed switch only supported when emitting a Portable PDB (--debug:portable or --debug:embedded) - /// (Originally from ..\FSComp.txt:849) + /// (Originally from ..\FSComp.txt:850) static member optsEmbeddedSourceRequirePortablePDBs() = (1501, GetStringFunc("optsEmbeddedSourceRequirePortablePDBs",",,,") ) /// --sourcelink switch only supported when emitting a Portable PDB (--debug:portable or --debug:embedded) - /// (Originally from ..\FSComp.txt:850) + /// (Originally from ..\FSComp.txt:851) static member optsSourceLinkRequirePortablePDBs() = (1502, GetStringFunc("optsSourceLinkRequirePortablePDBs",",,,") ) /// Source file is too large to embed in a portable PDB - /// (Originally from ..\FSComp.txt:851) + /// (Originally from ..\FSComp.txt:852) static member srcFileTooLarge() = (GetStringFunc("srcFileTooLarge",",,,") ) /// Embed the specified managed resource - /// (Originally from ..\FSComp.txt:852) + /// (Originally from ..\FSComp.txt:853) static member optsResource() = (GetStringFunc("optsResource",",,,") ) /// Link the specified resource to this assembly where the resinfo format is [,[,public|private]] - /// (Originally from ..\FSComp.txt:853) + /// (Originally from ..\FSComp.txt:854) static member optsLinkresource() = (GetStringFunc("optsLinkresource",",,,") ) /// Emit debug information (Short form: -g) - /// (Originally from ..\FSComp.txt:854) + /// (Originally from ..\FSComp.txt:855) static member optsDebugPM() = (GetStringFunc("optsDebugPM",",,,") ) /// Specify debugging type: full, portable, embedded, pdbonly. ('%s' is the default if no debuggging type specified and enables attaching a debugger to a running program, 'portable' is a cross-platform format, 'embedded' is a cross-platform format embedded into the output file). - /// (Originally from ..\FSComp.txt:855) + /// (Originally from ..\FSComp.txt:856) static member optsDebug(a0 : System.String) = (GetStringFunc("optsDebug",",,,%s,,,") a0) /// Enable optimizations (Short form: -O) - /// (Originally from ..\FSComp.txt:856) + /// (Originally from ..\FSComp.txt:857) static member optsOptimize() = (GetStringFunc("optsOptimize",",,,") ) /// Enable or disable tailcalls - /// (Originally from ..\FSComp.txt:857) + /// (Originally from ..\FSComp.txt:858) static member optsTailcalls() = (GetStringFunc("optsTailcalls",",,,") ) /// Produce a deterministic assembly (including module version GUID and timestamp) - /// (Originally from ..\FSComp.txt:858) + /// (Originally from ..\FSComp.txt:859) static member optsDeterministic() = (GetStringFunc("optsDeterministic",",,,") ) /// Enable or disable cross-module optimizations - /// (Originally from ..\FSComp.txt:859) + /// (Originally from ..\FSComp.txt:860) static member optsCrossoptimize() = (GetStringFunc("optsCrossoptimize",",,,") ) /// Report all warnings as errors - /// (Originally from ..\FSComp.txt:860) + /// (Originally from ..\FSComp.txt:861) static member optsWarnaserrorPM() = (GetStringFunc("optsWarnaserrorPM",",,,") ) /// Report specific warnings as errors - /// (Originally from ..\FSComp.txt:861) + /// (Originally from ..\FSComp.txt:862) static member optsWarnaserror() = (GetStringFunc("optsWarnaserror",",,,") ) /// Set a warning level (0-5) - /// (Originally from ..\FSComp.txt:862) + /// (Originally from ..\FSComp.txt:863) static member optsWarn() = (GetStringFunc("optsWarn",",,,") ) /// Disable specific warning messages - /// (Originally from ..\FSComp.txt:863) + /// (Originally from ..\FSComp.txt:864) static member optsNowarn() = (GetStringFunc("optsNowarn",",,,") ) /// Enable specific warnings that may be off by default - /// (Originally from ..\FSComp.txt:864) + /// (Originally from ..\FSComp.txt:865) static member optsWarnOn() = (GetStringFunc("optsWarnOn",",,,") ) /// Generate overflow checks - /// (Originally from ..\FSComp.txt:865) + /// (Originally from ..\FSComp.txt:866) static member optsChecked() = (GetStringFunc("optsChecked",",,,") ) /// Define conditional compilation symbols (Short form: -d) - /// (Originally from ..\FSComp.txt:866) + /// (Originally from ..\FSComp.txt:867) static member optsDefine() = (GetStringFunc("optsDefine",",,,") ) /// Ignore ML compatibility warnings - /// (Originally from ..\FSComp.txt:867) + /// (Originally from ..\FSComp.txt:868) static member optsMlcompatibility() = (GetStringFunc("optsMlcompatibility",",,,") ) /// Suppress compiler copyright message - /// (Originally from ..\FSComp.txt:868) + /// (Originally from ..\FSComp.txt:869) static member optsNologo() = (GetStringFunc("optsNologo",",,,") ) /// Display this usage message (Short form: -?) - /// (Originally from ..\FSComp.txt:869) + /// (Originally from ..\FSComp.txt:870) static member optsHelp() = (GetStringFunc("optsHelp",",,,") ) /// Read response file for more options - /// (Originally from ..\FSComp.txt:870) + /// (Originally from ..\FSComp.txt:871) static member optsResponseFile() = (GetStringFunc("optsResponseFile",",,,") ) /// Specify the codepage used to read source files - /// (Originally from ..\FSComp.txt:871) + /// (Originally from ..\FSComp.txt:872) static member optsCodepage() = (GetStringFunc("optsCodepage",",,,") ) /// Output messages in UTF-8 encoding - /// (Originally from ..\FSComp.txt:872) + /// (Originally from ..\FSComp.txt:873) static member optsUtf8output() = (GetStringFunc("optsUtf8output",",,,") ) /// Output messages with fully qualified paths - /// (Originally from ..\FSComp.txt:873) + /// (Originally from ..\FSComp.txt:874) static member optsFullpaths() = (GetStringFunc("optsFullpaths",",,,") ) /// Specify a directory for the include path which is used to resolve source files and assemblies (Short form: -I) - /// (Originally from ..\FSComp.txt:874) + /// (Originally from ..\FSComp.txt:875) static member optsLib() = (GetStringFunc("optsLib",",,,") ) /// Base address for the library to be built - /// (Originally from ..\FSComp.txt:875) + /// (Originally from ..\FSComp.txt:876) static member optsBaseaddress() = (GetStringFunc("optsBaseaddress",",,,") ) /// Do not reference the default CLI assemblies by default - /// (Originally from ..\FSComp.txt:876) + /// (Originally from ..\FSComp.txt:877) static member optsNoframework() = (GetStringFunc("optsNoframework",",,,") ) /// Statically link the F# library and all referenced DLLs that depend on it into the assembly being generated - /// (Originally from ..\FSComp.txt:877) + /// (Originally from ..\FSComp.txt:878) static member optsStandalone() = (GetStringFunc("optsStandalone",",,,") ) /// Statically link the given assembly and all referenced DLLs that depend on this assembly. Use an assembly name e.g. mylib, not a DLL name. - /// (Originally from ..\FSComp.txt:878) + /// (Originally from ..\FSComp.txt:879) static member optsStaticlink() = (GetStringFunc("optsStaticlink",",,,") ) /// Use a resident background compilation service to improve compiler startup times. - /// (Originally from ..\FSComp.txt:879) + /// (Originally from ..\FSComp.txt:880) static member optsResident() = (GetStringFunc("optsResident",",,,") ) /// Name the output debug file - /// (Originally from ..\FSComp.txt:880) + /// (Originally from ..\FSComp.txt:881) static member optsPdb() = (GetStringFunc("optsPdb",",,,") ) /// Resolve assembly references using directory-based rules rather than MSBuild resolution - /// (Originally from ..\FSComp.txt:881) + /// (Originally from ..\FSComp.txt:882) static member optsSimpleresolution() = (GetStringFunc("optsSimpleresolution",",,,") ) /// Unrecognized target '%s', expected 'exe', 'winexe', 'library' or 'module' - /// (Originally from ..\FSComp.txt:882) + /// (Originally from ..\FSComp.txt:883) static member optsUnrecognizedTarget(a0 : System.String) = (1048, GetStringFunc("optsUnrecognizedTarget",",,,%s,,,") a0) /// Unrecognized debug type '%s', expected 'pdbonly' or 'full' - /// (Originally from ..\FSComp.txt:883) + /// (Originally from ..\FSComp.txt:884) static member optsUnrecognizedDebugType(a0 : System.String) = (1049, GetStringFunc("optsUnrecognizedDebugType",",,,%s,,,") a0) /// Invalid warning level '%d' - /// (Originally from ..\FSComp.txt:884) + /// (Originally from ..\FSComp.txt:885) static member optsInvalidWarningLevel(a0 : System.Int32) = (1050, GetStringFunc("optsInvalidWarningLevel",",,,%d,,,") a0) /// Short form of '%s' - /// (Originally from ..\FSComp.txt:885) + /// (Originally from ..\FSComp.txt:886) static member optsShortFormOf(a0 : System.String) = (GetStringFunc("optsShortFormOf",",,,%s,,,") a0) /// The command-line option '--cliroot' has been deprecated. Use an explicit reference to a specific copy of mscorlib.dll instead. - /// (Originally from ..\FSComp.txt:886) + /// (Originally from ..\FSComp.txt:887) static member optsClirootDeprecatedMsg() = (GetStringFunc("optsClirootDeprecatedMsg",",,,") ) /// Use to override where the compiler looks for mscorlib.dll and framework components - /// (Originally from ..\FSComp.txt:887) + /// (Originally from ..\FSComp.txt:888) static member optsClirootDescription() = (GetStringFunc("optsClirootDescription",",,,") ) /// - OUTPUT FILES - - /// (Originally from ..\FSComp.txt:888) + /// (Originally from ..\FSComp.txt:889) static member optsHelpBannerOutputFiles() = (GetStringFunc("optsHelpBannerOutputFiles",",,,") ) /// - INPUT FILES - - /// (Originally from ..\FSComp.txt:889) + /// (Originally from ..\FSComp.txt:890) static member optsHelpBannerInputFiles() = (GetStringFunc("optsHelpBannerInputFiles",",,,") ) /// - RESOURCES - - /// (Originally from ..\FSComp.txt:890) + /// (Originally from ..\FSComp.txt:891) static member optsHelpBannerResources() = (GetStringFunc("optsHelpBannerResources",",,,") ) /// - CODE GENERATION - - /// (Originally from ..\FSComp.txt:891) + /// (Originally from ..\FSComp.txt:892) static member optsHelpBannerCodeGen() = (GetStringFunc("optsHelpBannerCodeGen",",,,") ) /// - ADVANCED - - /// (Originally from ..\FSComp.txt:892) + /// (Originally from ..\FSComp.txt:893) static member optsHelpBannerAdvanced() = (GetStringFunc("optsHelpBannerAdvanced",",,,") ) /// - MISCELLANEOUS - - /// (Originally from ..\FSComp.txt:893) + /// (Originally from ..\FSComp.txt:894) static member optsHelpBannerMisc() = (GetStringFunc("optsHelpBannerMisc",",,,") ) /// - LANGUAGE - - /// (Originally from ..\FSComp.txt:894) + /// (Originally from ..\FSComp.txt:895) static member optsHelpBannerLanguage() = (GetStringFunc("optsHelpBannerLanguage",",,,") ) /// - ERRORS AND WARNINGS - - /// (Originally from ..\FSComp.txt:895) + /// (Originally from ..\FSComp.txt:896) static member optsHelpBannerErrsAndWarns() = (GetStringFunc("optsHelpBannerErrsAndWarns",",,,") ) /// Unknown --test argument: '%s' - /// (Originally from ..\FSComp.txt:896) + /// (Originally from ..\FSComp.txt:897) static member optsUnknownArgumentToTheTestSwitch(a0 : System.String) = (1063, GetStringFunc("optsUnknownArgumentToTheTestSwitch",",,,%s,,,") a0) /// Unrecognized platform '%s', valid values are 'x86', 'x64', 'Itanium', 'anycpu32bitpreferred', and 'anycpu' - /// (Originally from ..\FSComp.txt:897) + /// (Originally from ..\FSComp.txt:898) static member optsUnknownPlatform(a0 : System.String) = (1064, GetStringFunc("optsUnknownPlatform",",,,%s,,,") a0) /// The command-line option '%s' is for test purposes only - /// (Originally from ..\FSComp.txt:898) + /// (Originally from ..\FSComp.txt:899) static member optsInternalNoDescription(a0 : System.String) = (GetStringFunc("optsInternalNoDescription",",,,%s,,,") a0) /// The command-line option '%s' has been deprecated - /// (Originally from ..\FSComp.txt:899) + /// (Originally from ..\FSComp.txt:900) static member optsDCLONoDescription(a0 : System.String) = (GetStringFunc("optsDCLONoDescription",",,,%s,,,") a0) /// The command-line option '%s' has been deprecated. Use '%s' instead. - /// (Originally from ..\FSComp.txt:900) + /// (Originally from ..\FSComp.txt:901) static member optsDCLODeprecatedSuggestAlternative(a0 : System.String, a1 : System.String) = (GetStringFunc("optsDCLODeprecatedSuggestAlternative",",,,%s,,,%s,,,") a0 a1) /// The command-line option '%s' has been deprecated. HTML document generation is now part of the F# Power Pack, via the tool FsHtmlDoc.exe. - /// (Originally from ..\FSComp.txt:901) + /// (Originally from ..\FSComp.txt:902) static member optsDCLOHtmlDoc(a0 : System.String) = (GetStringFunc("optsDCLOHtmlDoc",",,,%s,,,") a0) /// Output warning and error messages in color - /// (Originally from ..\FSComp.txt:902) + /// (Originally from ..\FSComp.txt:903) static member optsConsoleColors() = (GetStringFunc("optsConsoleColors",",,,") ) /// Enable high-entropy ASLR - /// (Originally from ..\FSComp.txt:903) + /// (Originally from ..\FSComp.txt:904) static member optsUseHighEntropyVA() = (GetStringFunc("optsUseHighEntropyVA",",,,") ) /// Specify subsystem version of this assembly - /// (Originally from ..\FSComp.txt:904) + /// (Originally from ..\FSComp.txt:905) static member optsSubSystemVersion() = (GetStringFunc("optsSubSystemVersion",",,,") ) /// Specify target framework profile of this assembly. Valid values are mscorlib, netcore or netstandard. Default - mscorlib - /// (Originally from ..\FSComp.txt:905) + /// (Originally from ..\FSComp.txt:906) static member optsTargetProfile() = (GetStringFunc("optsTargetProfile",",,,") ) /// Emit debug information in quotations - /// (Originally from ..\FSComp.txt:906) + /// (Originally from ..\FSComp.txt:907) static member optsEmitDebugInfoInQuotations() = (GetStringFunc("optsEmitDebugInfoInQuotations",",,,") ) /// Specify the preferred output language culture name (e.g. es-ES, ja-JP) - /// (Originally from ..\FSComp.txt:907) + /// (Originally from ..\FSComp.txt:908) static member optsPreferredUiLang() = (GetStringFunc("optsPreferredUiLang",",,,") ) /// Don't copy FSharp.Core.dll along the produced binaries - /// (Originally from ..\FSComp.txt:908) + /// (Originally from ..\FSComp.txt:909) static member optsNoCopyFsharpCore() = (GetStringFunc("optsNoCopyFsharpCore",",,,") ) /// Invalid version '%s' for '--subsystemversion'. The version must be 4.00 or greater. - /// (Originally from ..\FSComp.txt:909) + /// (Originally from ..\FSComp.txt:910) static member optsInvalidSubSystemVersion(a0 : System.String) = (1051, GetStringFunc("optsInvalidSubSystemVersion",",,,%s,,,") a0) /// Invalid value '%s' for '--targetprofile', valid values are 'mscorlib', 'netcore' or 'netstandard'. - /// (Originally from ..\FSComp.txt:910) + /// (Originally from ..\FSComp.txt:911) static member optsInvalidTargetProfile(a0 : System.String) = (1052, GetStringFunc("optsInvalidTargetProfile",",,,%s,,,") a0) /// Full name - /// (Originally from ..\FSComp.txt:911) + /// (Originally from ..\FSComp.txt:912) static member typeInfoFullName() = (GetStringFunc("typeInfoFullName",",,,") ) /// and %d other overloads - /// (Originally from ..\FSComp.txt:915) + /// (Originally from ..\FSComp.txt:916) static member typeInfoOtherOverloads(a0 : System.Int32) = (GetStringFunc("typeInfoOtherOverloads",",,,%d,,,") a0) /// union case - /// (Originally from ..\FSComp.txt:916) + /// (Originally from ..\FSComp.txt:917) static member typeInfoUnionCase() = (GetStringFunc("typeInfoUnionCase",",,,") ) /// active pattern result - /// (Originally from ..\FSComp.txt:917) + /// (Originally from ..\FSComp.txt:918) static member typeInfoActivePatternResult() = (GetStringFunc("typeInfoActivePatternResult",",,,") ) /// active recognizer - /// (Originally from ..\FSComp.txt:918) + /// (Originally from ..\FSComp.txt:919) static member typeInfoActiveRecognizer() = (GetStringFunc("typeInfoActiveRecognizer",",,,") ) /// field - /// (Originally from ..\FSComp.txt:919) + /// (Originally from ..\FSComp.txt:920) static member typeInfoField() = (GetStringFunc("typeInfoField",",,,") ) /// event - /// (Originally from ..\FSComp.txt:920) + /// (Originally from ..\FSComp.txt:921) static member typeInfoEvent() = (GetStringFunc("typeInfoEvent",",,,") ) /// property - /// (Originally from ..\FSComp.txt:921) + /// (Originally from ..\FSComp.txt:922) static member typeInfoProperty() = (GetStringFunc("typeInfoProperty",",,,") ) /// extension - /// (Originally from ..\FSComp.txt:922) + /// (Originally from ..\FSComp.txt:923) static member typeInfoExtension() = (GetStringFunc("typeInfoExtension",",,,") ) /// custom operation - /// (Originally from ..\FSComp.txt:923) + /// (Originally from ..\FSComp.txt:924) static member typeInfoCustomOperation() = (GetStringFunc("typeInfoCustomOperation",",,,") ) /// argument - /// (Originally from ..\FSComp.txt:924) + /// (Originally from ..\FSComp.txt:925) static member typeInfoArgument() = (GetStringFunc("typeInfoArgument",",,,") ) + /// anonymous record field + /// (Originally from ..\FSComp.txt:926) + static member typeInfoAnonRecdField() = (GetStringFunc("typeInfoAnonRecdField",",,,") ) /// patvar - /// (Originally from ..\FSComp.txt:925) + /// (Originally from ..\FSComp.txt:927) static member typeInfoPatternVariable() = (GetStringFunc("typeInfoPatternVariable",",,,") ) /// namespace - /// (Originally from ..\FSComp.txt:926) + /// (Originally from ..\FSComp.txt:928) static member typeInfoNamespace() = (GetStringFunc("typeInfoNamespace",",,,") ) /// module - /// (Originally from ..\FSComp.txt:927) + /// (Originally from ..\FSComp.txt:929) static member typeInfoModule() = (GetStringFunc("typeInfoModule",",,,") ) /// namespace/module - /// (Originally from ..\FSComp.txt:928) + /// (Originally from ..\FSComp.txt:930) static member typeInfoNamespaceOrModule() = (GetStringFunc("typeInfoNamespaceOrModule",",,,") ) /// from %s - /// (Originally from ..\FSComp.txt:929) + /// (Originally from ..\FSComp.txt:931) static member typeInfoFromFirst(a0 : System.String) = (GetStringFunc("typeInfoFromFirst",",,,%s,,,") a0) /// also from %s - /// (Originally from ..\FSComp.txt:930) + /// (Originally from ..\FSComp.txt:932) static member typeInfoFromNext(a0 : System.String) = (GetStringFunc("typeInfoFromNext",",,,%s,,,") a0) /// generated property - /// (Originally from ..\FSComp.txt:931) + /// (Originally from ..\FSComp.txt:933) static member typeInfoGeneratedProperty() = (GetStringFunc("typeInfoGeneratedProperty",",,,") ) /// generated type - /// (Originally from ..\FSComp.txt:932) + /// (Originally from ..\FSComp.txt:934) static member typeInfoGeneratedType() = (GetStringFunc("typeInfoGeneratedType",",,,") ) /// Found by AssemblyFolders registry key - /// (Originally from ..\FSComp.txt:933) + /// (Originally from ..\FSComp.txt:935) static member assemblyResolutionFoundByAssemblyFoldersKey() = (GetStringFunc("assemblyResolutionFoundByAssemblyFoldersKey",",,,") ) /// Found by AssemblyFoldersEx registry key - /// (Originally from ..\FSComp.txt:934) + /// (Originally from ..\FSComp.txt:936) static member assemblyResolutionFoundByAssemblyFoldersExKey() = (GetStringFunc("assemblyResolutionFoundByAssemblyFoldersExKey",",,,") ) /// .NET Framework - /// (Originally from ..\FSComp.txt:935) + /// (Originally from ..\FSComp.txt:937) static member assemblyResolutionNetFramework() = (GetStringFunc("assemblyResolutionNetFramework",",,,") ) /// Global Assembly Cache - /// (Originally from ..\FSComp.txt:936) + /// (Originally from ..\FSComp.txt:938) static member assemblyResolutionGAC() = (GetStringFunc("assemblyResolutionGAC",",,,") ) /// Recursive class hierarchy in type '%s' - /// (Originally from ..\FSComp.txt:937) + /// (Originally from ..\FSComp.txt:939) static member recursiveClassHierarchy(a0 : System.String) = (1089, GetStringFunc("recursiveClassHierarchy",",,,%s,,,") a0) /// Invalid recursive reference to an abstract slot - /// (Originally from ..\FSComp.txt:938) + /// (Originally from ..\FSComp.txt:940) static member InvalidRecursiveReferenceToAbstractSlot() = (1090, GetStringFunc("InvalidRecursiveReferenceToAbstractSlot",",,,") ) /// The event '%s' has a non-standard type. If this event is declared in another CLI language, you may need to access this event using the explicit %s and %s methods for the event. If this event is declared in F#, make the type of the event an instantiation of either 'IDelegateEvent<_>' or 'IEvent<_,_>'. - /// (Originally from ..\FSComp.txt:939) + /// (Originally from ..\FSComp.txt:941) static member eventHasNonStandardType(a0 : System.String, a1 : System.String, a2 : System.String) = (1091, GetStringFunc("eventHasNonStandardType",",,,%s,,,%s,,,%s,,,") a0 a1 a2) /// The type '%s' is not accessible from this code location - /// (Originally from ..\FSComp.txt:940) + /// (Originally from ..\FSComp.txt:942) static member typeIsNotAccessible(a0 : System.String) = (1092, GetStringFunc("typeIsNotAccessible",",,,%s,,,") a0) /// The union cases or fields of the type '%s' are not accessible from this code location - /// (Originally from ..\FSComp.txt:941) + /// (Originally from ..\FSComp.txt:943) static member unionCasesAreNotAccessible(a0 : System.String) = (1093, GetStringFunc("unionCasesAreNotAccessible",",,,%s,,,") a0) /// The value '%s' is not accessible from this code location - /// (Originally from ..\FSComp.txt:942) + /// (Originally from ..\FSComp.txt:944) static member valueIsNotAccessible(a0 : System.String) = (1094, GetStringFunc("valueIsNotAccessible",",,,%s,,,") a0) /// The union case '%s' is not accessible from this code location - /// (Originally from ..\FSComp.txt:943) + /// (Originally from ..\FSComp.txt:945) static member unionCaseIsNotAccessible(a0 : System.String) = (1095, GetStringFunc("unionCaseIsNotAccessible",",,,%s,,,") a0) /// The record, struct or class field '%s' is not accessible from this code location - /// (Originally from ..\FSComp.txt:944) + /// (Originally from ..\FSComp.txt:946) static member fieldIsNotAccessible(a0 : System.String) = (1096, GetStringFunc("fieldIsNotAccessible",",,,%s,,,") a0) /// The struct or class field '%s' is not accessible from this code location - /// (Originally from ..\FSComp.txt:945) + /// (Originally from ..\FSComp.txt:947) static member structOrClassFieldIsNotAccessible(a0 : System.String) = (1097, GetStringFunc("structOrClassFieldIsNotAccessible",",,,%s,,,") a0) /// This construct is experimental - /// (Originally from ..\FSComp.txt:946) + /// (Originally from ..\FSComp.txt:948) static member experimentalConstruct() = (GetStringFunc("experimentalConstruct",",,,") ) /// No Invoke methods found for delegate type - /// (Originally from ..\FSComp.txt:947) + /// (Originally from ..\FSComp.txt:949) static member noInvokeMethodsFound() = (1099, GetStringFunc("noInvokeMethodsFound",",,,") ) /// More than one Invoke method found for delegate type - /// (Originally from ..\FSComp.txt:948) + /// (Originally from ..\FSComp.txt:950) static member moreThanOneInvokeMethodFound() = (GetStringFunc("moreThanOneInvokeMethodFound",",,,") ) /// Delegates are not allowed to have curried signatures - /// (Originally from ..\FSComp.txt:949) + /// (Originally from ..\FSComp.txt:951) static member delegatesNotAllowedToHaveCurriedSignatures() = (1101, GetStringFunc("delegatesNotAllowedToHaveCurriedSignatures",",,,") ) /// Unexpected Expr.TyChoose - /// (Originally from ..\FSComp.txt:950) + /// (Originally from ..\FSComp.txt:952) static member tlrUnexpectedTExpr() = (1102, GetStringFunc("tlrUnexpectedTExpr",",,,") ) /// Note: Lambda-lifting optimizations have not been applied because of the use of this local constrained generic function as a first class value. Adding type constraints may resolve this condition. - /// (Originally from ..\FSComp.txt:951) + /// (Originally from ..\FSComp.txt:953) static member tlrLambdaLiftingOptimizationsNotApplied() = (1103, GetStringFunc("tlrLambdaLiftingOptimizationsNotApplied",",,,") ) /// Identifiers containing '@' are reserved for use in F# code generation - /// (Originally from ..\FSComp.txt:952) + /// (Originally from ..\FSComp.txt:954) static member lexhlpIdentifiersContainingAtSymbolReserved() = (1104, GetStringFunc("lexhlpIdentifiersContainingAtSymbolReserved",",,,") ) /// The identifier '%s' is reserved for future use by F# - /// (Originally from ..\FSComp.txt:953) + /// (Originally from ..\FSComp.txt:955) static member lexhlpIdentifierReserved(a0 : System.String) = (GetStringFunc("lexhlpIdentifierReserved",",,,%s,,,") a0) /// Missing variable '%s' - /// (Originally from ..\FSComp.txt:954) + /// (Originally from ..\FSComp.txt:956) static member patcMissingVariable(a0 : System.String) = (1106, GetStringFunc("patcMissingVariable",",,,%s,,,") a0) /// Partial active patterns may only generate one result - /// (Originally from ..\FSComp.txt:955) + /// (Originally from ..\FSComp.txt:957) static member patcPartialActivePatternsGenerateOneResult() = (1107, GetStringFunc("patcPartialActivePatternsGenerateOneResult",",,,") ) /// The type '%s' is required here and is unavailable. You must add a reference to assembly '%s'. - /// (Originally from ..\FSComp.txt:956) + /// (Originally from ..\FSComp.txt:958) static member impTypeRequiredUnavailable(a0 : System.String, a1 : System.String) = (1108, GetStringFunc("impTypeRequiredUnavailable",",,,%s,,,%s,,,") a0 a1) /// A reference to the type '%s' in assembly '%s' was found, but the type could not be found in that assembly - /// (Originally from ..\FSComp.txt:957) + /// (Originally from ..\FSComp.txt:959) static member impReferencedTypeCouldNotBeFoundInAssembly(a0 : System.String, a1 : System.String) = (1109, GetStringFunc("impReferencedTypeCouldNotBeFoundInAssembly",",,,%s,,,%s,,,") a0 a1) /// Internal error or badly formed metadata: not enough type parameters were in scope while importing - /// (Originally from ..\FSComp.txt:958) + /// (Originally from ..\FSComp.txt:960) static member impNotEnoughTypeParamsInScopeWhileImporting() = (1110, GetStringFunc("impNotEnoughTypeParamsInScopeWhileImporting",",,,") ) /// A reference to the DLL %s is required by assembly %s. The imported type %s is located in the first assembly and could not be resolved. - /// (Originally from ..\FSComp.txt:959) + /// (Originally from ..\FSComp.txt:961) static member impReferenceToDllRequiredByAssembly(a0 : System.String, a1 : System.String, a2 : System.String) = (1111, GetStringFunc("impReferenceToDllRequiredByAssembly",",,,%s,,,%s,,,%s,,,") a0 a1 a2) /// An imported assembly uses the type '%s' but that type is not public - /// (Originally from ..\FSComp.txt:960) + /// (Originally from ..\FSComp.txt:962) static member impImportedAssemblyUsesNotPublicType(a0 : System.String) = (1112, GetStringFunc("impImportedAssemblyUsesNotPublicType",",,,%s,,,") a0) /// The value '%s' was marked inline but its implementation makes use of an internal or private function which is not sufficiently accessible - /// (Originally from ..\FSComp.txt:961) + /// (Originally from ..\FSComp.txt:963) static member optValueMarkedInlineButIncomplete(a0 : System.String) = (1113, GetStringFunc("optValueMarkedInlineButIncomplete",",,,%s,,,") a0) /// The value '%s' was marked inline but was not bound in the optimization environment - /// (Originally from ..\FSComp.txt:962) + /// (Originally from ..\FSComp.txt:964) static member optValueMarkedInlineButWasNotBoundInTheOptEnv(a0 : System.String) = (1114, GetStringFunc("optValueMarkedInlineButWasNotBoundInTheOptEnv",",,,%s,,,") a0) /// Local value %s not found during optimization - /// (Originally from ..\FSComp.txt:963) + /// (Originally from ..\FSComp.txt:965) static member optLocalValueNotFoundDuringOptimization(a0 : System.String) = (1115, GetStringFunc("optLocalValueNotFoundDuringOptimization",",,,%s,,,") a0) /// A value marked as 'inline' has an unexpected value - /// (Originally from ..\FSComp.txt:964) + /// (Originally from ..\FSComp.txt:966) static member optValueMarkedInlineHasUnexpectedValue() = (1116, GetStringFunc("optValueMarkedInlineHasUnexpectedValue",",,,") ) /// A value marked as 'inline' could not be inlined - /// (Originally from ..\FSComp.txt:965) + /// (Originally from ..\FSComp.txt:967) static member optValueMarkedInlineCouldNotBeInlined() = (1117, GetStringFunc("optValueMarkedInlineCouldNotBeInlined",",,,") ) /// Failed to inline the value '%s' marked 'inline', perhaps because a recursive value was marked 'inline' - /// (Originally from ..\FSComp.txt:966) + /// (Originally from ..\FSComp.txt:968) static member optFailedToInlineValue(a0 : System.String) = (1118, GetStringFunc("optFailedToInlineValue",",,,%s,,,") a0) /// Recursive ValValue %s - /// (Originally from ..\FSComp.txt:967) + /// (Originally from ..\FSComp.txt:969) static member optRecursiveValValue(a0 : System.String) = (1119, GetStringFunc("optRecursiveValValue",",,,%s,,,") a0) /// The indentation of this 'in' token is incorrect with respect to the corresponding 'let' - /// (Originally from ..\FSComp.txt:968) + /// (Originally from ..\FSComp.txt:970) static member lexfltIncorrentIndentationOfIn() = (GetStringFunc("lexfltIncorrentIndentationOfIn",",,,") ) /// Possible incorrect indentation: this token is offside of context started at position %s. Try indenting this token further or using standard formatting conventions. - /// (Originally from ..\FSComp.txt:969) + /// (Originally from ..\FSComp.txt:971) static member lexfltTokenIsOffsideOfContextStartedEarlier(a0 : System.String) = (GetStringFunc("lexfltTokenIsOffsideOfContextStartedEarlier",",,,%s,,,") a0) /// The '|' tokens separating rules of this pattern match are misaligned by one column. Consider realigning your code or using further indentation. - /// (Originally from ..\FSComp.txt:970) + /// (Originally from ..\FSComp.txt:972) static member lexfltSeparatorTokensOfPatternMatchMisaligned() = (GetStringFunc("lexfltSeparatorTokensOfPatternMatchMisaligned",",,,") ) /// Invalid module/expression/type - /// (Originally from ..\FSComp.txt:971) + /// (Originally from ..\FSComp.txt:973) static member nrInvalidModuleExprType() = (1123, GetStringFunc("nrInvalidModuleExprType",",,,") ) /// Multiple types exist called '%s', taking different numbers of generic parameters. Provide a type instantiation to disambiguate the type resolution, e.g. '%s'. - /// (Originally from ..\FSComp.txt:972) + /// (Originally from ..\FSComp.txt:974) static member nrTypeInstantiationNeededToDisambiguateTypesWithSameName(a0 : System.String, a1 : System.String) = (1124, GetStringFunc("nrTypeInstantiationNeededToDisambiguateTypesWithSameName",",,,%s,,,%s,,,") a0 a1) /// The instantiation of the generic type '%s' is missing and can't be inferred from the arguments or return type of this member. Consider providing a type instantiation when accessing this type, e.g. '%s'. - /// (Originally from ..\FSComp.txt:973) + /// (Originally from ..\FSComp.txt:975) static member nrTypeInstantiationIsMissingAndCouldNotBeInferred(a0 : System.String, a1 : System.String) = (1125, GetStringFunc("nrTypeInstantiationIsMissingAndCouldNotBeInferred",",,,%s,,,%s,,,") a0 a1) /// 'global' may only be used as the first name in a qualified path - /// (Originally from ..\FSComp.txt:974) + /// (Originally from ..\FSComp.txt:976) static member nrGlobalUsedOnlyAsFirstName() = (1126, GetStringFunc("nrGlobalUsedOnlyAsFirstName",",,,") ) /// This is not a constructor or literal, or a constructor is being used incorrectly - /// (Originally from ..\FSComp.txt:975) + /// (Originally from ..\FSComp.txt:977) static member nrIsNotConstructorOrLiteral() = (1127, GetStringFunc("nrIsNotConstructorOrLiteral",",,,") ) /// Unexpected empty long identifier - /// (Originally from ..\FSComp.txt:976) + /// (Originally from ..\FSComp.txt:978) static member nrUnexpectedEmptyLongId() = (1128, GetStringFunc("nrUnexpectedEmptyLongId",",,,") ) /// The record type '%s' does not contain a label '%s'. - /// (Originally from ..\FSComp.txt:977) + /// (Originally from ..\FSComp.txt:979) static member nrRecordDoesNotContainSuchLabel(a0 : System.String, a1 : System.String) = (1129, GetStringFunc("nrRecordDoesNotContainSuchLabel",",,,%s,,,%s,,,") a0 a1) /// Invalid field label - /// (Originally from ..\FSComp.txt:978) + /// (Originally from ..\FSComp.txt:980) static member nrInvalidFieldLabel() = (1130, GetStringFunc("nrInvalidFieldLabel",",,,") ) /// Invalid expression '%s' - /// (Originally from ..\FSComp.txt:979) + /// (Originally from ..\FSComp.txt:981) static member nrInvalidExpression(a0 : System.String) = (1132, GetStringFunc("nrInvalidExpression",",,,%s,,,") a0) /// No constructors are available for the type '%s' - /// (Originally from ..\FSComp.txt:980) + /// (Originally from ..\FSComp.txt:982) static member nrNoConstructorsAvailableForType(a0 : System.String) = (1133, GetStringFunc("nrNoConstructorsAvailableForType",",,,%s,,,") a0) /// The union type for union case '%s' was defined with the RequireQualifiedAccessAttribute. Include the name of the union type ('%s') in the name you are using. - /// (Originally from ..\FSComp.txt:981) + /// (Originally from ..\FSComp.txt:983) static member nrUnionTypeNeedsQualifiedAccess(a0 : System.String, a1 : System.String) = (1134, GetStringFunc("nrUnionTypeNeedsQualifiedAccess",",,,%s,,,%s,,,") a0 a1) /// The record type for the record field '%s' was defined with the RequireQualifiedAccessAttribute. Include the name of the record type ('%s') in the name you are using. - /// (Originally from ..\FSComp.txt:982) + /// (Originally from ..\FSComp.txt:984) static member nrRecordTypeNeedsQualifiedAccess(a0 : System.String, a1 : System.String) = (1135, GetStringFunc("nrRecordTypeNeedsQualifiedAccess",",,,%s,,,%s,,,") a0 a1) /// Unexpected error creating debug information file '%s' - /// (Originally from ..\FSComp.txt:983) + /// (Originally from ..\FSComp.txt:985) static member ilwriteErrorCreatingPdb(a0 : System.String) = (1136, GetStringFunc("ilwriteErrorCreatingPdb",",,,%s,,,") a0) /// This number is outside the allowable range for this integer type - /// (Originally from ..\FSComp.txt:984) + /// (Originally from ..\FSComp.txt:986) static member lexOutsideIntegerRange() = (1138, GetStringFunc("lexOutsideIntegerRange",",,,") ) /// '%s' is not permitted as a character in operator names and is reserved for future use - /// (Originally from ..\FSComp.txt:988) + /// (Originally from ..\FSComp.txt:990) static member lexCharNotAllowedInOperatorNames(a0 : System.String) = (GetStringFunc("lexCharNotAllowedInOperatorNames",",,,%s,,,") a0) /// Unexpected character '%s' - /// (Originally from ..\FSComp.txt:989) + /// (Originally from ..\FSComp.txt:991) static member lexUnexpectedChar(a0 : System.String) = (GetStringFunc("lexUnexpectedChar",",,,%s,,,") a0) /// This byte array literal contains characters that do not encode as a single byte - /// (Originally from ..\FSComp.txt:990) + /// (Originally from ..\FSComp.txt:992) static member lexByteArrayCannotEncode() = (1140, GetStringFunc("lexByteArrayCannotEncode",",,,") ) /// Identifiers followed by '%s' are reserved for future use - /// (Originally from ..\FSComp.txt:991) + /// (Originally from ..\FSComp.txt:993) static member lexIdentEndInMarkReserved(a0 : System.String) = (1141, GetStringFunc("lexIdentEndInMarkReserved",",,,%s,,,") a0) /// This number is outside the allowable range for 8-bit signed integers - /// (Originally from ..\FSComp.txt:992) + /// (Originally from ..\FSComp.txt:994) static member lexOutsideEightBitSigned() = (1142, GetStringFunc("lexOutsideEightBitSigned",",,,") ) /// This number is outside the allowable range for hexadecimal 8-bit signed integers - /// (Originally from ..\FSComp.txt:993) + /// (Originally from ..\FSComp.txt:995) static member lexOutsideEightBitSignedHex() = (1143, GetStringFunc("lexOutsideEightBitSignedHex",",,,") ) /// This number is outside the allowable range for 8-bit unsigned integers - /// (Originally from ..\FSComp.txt:994) + /// (Originally from ..\FSComp.txt:996) static member lexOutsideEightBitUnsigned() = (1144, GetStringFunc("lexOutsideEightBitUnsigned",",,,") ) /// This number is outside the allowable range for 16-bit signed integers - /// (Originally from ..\FSComp.txt:995) + /// (Originally from ..\FSComp.txt:997) static member lexOutsideSixteenBitSigned() = (1145, GetStringFunc("lexOutsideSixteenBitSigned",",,,") ) /// This number is outside the allowable range for 16-bit unsigned integers - /// (Originally from ..\FSComp.txt:996) + /// (Originally from ..\FSComp.txt:998) static member lexOutsideSixteenBitUnsigned() = (1146, GetStringFunc("lexOutsideSixteenBitUnsigned",",,,") ) /// This number is outside the allowable range for 32-bit signed integers - /// (Originally from ..\FSComp.txt:997) + /// (Originally from ..\FSComp.txt:999) static member lexOutsideThirtyTwoBitSigned() = (1147, GetStringFunc("lexOutsideThirtyTwoBitSigned",",,,") ) /// This number is outside the allowable range for 32-bit unsigned integers - /// (Originally from ..\FSComp.txt:998) + /// (Originally from ..\FSComp.txt:1000) static member lexOutsideThirtyTwoBitUnsigned() = (1148, GetStringFunc("lexOutsideThirtyTwoBitUnsigned",",,,") ) /// This number is outside the allowable range for 64-bit signed integers - /// (Originally from ..\FSComp.txt:999) + /// (Originally from ..\FSComp.txt:1001) static member lexOutsideSixtyFourBitSigned() = (1149, GetStringFunc("lexOutsideSixtyFourBitSigned",",,,") ) /// This number is outside the allowable range for 64-bit unsigned integers - /// (Originally from ..\FSComp.txt:1000) + /// (Originally from ..\FSComp.txt:1002) static member lexOutsideSixtyFourBitUnsigned() = (1150, GetStringFunc("lexOutsideSixtyFourBitUnsigned",",,,") ) /// This number is outside the allowable range for signed native integers - /// (Originally from ..\FSComp.txt:1001) + /// (Originally from ..\FSComp.txt:1003) static member lexOutsideNativeSigned() = (1151, GetStringFunc("lexOutsideNativeSigned",",,,") ) /// This number is outside the allowable range for unsigned native integers - /// (Originally from ..\FSComp.txt:1002) + /// (Originally from ..\FSComp.txt:1004) static member lexOutsideNativeUnsigned() = (1152, GetStringFunc("lexOutsideNativeUnsigned",",,,") ) /// Invalid floating point number - /// (Originally from ..\FSComp.txt:1003) + /// (Originally from ..\FSComp.txt:1005) static member lexInvalidFloat() = (1153, GetStringFunc("lexInvalidFloat",",,,") ) /// This number is outside the allowable range for decimal literals - /// (Originally from ..\FSComp.txt:1004) + /// (Originally from ..\FSComp.txt:1006) static member lexOusideDecimal() = (1154, GetStringFunc("lexOusideDecimal",",,,") ) /// This number is outside the allowable range for 32-bit floats - /// (Originally from ..\FSComp.txt:1005) + /// (Originally from ..\FSComp.txt:1007) static member lexOusideThirtyTwoBitFloat() = (1155, GetStringFunc("lexOusideThirtyTwoBitFloat",",,,") ) /// This is not a valid numeric literal. Valid numeric literals include 1, 0x1, 0b0001 (int), 1u (uint32), 1L (int64), 1UL (uint64), 1s (int16), 1y (sbyte), 1uy (byte), 1.0 (float), 1.0f (float32), 1.0m (decimal), 1I (BigInteger). - /// (Originally from ..\FSComp.txt:1006) + /// (Originally from ..\FSComp.txt:1008) static member lexInvalidNumericLiteral() = (1156, GetStringFunc("lexInvalidNumericLiteral",",,,") ) /// This is not a valid byte literal - /// (Originally from ..\FSComp.txt:1007) + /// (Originally from ..\FSComp.txt:1009) static member lexInvalidByteLiteral() = (1157, GetStringFunc("lexInvalidByteLiteral",",,,") ) /// This is not a valid character literal - /// (Originally from ..\FSComp.txt:1008) + /// (Originally from ..\FSComp.txt:1010) static member lexInvalidCharLiteral() = (1158, GetStringFunc("lexInvalidCharLiteral",",,,") ) /// This Unicode encoding is only valid in string literals - /// (Originally from ..\FSComp.txt:1009) + /// (Originally from ..\FSComp.txt:1011) static member lexThisUnicodeOnlyInStringLiterals() = (1159, GetStringFunc("lexThisUnicodeOnlyInStringLiterals",",,,") ) /// This token is reserved for future use - /// (Originally from ..\FSComp.txt:1010) + /// (Originally from ..\FSComp.txt:1012) static member lexTokenReserved() = (1160, GetStringFunc("lexTokenReserved",",,,") ) /// TABs are not allowed in F# code unless the #indent \"off\" option is used - /// (Originally from ..\FSComp.txt:1011) + /// (Originally from ..\FSComp.txt:1013) static member lexTabsNotAllowed() = (1161, GetStringFunc("lexTabsNotAllowed",",,,") ) /// Invalid line number: '%s' - /// (Originally from ..\FSComp.txt:1012) + /// (Originally from ..\FSComp.txt:1014) static member lexInvalidLineNumber(a0 : System.String) = (1162, GetStringFunc("lexInvalidLineNumber",",,,%s,,,") a0) /// #if directive must appear as the first non-whitespace character on a line - /// (Originally from ..\FSComp.txt:1013) + /// (Originally from ..\FSComp.txt:1015) static member lexHashIfMustBeFirst() = (1163, GetStringFunc("lexHashIfMustBeFirst",",,,") ) /// #else has no matching #if - /// (Originally from ..\FSComp.txt:1014) + /// (Originally from ..\FSComp.txt:1016) static member lexHashElseNoMatchingIf() = (GetStringFunc("lexHashElseNoMatchingIf",",,,") ) /// #endif required for #else - /// (Originally from ..\FSComp.txt:1015) + /// (Originally from ..\FSComp.txt:1017) static member lexHashEndifRequiredForElse() = (GetStringFunc("lexHashEndifRequiredForElse",",,,") ) /// #else directive must appear as the first non-whitespace character on a line - /// (Originally from ..\FSComp.txt:1016) + /// (Originally from ..\FSComp.txt:1018) static member lexHashElseMustBeFirst() = (1166, GetStringFunc("lexHashElseMustBeFirst",",,,") ) /// #endif has no matching #if - /// (Originally from ..\FSComp.txt:1017) + /// (Originally from ..\FSComp.txt:1019) static member lexHashEndingNoMatchingIf() = (GetStringFunc("lexHashEndingNoMatchingIf",",,,") ) /// #endif directive must appear as the first non-whitespace character on a line - /// (Originally from ..\FSComp.txt:1018) + /// (Originally from ..\FSComp.txt:1020) static member lexHashEndifMustBeFirst() = (1168, GetStringFunc("lexHashEndifMustBeFirst",",,,") ) /// #if directive should be immediately followed by an identifier - /// (Originally from ..\FSComp.txt:1019) + /// (Originally from ..\FSComp.txt:1021) static member lexHashIfMustHaveIdent() = (1169, GetStringFunc("lexHashIfMustHaveIdent",",,,") ) /// Syntax error. Wrong nested #endif, unexpected tokens before it. - /// (Originally from ..\FSComp.txt:1020) + /// (Originally from ..\FSComp.txt:1022) static member lexWrongNestedHashEndif() = (1170, GetStringFunc("lexWrongNestedHashEndif",",,,") ) /// #! may only appear as the first line at the start of a file. - /// (Originally from ..\FSComp.txt:1021) + /// (Originally from ..\FSComp.txt:1023) static member lexHashBangMustBeFirstInFile() = (GetStringFunc("lexHashBangMustBeFirstInFile",",,,") ) /// Expected single line comment or end of line - /// (Originally from ..\FSComp.txt:1022) + /// (Originally from ..\FSComp.txt:1024) static member pplexExpectedSingleLineComment() = (1171, GetStringFunc("pplexExpectedSingleLineComment",",,,") ) /// Infix operator member '%s' has no arguments. Expected a tuple of 2 arguments, e.g. static member (+) (x,y) = ... - /// (Originally from ..\FSComp.txt:1023) + /// (Originally from ..\FSComp.txt:1025) static member memberOperatorDefinitionWithNoArguments(a0 : System.String) = (1172, GetStringFunc("memberOperatorDefinitionWithNoArguments",",,,%s,,,") a0) /// Infix operator member '%s' has %d initial argument(s). Expected a tuple of 2 arguments, e.g. static member (+) (x,y) = ... - /// (Originally from ..\FSComp.txt:1024) + /// (Originally from ..\FSComp.txt:1026) static member memberOperatorDefinitionWithNonPairArgument(a0 : System.String, a1 : System.Int32) = (1173, GetStringFunc("memberOperatorDefinitionWithNonPairArgument",",,,%s,,,%d,,,") a0 a1) /// Infix operator member '%s' has extra curried arguments. Expected a tuple of 2 arguments, e.g. static member (+) (x,y) = ... - /// (Originally from ..\FSComp.txt:1025) + /// (Originally from ..\FSComp.txt:1027) static member memberOperatorDefinitionWithCurriedArguments(a0 : System.String) = (1174, GetStringFunc("memberOperatorDefinitionWithCurriedArguments",",,,%s,,,") a0) /// All record, union and struct types in FSharp.Core.dll must be explicitly labelled with 'StructuralComparison' or 'NoComparison' - /// (Originally from ..\FSComp.txt:1026) + /// (Originally from ..\FSComp.txt:1028) static member tcFSharpCoreRequiresExplicit() = (1175, GetStringFunc("tcFSharpCoreRequiresExplicit",",,,") ) /// The struct, record or union type '%s' has the 'StructuralComparison' attribute but the type parameter '%s' does not satisfy the 'comparison' constraint. Consider adding the 'comparison' constraint to the type parameter - /// (Originally from ..\FSComp.txt:1027) + /// (Originally from ..\FSComp.txt:1029) static member tcStructuralComparisonNotSatisfied1(a0 : System.String, a1 : System.String) = (1176, GetStringFunc("tcStructuralComparisonNotSatisfied1",",,,%s,,,%s,,,") a0 a1) /// The struct, record or union type '%s' has the 'StructuralComparison' attribute but the component type '%s' does not satisfy the 'comparison' constraint - /// (Originally from ..\FSComp.txt:1028) + /// (Originally from ..\FSComp.txt:1030) static member tcStructuralComparisonNotSatisfied2(a0 : System.String, a1 : System.String) = (1177, GetStringFunc("tcStructuralComparisonNotSatisfied2",",,,%s,,,%s,,,") a0 a1) /// The struct, record or union type '%s' is not structurally comparable because the type parameter %s does not satisfy the 'comparison' constraint. Consider adding the 'NoComparison' attribute to the type '%s' to clarify that the type is not comparable - /// (Originally from ..\FSComp.txt:1029) + /// (Originally from ..\FSComp.txt:1031) static member tcNoComparisonNeeded1(a0 : System.String, a1 : System.String, a2 : System.String) = (1178, GetStringFunc("tcNoComparisonNeeded1",",,,%s,,,%s,,,%s,,,") a0 a1 a2) /// The struct, record or union type '%s' is not structurally comparable because the type '%s' does not satisfy the 'comparison' constraint. Consider adding the 'NoComparison' attribute to the type '%s' to clarify that the type is not comparable - /// (Originally from ..\FSComp.txt:1030) + /// (Originally from ..\FSComp.txt:1032) static member tcNoComparisonNeeded2(a0 : System.String, a1 : System.String, a2 : System.String) = (1178, GetStringFunc("tcNoComparisonNeeded2",",,,%s,,,%s,,,%s,,,") a0 a1 a2) /// The struct, record or union type '%s' does not support structural equality because the type parameter %s does not satisfy the 'equality' constraint. Consider adding the 'NoEquality' attribute to the type '%s' to clarify that the type does not support structural equality - /// (Originally from ..\FSComp.txt:1031) + /// (Originally from ..\FSComp.txt:1033) static member tcNoEqualityNeeded1(a0 : System.String, a1 : System.String, a2 : System.String) = (1178, GetStringFunc("tcNoEqualityNeeded1",",,,%s,,,%s,,,%s,,,") a0 a1 a2) /// The struct, record or union type '%s' does not support structural equality because the type '%s' does not satisfy the 'equality' constraint. Consider adding the 'NoEquality' attribute to the type '%s' to clarify that the type does not support structural equality - /// (Originally from ..\FSComp.txt:1032) + /// (Originally from ..\FSComp.txt:1034) static member tcNoEqualityNeeded2(a0 : System.String, a1 : System.String, a2 : System.String) = (1178, GetStringFunc("tcNoEqualityNeeded2",",,,%s,,,%s,,,%s,,,") a0 a1 a2) /// The struct, record or union type '%s' has the 'StructuralEquality' attribute but the type parameter '%s' does not satisfy the 'equality' constraint. Consider adding the 'equality' constraint to the type parameter - /// (Originally from ..\FSComp.txt:1033) + /// (Originally from ..\FSComp.txt:1035) static member tcStructuralEqualityNotSatisfied1(a0 : System.String, a1 : System.String) = (1179, GetStringFunc("tcStructuralEqualityNotSatisfied1",",,,%s,,,%s,,,") a0 a1) /// The struct, record or union type '%s' has the 'StructuralEquality' attribute but the component type '%s' does not satisfy the 'equality' constraint - /// (Originally from ..\FSComp.txt:1034) + /// (Originally from ..\FSComp.txt:1036) static member tcStructuralEqualityNotSatisfied2(a0 : System.String, a1 : System.String) = (1180, GetStringFunc("tcStructuralEqualityNotSatisfied2",",,,%s,,,%s,,,") a0 a1) /// Each argument of the primary constructor for a struct must be given a type, for example 'type S(x1:int, x2: int) = ...'. These arguments determine the fields of the struct. - /// (Originally from ..\FSComp.txt:1035) + /// (Originally from ..\FSComp.txt:1037) static member tcStructsMustDeclareTypesOfImplicitCtorArgsExplicitly() = (1181, GetStringFunc("tcStructsMustDeclareTypesOfImplicitCtorArgsExplicitly",",,,") ) /// The value '%s' is unused - /// (Originally from ..\FSComp.txt:1036) + /// (Originally from ..\FSComp.txt:1038) static member chkUnusedValue(a0 : System.String) = (1182, GetStringFunc("chkUnusedValue",",,,%s,,,") a0) /// The recursive object reference '%s' is unused. The presence of a recursive object reference adds runtime initialization checks to members in this and derived types. Consider removing this recursive object reference. - /// (Originally from ..\FSComp.txt:1037) + /// (Originally from ..\FSComp.txt:1039) static member chkUnusedThisVariable(a0 : System.String) = (1183, GetStringFunc("chkUnusedThisVariable",",,,%s,,,") a0) /// A getter property may have at most one argument group - /// (Originally from ..\FSComp.txt:1038) + /// (Originally from ..\FSComp.txt:1040) static member parsGetterAtMostOneArgument() = (1184, GetStringFunc("parsGetterAtMostOneArgument",",,,") ) /// A setter property may have at most two argument groups - /// (Originally from ..\FSComp.txt:1039) + /// (Originally from ..\FSComp.txt:1041) static member parsSetterAtMostTwoArguments() = (1185, GetStringFunc("parsSetterAtMostTwoArguments",",,,") ) /// Invalid property getter or setter - /// (Originally from ..\FSComp.txt:1040) + /// (Originally from ..\FSComp.txt:1042) static member parsInvalidProperty() = (1186, GetStringFunc("parsInvalidProperty",",,,") ) /// An indexer property must be given at least one argument - /// (Originally from ..\FSComp.txt:1041) + /// (Originally from ..\FSComp.txt:1043) static member parsIndexerPropertyRequiresAtLeastOneArgument() = (1187, GetStringFunc("parsIndexerPropertyRequiresAtLeastOneArgument",",,,") ) /// This operation accesses a mutable top-level value defined in another assembly in an unsupported way. The value cannot be accessed through its address. Consider copying the expression to a mutable local, e.g. 'let mutable x = ...', and if necessary assigning the value back after the completion of the operation - /// (Originally from ..\FSComp.txt:1042) + /// (Originally from ..\FSComp.txt:1044) static member tastInvalidAddressOfMutableAcrossAssemblyBoundary() = (1188, GetStringFunc("tastInvalidAddressOfMutableAcrossAssemblyBoundary",",,,") ) /// Type parameters must be placed directly adjacent to the type name, e.g. \"type C<'T>\", not type \"C <'T>\" - /// (Originally from ..\FSComp.txt:1043) + /// (Originally from ..\FSComp.txt:1045) static member parsNonAdjacentTypars() = (1189, GetStringFunc("parsNonAdjacentTypars",",,,") ) /// Type arguments must be placed directly adjacent to the type name, e.g. \"C<'T>\", not \"C <'T>\" - /// (Originally from ..\FSComp.txt:1044) + /// (Originally from ..\FSComp.txt:1046) static member parsNonAdjacentTyargs() = (1190, GetStringFunc("parsNonAdjacentTyargs",",,,") ) /// The use of the type syntax 'int C' and 'C ' is not permitted here. Consider adjusting this type to be written in the form 'C' - /// (Originally from ..\FSComp.txt:1045) + /// (Originally from ..\FSComp.txt:1047) static member parsNonAtomicType() = (GetStringFunc("parsNonAtomicType",",,,") ) /// The module/namespace '%s' from compilation unit '%s' did not contain the module/namespace '%s' - /// (Originally from ..\FSComp.txt:1048) + /// (Originally from ..\FSComp.txt:1050) static member tastUndefinedItemRefModuleNamespace(a0 : System.String, a1 : System.String, a2 : System.String) = (1193, GetStringFunc("tastUndefinedItemRefModuleNamespace",",,,%s,,,%s,,,%s,,,") a0 a1 a2) /// The module/namespace '%s' from compilation unit '%s' did not contain the val '%s' - /// (Originally from ..\FSComp.txt:1049) + /// (Originally from ..\FSComp.txt:1051) static member tastUndefinedItemRefVal(a0 : System.String, a1 : System.String, a2 : System.String) = (1194, GetStringFunc("tastUndefinedItemRefVal",",,,%s,,,%s,,,%s,,,") a0 a1 a2) /// The module/namespace '%s' from compilation unit '%s' did not contain the namespace, module or type '%s' - /// (Originally from ..\FSComp.txt:1050) + /// (Originally from ..\FSComp.txt:1052) static member tastUndefinedItemRefModuleNamespaceType(a0 : System.String, a1 : System.String, a2 : System.String) = (1195, GetStringFunc("tastUndefinedItemRefModuleNamespaceType",",,,%s,,,%s,,,%s,,,") a0 a1 a2) /// The 'UseNullAsTrueValue' attribute flag may only be used with union types that have one nullary case and at least one non-nullary case - /// (Originally from ..\FSComp.txt:1051) + /// (Originally from ..\FSComp.txt:1053) static member tcInvalidUseNullAsTrueValue() = (1196, GetStringFunc("tcInvalidUseNullAsTrueValue",",,,") ) /// The parameter '%s' was inferred to have byref type. Parameters of byref type must be given an explicit type annotation, e.g. 'x1: byref'. When used, a byref parameter is implicitly dereferenced. - /// (Originally from ..\FSComp.txt:1052) + /// (Originally from ..\FSComp.txt:1054) static member tcParameterInferredByref(a0 : System.String) = (1197, GetStringFunc("tcParameterInferredByref",",,,%s,,,") a0) /// The generic member '%s' has been used at a non-uniform instantiation prior to this program point. Consider reordering the members so this member occurs first. Alternatively, specify the full type of the member explicitly, including argument types, return type and any additional generic parameters and constraints. - /// (Originally from ..\FSComp.txt:1053) + /// (Originally from ..\FSComp.txt:1055) static member tcNonUniformMemberUse(a0 : System.String) = (1198, GetStringFunc("tcNonUniformMemberUse",",,,%s,,,") a0) /// The attribute '%s' appears in both the implementation and the signature, but the attribute arguments differ. Only the attribute from the signature will be included in the compiled code. - /// (Originally from ..\FSComp.txt:1054) + /// (Originally from ..\FSComp.txt:1056) static member tcAttribArgsDiffer(a0 : System.String) = (1200, GetStringFunc("tcAttribArgsDiffer",",,,%s,,,") a0) /// Cannot call an abstract base member: '%s' - /// (Originally from ..\FSComp.txt:1055) + /// (Originally from ..\FSComp.txt:1057) static member tcCannotCallAbstractBaseMember(a0 : System.String) = (1201, GetStringFunc("tcCannotCallAbstractBaseMember",",,,%s,,,") a0) /// Could not resolve the ambiguity in the use of a generic construct with an 'unmanaged' constraint at or near this position - /// (Originally from ..\FSComp.txt:1056) + /// (Originally from ..\FSComp.txt:1058) static member typrelCannotResolveAmbiguityInUnmanaged() = (1202, GetStringFunc("typrelCannotResolveAmbiguityInUnmanaged",",,,") ) /// This construct is for ML compatibility. %s. You can disable this warning by using '--mlcompatibility' or '--nowarn:62'. - /// (Originally from ..\FSComp.txt:1059) + /// (Originally from ..\FSComp.txt:1061) static member mlCompatMessage(a0 : System.String) = (GetStringFunc("mlCompatMessage",",,,%s,,,") a0) /// The type '%s' has been marked as having an Explicit layout, but the field '%s' has not been marked with the 'FieldOffset' attribute - /// (Originally from ..\FSComp.txt:1061) + /// (Originally from ..\FSComp.txt:1063) static member ilFieldDoesNotHaveValidOffsetForStructureLayout(a0 : System.String, a1 : System.String) = (1206, GetStringFunc("ilFieldDoesNotHaveValidOffsetForStructureLayout",",,,%s,,,%s,,,") a0 a1) /// Interfaces inherited by other interfaces should be declared using 'inherit ...' instead of 'interface ...' - /// (Originally from ..\FSComp.txt:1062) + /// (Originally from ..\FSComp.txt:1064) static member tcInterfacesShouldUseInheritNotInterface() = (1207, GetStringFunc("tcInterfacesShouldUseInheritNotInterface",",,,") ) /// Invalid prefix operator - /// (Originally from ..\FSComp.txt:1063) + /// (Originally from ..\FSComp.txt:1065) static member parsInvalidPrefixOperator() = (1208, GetStringFunc("parsInvalidPrefixOperator",",,,") ) /// Invalid operator definition. Prefix operator definitions must use a valid prefix operator name. - /// (Originally from ..\FSComp.txt:1064) + /// (Originally from ..\FSComp.txt:1066) static member parsInvalidPrefixOperatorDefinition() = (1208, GetStringFunc("parsInvalidPrefixOperatorDefinition",",,,") ) /// The file extensions '.ml' and '.mli' are for ML compatibility - /// (Originally from ..\FSComp.txt:1065) + /// (Originally from ..\FSComp.txt:1067) static member buildCompilingExtensionIsForML() = (GetStringFunc("buildCompilingExtensionIsForML",",,,") ) /// Consider using a file with extension '.ml' or '.mli' instead - /// (Originally from ..\FSComp.txt:1066) + /// (Originally from ..\FSComp.txt:1068) static member lexIndentOffForML() = (GetStringFunc("lexIndentOffForML",",,,") ) /// Active pattern '%s' is not a function - /// (Originally from ..\FSComp.txt:1067) + /// (Originally from ..\FSComp.txt:1069) static member activePatternIdentIsNotFunctionTyped(a0 : System.String) = (1209, GetStringFunc("activePatternIdentIsNotFunctionTyped",",,,%s,,,") a0) /// Active pattern '%s' has a result type containing type variables that are not determined by the input. The common cause is a when a result case is not mentioned, e.g. 'let (|A|B|) (x:int) = A x'. This can be fixed with a type constraint, e.g. 'let (|A|B|) (x:int) : Choice = A x' - /// (Originally from ..\FSComp.txt:1068) + /// (Originally from ..\FSComp.txt:1070) static member activePatternChoiceHasFreeTypars(a0 : System.String) = (1210, GetStringFunc("activePatternChoiceHasFreeTypars",",,,%s,,,") a0) /// The FieldOffset attribute can only be placed on members of types marked with the StructLayout(LayoutKind.Explicit) - /// (Originally from ..\FSComp.txt:1069) + /// (Originally from ..\FSComp.txt:1071) static member ilFieldHasOffsetForSequentialLayout() = (1211, GetStringFunc("ilFieldHasOffsetForSequentialLayout",",,,") ) /// Optional arguments must come at the end of the argument list, after any non-optional arguments - /// (Originally from ..\FSComp.txt:1070) + /// (Originally from ..\FSComp.txt:1072) static member tcOptionalArgsMustComeAfterNonOptionalArgs() = (1212, GetStringFunc("tcOptionalArgsMustComeAfterNonOptionalArgs",",,,") ) /// Attribute 'System.Diagnostics.ConditionalAttribute' is only valid on methods or attribute classes - /// (Originally from ..\FSComp.txt:1071) + /// (Originally from ..\FSComp.txt:1073) static member tcConditionalAttributeUsage() = (1213, GetStringFunc("tcConditionalAttributeUsage",",,,") ) /// Extension members cannot provide operator overloads. Consider defining the operator as part of the type definition instead. - /// (Originally from ..\FSComp.txt:1073) + /// (Originally from ..\FSComp.txt:1075) static member tcMemberOperatorDefinitionInExtrinsic() = (1215, GetStringFunc("tcMemberOperatorDefinitionInExtrinsic",",,,") ) /// The name of the MDB file must be .mdb. The --pdb option will be ignored. - /// (Originally from ..\FSComp.txt:1074) + /// (Originally from ..\FSComp.txt:1076) static member ilwriteMDBFileNameCannotBeChangedWarning() = (1216, GetStringFunc("ilwriteMDBFileNameCannotBeChangedWarning",",,,") ) /// MDB generation failed. Could not find compatible member %s - /// (Originally from ..\FSComp.txt:1075) + /// (Originally from ..\FSComp.txt:1077) static member ilwriteMDBMemberMissing(a0 : System.String) = (1217, GetStringFunc("ilwriteMDBMemberMissing",",,,%s,,,") a0) /// Cannot generate MDB debug information. Failed to load the 'MonoSymbolWriter' type from the 'Mono.CompilerServices.SymbolWriter.dll' assembly. - /// (Originally from ..\FSComp.txt:1076) + /// (Originally from ..\FSComp.txt:1078) static member ilwriteErrorCreatingMdb() = (1218, GetStringFunc("ilwriteErrorCreatingMdb",",,,") ) /// The union case named '%s' conflicts with the generated type '%s' - /// (Originally from ..\FSComp.txt:1077) + /// (Originally from ..\FSComp.txt:1079) static member tcUnionCaseNameConflictsWithGeneratedType(a0 : System.String, a1 : System.String) = (1219, GetStringFunc("tcUnionCaseNameConflictsWithGeneratedType",",,,%s,,,%s,,,") a0 a1) /// ReflectedDefinitionAttribute may not be applied to an instance member on a struct type, because the instance member takes an implicit 'this' byref parameter - /// (Originally from ..\FSComp.txt:1078) + /// (Originally from ..\FSComp.txt:1080) static member chkNoReflectedDefinitionOnStructMember() = (1220, GetStringFunc("chkNoReflectedDefinitionOnStructMember",",,,") ) /// DLLImport bindings must be static members in a class or function definitions in a module - /// (Originally from ..\FSComp.txt:1079) + /// (Originally from ..\FSComp.txt:1081) static member tcDllImportNotAllowed() = (1221, GetStringFunc("tcDllImportNotAllowed",",,,") ) /// When mscorlib.dll or FSharp.Core.dll is explicitly referenced the %s option must also be passed - /// (Originally from ..\FSComp.txt:1080) + /// (Originally from ..\FSComp.txt:1082) static member buildExplicitCoreLibRequiresNoFramework(a0 : System.String) = (1222, GetStringFunc("buildExplicitCoreLibRequiresNoFramework",",,,%s,,,") a0) /// FSharp.Core.sigdata not found alongside FSharp.Core. File expected in %s. Consider upgrading to a more recent version of FSharp.Core, where this file is no longer be required. - /// (Originally from ..\FSComp.txt:1081) + /// (Originally from ..\FSComp.txt:1083) static member buildExpectedSigdataFile(a0 : System.String) = (1223, GetStringFunc("buildExpectedSigdataFile",",,,%s,,,") a0) /// File '%s' not found alongside FSharp.Core. File expected in %s. Consider upgrading to a more recent version of FSharp.Core, where this file is no longer be required. - /// (Originally from ..\FSComp.txt:1082) + /// (Originally from ..\FSComp.txt:1084) static member buildExpectedFileAlongSideFSharpCore(a0 : System.String, a1 : System.String) = (1225, GetStringFunc("buildExpectedFileAlongSideFSharpCore",",,,%s,,,%s,,,") a0 a1) /// Filename '%s' contains invalid character '%s' - /// (Originally from ..\FSComp.txt:1083) + /// (Originally from ..\FSComp.txt:1085) static member buildUnexpectedFileNameCharacter(a0 : System.String, a1 : System.String) = (1227, GetStringFunc("buildUnexpectedFileNameCharacter",",,,%s,,,%s,,,") a0 a1) /// 'use!' bindings must be of the form 'use! = ' - /// (Originally from ..\FSComp.txt:1084) + /// (Originally from ..\FSComp.txt:1086) static member tcInvalidUseBangBinding() = (1228, GetStringFunc("tcInvalidUseBangBinding",",,,") ) /// Inner generic functions are not permitted in quoted expressions. Consider adding some type constraints until this function is no longer generic. - /// (Originally from ..\FSComp.txt:1085) + /// (Originally from ..\FSComp.txt:1087) static member crefNoInnerGenericsInQuotations() = (1230, GetStringFunc("crefNoInnerGenericsInQuotations",",,,") ) /// The type '%s' is not a valid enumerator type , i.e. does not have a 'MoveNext()' method returning a bool, and a 'Current' property - /// (Originally from ..\FSComp.txt:1086) + /// (Originally from ..\FSComp.txt:1088) static member tcEnumTypeCannotBeEnumerated(a0 : System.String) = (1231, GetStringFunc("tcEnumTypeCannotBeEnumerated",",,,%s,,,") a0) /// End of file in triple-quote string begun at or before here - /// (Originally from ..\FSComp.txt:1087) + /// (Originally from ..\FSComp.txt:1089) static member parsEofInTripleQuoteString() = (1232, GetStringFunc("parsEofInTripleQuoteString",",,,") ) /// End of file in triple-quote string embedded in comment begun at or before here - /// (Originally from ..\FSComp.txt:1088) + /// (Originally from ..\FSComp.txt:1090) static member parsEofInTripleQuoteStringInComment() = (1233, GetStringFunc("parsEofInTripleQuoteStringInComment",",,,") ) /// This type test or downcast will ignore the unit-of-measure '%s' - /// (Originally from ..\FSComp.txt:1089) + /// (Originally from ..\FSComp.txt:1091) static member tcTypeTestLosesMeasures(a0 : System.String) = (1240, GetStringFunc("tcTypeTestLosesMeasures",",,,%s,,,") a0) /// Expected type argument or static argument - /// (Originally from ..\FSComp.txt:1090) + /// (Originally from ..\FSComp.txt:1092) static member parsMissingTypeArgs() = (1241, GetStringFunc("parsMissingTypeArgs",",,,") ) /// Unmatched '<'. Expected closing '>' - /// (Originally from ..\FSComp.txt:1091) + /// (Originally from ..\FSComp.txt:1093) static member parsMissingGreaterThan() = (1242, GetStringFunc("parsMissingGreaterThan",",,,") ) /// Unexpected quotation operator '<@' in type definition. If you intend to pass a verbatim string as a static argument to a type provider, put a space between the '<' and '@' characters. - /// (Originally from ..\FSComp.txt:1092) + /// (Originally from ..\FSComp.txt:1094) static member parsUnexpectedQuotationOperatorInTypeAliasDidYouMeanVerbatimString() = (1243, GetStringFunc("parsUnexpectedQuotationOperatorInTypeAliasDidYouMeanVerbatimString",",,,") ) /// Attempted to parse this as an operator name, but failed - /// (Originally from ..\FSComp.txt:1093) + /// (Originally from ..\FSComp.txt:1095) static member parsErrorParsingAsOperatorName() = (1244, GetStringFunc("parsErrorParsingAsOperatorName",",,,") ) /// \U%s is not a valid Unicode character escape sequence - /// (Originally from ..\FSComp.txt:1094) + /// (Originally from ..\FSComp.txt:1096) static member lexInvalidUnicodeLiteral(a0 : System.String) = (1245, GetStringFunc("lexInvalidUnicodeLiteral",",,,%s,,,") a0) /// '%s' must be applied to an argument of type '%s', but has been applied to an argument of type '%s' - /// (Originally from ..\FSComp.txt:1095) + /// (Originally from ..\FSComp.txt:1097) static member tcCallerInfoWrongType(a0 : System.String, a1 : System.String, a2 : System.String) = (1246, GetStringFunc("tcCallerInfoWrongType",",,,%s,,,%s,,,%s,,,") a0 a1 a2) /// '%s' can only be applied to optional arguments - /// (Originally from ..\FSComp.txt:1096) + /// (Originally from ..\FSComp.txt:1098) static member tcCallerInfoNotOptional(a0 : System.String) = (1247, GetStringFunc("tcCallerInfoNotOptional",",,,%s,,,") a0) /// The specified .NET Framework version '%s' is not supported. Please specify a value from the enumeration Microsoft.Build.Utilities.TargetDotNetFrameworkVersion. - /// (Originally from ..\FSComp.txt:1098) + /// (Originally from ..\FSComp.txt:1100) static member toolLocationHelperUnsupportedFrameworkVersion(a0 : System.String) = (1300, GetStringFunc("toolLocationHelperUnsupportedFrameworkVersion",",,,%s,,,") a0) /// Invalid Magic value in CLR Header - /// (Originally from ..\FSComp.txt:1102) + /// (Originally from ..\FSComp.txt:1104) static member ilSignInvalidMagicValue() = (1301, GetStringFunc("ilSignInvalidMagicValue",",,,") ) /// Bad image format - /// (Originally from ..\FSComp.txt:1103) + /// (Originally from ..\FSComp.txt:1105) static member ilSignBadImageFormat() = (1302, GetStringFunc("ilSignBadImageFormat",",,,") ) /// Private key expected - /// (Originally from ..\FSComp.txt:1104) + /// (Originally from ..\FSComp.txt:1106) static member ilSignPrivateKeyExpected() = (1303, GetStringFunc("ilSignPrivateKeyExpected",",,,") ) /// RSA key expected - /// (Originally from ..\FSComp.txt:1105) + /// (Originally from ..\FSComp.txt:1107) static member ilSignRsaKeyExpected() = (1304, GetStringFunc("ilSignRsaKeyExpected",",,,") ) /// Invalid bit Length - /// (Originally from ..\FSComp.txt:1106) + /// (Originally from ..\FSComp.txt:1108) static member ilSignInvalidBitLen() = (1305, GetStringFunc("ilSignInvalidBitLen",",,,") ) /// Invalid RSAParameters structure - '{0}' expected - /// (Originally from ..\FSComp.txt:1107) + /// (Originally from ..\FSComp.txt:1109) static member ilSignInvalidRSAParams() = (1306, GetStringFunc("ilSignInvalidRSAParams",",,,") ) /// Invalid algId - 'Exponent' expected - /// (Originally from ..\FSComp.txt:1108) + /// (Originally from ..\FSComp.txt:1110) static member ilSignInvalidAlgId() = (1307, GetStringFunc("ilSignInvalidAlgId",",,,") ) /// Invalid signature size - /// (Originally from ..\FSComp.txt:1109) + /// (Originally from ..\FSComp.txt:1111) static member ilSignInvalidSignatureSize() = (1308, GetStringFunc("ilSignInvalidSignatureSize",",,,") ) /// No signature directory - /// (Originally from ..\FSComp.txt:1110) + /// (Originally from ..\FSComp.txt:1112) static member ilSignNoSignatureDirectory() = (1309, GetStringFunc("ilSignNoSignatureDirectory",",,,") ) /// Invalid Public Key blob - /// (Originally from ..\FSComp.txt:1111) + /// (Originally from ..\FSComp.txt:1113) static member ilSignInvalidPKBlob() = (1310, GetStringFunc("ilSignInvalidPKBlob",",,,") ) /// Exiting - too many errors - /// (Originally from ..\FSComp.txt:1113) + /// (Originally from ..\FSComp.txt:1115) static member fscTooManyErrors() = (GetStringFunc("fscTooManyErrors",",,,") ) /// The documentation file has no .xml suffix - /// (Originally from ..\FSComp.txt:1114) + /// (Originally from ..\FSComp.txt:1116) static member docfileNoXmlSuffix() = (2001, GetStringFunc("docfileNoXmlSuffix",",,,") ) /// No implementation files specified - /// (Originally from ..\FSComp.txt:1115) + /// (Originally from ..\FSComp.txt:1117) static member fscNoImplementationFiles() = (2002, GetStringFunc("fscNoImplementationFiles",",,,") ) /// An %s specified version '%s', but this value is invalid and has been ignored - /// (Originally from ..\FSComp.txt:1116) + /// (Originally from ..\FSComp.txt:1118) static member fscBadAssemblyVersion(a0 : System.String, a1 : System.String) = (2003, GetStringFunc("fscBadAssemblyVersion",",,,%s,,,%s,,,") a0 a1) /// Conflicting options specified: 'win32manifest' and 'win32res'. Only one of these can be used. - /// (Originally from ..\FSComp.txt:1117) + /// (Originally from ..\FSComp.txt:1119) static member fscTwoResourceManifests() = (2004, GetStringFunc("fscTwoResourceManifests",",,,") ) /// The code in assembly '%s' makes uses of quotation literals. Static linking may not include components that make use of quotation literals unless all assemblies are compiled with at least F# 4.0. - /// (Originally from ..\FSComp.txt:1118) + /// (Originally from ..\FSComp.txt:1120) static member fscQuotationLiteralsStaticLinking(a0 : System.String) = (2005, GetStringFunc("fscQuotationLiteralsStaticLinking",",,,%s,,,") a0) /// Code in this assembly makes uses of quotation literals. Static linking may not include components that make use of quotation literals unless all assemblies are compiled with at least F# 4.0. - /// (Originally from ..\FSComp.txt:1119) + /// (Originally from ..\FSComp.txt:1121) static member fscQuotationLiteralsStaticLinking0() = (2006, GetStringFunc("fscQuotationLiteralsStaticLinking0",",,,") ) /// Static linking may not include a .EXE - /// (Originally from ..\FSComp.txt:1120) + /// (Originally from ..\FSComp.txt:1122) static member fscStaticLinkingNoEXE() = (2007, GetStringFunc("fscStaticLinkingNoEXE",",,,") ) /// Static linking may not include a mixed managed/unmanaged DLL - /// (Originally from ..\FSComp.txt:1121) + /// (Originally from ..\FSComp.txt:1123) static member fscStaticLinkingNoMixedDLL() = (2008, GetStringFunc("fscStaticLinkingNoMixedDLL",",,,") ) /// Ignoring mixed managed/unmanaged assembly '%s' during static linking - /// (Originally from ..\FSComp.txt:1122) + /// (Originally from ..\FSComp.txt:1124) static member fscIgnoringMixedWhenLinking(a0 : System.String) = (2009, GetStringFunc("fscIgnoringMixedWhenLinking",",,,%s,,,") a0) /// Assembly '%s' was referenced transitively and the assembly could not be resolved automatically. Static linking will assume this DLL has no dependencies on the F# library or other statically linked DLLs. Consider adding an explicit reference to this DLL. - /// (Originally from ..\FSComp.txt:1123) + /// (Originally from ..\FSComp.txt:1125) static member fscAssumeStaticLinkContainsNoDependencies(a0 : System.String) = (2011, GetStringFunc("fscAssumeStaticLinkContainsNoDependencies",",,,%s,,,") a0) /// Assembly '%s' not found in dependency set of target binary. Statically linked roots should be specified using an assembly name, without a DLL or EXE extension. If this assembly was referenced explicitly then it is possible the assembly was not actually required by the generated binary, in which case it should not be statically linked. - /// (Originally from ..\FSComp.txt:1124) + /// (Originally from ..\FSComp.txt:1126) static member fscAssemblyNotFoundInDependencySet(a0 : System.String) = (2012, GetStringFunc("fscAssemblyNotFoundInDependencySet",",,,%s,,,") a0) /// The key file '%s' could not be opened - /// (Originally from ..\FSComp.txt:1125) + /// (Originally from ..\FSComp.txt:1127) static member fscKeyFileCouldNotBeOpened(a0 : System.String) = (2013, GetStringFunc("fscKeyFileCouldNotBeOpened",",,,%s,,,") a0) /// A problem occurred writing the binary '%s': %s - /// (Originally from ..\FSComp.txt:1126) + /// (Originally from ..\FSComp.txt:1128) static member fscProblemWritingBinary(a0 : System.String, a1 : System.String) = (2014, GetStringFunc("fscProblemWritingBinary",",,,%s,,,%s,,,") a0 a1) /// The 'AssemblyVersionAttribute' has been ignored because a version was given using a command line option - /// (Originally from ..\FSComp.txt:1127) + /// (Originally from ..\FSComp.txt:1129) static member fscAssemblyVersionAttributeIgnored() = (2015, GetStringFunc("fscAssemblyVersionAttributeIgnored",",,,") ) /// Error emitting 'System.Reflection.AssemblyCultureAttribute' attribute -- 'Executables cannot be satellite assemblies, Culture should always be empty' - /// (Originally from ..\FSComp.txt:1128) + /// (Originally from ..\FSComp.txt:1130) static member fscAssemblyCultureAttributeError() = (2016, GetStringFunc("fscAssemblyCultureAttributeError",",,,") ) /// Option '--delaysign' overrides attribute 'System.Reflection.AssemblyDelaySignAttribute' given in a source file or added module - /// (Originally from ..\FSComp.txt:1129) + /// (Originally from ..\FSComp.txt:1131) static member fscDelaySignWarning() = (2017, GetStringFunc("fscDelaySignWarning",",,,") ) /// Option '--keyfile' overrides attribute 'System.Reflection.AssemblyKeyFileAttribute' given in a source file or added module - /// (Originally from ..\FSComp.txt:1130) + /// (Originally from ..\FSComp.txt:1132) static member fscKeyFileWarning() = (2018, GetStringFunc("fscKeyFileWarning",",,,") ) /// Option '--keycontainer' overrides attribute 'System.Reflection.AssemblyNameAttribute' given in a source file or added module - /// (Originally from ..\FSComp.txt:1131) + /// (Originally from ..\FSComp.txt:1133) static member fscKeyNameWarning() = (2019, GetStringFunc("fscKeyNameWarning",",,,") ) /// The assembly '%s' is listed on the command line. Assemblies should be referenced using a command line flag such as '-r'. - /// (Originally from ..\FSComp.txt:1132) + /// (Originally from ..\FSComp.txt:1134) static member fscReferenceOnCommandLine(a0 : System.String) = (2020, GetStringFunc("fscReferenceOnCommandLine",",,,%s,,,") a0) /// The resident compilation service was not used because a problem occured in communicating with the server. - /// (Originally from ..\FSComp.txt:1133) + /// (Originally from ..\FSComp.txt:1135) static member fscRemotingError() = (2021, GetStringFunc("fscRemotingError",",,,") ) /// Problem with filename '%s': Illegal characters in path. - /// (Originally from ..\FSComp.txt:1134) + /// (Originally from ..\FSComp.txt:1136) static member pathIsInvalid(a0 : System.String) = (2022, GetStringFunc("pathIsInvalid",",,,%s,,,") a0) /// Passing a .resx file (%s) as a source file to the compiler is deprecated. Use resgen.exe to transform the .resx file into a .resources file to pass as a --resource option. If you are using MSBuild, this can be done via an item in the .fsproj project file. - /// (Originally from ..\FSComp.txt:1135) + /// (Originally from ..\FSComp.txt:1137) static member fscResxSourceFileDeprecated(a0 : System.String) = (2023, GetStringFunc("fscResxSourceFileDeprecated",",,,%s,,,") a0) /// Static linking may not be used on an assembly referencing mscorlib (e.g. a .NET Framework assembly) when generating an assembly that references System.Runtime (e.g. a .NET Core or Portable assembly). - /// (Originally from ..\FSComp.txt:1136) + /// (Originally from ..\FSComp.txt:1138) static member fscStaticLinkingNoProfileMismatches() = (2024, GetStringFunc("fscStaticLinkingNoProfileMismatches",",,,") ) /// An %s specified version '%s', but this value is a wildcard, and you have requested a deterministic build, these are in conflict. - /// (Originally from ..\FSComp.txt:1137) + /// (Originally from ..\FSComp.txt:1139) static member fscAssemblyWildcardAndDeterminism(a0 : System.String, a1 : System.String) = (2025, GetStringFunc("fscAssemblyWildcardAndDeterminism",",,,%s,,,%s,,,") a0 a1) /// Determinstic builds only support portable PDBs (--debug:portable or --debug:embedded) - /// (Originally from ..\FSComp.txt:1138) + /// (Originally from ..\FSComp.txt:1140) static member fscDeterministicDebugRequiresPortablePdb() = (2026, GetStringFunc("fscDeterministicDebugRequiresPortablePdb",",,,") ) /// Character '%s' is not allowed in provided namespace name '%s' - /// (Originally from ..\FSComp.txt:1139) + /// (Originally from ..\FSComp.txt:1141) static member etIllegalCharactersInNamespaceName(a0 : System.String, a1 : System.String) = (3000, GetStringFunc("etIllegalCharactersInNamespaceName",",,,%s,,,%s,,,") a0 a1) /// The provided type '%s' returned a member with a null or empty member name - /// (Originally from ..\FSComp.txt:1140) + /// (Originally from ..\FSComp.txt:1142) static member etNullOrEmptyMemberName(a0 : System.String) = (3001, GetStringFunc("etNullOrEmptyMemberName",",,,%s,,,") a0) /// The provided type '%s' returned a null member - /// (Originally from ..\FSComp.txt:1141) + /// (Originally from ..\FSComp.txt:1143) static member etNullMember(a0 : System.String) = (3002, GetStringFunc("etNullMember",",,,%s,,,") a0) /// The provided type '%s' member info '%s' has null declaring type - /// (Originally from ..\FSComp.txt:1142) + /// (Originally from ..\FSComp.txt:1144) static member etNullMemberDeclaringType(a0 : System.String, a1 : System.String) = (3003, GetStringFunc("etNullMemberDeclaringType",",,,%s,,,%s,,,") a0 a1) /// The provided type '%s' has member '%s' which has declaring type '%s'. Expected declaring type to be the same as provided type. - /// (Originally from ..\FSComp.txt:1143) + /// (Originally from ..\FSComp.txt:1145) static member etNullMemberDeclaringTypeDifferentFromProvidedType(a0 : System.String, a1 : System.String, a2 : System.String) = (3004, GetStringFunc("etNullMemberDeclaringTypeDifferentFromProvidedType",",,,%s,,,%s,,,%s,,,") a0 a1 a2) /// Referenced assembly '%s' has assembly level attribute '%s' but no public type provider classes were found - /// (Originally from ..\FSComp.txt:1144) + /// (Originally from ..\FSComp.txt:1146) static member etHostingAssemblyFoundWithoutHosts(a0 : System.String, a1 : System.String) = (3005, GetStringFunc("etHostingAssemblyFoundWithoutHosts",",,,%s,,,%s,,,") a0 a1) /// Type '%s' from type provider '%s' has an empty namespace. Use 'null' for the global namespace. - /// (Originally from ..\FSComp.txt:1145) + /// (Originally from ..\FSComp.txt:1147) static member etEmptyNamespaceOfTypeNotAllowed(a0 : System.String, a1 : System.String) = (3006, GetStringFunc("etEmptyNamespaceOfTypeNotAllowed",",,,%s,,,%s,,,") a0 a1) /// Empty namespace found from the type provider '%s'. Use 'null' for the global namespace. - /// (Originally from ..\FSComp.txt:1146) + /// (Originally from ..\FSComp.txt:1148) static member etEmptyNamespaceNotAllowed(a0 : System.String) = (3007, GetStringFunc("etEmptyNamespaceNotAllowed",",,,%s,,,") a0) /// Provided type '%s' has 'IsGenericType' as true, but generic types are not supported. - /// (Originally from ..\FSComp.txt:1147) + /// (Originally from ..\FSComp.txt:1149) static member etMustNotBeGeneric(a0 : System.String) = (3011, GetStringFunc("etMustNotBeGeneric",",,,%s,,,") a0) /// Provided type '%s' has 'IsArray' as true, but array types are not supported. - /// (Originally from ..\FSComp.txt:1148) + /// (Originally from ..\FSComp.txt:1150) static member etMustNotBeAnArray(a0 : System.String) = (3013, GetStringFunc("etMustNotBeAnArray",",,,%s,,,") a0) /// Invalid member '%s' on provided type '%s'. Provided type members must be public, and not be generic, virtual, or abstract. - /// (Originally from ..\FSComp.txt:1149) + /// (Originally from ..\FSComp.txt:1151) static member etMethodHasRequirements(a0 : System.String, a1 : System.String) = (3014, GetStringFunc("etMethodHasRequirements",",,,%s,,,%s,,,") a0 a1) /// Invalid member '%s' on provided type '%s'. Only properties, methods and constructors are allowed - /// (Originally from ..\FSComp.txt:1150) + /// (Originally from ..\FSComp.txt:1152) static member etUnsupportedMemberKind(a0 : System.String, a1 : System.String) = (3015, GetStringFunc("etUnsupportedMemberKind",",,,%s,,,%s,,,") a0 a1) /// Property '%s' on provided type '%s' has CanRead=true but there was no value from GetGetMethod() - /// (Originally from ..\FSComp.txt:1151) + /// (Originally from ..\FSComp.txt:1153) static member etPropertyCanReadButHasNoGetter(a0 : System.String, a1 : System.String) = (3016, GetStringFunc("etPropertyCanReadButHasNoGetter",",,,%s,,,%s,,,") a0 a1) /// Property '%s' on provided type '%s' has CanRead=false but GetGetMethod() returned a method - /// (Originally from ..\FSComp.txt:1152) + /// (Originally from ..\FSComp.txt:1154) static member etPropertyHasGetterButNoCanRead(a0 : System.String, a1 : System.String) = (3017, GetStringFunc("etPropertyHasGetterButNoCanRead",",,,%s,,,%s,,,") a0 a1) /// Property '%s' on provided type '%s' has CanWrite=true but there was no value from GetSetMethod() - /// (Originally from ..\FSComp.txt:1153) + /// (Originally from ..\FSComp.txt:1155) static member etPropertyCanWriteButHasNoSetter(a0 : System.String, a1 : System.String) = (3018, GetStringFunc("etPropertyCanWriteButHasNoSetter",",,,%s,,,%s,,,") a0 a1) /// Property '%s' on provided type '%s' has CanWrite=false but GetSetMethod() returned a method - /// (Originally from ..\FSComp.txt:1154) + /// (Originally from ..\FSComp.txt:1156) static member etPropertyHasSetterButNoCanWrite(a0 : System.String, a1 : System.String) = (3019, GetStringFunc("etPropertyHasSetterButNoCanWrite",",,,%s,,,%s,,,") a0 a1) /// One or more errors seen during provided type setup - /// (Originally from ..\FSComp.txt:1155) + /// (Originally from ..\FSComp.txt:1157) static member etOneOrMoreErrorsSeenDuringExtensionTypeSetting() = (3020, GetStringFunc("etOneOrMoreErrorsSeenDuringExtensionTypeSetting",",,,") ) /// Unexpected exception from provided type '%s' member '%s': %s - /// (Originally from ..\FSComp.txt:1156) + /// (Originally from ..\FSComp.txt:1158) static member etUnexpectedExceptionFromProvidedTypeMember(a0 : System.String, a1 : System.String, a2 : System.String) = (3021, GetStringFunc("etUnexpectedExceptionFromProvidedTypeMember",",,,%s,,,%s,,,%s,,,") a0 a1 a2) /// Unsupported constant type '%s'. Quotations provided by type providers can only contain simple constants. The implementation of the type provider may need to be adjusted by moving a value declared outside a provided quotation literal to be a 'let' binding inside the quotation literal. - /// (Originally from ..\FSComp.txt:1157) + /// (Originally from ..\FSComp.txt:1159) static member etUnsupportedConstantType(a0 : System.String) = (3022, GetStringFunc("etUnsupportedConstantType",",,,%s,,,") a0) /// Unsupported expression '%s' from type provider. If you are the author of this type provider, consider adjusting it to provide a different provided expression. - /// (Originally from ..\FSComp.txt:1158) + /// (Originally from ..\FSComp.txt:1160) static member etUnsupportedProvidedExpression(a0 : System.String) = (3025, GetStringFunc("etUnsupportedProvidedExpression",",,,%s,,,") a0) /// Expected provided type named '%s' but provided type has 'Name' with value '%s' - /// (Originally from ..\FSComp.txt:1159) + /// (Originally from ..\FSComp.txt:1161) static member etProvidedTypeHasUnexpectedName(a0 : System.String, a1 : System.String) = (3028, GetStringFunc("etProvidedTypeHasUnexpectedName",",,,%s,,,%s,,,") a0 a1) /// Event '%s' on provided type '%s' has no value from GetAddMethod() - /// (Originally from ..\FSComp.txt:1160) + /// (Originally from ..\FSComp.txt:1162) static member etEventNoAdd(a0 : System.String, a1 : System.String) = (3029, GetStringFunc("etEventNoAdd",",,,%s,,,%s,,,") a0 a1) /// Event '%s' on provided type '%s' has no value from GetRemoveMethod() - /// (Originally from ..\FSComp.txt:1161) + /// (Originally from ..\FSComp.txt:1163) static member etEventNoRemove(a0 : System.String, a1 : System.String) = (3030, GetStringFunc("etEventNoRemove",",,,%s,,,%s,,,") a0 a1) /// Assembly attribute '%s' refers to a designer assembly '%s' which cannot be loaded or doesn't exist. %s - /// (Originally from ..\FSComp.txt:1162) + /// (Originally from ..\FSComp.txt:1164) static member etProviderHasWrongDesignerAssembly(a0 : System.String, a1 : System.String, a2 : System.String) = (3031, GetStringFunc("etProviderHasWrongDesignerAssembly",",,,%s,,,%s,,,%s,,,") a0 a1 a2) /// The type provider does not have a valid constructor. A constructor taking either no arguments or one argument of type 'TypeProviderConfig' was expected. - /// (Originally from ..\FSComp.txt:1163) + /// (Originally from ..\FSComp.txt:1165) static member etProviderDoesNotHaveValidConstructor() = (3032, GetStringFunc("etProviderDoesNotHaveValidConstructor",",,,") ) /// The type provider '%s' reported an error: %s - /// (Originally from ..\FSComp.txt:1164) + /// (Originally from ..\FSComp.txt:1166) static member etProviderError(a0 : System.String, a1 : System.String) = (3033, GetStringFunc("etProviderError",",,,%s,,,%s,,,") a0 a1) /// The type provider '%s' used an invalid parameter in the ParameterExpression: %s - /// (Originally from ..\FSComp.txt:1165) + /// (Originally from ..\FSComp.txt:1167) static member etIncorrectParameterExpression(a0 : System.String, a1 : System.String) = (3034, GetStringFunc("etIncorrectParameterExpression",",,,%s,,,%s,,,") a0 a1) /// The type provider '%s' provided a method with a name '%s' and metadata token '%d', which is not reported among its methods of its declaring type '%s' - /// (Originally from ..\FSComp.txt:1166) + /// (Originally from ..\FSComp.txt:1168) static member etIncorrectProvidedMethod(a0 : System.String, a1 : System.String, a2 : System.Int32, a3 : System.String) = (3035, GetStringFunc("etIncorrectProvidedMethod",",,,%s,,,%s,,,%d,,,%s,,,") a0 a1 a2 a3) /// The type provider '%s' provided a constructor which is not reported among the constructors of its declaring type '%s' - /// (Originally from ..\FSComp.txt:1167) + /// (Originally from ..\FSComp.txt:1169) static member etIncorrectProvidedConstructor(a0 : System.String, a1 : System.String) = (3036, GetStringFunc("etIncorrectProvidedConstructor",",,,%s,,,%s,,,") a0 a1) /// A direct reference to the generated type '%s' is not permitted. Instead, use a type definition, e.g. 'type TypeAlias = '. This indicates that a type provider adds generated types to your assembly. - /// (Originally from ..\FSComp.txt:1168) + /// (Originally from ..\FSComp.txt:1170) static member etDirectReferenceToGeneratedTypeNotAllowed(a0 : System.String) = (3039, GetStringFunc("etDirectReferenceToGeneratedTypeNotAllowed",",,,%s,,,") a0) /// Expected provided type with path '%s' but provided type has path '%s' - /// (Originally from ..\FSComp.txt:1169) + /// (Originally from ..\FSComp.txt:1171) static member etProvidedTypeHasUnexpectedPath(a0 : System.String, a1 : System.String) = (3041, GetStringFunc("etProvidedTypeHasUnexpectedPath",",,,%s,,,%s,,,") a0 a1) /// Unexpected 'null' return value from provided type '%s' member '%s' - /// (Originally from ..\FSComp.txt:1170) + /// (Originally from ..\FSComp.txt:1172) static member etUnexpectedNullFromProvidedTypeMember(a0 : System.String, a1 : System.String) = (3042, GetStringFunc("etUnexpectedNullFromProvidedTypeMember",",,,%s,,,%s,,,") a0 a1) /// Unexpected exception from member '%s' of provided type '%s' member '%s': %s - /// (Originally from ..\FSComp.txt:1171) + /// (Originally from ..\FSComp.txt:1173) static member etUnexpectedExceptionFromProvidedMemberMember(a0 : System.String, a1 : System.String, a2 : System.String, a3 : System.String) = (3043, GetStringFunc("etUnexpectedExceptionFromProvidedMemberMember",",,,%s,,,%s,,,%s,,,%s,,,") a0 a1 a2 a3) /// Nested provided types do not take static arguments or generic parameters - /// (Originally from ..\FSComp.txt:1172) + /// (Originally from ..\FSComp.txt:1174) static member etNestedProvidedTypesDoNotTakeStaticArgumentsOrGenericParameters() = (3044, GetStringFunc("etNestedProvidedTypesDoNotTakeStaticArgumentsOrGenericParameters",",,,") ) /// Invalid static argument to provided type. Expected an argument of kind '%s'. - /// (Originally from ..\FSComp.txt:1173) + /// (Originally from ..\FSComp.txt:1175) static member etInvalidStaticArgument(a0 : System.String) = (3045, GetStringFunc("etInvalidStaticArgument",",,,%s,,,") a0) /// An error occured applying the static arguments to a provided type - /// (Originally from ..\FSComp.txt:1174) + /// (Originally from ..\FSComp.txt:1176) static member etErrorApplyingStaticArgumentsToType() = (3046, GetStringFunc("etErrorApplyingStaticArgumentsToType",",,,") ) /// Unknown static argument kind '%s' when resolving a reference to a provided type or method '%s' - /// (Originally from ..\FSComp.txt:1175) + /// (Originally from ..\FSComp.txt:1177) static member etUnknownStaticArgumentKind(a0 : System.String, a1 : System.String) = (3047, GetStringFunc("etUnknownStaticArgumentKind",",,,%s,,,%s,,,") a0 a1) /// invalid namespace for provided type - /// (Originally from ..\FSComp.txt:1176) + /// (Originally from ..\FSComp.txt:1178) static member invalidNamespaceForProvidedType() = (GetStringFunc("invalidNamespaceForProvidedType",",,,") ) /// invalid full name for provided type - /// (Originally from ..\FSComp.txt:1177) + /// (Originally from ..\FSComp.txt:1179) static member invalidFullNameForProvidedType() = (GetStringFunc("invalidFullNameForProvidedType",",,,") ) /// The type provider returned 'null', which is not a valid return value from '%s' - /// (Originally from ..\FSComp.txt:1179) + /// (Originally from ..\FSComp.txt:1181) static member etProviderReturnedNull(a0 : System.String) = (3051, GetStringFunc("etProviderReturnedNull",",,,%s,,,") a0) /// The type provider constructor has thrown an exception: %s - /// (Originally from ..\FSComp.txt:1180) + /// (Originally from ..\FSComp.txt:1182) static member etTypeProviderConstructorException(a0 : System.String) = (3053, GetStringFunc("etTypeProviderConstructorException",",,,%s,,,") a0) /// Type provider '%s' returned null from GetInvokerExpression. - /// (Originally from ..\FSComp.txt:1181) + /// (Originally from ..\FSComp.txt:1183) static member etNullProvidedExpression(a0 : System.String) = (3056, GetStringFunc("etNullProvidedExpression",",,,%s,,,") a0) /// The type provider '%s' returned an invalid type from 'ApplyStaticArguments'. A type with name '%s' was expected, but a type with name '%s' was returned. - /// (Originally from ..\FSComp.txt:1182) + /// (Originally from ..\FSComp.txt:1184) static member etProvidedAppliedTypeHadWrongName(a0 : System.String, a1 : System.String, a2 : System.String) = (3057, GetStringFunc("etProvidedAppliedTypeHadWrongName",",,,%s,,,%s,,,%s,,,") a0 a1 a2) /// The type provider '%s' returned an invalid method from 'ApplyStaticArgumentsForMethod'. A method with name '%s' was expected, but a method with name '%s' was returned. - /// (Originally from ..\FSComp.txt:1183) + /// (Originally from ..\FSComp.txt:1185) static member etProvidedAppliedMethodHadWrongName(a0 : System.String, a1 : System.String, a2 : System.String) = (3058, GetStringFunc("etProvidedAppliedMethodHadWrongName",",,,%s,,,%s,,,%s,,,") a0 a1 a2) /// This type test or downcast will erase the provided type '%s' to the type '%s' - /// (Originally from ..\FSComp.txt:1184) + /// (Originally from ..\FSComp.txt:1186) static member tcTypeTestLossy(a0 : System.String, a1 : System.String) = (3060, GetStringFunc("tcTypeTestLossy",",,,%s,,,%s,,,") a0 a1) /// This downcast will erase the provided type '%s' to the type '%s'. - /// (Originally from ..\FSComp.txt:1185) + /// (Originally from ..\FSComp.txt:1187) static member tcTypeCastErased(a0 : System.String, a1 : System.String) = (3061, GetStringFunc("tcTypeCastErased",",,,%s,,,%s,,,") a0 a1) /// This type test with a provided type '%s' is not allowed because this provided type will be erased to '%s' at runtime. - /// (Originally from ..\FSComp.txt:1186) + /// (Originally from ..\FSComp.txt:1188) static member tcTypeTestErased(a0 : System.String, a1 : System.String) = (3062, GetStringFunc("tcTypeTestErased",",,,%s,,,%s,,,") a0 a1) /// Cannot inherit from erased provided type - /// (Originally from ..\FSComp.txt:1187) + /// (Originally from ..\FSComp.txt:1189) static member tcCannotInheritFromErasedType() = (3063, GetStringFunc("tcCannotInheritFromErasedType",",,,") ) /// Assembly '%s' hase TypeProviderAssembly attribute with invalid value '%s'. The value should be a valid assembly name - /// (Originally from ..\FSComp.txt:1188) + /// (Originally from ..\FSComp.txt:1190) static member etInvalidTypeProviderAssemblyName(a0 : System.String, a1 : System.String) = (3065, GetStringFunc("etInvalidTypeProviderAssemblyName",",,,%s,,,%s,,,") a0 a1) /// Invalid member name. Members may not have name '.ctor' or '.cctor' - /// (Originally from ..\FSComp.txt:1189) + /// (Originally from ..\FSComp.txt:1191) static member tcInvalidMemberNameCtor() = (3066, GetStringFunc("tcInvalidMemberNameCtor",",,,") ) /// The function or member '%s' is used in a way that requires further type annotations at its definition to ensure consistency of inferred types. The inferred signature is '%s'. - /// (Originally from ..\FSComp.txt:1190) + /// (Originally from ..\FSComp.txt:1192) static member tcInferredGenericTypeGivesRiseToInconsistency(a0 : System.String, a1 : System.String) = (3068, GetStringFunc("tcInferredGenericTypeGivesRiseToInconsistency",",,,%s,,,%s,,,") a0 a1) /// The number of type arguments did not match: '%d' given, '%d' expected. This may be related to a previously reported error. - /// (Originally from ..\FSComp.txt:1191) + /// (Originally from ..\FSComp.txt:1193) static member tcInvalidTypeArgumentCount(a0 : System.Int32, a1 : System.Int32) = (3069, GetStringFunc("tcInvalidTypeArgumentCount",",,,%d,,,%d,,,") a0 a1) /// Cannot override inherited member '%s' because it is sealed - /// (Originally from ..\FSComp.txt:1192) + /// (Originally from ..\FSComp.txt:1194) static member tcCannotOverrideSealedMethod(a0 : System.String) = (3070, GetStringFunc("tcCannotOverrideSealedMethod",",,,%s,,,") a0) /// The type provider '%s' reported an error in the context of provided type '%s', member '%s'. The error: %s - /// (Originally from ..\FSComp.txt:1193) + /// (Originally from ..\FSComp.txt:1195) static member etProviderErrorWithContext(a0 : System.String, a1 : System.String, a2 : System.String, a3 : System.String) = (3071, GetStringFunc("etProviderErrorWithContext",",,,%s,,,%s,,,%s,,,%s,,,") a0 a1 a2 a3) /// An exception occurred when accessing the '%s' of a provided type: %s - /// (Originally from ..\FSComp.txt:1194) + /// (Originally from ..\FSComp.txt:1196) static member etProvidedTypeWithNameException(a0 : System.String, a1 : System.String) = (3072, GetStringFunc("etProvidedTypeWithNameException",",,,%s,,,%s,,,") a0 a1) /// The '%s' of a provided type was null or empty. - /// (Originally from ..\FSComp.txt:1195) + /// (Originally from ..\FSComp.txt:1197) static member etProvidedTypeWithNullOrEmptyName(a0 : System.String) = (3073, GetStringFunc("etProvidedTypeWithNullOrEmptyName",",,,%s,,,") a0) /// Character '%s' is not allowed in provided type name '%s' - /// (Originally from ..\FSComp.txt:1196) + /// (Originally from ..\FSComp.txt:1198) static member etIllegalCharactersInTypeName(a0 : System.String, a1 : System.String) = (3075, GetStringFunc("etIllegalCharactersInTypeName",",,,%s,,,%s,,,") a0 a1) /// In queries, '%s' must use a simple pattern - /// (Originally from ..\FSComp.txt:1197) + /// (Originally from ..\FSComp.txt:1199) static member tcJoinMustUseSimplePattern(a0 : System.String) = (3077, GetStringFunc("tcJoinMustUseSimplePattern",",,,%s,,,") a0) /// A custom query operation for '%s' is required but not specified - /// (Originally from ..\FSComp.txt:1198) + /// (Originally from ..\FSComp.txt:1200) static member tcMissingCustomOperation(a0 : System.String) = (3078, GetStringFunc("tcMissingCustomOperation",",,,%s,,,") a0) /// Named static arguments must come after all unnamed static arguments - /// (Originally from ..\FSComp.txt:1199) + /// (Originally from ..\FSComp.txt:1201) static member etBadUnnamedStaticArgs() = (3080, GetStringFunc("etBadUnnamedStaticArgs",",,,") ) /// The static parameter '%s' of the provided type or method '%s' requires a value. Static parameters to type providers may be optionally specified using named arguments, e.g. '%s<%s=...>'. - /// (Originally from ..\FSComp.txt:1200) + /// (Originally from ..\FSComp.txt:1202) static member etStaticParameterRequiresAValue(a0 : System.String, a1 : System.String, a2 : System.String, a3 : System.String) = (3081, GetStringFunc("etStaticParameterRequiresAValue",",,,%s,,,%s,,,%s,,,%s,,,") a0 a1 a2 a3) /// No static parameter exists with name '%s' - /// (Originally from ..\FSComp.txt:1201) + /// (Originally from ..\FSComp.txt:1203) static member etNoStaticParameterWithName(a0 : System.String) = (3082, GetStringFunc("etNoStaticParameterWithName",",,,%s,,,") a0) /// The static parameter '%s' has already been given a value - /// (Originally from ..\FSComp.txt:1202) + /// (Originally from ..\FSComp.txt:1204) static member etStaticParameterAlreadyHasValue(a0 : System.String) = (3083, GetStringFunc("etStaticParameterAlreadyHasValue",",,,%s,,,") a0) /// Multiple static parameters exist with name '%s' - /// (Originally from ..\FSComp.txt:1203) + /// (Originally from ..\FSComp.txt:1205) static member etMultipleStaticParameterWithName(a0 : System.String) = (3084, GetStringFunc("etMultipleStaticParameterWithName",",,,%s,,,") a0) /// A custom operation may not be used in conjunction with a non-value or recursive 'let' binding in another part of this computation expression - /// (Originally from ..\FSComp.txt:1204) + /// (Originally from ..\FSComp.txt:1206) static member tcCustomOperationMayNotBeUsedInConjunctionWithNonSimpleLetBindings() = (3085, GetStringFunc("tcCustomOperationMayNotBeUsedInConjunctionWithNonSimpleLetBindings",",,,") ) /// A custom operation may not be used in conjunction with 'use', 'try/with', 'try/finally', 'if/then/else' or 'match' operators within this computation expression - /// (Originally from ..\FSComp.txt:1205) + /// (Originally from ..\FSComp.txt:1207) static member tcCustomOperationMayNotBeUsedHere() = (3086, GetStringFunc("tcCustomOperationMayNotBeUsedHere",",,,") ) /// The custom operation '%s' refers to a method which is overloaded. The implementations of custom operations may not be overloaded. - /// (Originally from ..\FSComp.txt:1206) + /// (Originally from ..\FSComp.txt:1208) static member tcCustomOperationMayNotBeOverloaded(a0 : System.String) = (3087, GetStringFunc("tcCustomOperationMayNotBeOverloaded",",,,%s,,,") a0) /// An if/then/else expression may not be used within queries. Consider using either an if/then expression, or use a sequence expression instead. - /// (Originally from ..\FSComp.txt:1207) + /// (Originally from ..\FSComp.txt:1209) static member tcIfThenElseMayNotBeUsedWithinQueries() = (3090, GetStringFunc("tcIfThenElseMayNotBeUsedWithinQueries",",,,") ) /// Invalid argument to 'methodhandleof' during codegen - /// (Originally from ..\FSComp.txt:1208) + /// (Originally from ..\FSComp.txt:1210) static member ilxgenUnexpectedArgumentToMethodHandleOfDuringCodegen() = (3091, GetStringFunc("ilxgenUnexpectedArgumentToMethodHandleOfDuringCodegen",",,,") ) /// A reference to a provided type was missing a value for the static parameter '%s'. You may need to recompile one or more referenced assemblies. - /// (Originally from ..\FSComp.txt:1209) + /// (Originally from ..\FSComp.txt:1211) static member etProvidedTypeReferenceMissingArgument(a0 : System.String) = (3092, GetStringFunc("etProvidedTypeReferenceMissingArgument",",,,%s,,,") a0) /// A reference to a provided type had an invalid value '%s' for a static parameter. You may need to recompile one or more referenced assemblies. - /// (Originally from ..\FSComp.txt:1210) + /// (Originally from ..\FSComp.txt:1212) static member etProvidedTypeReferenceInvalidText(a0 : System.String) = (3093, GetStringFunc("etProvidedTypeReferenceInvalidText",",,,%s,,,") a0) /// '%s' is not used correctly. This is a custom operation in this query or computation expression. - /// (Originally from ..\FSComp.txt:1211) + /// (Originally from ..\FSComp.txt:1213) static member tcCustomOperationNotUsedCorrectly(a0 : System.String) = (3095, GetStringFunc("tcCustomOperationNotUsedCorrectly",",,,%s,,,") a0) /// '%s' is not used correctly. Usage: %s. This is a custom operation in this query or computation expression. - /// (Originally from ..\FSComp.txt:1212) + /// (Originally from ..\FSComp.txt:1214) static member tcCustomOperationNotUsedCorrectly2(a0 : System.String, a1 : System.String) = (3095, GetStringFunc("tcCustomOperationNotUsedCorrectly2",",,,%s,,,%s,,,") a0 a1) /// %s var in collection %s (outerKey = innerKey). Note that parentheses are required after '%s' - /// (Originally from ..\FSComp.txt:1213) + /// (Originally from ..\FSComp.txt:1215) static member customOperationTextLikeJoin(a0 : System.String, a1 : System.String, a2 : System.String) = (GetStringFunc("customOperationTextLikeJoin",",,,%s,,,%s,,,%s,,,") a0 a1 a2) /// %s var in collection %s (outerKey = innerKey) into group. Note that parentheses are required after '%s' - /// (Originally from ..\FSComp.txt:1214) + /// (Originally from ..\FSComp.txt:1216) static member customOperationTextLikeGroupJoin(a0 : System.String, a1 : System.String, a2 : System.String) = (GetStringFunc("customOperationTextLikeGroupJoin",",,,%s,,,%s,,,%s,,,") a0 a1 a2) /// %s var in collection - /// (Originally from ..\FSComp.txt:1215) + /// (Originally from ..\FSComp.txt:1217) static member customOperationTextLikeZip(a0 : System.String) = (GetStringFunc("customOperationTextLikeZip",",,,%s,,,") a0) /// '%s' must be followed by a variable name. Usage: %s. - /// (Originally from ..\FSComp.txt:1216) + /// (Originally from ..\FSComp.txt:1218) static member tcBinaryOperatorRequiresVariable(a0 : System.String, a1 : System.String) = (3096, GetStringFunc("tcBinaryOperatorRequiresVariable",",,,%s,,,%s,,,") a0 a1) /// Incorrect syntax for '%s'. Usage: %s. - /// (Originally from ..\FSComp.txt:1217) + /// (Originally from ..\FSComp.txt:1219) static member tcOperatorIncorrectSyntax(a0 : System.String, a1 : System.String) = (3097, GetStringFunc("tcOperatorIncorrectSyntax",",,,%s,,,%s,,,") a0 a1) /// '%s' must come after a 'for' selection clause and be followed by the rest of the query. Syntax: ... %s ... - /// (Originally from ..\FSComp.txt:1218) + /// (Originally from ..\FSComp.txt:1220) static member tcBinaryOperatorRequiresBody(a0 : System.String, a1 : System.String) = (3098, GetStringFunc("tcBinaryOperatorRequiresBody",",,,%s,,,%s,,,") a0 a1) /// '%s' is used with an incorrect number of arguments. This is a custom operation in this query or computation expression. Expected %d argument(s), but given %d. - /// (Originally from ..\FSComp.txt:1219) + /// (Originally from ..\FSComp.txt:1221) static member tcCustomOperationHasIncorrectArgCount(a0 : System.String, a1 : System.Int32, a2 : System.Int32) = (3099, GetStringFunc("tcCustomOperationHasIncorrectArgCount",",,,%s,,,%d,,,%d,,,") a0 a1 a2) /// Expected an expression after this point - /// (Originally from ..\FSComp.txt:1220) + /// (Originally from ..\FSComp.txt:1222) static member parsExpectedExpressionAfterToken() = (3100, GetStringFunc("parsExpectedExpressionAfterToken",",,,") ) /// Expected a type after this point - /// (Originally from ..\FSComp.txt:1221) + /// (Originally from ..\FSComp.txt:1223) static member parsExpectedTypeAfterToken() = (3101, GetStringFunc("parsExpectedTypeAfterToken",",,,") ) /// Unmatched '[<'. Expected closing '>]' - /// (Originally from ..\FSComp.txt:1222) + /// (Originally from ..\FSComp.txt:1224) static member parsUnmatchedLBrackLess() = (3102, GetStringFunc("parsUnmatchedLBrackLess",",,,") ) /// Unexpected end of input in 'match' expression. Expected 'match with | -> | -> ...'. - /// (Originally from ..\FSComp.txt:1223) + /// (Originally from ..\FSComp.txt:1225) static member parsUnexpectedEndOfFileMatch() = (3103, GetStringFunc("parsUnexpectedEndOfFileMatch",",,,") ) /// Unexpected end of input in 'try' expression. Expected 'try with ' or 'try finally '. - /// (Originally from ..\FSComp.txt:1224) + /// (Originally from ..\FSComp.txt:1226) static member parsUnexpectedEndOfFileTry() = (3104, GetStringFunc("parsUnexpectedEndOfFileTry",",,,") ) /// Unexpected end of input in 'while' expression. Expected 'while do '. - /// (Originally from ..\FSComp.txt:1225) + /// (Originally from ..\FSComp.txt:1227) static member parsUnexpectedEndOfFileWhile() = (3105, GetStringFunc("parsUnexpectedEndOfFileWhile",",,,") ) /// Unexpected end of input in 'for' expression. Expected 'for in do '. - /// (Originally from ..\FSComp.txt:1226) + /// (Originally from ..\FSComp.txt:1228) static member parsUnexpectedEndOfFileFor() = (3106, GetStringFunc("parsUnexpectedEndOfFileFor",",,,") ) /// Unexpected end of input in 'match' or 'try' expression - /// (Originally from ..\FSComp.txt:1227) + /// (Originally from ..\FSComp.txt:1229) static member parsUnexpectedEndOfFileWith() = (3107, GetStringFunc("parsUnexpectedEndOfFileWith",",,,") ) /// Unexpected end of input in 'then' branch of conditional expression. Expected 'if then ' or 'if then else '. - /// (Originally from ..\FSComp.txt:1228) + /// (Originally from ..\FSComp.txt:1230) static member parsUnexpectedEndOfFileThen() = (3108, GetStringFunc("parsUnexpectedEndOfFileThen",",,,") ) /// Unexpected end of input in 'else' branch of conditional expression. Expected 'if then ' or 'if then else '. - /// (Originally from ..\FSComp.txt:1229) + /// (Originally from ..\FSComp.txt:1231) static member parsUnexpectedEndOfFileElse() = (3109, GetStringFunc("parsUnexpectedEndOfFileElse",",,,") ) /// Unexpected end of input in body of lambda expression. Expected 'fun ... -> '. - /// (Originally from ..\FSComp.txt:1230) + /// (Originally from ..\FSComp.txt:1232) static member parsUnexpectedEndOfFileFunBody() = (3110, GetStringFunc("parsUnexpectedEndOfFileFunBody",",,,") ) /// Unexpected end of input in type arguments - /// (Originally from ..\FSComp.txt:1231) + /// (Originally from ..\FSComp.txt:1233) static member parsUnexpectedEndOfFileTypeArgs() = (3111, GetStringFunc("parsUnexpectedEndOfFileTypeArgs",",,,") ) /// Unexpected end of input in type signature - /// (Originally from ..\FSComp.txt:1232) + /// (Originally from ..\FSComp.txt:1234) static member parsUnexpectedEndOfFileTypeSignature() = (3112, GetStringFunc("parsUnexpectedEndOfFileTypeSignature",",,,") ) /// Unexpected end of input in type definition - /// (Originally from ..\FSComp.txt:1233) + /// (Originally from ..\FSComp.txt:1235) static member parsUnexpectedEndOfFileTypeDefinition() = (3113, GetStringFunc("parsUnexpectedEndOfFileTypeDefinition",",,,") ) /// Unexpected end of input in object members - /// (Originally from ..\FSComp.txt:1234) + /// (Originally from ..\FSComp.txt:1236) static member parsUnexpectedEndOfFileObjectMembers() = (3114, GetStringFunc("parsUnexpectedEndOfFileObjectMembers",",,,") ) /// Unexpected end of input in value, function or member definition - /// (Originally from ..\FSComp.txt:1235) + /// (Originally from ..\FSComp.txt:1237) static member parsUnexpectedEndOfFileDefinition() = (3115, GetStringFunc("parsUnexpectedEndOfFileDefinition",",,,") ) /// Unexpected end of input in expression - /// (Originally from ..\FSComp.txt:1236) + /// (Originally from ..\FSComp.txt:1238) static member parsUnexpectedEndOfFileExpression() = (3116, GetStringFunc("parsUnexpectedEndOfFileExpression",",,,") ) /// Unexpected end of type. Expected a name after this point. - /// (Originally from ..\FSComp.txt:1237) + /// (Originally from ..\FSComp.txt:1239) static member parsExpectedNameAfterToken() = (3117, GetStringFunc("parsExpectedNameAfterToken",",,,") ) /// Incomplete value or function definition. If this is in an expression, the body of the expression must be indented to the same column as the 'let' keyword. - /// (Originally from ..\FSComp.txt:1238) + /// (Originally from ..\FSComp.txt:1240) static member parsUnmatchedLet() = (3118, GetStringFunc("parsUnmatchedLet",",,,") ) /// Incomplete value definition. If this is in an expression, the body of the expression must be indented to the same column as the 'let!' keyword. - /// (Originally from ..\FSComp.txt:1239) + /// (Originally from ..\FSComp.txt:1241) static member parsUnmatchedLetBang() = (3119, GetStringFunc("parsUnmatchedLetBang",",,,") ) /// Incomplete value definition. If this is in an expression, the body of the expression must be indented to the same column as the 'use!' keyword. - /// (Originally from ..\FSComp.txt:1240) + /// (Originally from ..\FSComp.txt:1242) static member parsUnmatchedUseBang() = (3120, GetStringFunc("parsUnmatchedUseBang",",,,") ) /// Incomplete value definition. If this is in an expression, the body of the expression must be indented to the same column as the 'use' keyword. - /// (Originally from ..\FSComp.txt:1241) + /// (Originally from ..\FSComp.txt:1243) static member parsUnmatchedUse() = (3121, GetStringFunc("parsUnmatchedUse",",,,") ) /// Missing 'do' in 'while' expression. Expected 'while do '. - /// (Originally from ..\FSComp.txt:1242) + /// (Originally from ..\FSComp.txt:1244) static member parsWhileDoExpected() = (3122, GetStringFunc("parsWhileDoExpected",",,,") ) /// Missing 'do' in 'for' expression. Expected 'for in do '. - /// (Originally from ..\FSComp.txt:1243) + /// (Originally from ..\FSComp.txt:1245) static member parsForDoExpected() = (3123, GetStringFunc("parsForDoExpected",",,,") ) /// Invalid join relation in '%s'. Expected 'expr expr', where is =, =?, ?= or ?=?. - /// (Originally from ..\FSComp.txt:1244) + /// (Originally from ..\FSComp.txt:1246) static member tcInvalidRelationInJoin(a0 : System.String) = (3125, GetStringFunc("tcInvalidRelationInJoin",",,,%s,,,") a0) /// Calls - /// (Originally from ..\FSComp.txt:1245) + /// (Originally from ..\FSComp.txt:1247) static member typeInfoCallsWord() = (GetStringFunc("typeInfoCallsWord",",,,") ) /// Invalid number of generic arguments to type '%s' in provided type. Expected '%d' arguments, given '%d'. - /// (Originally from ..\FSComp.txt:1246) + /// (Originally from ..\FSComp.txt:1248) static member impInvalidNumberOfGenericArguments(a0 : System.String, a1 : System.Int32, a2 : System.Int32) = (3126, GetStringFunc("impInvalidNumberOfGenericArguments",",,,%s,,,%d,,,%d,,,") a0 a1 a2) /// Invalid value '%s' for unit-of-measure parameter '%s' - /// (Originally from ..\FSComp.txt:1247) + /// (Originally from ..\FSComp.txt:1249) static member impInvalidMeasureArgument1(a0 : System.String, a1 : System.String) = (3127, GetStringFunc("impInvalidMeasureArgument1",",,,%s,,,%s,,,") a0 a1) /// Invalid value unit-of-measure parameter '%s' - /// (Originally from ..\FSComp.txt:1248) + /// (Originally from ..\FSComp.txt:1250) static member impInvalidMeasureArgument2(a0 : System.String) = (3127, GetStringFunc("impInvalidMeasureArgument2",",,,%s,,,") a0) /// Property '%s' on provided type '%s' is neither readable nor writable as it has CanRead=false and CanWrite=false - /// (Originally from ..\FSComp.txt:1249) + /// (Originally from ..\FSComp.txt:1251) static member etPropertyNeedsCanWriteOrCanRead(a0 : System.String, a1 : System.String) = (3128, GetStringFunc("etPropertyNeedsCanWriteOrCanRead",",,,%s,,,%s,,,") a0 a1) /// A use of 'into' must be followed by the remainder of the computation - /// (Originally from ..\FSComp.txt:1250) + /// (Originally from ..\FSComp.txt:1252) static member tcIntoNeedsRestOfQuery() = (3129, GetStringFunc("tcIntoNeedsRestOfQuery",",,,") ) /// The operator '%s' does not accept the use of 'into' - /// (Originally from ..\FSComp.txt:1251) + /// (Originally from ..\FSComp.txt:1253) static member tcOperatorDoesntAcceptInto(a0 : System.String) = (3130, GetStringFunc("tcOperatorDoesntAcceptInto",",,,%s,,,") a0) /// The definition of the custom operator '%s' does not use a valid combination of attribute flags - /// (Originally from ..\FSComp.txt:1252) + /// (Originally from ..\FSComp.txt:1254) static member tcCustomOperationInvalid(a0 : System.String) = (3131, GetStringFunc("tcCustomOperationInvalid",",,,%s,,,") a0) /// This type definition may not have the 'CLIMutable' attribute. Only record types may have this attribute. - /// (Originally from ..\FSComp.txt:1253) + /// (Originally from ..\FSComp.txt:1255) static member tcThisTypeMayNotHaveACLIMutableAttribute() = (3132, GetStringFunc("tcThisTypeMayNotHaveACLIMutableAttribute",",,,") ) /// 'member val' definitions are only permitted in types with a primary constructor. Consider adding arguments to your type definition, e.g. 'type X(args) = ...'. - /// (Originally from ..\FSComp.txt:1254) + /// (Originally from ..\FSComp.txt:1256) static member tcAutoPropertyRequiresImplicitConstructionSequence() = (3133, GetStringFunc("tcAutoPropertyRequiresImplicitConstructionSequence",",,,") ) /// Property definitions may not be declared mutable. To indicate that this property can be set, use 'member val PropertyName = expr with get,set'. - /// (Originally from ..\FSComp.txt:1255) + /// (Originally from ..\FSComp.txt:1257) static member parsMutableOnAutoPropertyShouldBeGetSet() = (3134, GetStringFunc("parsMutableOnAutoPropertyShouldBeGetSet",",,,") ) /// To indicate that this property can be set, use 'member val PropertyName = expr with get,set'. - /// (Originally from ..\FSComp.txt:1256) + /// (Originally from ..\FSComp.txt:1258) static member parsMutableOnAutoPropertyShouldBeGetSetNotJustSet() = (3135, GetStringFunc("parsMutableOnAutoPropertyShouldBeGetSetNotJustSet",",,,") ) /// Type '%s' is illegal because in byref, T cannot contain byref types. - /// (Originally from ..\FSComp.txt:1257) + /// (Originally from ..\FSComp.txt:1259) static member chkNoByrefsOfByrefs(a0 : System.String) = (3136, GetStringFunc("chkNoByrefsOfByrefs",",,,%s,,,") a0) /// F# supports array ranks between 1 and 32. The value %d is not allowed. - /// (Originally from ..\FSComp.txt:1258) + /// (Originally from ..\FSComp.txt:1260) static member tastopsMaxArrayThirtyTwo(a0 : System.Int32) = (3138, GetStringFunc("tastopsMaxArrayThirtyTwo",",,,%d,,,") a0) /// In queries, use the form 'for x in n .. m do ...' for ranging over integers - /// (Originally from ..\FSComp.txt:1259) + /// (Originally from ..\FSComp.txt:1261) static member tcNoIntegerForLoopInQuery() = (3139, GetStringFunc("tcNoIntegerForLoopInQuery",",,,") ) /// 'while' expressions may not be used in queries - /// (Originally from ..\FSComp.txt:1260) + /// (Originally from ..\FSComp.txt:1262) static member tcNoWhileInQuery() = (3140, GetStringFunc("tcNoWhileInQuery",",,,") ) /// 'try/finally' expressions may not be used in queries - /// (Originally from ..\FSComp.txt:1261) + /// (Originally from ..\FSComp.txt:1263) static member tcNoTryFinallyInQuery() = (3141, GetStringFunc("tcNoTryFinallyInQuery",",,,") ) /// 'use' expressions may not be used in queries - /// (Originally from ..\FSComp.txt:1262) + /// (Originally from ..\FSComp.txt:1264) static member tcUseMayNotBeUsedInQueries() = (3142, GetStringFunc("tcUseMayNotBeUsedInQueries",",,,") ) /// 'let!', 'use!' and 'do!' expressions may not be used in queries - /// (Originally from ..\FSComp.txt:1263) + /// (Originally from ..\FSComp.txt:1265) static member tcBindMayNotBeUsedInQueries() = (3143, GetStringFunc("tcBindMayNotBeUsedInQueries",",,,") ) /// 'return' and 'return!' may not be used in queries - /// (Originally from ..\FSComp.txt:1264) + /// (Originally from ..\FSComp.txt:1266) static member tcReturnMayNotBeUsedInQueries() = (3144, GetStringFunc("tcReturnMayNotBeUsedInQueries",",,,") ) /// This is not a known query operator. Query operators are identifiers such as 'select', 'where', 'sortBy', 'thenBy', 'groupBy', 'groupValBy', 'join', 'groupJoin', 'sumBy' and 'averageBy', defined using corresponding methods on the 'QueryBuilder' type. - /// (Originally from ..\FSComp.txt:1265) + /// (Originally from ..\FSComp.txt:1267) static member tcUnrecognizedQueryOperator() = (3145, GetStringFunc("tcUnrecognizedQueryOperator",",,,") ) /// 'try/with' expressions may not be used in queries - /// (Originally from ..\FSComp.txt:1266) + /// (Originally from ..\FSComp.txt:1268) static member tcTryWithMayNotBeUsedInQueries() = (3146, GetStringFunc("tcTryWithMayNotBeUsedInQueries",",,,") ) /// This 'let' definition may not be used in a query. Only simple value definitions may be used in queries. - /// (Originally from ..\FSComp.txt:1267) + /// (Originally from ..\FSComp.txt:1269) static member tcNonSimpleLetBindingInQuery() = (3147, GetStringFunc("tcNonSimpleLetBindingInQuery",",,,") ) /// Too many static parameters. Expected at most %d parameters, but got %d unnamed and %d named parameters. - /// (Originally from ..\FSComp.txt:1268) + /// (Originally from ..\FSComp.txt:1270) static member etTooManyStaticParameters(a0 : System.Int32, a1 : System.Int32, a2 : System.Int32) = (3148, GetStringFunc("etTooManyStaticParameters",",,,%d,,,%d,,,%d,,,") a0 a1 a2) /// Invalid provided literal value '%s' - /// (Originally from ..\FSComp.txt:1269) + /// (Originally from ..\FSComp.txt:1271) static member infosInvalidProvidedLiteralValue(a0 : System.String) = (3149, GetStringFunc("infosInvalidProvidedLiteralValue",",,,%s,,,") a0) /// The 'anycpu32bitpreferred' platform can only be used with EXE targets. You must use 'anycpu' instead. - /// (Originally from ..\FSComp.txt:1270) + /// (Originally from ..\FSComp.txt:1272) static member invalidPlatformTarget() = (3150, GetStringFunc("invalidPlatformTarget",",,,") ) /// This member, function or value declaration may not be declared 'inline' - /// (Originally from ..\FSComp.txt:1271) + /// (Originally from ..\FSComp.txt:1273) static member tcThisValueMayNotBeInlined() = (3151, GetStringFunc("tcThisValueMayNotBeInlined",",,,") ) /// The provider '%s' returned a non-generated type '%s' in the context of a set of generated types. Consider adjusting the type provider to only return generated types. - /// (Originally from ..\FSComp.txt:1272) + /// (Originally from ..\FSComp.txt:1274) static member etErasedTypeUsedInGeneration(a0 : System.String, a1 : System.String) = (3152, GetStringFunc("etErasedTypeUsedInGeneration",",,,%s,,,%s,,,") a0 a1) /// Arguments to query operators may require parentheses, e.g. 'where (x > y)' or 'groupBy (x.Length / 10)' - /// (Originally from ..\FSComp.txt:1273) + /// (Originally from ..\FSComp.txt:1275) static member tcUnrecognizedQueryBinaryOperator() = (3153, GetStringFunc("tcUnrecognizedQueryBinaryOperator",",,,") ) /// A quotation may not involve an assignment to or taking the address of a captured local variable - /// (Originally from ..\FSComp.txt:1274) + /// (Originally from ..\FSComp.txt:1276) static member crefNoSetOfHole() = (3155, GetStringFunc("crefNoSetOfHole",",,,") ) /// + 1 overload - /// (Originally from ..\FSComp.txt:1275) + /// (Originally from ..\FSComp.txt:1277) static member nicePrintOtherOverloads1() = (GetStringFunc("nicePrintOtherOverloads1",",,,") ) /// + %d overloads - /// (Originally from ..\FSComp.txt:1276) + /// (Originally from ..\FSComp.txt:1278) static member nicePrintOtherOverloadsN(a0 : System.Int32) = (GetStringFunc("nicePrintOtherOverloadsN",",,,%d,,,") a0) /// Erased to - /// (Originally from ..\FSComp.txt:1277) + /// (Originally from ..\FSComp.txt:1279) static member erasedTo() = (GetStringFunc("erasedTo",",,,") ) /// Unexpected token '%s' or incomplete expression - /// (Originally from ..\FSComp.txt:1278) + /// (Originally from ..\FSComp.txt:1280) static member parsUnfinishedExpression(a0 : System.String) = (3156, GetStringFunc("parsUnfinishedExpression",",,,%s,,,") a0) /// Cannot find code target for this attribute, possibly because the code after the attribute is incomplete. - /// (Originally from ..\FSComp.txt:1279) + /// (Originally from ..\FSComp.txt:1281) static member parsAttributeOnIncompleteCode() = (3158, GetStringFunc("parsAttributeOnIncompleteCode",",,,") ) /// Type name cannot be empty. - /// (Originally from ..\FSComp.txt:1280) + /// (Originally from ..\FSComp.txt:1282) static member parsTypeNameCannotBeEmpty() = (3159, GetStringFunc("parsTypeNameCannotBeEmpty",",,,") ) /// Problem reading assembly '%s': %s - /// (Originally from ..\FSComp.txt:1281) + /// (Originally from ..\FSComp.txt:1283) static member buildProblemReadingAssembly(a0 : System.String, a1 : System.String) = (3160, GetStringFunc("buildProblemReadingAssembly",",,,%s,,,%s,,,") a0 a1) /// Invalid provided field. Provided fields of erased provided types must be literals. - /// (Originally from ..\FSComp.txt:1282) + /// (Originally from ..\FSComp.txt:1284) static member tcTPFieldMustBeLiteral() = (3161, GetStringFunc("tcTPFieldMustBeLiteral",",,,") ) /// (loading description...) - /// (Originally from ..\FSComp.txt:1283) + /// (Originally from ..\FSComp.txt:1285) static member loadingDescription() = (GetStringFunc("loadingDescription",",,,") ) /// (description unavailable...) - /// (Originally from ..\FSComp.txt:1284) + /// (Originally from ..\FSComp.txt:1286) static member descriptionUnavailable() = (GetStringFunc("descriptionUnavailable",",,,") ) /// A type variable has been constrained by multiple different class types. A type variable may only have one class constraint. - /// (Originally from ..\FSComp.txt:1285) + /// (Originally from ..\FSComp.txt:1287) static member chkTyparMultipleClassConstraints() = (3162, GetStringFunc("chkTyparMultipleClassConstraints",",,,") ) /// 'match' expressions may not be used in queries - /// (Originally from ..\FSComp.txt:1286) + /// (Originally from ..\FSComp.txt:1288) static member tcMatchMayNotBeUsedWithQuery() = (3163, GetStringFunc("tcMatchMayNotBeUsedWithQuery",",,,") ) /// Infix operator member '%s' has %d initial argument(s). Expected a tuple of 3 arguments - /// (Originally from ..\FSComp.txt:1287) + /// (Originally from ..\FSComp.txt:1289) static member memberOperatorDefinitionWithNonTripleArgument(a0 : System.String, a1 : System.Int32) = (3164, GetStringFunc("memberOperatorDefinitionWithNonTripleArgument",",,,%s,,,%d,,,") a0 a1) /// The operator '%s' cannot be resolved. Consider opening the module 'Microsoft.FSharp.Linq.NullableOperators'. - /// (Originally from ..\FSComp.txt:1288) + /// (Originally from ..\FSComp.txt:1290) static member cannotResolveNullableOperators(a0 : System.String) = (3165, GetStringFunc("cannotResolveNullableOperators",",,,%s,,,") a0) /// '%s' must be followed by 'in'. Usage: %s. - /// (Originally from ..\FSComp.txt:1289) + /// (Originally from ..\FSComp.txt:1291) static member tcOperatorRequiresIn(a0 : System.String, a1 : System.String) = (3167, GetStringFunc("tcOperatorRequiresIn",",,,%s,,,%s,,,") a0 a1) /// Neither 'member val' nor 'override val' definitions are permitted in object expressions. - /// (Originally from ..\FSComp.txt:1290) + /// (Originally from ..\FSComp.txt:1292) static member parsIllegalMemberVarInObjectImplementation() = (3168, GetStringFunc("parsIllegalMemberVarInObjectImplementation",",,,") ) /// Copy-and-update record expressions must include at least one field. - /// (Originally from ..\FSComp.txt:1291) + /// (Originally from ..\FSComp.txt:1293) static member tcEmptyCopyAndUpdateRecordInvalid() = (3169, GetStringFunc("tcEmptyCopyAndUpdateRecordInvalid",",,,") ) /// '_' cannot be used as field name - /// (Originally from ..\FSComp.txt:1292) + /// (Originally from ..\FSComp.txt:1294) static member parsUnderscoreInvalidFieldName() = (3170, GetStringFunc("parsUnderscoreInvalidFieldName",",,,") ) /// The provided types generated by this use of a type provider may not be used from other F# assemblies and should be marked internal or private. Consider using 'type internal TypeName = ...' or 'type private TypeName = ...'. - /// (Originally from ..\FSComp.txt:1293) + /// (Originally from ..\FSComp.txt:1295) static member tcGeneratedTypesShouldBeInternalOrPrivate() = (3171, GetStringFunc("tcGeneratedTypesShouldBeInternalOrPrivate",",,,") ) /// A property's getter and setter must have the same type. Property '%s' has getter of type '%s' but setter of type '%s'. - /// (Originally from ..\FSComp.txt:1294) + /// (Originally from ..\FSComp.txt:1296) static member chkGetterAndSetterHaveSamePropertyType(a0 : System.String, a1 : System.String, a2 : System.String) = (3172, GetStringFunc("chkGetterAndSetterHaveSamePropertyType",",,,%s,,,%s,,,%s,,,") a0 a1 a2) /// Array method '%s' is supplied by the runtime and cannot be directly used in code. For operations with array elements consider using family of GetArray/SetArray functions from LanguagePrimitives.IntrinsicFunctions module. - /// (Originally from ..\FSComp.txt:1295) + /// (Originally from ..\FSComp.txt:1297) static member tcRuntimeSuppliedMethodCannotBeUsedInUserCode(a0 : System.String) = (3173, GetStringFunc("tcRuntimeSuppliedMethodCannotBeUsedInUserCode",",,,%s,,,") a0) /// Union case/exception '%s' does not have field named '%s'. - /// (Originally from ..\FSComp.txt:1296) + /// (Originally from ..\FSComp.txt:1298) static member tcUnionCaseConstructorDoesNotHaveFieldWithGivenName(a0 : System.String, a1 : System.String) = (3174, GetStringFunc("tcUnionCaseConstructorDoesNotHaveFieldWithGivenName",",,,%s,,,%s,,,") a0 a1) /// Union case/exception field '%s' cannot be used more than once. - /// (Originally from ..\FSComp.txt:1297) + /// (Originally from ..\FSComp.txt:1299) static member tcUnionCaseFieldCannotBeUsedMoreThanOnce(a0 : System.String) = (3175, GetStringFunc("tcUnionCaseFieldCannotBeUsedMoreThanOnce",",,,%s,,,") a0) /// Named field '%s' is used more than once. - /// (Originally from ..\FSComp.txt:1298) + /// (Originally from ..\FSComp.txt:1300) static member tcFieldNameIsUsedModeThanOnce(a0 : System.String) = (3176, GetStringFunc("tcFieldNameIsUsedModeThanOnce",",,,%s,,,") a0) /// Named field '%s' conflicts with autogenerated name for anonymous field. - /// (Originally from ..\FSComp.txt:1299) + /// (Originally from ..\FSComp.txt:1301) static member tcFieldNameConflictsWithGeneratedNameForAnonymousField(a0 : System.String) = (3176, GetStringFunc("tcFieldNameConflictsWithGeneratedNameForAnonymousField",",,,%s,,,") a0) /// This literal expression or attribute argument results in an arithmetic overflow. - /// (Originally from ..\FSComp.txt:1300) + /// (Originally from ..\FSComp.txt:1302) static member tastConstantExpressionOverflow() = (3177, GetStringFunc("tastConstantExpressionOverflow",",,,") ) /// This is not valid literal expression. The [] attribute will be ignored. - /// (Originally from ..\FSComp.txt:1301) + /// (Originally from ..\FSComp.txt:1303) static member tcIllegalStructTypeForConstantExpression() = (3178, GetStringFunc("tcIllegalStructTypeForConstantExpression",",,,") ) /// System.Runtime.InteropServices assembly is required to use UnknownWrapper\DispatchWrapper classes. - /// (Originally from ..\FSComp.txt:1302) + /// (Originally from ..\FSComp.txt:1304) static member fscSystemRuntimeInteropServicesIsRequired() = (3179, GetStringFunc("fscSystemRuntimeInteropServicesIsRequired",",,,") ) /// The mutable local '%s' is implicitly allocated as a reference cell because it has been captured by a closure. This warning is for informational purposes only to indicate where implicit allocations are performed. - /// (Originally from ..\FSComp.txt:1303) + /// (Originally from ..\FSComp.txt:1305) static member abImplicitHeapAllocation(a0 : System.String) = (3180, GetStringFunc("abImplicitHeapAllocation",",,,%s,,,") a0) /// A type provider implemented GetStaticParametersForMethod, but ApplyStaticArgumentsForMethod was not implemented or invalid - /// (Originally from ..\FSComp.txt:1304) + /// (Originally from ..\FSComp.txt:1306) static member estApplyStaticArgumentsForMethodNotImplemented() = (GetStringFunc("estApplyStaticArgumentsForMethodNotImplemented",",,,") ) /// An error occured applying the static arguments to a provided method - /// (Originally from ..\FSComp.txt:1305) + /// (Originally from ..\FSComp.txt:1307) static member etErrorApplyingStaticArgumentsToMethod() = (3181, GetStringFunc("etErrorApplyingStaticArgumentsToMethod",",,,") ) /// Unexpected character '%s' in preprocessor expression - /// (Originally from ..\FSComp.txt:1306) + /// (Originally from ..\FSComp.txt:1308) static member pplexUnexpectedChar(a0 : System.String) = (3182, GetStringFunc("pplexUnexpectedChar",",,,%s,,,") a0) /// Unexpected token '%s' in preprocessor expression - /// (Originally from ..\FSComp.txt:1307) + /// (Originally from ..\FSComp.txt:1309) static member ppparsUnexpectedToken(a0 : System.String) = (3183, GetStringFunc("ppparsUnexpectedToken",",,,%s,,,") a0) /// Incomplete preprocessor expression - /// (Originally from ..\FSComp.txt:1308) + /// (Originally from ..\FSComp.txt:1310) static member ppparsIncompleteExpression() = (3184, GetStringFunc("ppparsIncompleteExpression",",,,") ) /// Missing token '%s' in preprocessor expression - /// (Originally from ..\FSComp.txt:1309) + /// (Originally from ..\FSComp.txt:1311) static member ppparsMissingToken(a0 : System.String) = (3185, GetStringFunc("ppparsMissingToken",",,,%s,,,") a0) /// An error occurred while reading the F# metadata node at position %d in table '%s' of assembly '%s'. The node had no matching declaration. Please report this warning. You may need to recompile the F# assembly you are using. - /// (Originally from ..\FSComp.txt:1310) + /// (Originally from ..\FSComp.txt:1312) static member pickleMissingDefinition(a0 : System.Int32, a1 : System.String, a2 : System.String) = (3186, GetStringFunc("pickleMissingDefinition",",,,%d,,,%s,,,%s,,,") a0 a1 a2) /// Type inference caused the type variable %s to escape its scope. Consider adding an explicit type parameter declaration or adjusting your code to be less generic. - /// (Originally from ..\FSComp.txt:1311) + /// (Originally from ..\FSComp.txt:1313) static member checkNotSufficientlyGenericBecauseOfScope(a0 : System.String) = (3187, GetStringFunc("checkNotSufficientlyGenericBecauseOfScope",",,,%s,,,") a0) /// Type inference caused an inference type variable to escape its scope. Consider adding type annotations to make your code less generic. - /// (Originally from ..\FSComp.txt:1312) + /// (Originally from ..\FSComp.txt:1314) static member checkNotSufficientlyGenericBecauseOfScopeAnon() = (3188, GetStringFunc("checkNotSufficientlyGenericBecauseOfScopeAnon",",,,") ) /// Redundant arguments are being ignored in function '%s'. Expected %d but got %d arguments. - /// (Originally from ..\FSComp.txt:1313) + /// (Originally from ..\FSComp.txt:1315) static member checkRaiseFamilyFunctionArgumentCount(a0 : System.String, a1 : System.Int32, a2 : System.Int32) = (3189, GetStringFunc("checkRaiseFamilyFunctionArgumentCount",",,,%s,,,%d,,,%d,,,") a0 a1 a2) /// Lowercase literal '%s' is being shadowed by a new pattern with the same name. Only uppercase and module-prefixed literals can be used as named patterns. - /// (Originally from ..\FSComp.txt:1314) + /// (Originally from ..\FSComp.txt:1316) static member checkLowercaseLiteralBindingInPattern(a0 : System.String) = (3190, GetStringFunc("checkLowercaseLiteralBindingInPattern",",,,%s,,,") a0) /// This literal pattern does not take arguments - /// (Originally from ..\FSComp.txt:1315) + /// (Originally from ..\FSComp.txt:1317) static member tcLiteralDoesNotTakeArguments() = (3191, GetStringFunc("tcLiteralDoesNotTakeArguments",",,,") ) /// Constructors are not permitted as extension members - they must be defined as part of the original definition of the type - /// (Originally from ..\FSComp.txt:1316) + /// (Originally from ..\FSComp.txt:1318) static member tcConstructorsIllegalInAugmentation() = (3192, GetStringFunc("tcConstructorsIllegalInAugmentation",",,,") ) /// Invalid response file '%s' ( '%s' ) - /// (Originally from ..\FSComp.txt:1317) + /// (Originally from ..\FSComp.txt:1319) static member optsInvalidResponseFile(a0 : System.String, a1 : System.String) = (3193, GetStringFunc("optsInvalidResponseFile",",,,%s,,,%s,,,") a0 a1) /// Response file '%s' not found in '%s' - /// (Originally from ..\FSComp.txt:1318) + /// (Originally from ..\FSComp.txt:1320) static member optsResponseFileNotFound(a0 : System.String, a1 : System.String) = (3194, GetStringFunc("optsResponseFileNotFound",",,,%s,,,%s,,,") a0 a1) /// Response file name '%s' is empty, contains invalid characters, has a drive specification without an absolute path, or is too long - /// (Originally from ..\FSComp.txt:1319) + /// (Originally from ..\FSComp.txt:1321) static member optsResponseFileNameInvalid(a0 : System.String) = (3195, GetStringFunc("optsResponseFileNameInvalid",",,,%s,,,") a0) /// Cannot find FSharp.Core.dll in compiler's directory - /// (Originally from ..\FSComp.txt:1320) + /// (Originally from ..\FSComp.txt:1322) static member fsharpCoreNotFoundToBeCopied() = (3196, GetStringFunc("fsharpCoreNotFoundToBeCopied",",,,") ) /// One tuple type is a struct tuple, the other is a reference tuple - /// (Originally from ..\FSComp.txt:1321) + /// (Originally from ..\FSComp.txt:1323) static member tcTupleStructMismatch() = (GetStringFunc("tcTupleStructMismatch",",,,") ) /// This provided method requires static parameters - /// (Originally from ..\FSComp.txt:1322) + /// (Originally from ..\FSComp.txt:1324) static member etMissingStaticArgumentsToMethod() = (3197, GetStringFunc("etMissingStaticArgumentsToMethod",",,,") ) /// The conversion from %s to %s is a compile-time safe upcast, not a downcast. Consider using 'upcast' instead of 'downcast'. - /// (Originally from ..\FSComp.txt:1323) + /// (Originally from ..\FSComp.txt:1325) static member considerUpcast(a0 : System.String, a1 : System.String) = (3198, GetStringFunc("considerUpcast",",,,%s,,,%s,,,") a0 a1) /// The conversion from %s to %s is a compile-time safe upcast, not a downcast. Consider using the :> (upcast) operator instead of the :?> (downcast) operator. - /// (Originally from ..\FSComp.txt:1324) + /// (Originally from ..\FSComp.txt:1326) static member considerUpcastOperator(a0 : System.String, a1 : System.String) = (3198, GetStringFunc("considerUpcastOperator",",,,%s,,,%s,,,") a0 a1) /// The 'rec' on this module is implied by an outer 'rec' declaration and is being ignored - /// (Originally from ..\FSComp.txt:1325) + /// (Originally from ..\FSComp.txt:1327) static member tcRecImplied() = (3199, GetStringFunc("tcRecImplied",",,,") ) /// In a recursive declaration group, 'open' declarations must come first in each module - /// (Originally from ..\FSComp.txt:1326) + /// (Originally from ..\FSComp.txt:1328) static member tcOpenFirstInMutRec() = (3200, GetStringFunc("tcOpenFirstInMutRec",",,,") ) /// In a recursive declaration group, module abbreviations must come after all 'open' declarations and before other declarations - /// (Originally from ..\FSComp.txt:1327) + /// (Originally from ..\FSComp.txt:1329) static member tcModuleAbbrevFirstInMutRec() = (3201, GetStringFunc("tcModuleAbbrevFirstInMutRec",",,,") ) /// This declaration is not supported in recursive declaration groups - /// (Originally from ..\FSComp.txt:1328) + /// (Originally from ..\FSComp.txt:1330) static member tcUnsupportedMutRecDecl() = (3202, GetStringFunc("tcUnsupportedMutRecDecl",",,,") ) /// Invalid use of 'rec' keyword - /// (Originally from ..\FSComp.txt:1329) + /// (Originally from ..\FSComp.txt:1331) static member parsInvalidUseOfRec() = (3203, GetStringFunc("parsInvalidUseOfRec",",,,") ) /// If a union type has more than one case and is a struct, then all fields within the union type must be given unique names. - /// (Originally from ..\FSComp.txt:1330) + /// (Originally from ..\FSComp.txt:1332) static member tcStructUnionMultiCaseDistinctFields() = (3204, GetStringFunc("tcStructUnionMultiCaseDistinctFields",",,,") ) /// The CallerMemberNameAttribute applied to parameter '%s' will have no effect. It is overridden by the CallerFilePathAttribute. - /// (Originally from ..\FSComp.txt:1331) + /// (Originally from ..\FSComp.txt:1333) static member CallerMemberNameIsOverriden(a0 : System.String) = (3206, GetStringFunc("CallerMemberNameIsOverriden",",,,%s,,,") a0) /// Invalid use of 'fixed'. 'fixed' may only be used in a declaration of the form 'use x = fixed expr' where the expression is an array, the address of a field, the address of an array element or a string' - /// (Originally from ..\FSComp.txt:1332) + /// (Originally from ..\FSComp.txt:1334) static member tcFixedNotAllowed() = (3207, GetStringFunc("tcFixedNotAllowed",",,,") ) /// Could not find method System.Runtime.CompilerServices.OffsetToStringData in references when building 'fixed' expression. - /// (Originally from ..\FSComp.txt:1333) + /// (Originally from ..\FSComp.txt:1335) static member tcCouldNotFindOffsetToStringData() = (3208, GetStringFunc("tcCouldNotFindOffsetToStringData",",,,") ) /// The address of the variable '%s' cannot be used at this point. A method or function may not return the address of this local value. - /// (Originally from ..\FSComp.txt:1334) + /// (Originally from ..\FSComp.txt:1336) static member chkNoByrefReturnOfLocal(a0 : System.String) = (3209, GetStringFunc("chkNoByrefReturnOfLocal",",,,%s,,,") a0) /// %s is an active pattern and cannot be treated as a discriminated union case with named fields. - /// (Originally from ..\FSComp.txt:1335) + /// (Originally from ..\FSComp.txt:1337) static member tcNamedActivePattern(a0 : System.String) = (3210, GetStringFunc("tcNamedActivePattern",",,,%s,,,") a0) /// The default value does not have the same type as the argument. The DefaultParameterValue attribute and any Optional attribute will be ignored. Note: 'null' needs to be annotated with the correct type, e.g. 'DefaultParameterValue(null:obj)'. - /// (Originally from ..\FSComp.txt:1336) + /// (Originally from ..\FSComp.txt:1338) static member DefaultParameterValueNotAppropriateForArgument() = (3211, GetStringFunc("DefaultParameterValueNotAppropriateForArgument",",,,") ) /// The system type '%s' was required but no referenced system DLL contained this type - /// (Originally from ..\FSComp.txt:1337) + /// (Originally from ..\FSComp.txt:1339) static member tcGlobalsSystemTypeNotFound(a0 : System.String) = (GetStringFunc("tcGlobalsSystemTypeNotFound",",,,%s,,,") a0) /// The member '%s' matches multiple overloads of the same method.\nPlease restrict it to one of the following:%s. - /// (Originally from ..\FSComp.txt:1338) + /// (Originally from ..\FSComp.txt:1340) static member typrelMemberHasMultiplePossibleDispatchSlots(a0 : System.String, a1 : System.String) = (3213, GetStringFunc("typrelMemberHasMultiplePossibleDispatchSlots",",,,%s,,,%s,,,") a0 a1) /// Method or object constructor '%s' is not static - /// (Originally from ..\FSComp.txt:1339) + /// (Originally from ..\FSComp.txt:1341) static member methodIsNotStatic(a0 : System.String) = (3214, GetStringFunc("methodIsNotStatic",",,,%s,,,") a0) /// Unexpected symbol '=' in expression. Did you intend to use 'for x in y .. z do' instead? - /// (Originally from ..\FSComp.txt:1340) + /// (Originally from ..\FSComp.txt:1342) static member parsUnexpectedSymbolEqualsInsteadOfIn() = (3215, GetStringFunc("parsUnexpectedSymbolEqualsInsteadOfIn",",,,") ) + /// Two anonymous record types are from different assemblies '%s' and '%s' + /// (Originally from ..\FSComp.txt:1343) + static member tcAnonRecdCcuMismatch(a0 : System.String, a1 : System.String) = (GetStringFunc("tcAnonRecdCcuMismatch",",,,%s,,,%s,,,") a0 a1) + /// One anonymous record type is assembly-bound to '%s' (syntax 'new {| ... |}'), the other is assembly-neutral (syntax '{| ... |}') + /// (Originally from ..\FSComp.txt:1344) + static member tcAnonRecdFieldNameMismatch(a0 : System.String, a1 : System.String) = (GetStringFunc("tcAnonRecdFieldNameMismatch",",,,%s,,,%s,,,") a0 a1) /// Indicates a method that either has no implementation in the type in which it is declared or that is virtual and has a default implementation. - /// (Originally from ..\FSComp.txt:1341) + /// (Originally from ..\FSComp.txt:1346) static member keywordDescriptionAbstract() = (GetStringFunc("keywordDescriptionAbstract",",,,") ) /// Used in mutually recursive bindings, in property declarations, and with multiple constraints on generic parameters. - /// (Originally from ..\FSComp.txt:1342) + /// (Originally from ..\FSComp.txt:1347) static member keyworkDescriptionAnd() = (GetStringFunc("keyworkDescriptionAnd",",,,") ) /// Used to give the current class object an object name. Also used to give a name to a whole pattern within a pattern match. - /// (Originally from ..\FSComp.txt:1343) + /// (Originally from ..\FSComp.txt:1348) static member keywordDescriptionAs() = (GetStringFunc("keywordDescriptionAs",",,,") ) /// Used to verify code during debugging. - /// (Originally from ..\FSComp.txt:1344) + /// (Originally from ..\FSComp.txt:1349) static member keywordDescriptionAssert() = (GetStringFunc("keywordDescriptionAssert",",,,") ) /// Used as the name of the base class object. - /// (Originally from ..\FSComp.txt:1345) + /// (Originally from ..\FSComp.txt:1350) static member keywordDescriptionBase() = (GetStringFunc("keywordDescriptionBase",",,,") ) /// In verbose syntax, indicates the start of a code block. - /// (Originally from ..\FSComp.txt:1346) + /// (Originally from ..\FSComp.txt:1351) static member keywordDescriptionBegin() = (GetStringFunc("keywordDescriptionBegin",",,,") ) /// In verbose syntax, indicates the start of a class definition. - /// (Originally from ..\FSComp.txt:1347) + /// (Originally from ..\FSComp.txt:1352) static member keywordDescriptionClass() = (GetStringFunc("keywordDescriptionClass",",,,") ) /// Indicates an implementation of an abstract method; used together with an abstract method declaration to create a virtual method. - /// (Originally from ..\FSComp.txt:1348) + /// (Originally from ..\FSComp.txt:1353) static member keywordDescriptionDefault() = (GetStringFunc("keywordDescriptionDefault",",,,") ) /// Used to declare a delegate. - /// (Originally from ..\FSComp.txt:1349) + /// (Originally from ..\FSComp.txt:1354) static member keywordDescriptionDelegate() = (GetStringFunc("keywordDescriptionDelegate",",,,") ) /// Used in looping constructs or to execute imperative code. - /// (Originally from ..\FSComp.txt:1350) + /// (Originally from ..\FSComp.txt:1355) static member keywordDescriptionDo() = (GetStringFunc("keywordDescriptionDo",",,,") ) /// In verbose syntax, indicates the end of a block of code in a looping expression. - /// (Originally from ..\FSComp.txt:1351) + /// (Originally from ..\FSComp.txt:1356) static member keywordDescriptionDone() = (GetStringFunc("keywordDescriptionDone",",,,") ) /// Used to convert to a type that is lower in the inheritance chain. - /// (Originally from ..\FSComp.txt:1352) + /// (Originally from ..\FSComp.txt:1357) static member keywordDescriptionDowncast() = (GetStringFunc("keywordDescriptionDowncast",",,,") ) /// In a for expression, used when counting in reverse. - /// (Originally from ..\FSComp.txt:1353) + /// (Originally from ..\FSComp.txt:1358) static member keywordDescriptionDownto() = (GetStringFunc("keywordDescriptionDownto",",,,") ) /// Used in conditional branching. A short form of else if. - /// (Originally from ..\FSComp.txt:1354) + /// (Originally from ..\FSComp.txt:1359) static member keywordDescriptionElif() = (GetStringFunc("keywordDescriptionElif",",,,") ) /// Used in conditional branching. - /// (Originally from ..\FSComp.txt:1355) + /// (Originally from ..\FSComp.txt:1360) static member keywordDescriptionElse() = (GetStringFunc("keywordDescriptionElse",",,,") ) /// In type definitions and type extensions, indicates the end of a section of member definitions. In verbose syntax, used to specify the end of a code block that starts with the begin keyword. - /// (Originally from ..\FSComp.txt:1356) + /// (Originally from ..\FSComp.txt:1361) static member keywordDescriptionEnd() = (GetStringFunc("keywordDescriptionEnd",",,,") ) /// Used to declare an exception type. - /// (Originally from ..\FSComp.txt:1357) + /// (Originally from ..\FSComp.txt:1362) static member keywordDescriptionException() = (GetStringFunc("keywordDescriptionException",",,,") ) /// Indicates that a declared program element is defined in another binary or assembly. - /// (Originally from ..\FSComp.txt:1358) + /// (Originally from ..\FSComp.txt:1363) static member keywordDescriptionExtern() = (GetStringFunc("keywordDescriptionExtern",",,,") ) /// Used as a Boolean literal. - /// (Originally from ..\FSComp.txt:1359) + /// (Originally from ..\FSComp.txt:1364) static member keywordDescriptionTrueFalse() = (GetStringFunc("keywordDescriptionTrueFalse",",,,") ) /// Used together with try to introduce a block of code that executes regardless of whether an exception occurs. - /// (Originally from ..\FSComp.txt:1360) + /// (Originally from ..\FSComp.txt:1365) static member keywordDescriptionFinally() = (GetStringFunc("keywordDescriptionFinally",",,,") ) /// Used in looping constructs. - /// (Originally from ..\FSComp.txt:1361) + /// (Originally from ..\FSComp.txt:1366) static member keywordDescriptionFor() = (GetStringFunc("keywordDescriptionFor",",,,") ) /// Used in lambda expressions, also known as anonymous functions. - /// (Originally from ..\FSComp.txt:1362) + /// (Originally from ..\FSComp.txt:1367) static member keywordDescriptionFun() = (GetStringFunc("keywordDescriptionFun",",,,") ) /// Used as a shorter alternative to the fun keyword and a match expression in a lambda expression that has pattern matching on a single argument. - /// (Originally from ..\FSComp.txt:1363) + /// (Originally from ..\FSComp.txt:1368) static member keywordDescriptionFunction() = (GetStringFunc("keywordDescriptionFunction",",,,") ) /// Used to reference the top-level .NET namespace. - /// (Originally from ..\FSComp.txt:1364) + /// (Originally from ..\FSComp.txt:1369) static member keywordDescriptionGlobal() = (GetStringFunc("keywordDescriptionGlobal",",,,") ) /// Used in conditional branching constructs. - /// (Originally from ..\FSComp.txt:1365) + /// (Originally from ..\FSComp.txt:1370) static member keywordDescriptionIf() = (GetStringFunc("keywordDescriptionIf",",,,") ) /// Used for sequence expressions and, in verbose syntax, to separate expressions from bindings. - /// (Originally from ..\FSComp.txt:1366) + /// (Originally from ..\FSComp.txt:1371) static member keywordDescriptionIn() = (GetStringFunc("keywordDescriptionIn",",,,") ) /// Used to specify a base class or base interface. - /// (Originally from ..\FSComp.txt:1367) + /// (Originally from ..\FSComp.txt:1372) static member keywordDescriptionInherit() = (GetStringFunc("keywordDescriptionInherit",",,,") ) /// Used to indicate a function that should be integrated directly into the caller's code. - /// (Originally from ..\FSComp.txt:1368) + /// (Originally from ..\FSComp.txt:1373) static member keywordDescriptionInline() = (GetStringFunc("keywordDescriptionInline",",,,") ) /// Used to declare and implement interfaces. - /// (Originally from ..\FSComp.txt:1369) + /// (Originally from ..\FSComp.txt:1374) static member keywordDescriptionInterface() = (GetStringFunc("keywordDescriptionInterface",",,,") ) /// Used to specify that a member is visible inside an assembly but not outside it. - /// (Originally from ..\FSComp.txt:1370) + /// (Originally from ..\FSComp.txt:1375) static member keywordDescriptionInternal() = (GetStringFunc("keywordDescriptionInternal",",,,") ) /// Used to specify a computation that is to be performed only when a result is needed. - /// (Originally from ..\FSComp.txt:1371) + /// (Originally from ..\FSComp.txt:1376) static member keywordDescriptionLazy() = (GetStringFunc("keywordDescriptionLazy",",,,") ) /// Used to associate, or bind, a name to a value or function. - /// (Originally from ..\FSComp.txt:1372) + /// (Originally from ..\FSComp.txt:1377) static member keywordDescriptionLet() = (GetStringFunc("keywordDescriptionLet",",,,") ) /// Used in asynchronous workflows to bind a name to the result of an asynchronous computation, or, in other computation expressions, used to bind a name to a result, which is of the computation type. - /// (Originally from ..\FSComp.txt:1373) + /// (Originally from ..\FSComp.txt:1378) static member keywordDescriptionLetBang() = (GetStringFunc("keywordDescriptionLetBang",",,,") ) /// Used to branch by comparing a value to a pattern. - /// (Originally from ..\FSComp.txt:1374) + /// (Originally from ..\FSComp.txt:1379) static member keywordDescriptionMatch() = (GetStringFunc("keywordDescriptionMatch",",,,") ) /// Used to declare a property or method in an object type. - /// (Originally from ..\FSComp.txt:1375) + /// (Originally from ..\FSComp.txt:1380) static member keywordDescriptionMember() = (GetStringFunc("keywordDescriptionMember",",,,") ) /// Used to associate a name with a group of related types, values, and functions, to logically separate it from other code. - /// (Originally from ..\FSComp.txt:1376) + /// (Originally from ..\FSComp.txt:1381) static member keywordDescriptionModule() = (GetStringFunc("keywordDescriptionModule",",,,") ) /// Used to declare a variable, that is, a value that can be changed. - /// (Originally from ..\FSComp.txt:1377) + /// (Originally from ..\FSComp.txt:1382) static member keywordDescriptionMutable() = (GetStringFunc("keywordDescriptionMutable",",,,") ) /// Used to associate a name with a group of related types and modules, to logically separate it from other code. - /// (Originally from ..\FSComp.txt:1378) + /// (Originally from ..\FSComp.txt:1383) static member keywordDescriptionNamespace() = (GetStringFunc("keywordDescriptionNamespace",",,,") ) /// Used to declare, define, or invoke a constructor that creates or that can create an object. Also used in generic parameter constraints to indicate that a type must have a certain constructor. - /// (Originally from ..\FSComp.txt:1379) + /// (Originally from ..\FSComp.txt:1384) static member keywordDescriptionNew() = (GetStringFunc("keywordDescriptionNew",",,,") ) /// Not actually a keyword. However, not struct in combination is used as a generic parameter constraint. - /// (Originally from ..\FSComp.txt:1380) + /// (Originally from ..\FSComp.txt:1385) static member keywordDescriptionNot() = (GetStringFunc("keywordDescriptionNot",",,,") ) /// Indicates the absence of an object. Also used in generic parameter constraints. - /// (Originally from ..\FSComp.txt:1381) + /// (Originally from ..\FSComp.txt:1386) static member keywordDescriptionNull() = (GetStringFunc("keywordDescriptionNull",",,,") ) /// Used in discriminated unions to indicate the type of categories of values, and in delegate and exception declarations. - /// (Originally from ..\FSComp.txt:1382) + /// (Originally from ..\FSComp.txt:1387) static member keywordDescriptionOf() = (GetStringFunc("keywordDescriptionOf",",,,") ) /// Used to make the contents of a namespace or module available without qualification. - /// (Originally from ..\FSComp.txt:1383) + /// (Originally from ..\FSComp.txt:1388) static member keywordDescriptionOpen() = (GetStringFunc("keywordDescriptionOpen",",,,") ) /// Used with Boolean conditions as a Boolean or operator. Equivalent to ||. Also used in member constraints. - /// (Originally from ..\FSComp.txt:1384) + /// (Originally from ..\FSComp.txt:1389) static member keywordDescriptionOr() = (GetStringFunc("keywordDescriptionOr",",,,") ) /// Used to implement a version of an abstract or virtual method that differs from the base version. - /// (Originally from ..\FSComp.txt:1385) + /// (Originally from ..\FSComp.txt:1390) static member keywordDescriptionOverride() = (GetStringFunc("keywordDescriptionOverride",",,,") ) /// Restricts access to a member to code in the same type or module. - /// (Originally from ..\FSComp.txt:1386) + /// (Originally from ..\FSComp.txt:1391) static member keywordDescriptionPrivate() = (GetStringFunc("keywordDescriptionPrivate",",,,") ) /// Allows access to a member from outside the type. - /// (Originally from ..\FSComp.txt:1387) + /// (Originally from ..\FSComp.txt:1392) static member keywordDescriptionPublic() = (GetStringFunc("keywordDescriptionPublic",",,,") ) /// Used to indicate that a function is recursive. - /// (Originally from ..\FSComp.txt:1388) + /// (Originally from ..\FSComp.txt:1393) static member keywordDescriptionRec() = (GetStringFunc("keywordDescriptionRec",",,,") ) /// Used to indicate a value to provide as the result of a computation expression. - /// (Originally from ..\FSComp.txt:1389) + /// (Originally from ..\FSComp.txt:1394) static member keywordDescriptionReturn() = (GetStringFunc("keywordDescriptionReturn",",,,") ) /// Used to indicate a computation expression that, when evaluated, provides the result of the containing computation expression. - /// (Originally from ..\FSComp.txt:1390) + /// (Originally from ..\FSComp.txt:1395) static member keywordDescriptionReturnBang() = (GetStringFunc("keywordDescriptionReturnBang",",,,") ) /// Used in query expressions to specify what fields or columns to extract. Note that this is a contextual keyword, which means that it is not actually a reserved word and it only acts like a keyword in appropriate context. - /// (Originally from ..\FSComp.txt:1391) + /// (Originally from ..\FSComp.txt:1396) static member keywordDescriptionSelect() = (GetStringFunc("keywordDescriptionSelect",",,,") ) /// Used to indicate a method or property that can be called without an instance of a type, or a value member that is shared among all instances of a type. - /// (Originally from ..\FSComp.txt:1392) + /// (Originally from ..\FSComp.txt:1397) static member keywordDescriptionStatic() = (GetStringFunc("keywordDescriptionStatic",",,,") ) /// Used to declare a structure type. Also used in generic parameter constraints. Used for OCaml compatibility in module definitions. - /// (Originally from ..\FSComp.txt:1393) + /// (Originally from ..\FSComp.txt:1398) static member keywordDescriptionStruct() = (GetStringFunc("keywordDescriptionStruct",",,,") ) /// Used in conditional expressions. Also used to perform side effects after object construction. - /// (Originally from ..\FSComp.txt:1394) + /// (Originally from ..\FSComp.txt:1399) static member keywordDescriptionThen() = (GetStringFunc("keywordDescriptionThen",",,,") ) /// Used in for loops to indicate a range. - /// (Originally from ..\FSComp.txt:1395) + /// (Originally from ..\FSComp.txt:1400) static member keywordDescriptionTo() = (GetStringFunc("keywordDescriptionTo",",,,") ) /// Used to introduce a block of code that might generate an exception. Used together with with or finally. - /// (Originally from ..\FSComp.txt:1396) + /// (Originally from ..\FSComp.txt:1401) static member keywordDescriptionTry() = (GetStringFunc("keywordDescriptionTry",",,,") ) /// Used to declare a class, record, structure, discriminated union, enumeration type, unit of measure, or type abbreviation. - /// (Originally from ..\FSComp.txt:1397) + /// (Originally from ..\FSComp.txt:1402) static member keywordDescriptionType() = (GetStringFunc("keywordDescriptionType",",,,") ) /// Used to convert to a type that is higher in the inheritance chain. - /// (Originally from ..\FSComp.txt:1398) + /// (Originally from ..\FSComp.txt:1403) static member keywordDescriptionUpcast() = (GetStringFunc("keywordDescriptionUpcast",",,,") ) /// Used instead of let for values that require Dispose to be called to free resources. - /// (Originally from ..\FSComp.txt:1399) + /// (Originally from ..\FSComp.txt:1404) static member keywordDescriptionUse() = (GetStringFunc("keywordDescriptionUse",",,,") ) /// Used instead of let! in asynchronous workflows and other computation expressions for values that require Dispose to be called to free resources. - /// (Originally from ..\FSComp.txt:1400) + /// (Originally from ..\FSComp.txt:1405) static member keywordDescriptionUseBang() = (GetStringFunc("keywordDescriptionUseBang",",,,") ) /// Used in a signature to indicate a value, or in a type to declare a member, in limited situations. - /// (Originally from ..\FSComp.txt:1401) + /// (Originally from ..\FSComp.txt:1406) static member keywordDescriptionVal() = (GetStringFunc("keywordDescriptionVal",",,,") ) /// Indicates the .NET void type. Used when interoperating with other .NET languages. - /// (Originally from ..\FSComp.txt:1402) + /// (Originally from ..\FSComp.txt:1407) static member keywordDescriptionVoid() = (GetStringFunc("keywordDescriptionVoid",",,,") ) /// Used for Boolean conditions (when guards) on pattern matches and to introduce a constraint clause for a generic type parameter. - /// (Originally from ..\FSComp.txt:1403) + /// (Originally from ..\FSComp.txt:1408) static member keywordDescriptionWhen() = (GetStringFunc("keywordDescriptionWhen",",,,") ) /// Introduces a looping construct. - /// (Originally from ..\FSComp.txt:1404) + /// (Originally from ..\FSComp.txt:1409) static member keywordDescriptionWhile() = (GetStringFunc("keywordDescriptionWhile",",,,") ) /// Used together with the match keyword in pattern matching expressions. Also used in object expressions, record copying expressions, and type extensions to introduce member definitions, and to introduce exception handlers. - /// (Originally from ..\FSComp.txt:1405) + /// (Originally from ..\FSComp.txt:1410) static member keywordDescriptionWith() = (GetStringFunc("keywordDescriptionWith",",,,") ) /// Used in a sequence expression to produce a value for a sequence. - /// (Originally from ..\FSComp.txt:1406) + /// (Originally from ..\FSComp.txt:1411) static member keywordDescriptionYield() = (GetStringFunc("keywordDescriptionYield",",,,") ) /// Used in a computation expression to append the result of a given computation expression to a collection of results for the containing computation expression. - /// (Originally from ..\FSComp.txt:1407) + /// (Originally from ..\FSComp.txt:1412) static member keywordDescriptionYieldBang() = (GetStringFunc("keywordDescriptionYieldBang",",,,") ) /// In function types, delimits arguments and return values. Yields an expression (in sequence expressions); equivalent to the yield keyword. Used in match expressions - /// (Originally from ..\FSComp.txt:1408) + /// (Originally from ..\FSComp.txt:1413) static member keywordDescriptionRightArrow() = (GetStringFunc("keywordDescriptionRightArrow",",,,") ) /// Assigns a value to a variable. - /// (Originally from ..\FSComp.txt:1409) + /// (Originally from ..\FSComp.txt:1414) static member keywordDescriptionLeftArrow() = (GetStringFunc("keywordDescriptionLeftArrow",",,,") ) /// Converts a type to type that is higher in the hierarchy. - /// (Originally from ..\FSComp.txt:1410) + /// (Originally from ..\FSComp.txt:1415) static member keywordDescriptionCast() = (GetStringFunc("keywordDescriptionCast",",,,") ) /// Converts a type to a type that is lower in the hierarchy. - /// (Originally from ..\FSComp.txt:1411) + /// (Originally from ..\FSComp.txt:1416) static member keywordDescriptionDynamicCast() = (GetStringFunc("keywordDescriptionDynamicCast",",,,") ) /// Delimits a typed code quotation. - /// (Originally from ..\FSComp.txt:1412) + /// (Originally from ..\FSComp.txt:1417) static member keywordDescriptionTypedQuotation() = (GetStringFunc("keywordDescriptionTypedQuotation",",,,") ) /// Delimits a untyped code quotation. - /// (Originally from ..\FSComp.txt:1413) + /// (Originally from ..\FSComp.txt:1418) static member keywordDescriptionUntypedQuotation() = (GetStringFunc("keywordDescriptionUntypedQuotation",",,,") ) /// %s '%s' not found in assembly '%s'. A possible cause may be a version incompatibility. You may need to explicitly reference the correct version of this assembly to allow all referenced components to use the correct version. - /// (Originally from ..\FSComp.txt:1414) + /// (Originally from ..\FSComp.txt:1419) static member itemNotFoundDuringDynamicCodeGen(a0 : System.String, a1 : System.String, a2 : System.String) = (3216, GetStringFunc("itemNotFoundDuringDynamicCodeGen",",,,%s,,,%s,,,%s,,,") a0 a1 a2) /// %s '%s' not found in type '%s' from assembly '%s'. A possible cause may be a version incompatibility. You may need to explicitly reference the correct version of this assembly to allow all referenced components to use the correct version. - /// (Originally from ..\FSComp.txt:1415) + /// (Originally from ..\FSComp.txt:1420) static member itemNotFoundInTypeDuringDynamicCodeGen(a0 : System.String, a1 : System.String, a2 : System.String, a3 : System.String) = (3216, GetStringFunc("itemNotFoundInTypeDuringDynamicCodeGen",",,,%s,,,%s,,,%s,,,%s,,,") a0 a1 a2 a3) /// is - /// (Originally from ..\FSComp.txt:1416) + /// (Originally from ..\FSComp.txt:1421) static member descriptionWordIs() = (GetStringFunc("descriptionWordIs",",,,") ) /// This value is not a function and cannot be applied. - /// (Originally from ..\FSComp.txt:1417) + /// (Originally from ..\FSComp.txt:1422) static member notAFunction() = (GetStringFunc("notAFunction",",,,") ) /// This value is not a function and cannot be applied. Did you intend to access the indexer via %s.[index] instead? - /// (Originally from ..\FSComp.txt:1418) + /// (Originally from ..\FSComp.txt:1423) static member notAFunctionButMaybeIndexerWithName(a0 : System.String) = (GetStringFunc("notAFunctionButMaybeIndexerWithName",",,,%s,,,") a0) /// This expression is not a function and cannot be applied. Did you intend to access the indexer via expr.[index] instead? - /// (Originally from ..\FSComp.txt:1419) + /// (Originally from ..\FSComp.txt:1424) static member notAFunctionButMaybeIndexer() = (GetStringFunc("notAFunctionButMaybeIndexer",",,,") ) /// - /// (Originally from ..\FSComp.txt:1420) + /// (Originally from ..\FSComp.txt:1425) static member notAFunctionButMaybeIndexerErrorCode() = (3217, GetStringFunc("notAFunctionButMaybeIndexerErrorCode",",,,") ) /// This value is not a function and cannot be applied. Did you forget to terminate a declaration? - /// (Originally from ..\FSComp.txt:1421) + /// (Originally from ..\FSComp.txt:1426) static member notAFunctionButMaybeDeclaration() = (GetStringFunc("notAFunctionButMaybeDeclaration",",,,") ) /// The argument names in the signature '%s' and implementation '%s' do not match. The argument name from the signature file will be used. This may cause problems when debugging or profiling. - /// (Originally from ..\FSComp.txt:1422) + /// (Originally from ..\FSComp.txt:1427) static member ArgumentsInSigAndImplMismatch(a0 : System.String, a1 : System.String) = (3218, GetStringFunc("ArgumentsInSigAndImplMismatch",",,,%s,,,%s,,,") a0 a1) /// An error occurred while reading the F# metadata of assembly '%s'. A reserved construct was utilized. You may need to upgrade your F# compiler or use an earlier version of the assembly that doesn't make use of a specific construct. - /// (Originally from ..\FSComp.txt:1423) + /// (Originally from ..\FSComp.txt:1428) static member pickleUnexpectedNonZero(a0 : System.String) = (3219, GetStringFunc("pickleUnexpectedNonZero",",,,%s,,,") a0) /// This method or property is not normally used from F# code, use an explicit tuple pattern for deconstruction instead. - /// (Originally from ..\FSComp.txt:1424) + /// (Originally from ..\FSComp.txt:1429) static member tcTupleMemberNotNormallyUsed() = (3220, GetStringFunc("tcTupleMemberNotNormallyUsed",",,,") ) /// This expression returns a value of type '%s' but is implicitly discarded. Consider using 'let' to bind the result to a name, e.g. 'let result = expression'. If you intended to use the expression as a value in the sequence then use an explicit 'yield'. - /// (Originally from ..\FSComp.txt:1425) + /// (Originally from ..\FSComp.txt:1430) static member implicitlyDiscardedInSequenceExpression(a0 : System.String) = (3221, GetStringFunc("implicitlyDiscardedInSequenceExpression",",,,%s,,,") a0) /// This expression returns a value of type '%s' but is implicitly discarded. Consider using 'let' to bind the result to a name, e.g. 'let result = expression'. If you intended to use the expression as a value in the sequence then use an explicit 'yield!'. - /// (Originally from ..\FSComp.txt:1426) + /// (Originally from ..\FSComp.txt:1431) static member implicitlyDiscardedSequenceInSequenceExpression(a0 : System.String) = (3222, GetStringFunc("implicitlyDiscardedSequenceInSequenceExpression",",,,%s,,,") a0) + /// Invalid anonymous record expression + /// (Originally from ..\FSComp.txt:1432) + static member parsInvalidAnonRecdExpr() = (3223, GetStringFunc("parsInvalidAnonRecdExpr",",,,") ) + /// Invalid anonymous record type + /// (Originally from ..\FSComp.txt:1433) + static member parsInvalidAnonRecdType() = (3224, GetStringFunc("parsInvalidAnonRecdType",",,,") ) /// Call this method once to validate that all known resources are valid; throws if not static member RunStartupValidation() = @@ -4747,6 +4765,7 @@ type internal SR private() = ignore(GetString("parsUnmatched")) ignore(GetString("parsUnmatchedBracketBar")) ignore(GetString("parsUnmatchedBrace")) + ignore(GetString("parsUnmatchedBraceBar")) ignore(GetString("parsFieldBinding")) ignore(GetString("parsMemberIllegalInObjectImplementation")) ignore(GetString("parsMissingFunctionBody")) @@ -5219,6 +5238,7 @@ type internal SR private() = ignore(GetString("typeInfoExtension")) ignore(GetString("typeInfoCustomOperation")) ignore(GetString("typeInfoArgument")) + ignore(GetString("typeInfoAnonRecdField")) ignore(GetString("typeInfoPatternVariable")) ignore(GetString("typeInfoNamespace")) ignore(GetString("typeInfoModule")) @@ -5620,6 +5640,8 @@ type internal SR private() = ignore(GetString("typrelMemberHasMultiplePossibleDispatchSlots")) ignore(GetString("methodIsNotStatic")) ignore(GetString("parsUnexpectedSymbolEqualsInsteadOfIn")) + ignore(GetString("tcAnonRecdCcuMismatch")) + ignore(GetString("tcAnonRecdFieldNameMismatch")) ignore(GetString("keywordDescriptionAbstract")) ignore(GetString("keyworkDescriptionAnd")) ignore(GetString("keywordDescriptionAs")) @@ -5706,4 +5728,6 @@ type internal SR private() = ignore(GetString("tcTupleMemberNotNormallyUsed")) ignore(GetString("implicitlyDiscardedInSequenceExpression")) ignore(GetString("implicitlyDiscardedSequenceInSequenceExpression")) + ignore(GetString("parsInvalidAnonRecdExpr")) + ignore(GetString("parsInvalidAnonRecdType")) () diff --git a/src/buildfromsource/FSharp.Compiler.Private/FSComp.resx b/src/buildfromsource/FSharp.Compiler.Private/FSComp.resx index 98d1c657bae..2e1d0938ce4 100644 --- a/src/buildfromsource/FSharp.Compiler.Private/FSComp.resx +++ b/src/buildfromsource/FSharp.Compiler.Private/FSComp.resx @@ -1117,7 +1117,7 @@ The member or object constructor '{0}' is not {1} - The member or object constructor '{0}' is not {1}. Private members may only be accessed from within the declaring type. Protected members may only be accessed from an extending type and cannot be accessed from within inner lambda expressions, object expressions or computation expressions (such as async { }). If {0} is a protected member, consider creating a member in this type that calls it. + The member or object constructor '{0}' is not {1}. Private members may only be accessed from within the declaring type. Protected members may only be accessed from an extending type and cannot be accessed from inner lambda expressions. {0} is not a static method @@ -1431,6 +1431,9 @@ Unmatched '{{' + + Unmatched '{{|' + Field bindings must have the form 'id = expr;' @@ -2847,6 +2850,9 @@ argument + + anonymous record field + patvar @@ -4050,6 +4056,12 @@ Unexpected symbol '=' in expression. Did you intend to use 'for x in y .. z do' instead? + + Two anonymous record types are from different assemblies '{0}' and '{1}' + + + Two anonymous record types have mismatched sets of field names '{0}' and '{1}' + Indicates a method that either has no implementation in the type in which it is declared or that is virtual and has a default implementation. @@ -4309,4 +4321,10 @@ This expression returns a value of type '{0}' but is implicitly discarded. Consider using 'let' to bind the result to a name, e.g. 'let result = expression'. If you intended to use the expression as a value in the sequence then use an explicit 'yield!'. + + Invalid anonymous record expression + + + Invalid anonymous record type + \ No newline at end of file diff --git a/src/fsharp/CompileOps.fs b/src/fsharp/CompileOps.fs index 069dba4859e..86789db080e 100644 --- a/src/fsharp/CompileOps.fs +++ b/src/fsharp/CompileOps.fs @@ -959,12 +959,12 @@ let OutputPhasedErrorR (os:StringBuilder) (err:PhasedDiagnostic) = | Parser.TOKEN_RPAREN | Parser.TOKEN_RPAREN_COMING_SOON | Parser.TOKEN_RPAREN_IS_HERE -> getErrorString("Parser.TOKEN.RPAREN") | Parser.TOKEN_LQUOTE -> getErrorString("Parser.TOKEN.LQUOTE") | Parser.TOKEN_LBRACK -> getErrorString("Parser.TOKEN.LBRACK") + | Parser.TOKEN_LBRACE_BAR -> getErrorString("Parser.TOKEN.LBRACE.BAR") | Parser.TOKEN_LBRACK_BAR -> getErrorString("Parser.TOKEN.LBRACK.BAR") | Parser.TOKEN_LBRACK_LESS -> getErrorString("Parser.TOKEN.LBRACK.LESS") | Parser.TOKEN_LBRACE -> getErrorString("Parser.TOKEN.LBRACE") - | Parser.TOKEN_LBRACE_LESS-> getErrorString("Parser.TOKEN.LBRACE.LESS") | Parser.TOKEN_BAR_RBRACK -> getErrorString("Parser.TOKEN.BAR.RBRACK") - | Parser.TOKEN_GREATER_RBRACE -> getErrorString("Parser.TOKEN.GREATER.RBRACE") + | Parser.TOKEN_BAR_RBRACE -> getErrorString("Parser.TOKEN.BAR.RBRACE") | Parser.TOKEN_GREATER_RBRACK -> getErrorString("Parser.TOKEN.GREATER.RBRACK") | Parser.TOKEN_RQUOTE_DOT _ | Parser.TOKEN_RQUOTE -> getErrorString("Parser.TOKEN.RQUOTE") @@ -1094,7 +1094,7 @@ let OutputPhasedErrorR (os:StringBuilder) (err:PhasedDiagnostic) = (* Merge a bunch of expression non terminals *) let (|NONTERM_Category_Expr|_|) = function | Parser.NONTERM_argExpr|Parser.NONTERM_minusExpr|Parser.NONTERM_parenExpr|Parser.NONTERM_atomicExpr - | Parser.NONTERM_appExpr|Parser.NONTERM_tupleExpr|Parser.NONTERM_declExpr|Parser.NONTERM_braceExpr + | Parser.NONTERM_appExpr|Parser.NONTERM_tupleExpr|Parser.NONTERM_declExpr|Parser.NONTERM_braceExpr|Parser.NONTERM_braceBarExpr | Parser.NONTERM_typedSeqExprBlock | Parser.NONTERM_interactiveExpr -> Some() | _ -> None diff --git a/src/fsharp/ConstraintSolver.fs b/src/fsharp/ConstraintSolver.fs index b1b690c6a85..ca16d3465bc 100644 --- a/src/fsharp/ConstraintSolver.fs +++ b/src/fsharp/ConstraintSolver.fs @@ -221,6 +221,7 @@ let rec occursCheck g un ty = match stripTyEqns g ty with | TType_ucase(_, l) | TType_app (_, l) + | TType_anon(_, l) | TType_tuple (_, l) -> List.exists (occursCheck g un) l | TType_fun (d, r) -> occursCheck g un d || occursCheck g un r | TType_var r -> typarEq un r @@ -293,6 +294,7 @@ type TraitConstraintSolution = | TTraitBuiltIn | TTraitSolved of MethInfo * TypeInst | TTraitSolvedRecdProp of RecdFieldInfo * bool + | TTraitSolvedAnonRecdProp of AnonRecdTypeInfo * TypeInst * int let BakedInTraitConstraintNames = [ "op_Division" ; "op_Multiply"; "op_Addition" @@ -557,6 +559,7 @@ let rec SimplifyMeasuresInType g resultFirst ((generalizable, generalized) as pa match stripTyparEqns ty with | TType_ucase(_, l) | TType_app (_, l) + | TType_anon (_,l) | TType_tuple (_, l) -> SimplifyMeasuresInTypes g param l | TType_fun (d, r) -> if resultFirst then SimplifyMeasuresInTypes g param [r;d] else SimplifyMeasuresInTypes g param [d;r] @@ -594,6 +597,7 @@ let rec GetMeasureVarGcdInType v ty = match stripTyparEqns ty with | TType_ucase(_, l) | TType_app (_, l) + | TType_anon (_,l) | TType_tuple (_, l) -> GetMeasureVarGcdInTypes v l | TType_fun (d, r) -> GcdRational (GetMeasureVarGcdInType v d) (GetMeasureVarGcdInType v r) @@ -757,6 +761,14 @@ and solveTypMeetsTyparConstraints (csenv:ConstraintSolverEnv) ndeep m2 trace ty ))) +and SolveAnonInfoEqualsAnonInfo (csenv:ConstraintSolverEnv) m2 (anonInfo1: AnonRecdTypeInfo) (anonInfo2: AnonRecdTypeInfo) = + if evalTupInfoIsStruct anonInfo1.TupInfo <> evalTupInfoIsStruct anonInfo2.TupInfo then ErrorD (ConstraintSolverError(FSComp.SR.tcTupleStructMismatch(), csenv.m,m2)) else + (match anonInfo1.Assembly, anonInfo2.Assembly with + | ccu1, ccu2 -> if not (ccuEq ccu1 ccu2) then ErrorD (ConstraintSolverError(FSComp.SR.tcAnonRecdCcuMismatch(ccu1.AssemblyName, ccu2.AssemblyName), csenv.m,m2)) else ResultD () + ) ++ (fun () -> + if not (anonInfo1.SortedNames = anonInfo2.SortedNames) then ErrorD (ConstraintSolverError(FSComp.SR.tcAnonRecdFieldNameMismatch(sprintf "%A" (Array.toList anonInfo1.SortedNames), sprintf "%A" (Array.toList anonInfo2.SortedNames)), csenv.m,m2)) else + ResultD ()) + /// Add the constraint "ty1 = ty2" to the constraint problem. /// Propagate all effects of adding this constraint, e.g. to solve type variables and SolveTypEqualsTyp (csenv:ConstraintSolverEnv) ndeep m2 (trace: OptionalTrace) (cxsln:(TraitConstraintInfo * TraitConstraintSln) option) ty1 ty2 = @@ -797,6 +809,9 @@ and SolveTypEqualsTyp (csenv:ConstraintSolverEnv) ndeep m2 (trace: OptionalTrace | TType_tuple (tupInfo1, l1) , TType_tuple (tupInfo2, l2) -> if evalTupInfoIsStruct tupInfo1 <> evalTupInfoIsStruct tupInfo2 then ErrorD (ConstraintSolverError(FSComp.SR.tcTupleStructMismatch(), csenv.m, m2)) else SolveTypEqualsTypEqns csenv ndeep m2 trace None l1 l2 + | TType_anon (anonInfo1, l1),TType_anon (anonInfo2, l2) -> + SolveAnonInfoEqualsAnonInfo csenv m2 anonInfo1 anonInfo2 ++ (fun () -> + SolveTypEqualsTypEqns csenv ndeep m2 trace None l1 l2) | TType_fun (d1, r1) , TType_fun (d2, r2) -> SolveFunTypEqn csenv ndeep m2 trace None d1 d2 r1 r2 | TType_measure ms1 , TType_measure ms2 -> UnifyMeasures csenv trace ms1 ms2 | TType_forall(tps1, rty1), TType_forall(tps2, rty2) -> @@ -859,6 +874,9 @@ and SolveTypSubsumesTyp (csenv:ConstraintSolverEnv) ndeep m2 (trace: OptionalTra | TType_tuple (tupInfo1, l1) , TType_tuple (tupInfo2, l2) -> if evalTupInfoIsStruct tupInfo1 <> evalTupInfoIsStruct tupInfo2 then ErrorD (ConstraintSolverError(FSComp.SR.tcTupleStructMismatch(), csenv.m, m2)) else SolveTypEqualsTypEqns csenv ndeep m2 trace cxsln l1 l2 (* nb. can unify since no variance *) + | TType_anon (anonInfo1, l1), TType_anon (anonInfo2, l2) -> + SolveAnonInfoEqualsAnonInfo csenv m2 anonInfo1 anonInfo2 ++ (fun () -> + SolveTypEqualsTypEqns csenv ndeep m2 trace cxsln l1 l2) (* nb. can unify since no variance *) | TType_fun (d1, r1) , TType_fun (d2, r2) -> SolveFunTypEqn csenv ndeep m2 trace cxsln d1 d2 r1 r2 (* nb. can unify since no variance *) | TType_measure ms1, TType_measure ms2 -> UnifyMeasures csenv trace ms1 ms2 @@ -1232,9 +1250,24 @@ and SolveMemberConstraint (csenv:ConstraintSolverEnv) ignoreUnresolvedOverload p else None + let anonRecdPropSearch = + let isGetProp = nm.StartsWith "get_" + if isGetProp && memFlags.IsInstance then + let propName = nm.[4..] + let props = + tys |> List.choose (fun ty -> + match NameResolution.TryFindAnonRecdFieldOfType g ty propName with + | Some (NameResolution.Item.AnonRecdField(anonInfo, tinst, i, _)) -> Some (anonInfo, tinst, i) + | _ -> None) + match props with + | [ prop ] -> Some prop + | _ -> None + else + None + // Now check if there are no feasible solutions at all - match minfos, recdPropSearch with - | [], None when not (tys |> List.exists (isAnyParTy g)) -> + match minfos, recdPropSearch, anonRecdPropSearch with + | [], None, None when not (tys |> List.exists (isAnyParTy g)) -> if tys |> List.exists (isFunTy g) then ErrorD (ConstraintSolverError(FSComp.SR.csExpectTypeWithOperatorButGivenFunction(DecompileOpName nm), m, m2)) elif tys |> List.exists (isAnyTupleTy g) then @@ -1276,13 +1309,20 @@ and SolveMemberConstraint (csenv:ConstraintSolverEnv) ignoreUnresolvedOverload p let methOverloadResult, errors = trace.CollectThenUndoOrCommit (fun (a, _) -> Option.isSome a) (fun trace -> ResolveOverloading csenv (WithTrace trace) nm ndeep (Some traitInfo) (0, 0) AccessibleFromEverywhere calledMethGroup false (Some rty)) - match recdPropSearch, methOverloadResult with - | Some (rfinfo, isSetProp), None -> + match anonRecdPropSearch, recdPropSearch, methOverloadResult with + | Some (anonInfo, tinst, i), None, None -> + // OK, the constraint is solved by a record property. Assert that the return types match. + let rty2 = List.item i tinst + SolveTypEqualsTypKeepAbbrevs csenv ndeep m2 trace rty rty2 ++ (fun () -> + ResultD (TTraitSolvedAnonRecdProp(anonInfo, tinst, i))) + + | None, Some (rfinfo, isSetProp), None -> // OK, the constraint is solved by a record property. Assert that the return types match. let rty2 = if isSetProp then g.unit_ty else rfinfo.FieldType SolveTypEqualsTypKeepAbbrevs csenv ndeep m2 trace rty rty2 ++ (fun () -> ResultD (TTraitSolvedRecdProp(rfinfo, isSetProp))) - | None, Some (calledMeth:CalledMeth<_>) -> + + | None, None, Some (calledMeth:CalledMeth<_>) -> // OK, the constraint is solved. let minfo = calledMeth.Method @@ -1329,8 +1369,13 @@ and RecordMemberConstraintSolution css m trace traitInfo res = TransactMemberConstraintSolution traitInfo trace BuiltInSln; ResultD true - | TTraitSolvedRecdProp (rfinfo, isSetProp) -> - let sln = MemberConstraintSolutionOfRecdFieldInfo rfinfo isSetProp + | TTraitSolvedRecdProp (rfinfo, isSet) -> + let sln = FSRecdFieldSln(rfinfo.TypeInst,rfinfo.RecdFieldRef,isSet) + TransactMemberConstraintSolution traitInfo trace sln; + ResultD true + + | TTraitSolvedAnonRecdProp (anonInfo, tinst, i) -> + let sln = FSAnonRecdFieldSln(anonInfo, tinst, i) TransactMemberConstraintSolution traitInfo trace sln; ResultD true @@ -1375,9 +1420,6 @@ and MemberConstraintSolutionOfMethInfo css m minfo minst = #endif -and MemberConstraintSolutionOfRecdFieldInfo rfinfo isSet = - FSRecdFieldSln(rfinfo.TypeInst, rfinfo.RecdFieldRef, isSet) - /// Write into the reference cell stored in the TAST and add to the undo trace if necessary and TransactMemberConstraintSolution traitInfo (trace:OptionalTrace) sln = let prev = traitInfo.Solution @@ -2606,7 +2648,7 @@ let CodegenWitnessThatTypSupportsTraitConstraint tcVal g amap m (traitInfo:Trait SolveMemberConstraint csenv true true 0 m NoTrace traitInfo ++ (fun _res -> let sln = match traitInfo.Solution with - | None -> Choice4Of4() + | None -> Choice5Of5() | Some sln -> match sln with | ILMethSln(origTy, extOpt, mref, minst) -> @@ -2619,17 +2661,19 @@ let CodegenWitnessThatTypSupportsTraitConstraint tcVal g amap m (traitInfo:Trait | Some ilActualTypeRef -> let actualTyconRef = Import.ImportILTypeRef amap m ilActualTypeRef MethInfo.CreateILExtensionMeth(amap, m, origTy, actualTyconRef, None, mdef) - Choice1Of4 (ilMethInfo, minst) + Choice1Of5 (ilMethInfo, minst) | FSMethSln(typ, vref, minst) -> - Choice1Of4 (FSMeth(g, typ, vref, None), minst) + Choice1Of5 (FSMeth(g, typ, vref, None), minst) | FSRecdFieldSln(tinst, rfref, isSetProp) -> - Choice2Of4 (tinst, rfref, isSetProp) + Choice2Of5 (tinst, rfref, isSetProp) + | FSAnonRecdFieldSln(anonInfo, tinst, i) -> + Choice3Of5 (anonInfo, tinst, i) | BuiltInSln -> - Choice4Of4 () + Choice5Of5 () | ClosedExprSln expr -> - Choice3Of4 expr + Choice4Of5 expr match sln with - | Choice1Of4(minfo, methArgTys) -> + | Choice1Of5(minfo, methArgTys) -> let argExprs = // FIX for #421894 - typechecker assumes that coercion can be applied for the trait calls arguments but codegen doesn't emit coercion operations // result - generation of non-verifyable code @@ -2660,7 +2704,7 @@ let CodegenWitnessThatTypSupportsTraitConstraint tcVal g amap m (traitInfo:Trait else ResultD (Some (MakeMethInfoCall amap m minfo methArgTys argExprs )) - | Choice2Of4 (tinst, rfref, isSet) -> + | Choice2Of5 (tinst, rfref, isSet) -> let res = match isSet, rfref.RecdField.IsStatic, argExprs.Length with | true, true, 1 -> @@ -2683,8 +2727,16 @@ let CodegenWitnessThatTypSupportsTraitConstraint tcVal g amap m (traitInfo:Trait Some (mkRecdFieldGet g (argExprs.[0], rfref, tinst, m)) | _ -> None ResultD res - | Choice3Of4 expr -> ResultD (Some (MakeApplicationAndBetaReduce g (expr, tyOfExpr g expr, [], argExprs, m))) - | Choice4Of4 () -> ResultD None) + | Choice3Of5 (anonInfo, tinst, i) -> + let res = + let tupInfo = anonInfo.TupInfo + if evalTupInfoIsStruct tupInfo && isByrefTy g (tyOfExpr g argExprs.[0]) then + Some (mkAnonRecdFieldGetViaExprAddr (anonInfo, argExprs.[0], tinst, i, m)) + else + Some (mkAnonRecdFieldGet g (anonInfo, argExprs.[0], tinst, i, m)) + ResultD res + | Choice4Of5 expr -> ResultD (Some (MakeApplicationAndBetaReduce g (expr, tyOfExpr g expr, [], argExprs, m))) + | Choice5Of5 () -> ResultD None) let ChooseTyparSolutionAndSolve css denv tp = diff --git a/src/fsharp/FSComp.txt b/src/fsharp/FSComp.txt index f09efb42d99..a212f7def0b 100644 --- a/src/fsharp/FSComp.txt +++ b/src/fsharp/FSComp.txt @@ -440,6 +440,7 @@ parsParenFormIsForML,"In F# code you may use 'expr.[expr]'. A type annotation ma 602,parsUnmatched,"Unmatched '%s'" 603,parsUnmatchedBracketBar,"Unmatched '[|'" 604,parsUnmatchedBrace,"Unmatched '{{'" +605,parsUnmatchedBraceBar,"Unmatched '{{|'" 609,parsFieldBinding,"Field bindings must have the form 'id = expr;'" 610,parsMemberIllegalInObjectImplementation,"This member is not permitted in an object implementation" 611,parsMissingFunctionBody,"Missing function body" @@ -922,6 +923,7 @@ typeInfoProperty,"property" typeInfoExtension,"extension" typeInfoCustomOperation,"custom operation" typeInfoArgument,"argument" +typeInfoAnonRecdField,"anonymous record field" typeInfoPatternVariable,"patvar" typeInfoNamespace,"namespace" typeInfoModule,"module" @@ -1338,6 +1340,8 @@ tcGlobalsSystemTypeNotFound,"The system type '%s' was required but no referenced 3213,typrelMemberHasMultiplePossibleDispatchSlots,"The member '%s' matches multiple overloads of the same method.\nPlease restrict it to one of the following:%s." 3214,methodIsNotStatic,"Method or object constructor '%s' is not static" 3215,parsUnexpectedSymbolEqualsInsteadOfIn,"Unexpected symbol '=' in expression. Did you intend to use 'for x in y .. z do' instead?" +tcAnonRecdCcuMismatch,"Two anonymous record types are from different assemblies '%s' and '%s'" +tcAnonRecdFieldNameMismatch,"Two anonymous record types have mismatched sets of field names '%s' and '%s'" keywordDescriptionAbstract,"Indicates a method that either has no implementation in the type in which it is declared or that is virtual and has a default implementation." keyworkDescriptionAnd,"Used in mutually recursive bindings, in property declarations, and with multiple constraints on generic parameters." keywordDescriptionAs,"Used to give the current class object an object name. Also used to give a name to a whole pattern within a pattern match." @@ -1423,4 +1427,6 @@ notAFunctionButMaybeDeclaration,"This value is not a function and cannot be appl 3219,pickleUnexpectedNonZero,"An error occurred while reading the F# metadata of assembly '%s'. A reserved construct was utilized. You may need to upgrade your F# compiler or use an earlier version of the assembly that doesn't make use of a specific construct." 3220,tcTupleMemberNotNormallyUsed,"This method or property is not normally used from F# code, use an explicit tuple pattern for deconstruction instead." 3221,implicitlyDiscardedInSequenceExpression,"This expression returns a value of type '%s' but is implicitly discarded. Consider using 'let' to bind the result to a name, e.g. 'let result = expression'. If you intended to use the expression as a value in the sequence then use an explicit 'yield'." -3222,implicitlyDiscardedSequenceInSequenceExpression,"This expression returns a value of type '%s' but is implicitly discarded. Consider using 'let' to bind the result to a name, e.g. 'let result = expression'. If you intended to use the expression as a value in the sequence then use an explicit 'yield!'." \ No newline at end of file +3222,implicitlyDiscardedSequenceInSequenceExpression,"This expression returns a value of type '%s' but is implicitly discarded. Consider using 'let' to bind the result to a name, e.g. 'let result = expression'. If you intended to use the expression as a value in the sequence then use an explicit 'yield!'." +3223,parsInvalidAnonRecdExpr,"Invalid anonymous record expression" +3224,parsInvalidAnonRecdType,"Invalid anonymous record type" diff --git a/src/fsharp/FSStrings.resx b/src/fsharp/FSStrings.resx index eb8a8f975cf..48e26fceda4 100644 --- a/src/fsharp/FSStrings.resx +++ b/src/fsharp/FSStrings.resx @@ -396,6 +396,9 @@ symbol '[' + + symbol '{|' + symbol '[|' @@ -411,6 +414,9 @@ symbol '|]' + + symbol '|}' + symbol '>}' diff --git a/src/fsharp/FindUnsolved.fs b/src/fsharp/FindUnsolved.fs index f207262e930..1efe5e0e05c 100644 --- a/src/fsharp/FindUnsolved.fs +++ b/src/fsharp/FindUnsolved.fs @@ -1,9 +1,7 @@ // Copyright (c) Microsoft Corporation. All Rights Reserved. See License.txt in the project root for license information. -//------------------------------------------------------------------------- -// Find unsolved, uninstantiated type variables -//------------------------------------------------------------------------- +/// Find unsolved, uninstantiated type variables module internal Microsoft.FSharp.Compiler.FindUnsolved open Microsoft.FSharp.Compiler @@ -16,24 +14,24 @@ open Microsoft.FSharp.Compiler.TypeRelations type env = Nix +/// The environment and collector type cenv = { g: TcGlobals amap: Import.ImportMap denv: DisplayEnv mutable unsolved: Typars } +/// Walk types, collecting type variables let accTy cenv _env ty = - (freeInType CollectTyparsNoCaching (tryNormalizeMeasureInType cenv.g ty)).FreeTypars |> Zset.iter (fun tp -> - if (tp.Rigidity <> TyparRigidity.Rigid) then - cenv.unsolved <- tp :: cenv.unsolved) + let normalizedTy = tryNormalizeMeasureInType cenv.g ty + (freeInType CollectTyparsNoCaching normalizedTy).FreeTypars |> Zset.iter (fun tp -> + if (tp.Rigidity <> TyparRigidity.Rigid) then + cenv.unsolved <- tp :: cenv.unsolved) let accTypeInst cenv env tyargs = - tyargs |> List.iter (accTy cenv env) + tyargs |> List.iter (accTy cenv env) -//-------------------------------------------------------------------------- -// walk exprs etc -//-------------------------------------------------------------------------- - +/// Walk expressions, collecting type variables let rec accExpr (cenv:cenv) (env:env) expr = let expr = stripExpr expr match expr with @@ -62,7 +60,6 @@ let rec accExpr (cenv:cenv) (env:env) expr = accTypeInst cenv env tyargs accExpr cenv env f accExprs cenv env argsl - // REVIEW: fold the next two cases together | Expr.Lambda(_,_ctorThisValOpt,_baseValOpt,argvs,_body,m,rty) -> let topValInfo = ValReprInfo ([],[argvs |> List.map (fun _ -> ValReprInfo.unnamedTopArg1)],ValReprInfo.unnamedRetVal) let ty = mkMultiLambdaTy m argvs rty @@ -136,6 +133,7 @@ and accLambdas cenv env topValInfo e ety = accExpr cenv env e and accExprs cenv env exprs = exprs |> List.iter (accExpr cenv env) + and accTargets cenv env m ty targets = Array.iter (accTarget cenv env m ty) targets and accTarget cenv env _m _ty (TTarget(_vs,e,_)) = accExpr cenv env e @@ -192,10 +190,6 @@ and accBind cenv env (bind:Binding) = and accBinds cenv env xs = xs |> List.iter (accBind cenv env) -//-------------------------------------------------------------------------- -// check tycons -//-------------------------------------------------------------------------- - let accTyconRecdField cenv env _tycon (rfield:RecdField) = accAttribs cenv env rfield.PropertyAttribs accAttribs cenv env rfield.FieldAttribs @@ -208,14 +202,9 @@ let accTycon cenv env (tycon:Tycon) = tycon.UnionCasesAsList |> List.iter (fun uc -> accAttribs cenv env uc.Attribs uc.RecdFields |> List.iter (accTyconRecdField cenv env tycon)) - let accTycons cenv env tycons = List.iter (accTycon cenv env) tycons -//-------------------------------------------------------------------------- -// check modules -//-------------------------------------------------------------------------- - let rec accModuleOrNamespaceExpr cenv env x = match x with | ModuleOrNamespaceExprWithSig(_mty,def,_m) -> accModuleOrNamespaceDef cenv env def @@ -231,7 +220,9 @@ and accModuleOrNamespaceDef cenv env x = | TMDefDo(e,_m) -> accExpr cenv env e | TMAbstract(def) -> accModuleOrNamespaceExpr cenv env def | TMDefs(defs) -> accModuleOrNamespaceDefs cenv env defs + and accModuleOrNamespaceBinds cenv env xs = List.iter (accModuleOrNamespaceBind cenv env) xs + and accModuleOrNamespaceBind cenv env x = match x with | ModuleOrNamespaceBinding.Binding bind -> accBind cenv env bind diff --git a/src/fsharp/IlxGen.fs b/src/fsharp/IlxGen.fs index 704a92f7600..f5cee3ca886 100644 --- a/src/fsharp/IlxGen.fs +++ b/src/fsharp/IlxGen.fs @@ -373,7 +373,7 @@ type PtrsOK = | PtrTypesNotOK let rec GenTypeArgAux amap m tyenv tyarg = - GenTypeAux amap m tyenv VoidNotOK PtrTypesNotOK tyarg + GenTypeAuxAux amap m tyenv VoidNotOK PtrTypesNotOK tyarg and GenTypeArgsAux amap m tyenv tyargs = List.map (GenTypeArgAux amap m tyenv) (DropErasedTyargs tyargs) @@ -385,13 +385,15 @@ and GenTyAppAux amap m tyenv repr tinst = let ty = IL.instILType ilTypeInst ty ty | CompiledTypeRepr.ILAsmNamed (tref, boxity, ilTypeOpt) -> - match ilTypeOpt with - | None -> - let ilTypeInst = GenTypeArgsAux amap m tyenv tinst - mkILTy boxity (mkILTySpec (tref,ilTypeInst)) - | Some ilType -> - ilType // monomorphic types include a cached ilType to avoid reallocation of an ILType node + GenILTyAppAux amap m tyenv (tref, boxity, ilTypeOpt) tinst +and GenILTyAppAux amap m tyenv (tref, boxity, ilTypeOpt) tinst = + match ilTypeOpt with + | None -> + let ilTypeInst = GenTypeArgsAux amap m tyenv tinst + mkILTy boxity (mkILTySpec (tref,ilTypeInst)) + | Some ilType -> + ilType // monomorphic types include a cached ilType to avoid reallocation of an ILType node and GenNamedTyAppAux (amap:ImportMap) m tyenv ptrsOK tcref tinst = let g = amap.g @@ -404,12 +406,12 @@ and GenNamedTyAppAux (amap:ImportMap) m tyenv ptrsOK tcref tinst = match tcref.TypeReprInfo with // Generate the base type, because that is always the representation of the erased type, unless the assembly is being injected | TProvidedTypeExtensionPoint info when info.IsErased -> - GenTypeAux amap m tyenv VoidNotOK ptrsOK (info.BaseTypeForErased (m,g.obj_ty)) + GenTypeAuxAux amap m tyenv VoidNotOK ptrsOK (info.BaseTypeForErased (m,g.obj_ty)) | _ -> #endif GenTyAppAux amap m tyenv (GenTyconRef tcref) tinst -and GenTypeAux amap m (tyenv: TypeReprEnv) voidOK ptrsOK ty = +and GenTypeAuxAux amap m (tyenv: TypeReprEnv) voidOK ptrsOK ty = let g = amap.g #if DEBUG voidCheck m g voidOK ty @@ -418,16 +420,20 @@ and GenTypeAux amap m (tyenv: TypeReprEnv) voidOK ptrsOK ty = #endif match stripTyEqnsAndMeasureEqns g ty with | TType_app (tcref, tinst) -> GenNamedTyAppAux amap m tyenv ptrsOK tcref tinst - | TType_tuple (tupInfo, args) -> GenTypeAux amap m tyenv VoidNotOK ptrsOK (mkCompiledTupleTy g (evalTupInfoIsStruct tupInfo) args) + | TType_tuple (tupInfo, args) -> GenTypeAuxAux amap m tyenv VoidNotOK ptrsOK (mkCompiledTupleTy g (evalTupInfoIsStruct tupInfo) args) | TType_fun (dty, returnTy) -> EraseClosures.mkILFuncTy g.ilxPubCloEnv (GenTypeArgAux amap m tyenv dty) (GenTypeArgAux amap m tyenv returnTy) + | TType_anon (anonInfo, tinst) -> + let tref = anonInfo.ILTypeRef + let boxity = if evalAnonInfoIsStruct anonInfo then ILBoxity.AsValue else ILBoxity.AsObject + GenILTyAppAux amap m tyenv (tref, boxity, None) tinst | TType_ucase (ucref, args) -> - let cuspec,idx = GenUnionCaseSpec amap m tyenv ucref args + let cuspec,idx = GenUnionCaseSpecAux amap m tyenv ucref args EraseUnions.GetILTypeForAlternative cuspec idx | TType_forall (tps, tau) -> let tps = DropErasedTypars tps - if tps.IsEmpty then GenTypeAux amap m tyenv VoidNotOK ptrsOK tau + if tps.IsEmpty then GenTypeAuxAux amap m tyenv VoidNotOK ptrsOK tau else EraseClosures.mkILTyFuncTy g.ilxPubCloEnv | TType_var tp -> mkILTyvarTy tyenv.[tp,m] | TType_measure _ -> g.ilg.typ_Int32 @@ -439,7 +445,7 @@ and GenTypeAux amap m (tyenv: TypeReprEnv) voidOK ptrsOK ty = and GenUnionCaseRef (amap: ImportMap) m tyenv i (fspecs:RecdField array) = let g = amap.g fspecs |> Array.mapi (fun j fspec -> - let ilFieldDef = IL.mkILInstanceField(fspec.Name,GenType amap m tyenv fspec.FormalType, None, ILMemberAccess.Public) + let ilFieldDef = IL.mkILInstanceField(fspec.Name,GenTypeAux amap m tyenv fspec.FormalType, None, ILMemberAccess.Public) IlxUnionField { ilFieldDef with // These properties on the "field" of an alternative end up going on a property generated by cu_erase.fs @@ -482,47 +488,26 @@ and ComputeUnionHasHelpers g (tcref : TyconRef) = | _ -> AllHelpers (* not hiddenRepr *) -and GenUnionSpec amap m tyenv tcref tyargs = +and GenUnionSpecAux amap m tyenv tcref tyargs = let curef = GenUnionRef amap m tcref - let tinst = GenTypeArgs amap m tyenv tyargs + let tinst = GenTypeArgsAux amap m tyenv tyargs IlxUnionSpec(curef,tinst) -and GenUnionCaseSpec amap m tyenv (ucref:UnionCaseRef) tyargs = - let cuspec = GenUnionSpec amap m tyenv ucref.TyconRef tyargs +and GenUnionCaseSpecAux amap m tyenv (ucref:UnionCaseRef) tyargs = + let cuspec = GenUnionSpecAux amap m tyenv ucref.TyconRef tyargs cuspec, ucref.Index -and GenType amap m tyenv ty = - GenTypeAux amap m tyenv VoidNotOK PtrTypesNotOK ty - - -and GenTypes amap m tyenv tys = List.map (GenType amap m tyenv) tys -and GenTypePermitVoid amap m tyenv ty = (GenTypeAux amap m tyenv VoidOK PtrTypesNotOK ty) -and GenTypesPermitVoid amap m tyenv tys = List.map (GenTypePermitVoid amap m tyenv) tys - -and GenTyApp amap m tyenv repr tyargs = GenTyAppAux amap m tyenv repr tyargs -and GenNamedTyApp amap m tyenv tcref tinst = GenNamedTyAppAux amap m tyenv PtrTypesNotOK tcref tinst - /// IL void types are only generated for return types -and GenReturnType amap m tyenv returnTyOpt = +and GenReturnTypeAux amap m tyenv returnTyOpt = match returnTyOpt with | None -> ILType.Void - | Some returnTy -> GenTypeAux amap m tyenv VoidNotOK(*1*) PtrTypesOK returnTy (*1: generate void from unit, but not accept void *) - -and GenParamType amap m tyenv ty = - ty |> GenTypeAux amap m tyenv VoidNotOK PtrTypesOK - -and GenParamTypes amap m tyenv tys = - tys |> List.map (GenTypeAux amap m tyenv VoidNotOK PtrTypesOK) - -and GenTypeArgs amap m tyenv tyargs = GenTypeArgsAux amap m tyenv tyargs - -let GenericParamHasConstraint (gp: ILGenericParameterDef) = - gp.Constraints.Length <> 0 || - gp.Variance <> NonVariant || - gp.HasReferenceTypeConstraint || - gp.HasNotNullableValueTypeConstraint || - gp.HasDefaultConstructorConstraint + | Some returnTy -> GenTypeAuxAux amap m tyenv VoidNotOK(*1*) PtrTypesOK returnTy (*1: generate void from unit, but not accept void *) +and GenTypeAux amap m tyenv ty = GenTypeAuxAux amap m tyenv VoidNotOK PtrTypesNotOK ty +and GenTypesAux amap m tyenv tys = List.map (GenTypeAux amap m tyenv) tys +and GenParamTypeAux amap m tyenv ty = GenTypeAuxAux amap m tyenv VoidNotOK PtrTypesOK ty +and GenParamTypesAux amap m tyenv tys = tys |> List.map (GenParamTypeAux amap m tyenv) +and GenTypePermitVoidAux amap m tyenv ty = GenTypeAuxAux amap m tyenv VoidOK PtrTypesNotOK ty // Static fields generally go in a private InitializationCodeAndBackingFields section. This is to ensure all static // fields are initialized only in their class constructors (we generate one primary @@ -549,12 +534,9 @@ let GenFieldSpecForStaticField (isInteractive, g, ilContainerTy, vspec:Val, nm, let GenRecdFieldRef m cenv tyenv (rfref:RecdFieldRef) tyargs = let tyenvinner = TypeReprEnv.ForTycon rfref.Tycon - mkILFieldSpecInTy(GenTyApp cenv.amap m tyenv rfref.TyconRef.CompiledRepresentation tyargs, + mkILFieldSpecInTy(GenTyAppAux cenv.amap m tyenv rfref.TyconRef.CompiledRepresentation tyargs, ComputeFieldName rfref.Tycon rfref.RecdField, - GenType cenv.amap m tyenvinner rfref.RecdField.FormalType) - -let GenExnType amap m tyenv (ecref:TyconRef) = GenTyApp amap m tyenv ecref.CompiledRepresentation [] - + GenTypeAux cenv.amap m tyenvinner rfref.RecdField.FormalType) //-------------------------------------------------------------------------- // Closure summaries @@ -595,663 +577,827 @@ type IlxClosureInfo = //-------------------------------------------------------------------------- -// Representation of term declarations = Environments for compiling expressions. +// Generate debugging marks //-------------------------------------------------------------------------- - -[] -type ValStorage = - /// Indicates the value is always null - | Null - /// Indicates the value is stored in a static field. - | StaticField of ILFieldSpec * ValRef * (*hasLiteralAttr:*)bool * ILType * string * ILType * ILMethodRef * ILMethodRef * OptionalShadowLocal - /// Indicates the value is "stored" as a property that recomputes it each time it is referenced. Used for simple constants that do not cause initialization triggers - | StaticProperty of ILMethodSpec * OptionalShadowLocal - /// Indicates the value is "stored" as a IL static method (in a "main" class for a F# - /// compilation unit, or as a member) according to its inferred or specified arity. - | Method of ValReprInfo * ValRef * ILMethodSpec * Range.range * ArgReprInfo list * ArgReprInfo - /// Indicates the value is stored at the given position in the closure environment accessed via "ldarg 0" - | Env of ILType * int * ILFieldSpec * NamedLocalIlxClosureInfo ref option - /// Indicates that the value is an argument of a method being generated - | Arg of int - /// Indicates that the value is stored in local of the method being generated. NamedLocalIlxClosureInfo is normally empty. - /// It is non-empty for 'local type functions', see comments on definition of NamedLocalIlxClosureInfo. - | Local of int * NamedLocalIlxClosureInfo ref option +let GenILSourceMarker (g: TcGlobals) (m:range) = + ILSourceMarker.Create(document=g.memoize_file m.FileIndex, + line=m.StartLine, + /// NOTE: .NET && VS measure first column as column 1 + column= m.StartColumn+1, + endLine= m.EndLine, + endColumn=m.EndColumn+1) -and OptionalShadowLocal = - | NoShadowLocal - | ShadowLocal of ValStorage +let GenPossibleILSourceMarker cenv m = + if cenv.opts.generateDebugSymbols then + Some (GenILSourceMarker cenv.g m ) + else + None -/// The representation of a NamedLocalClosure is based on a cloinfo. However we can't generate a cloinfo until we've -/// decided the representations of other items in the recursive set. Hence we use two phases to decide representations in -/// a recursive set. Yuck. -and NamedLocalIlxClosureInfo = - | NamedLocalIlxClosureInfoGenerator of (IlxGenEnv -> IlxClosureInfo) - | NamedLocalIlxClosureInfoGenerated of IlxClosureInfo - -and ModuleStorage = - { Vals: Lazy> - SubModules: Lazy> } +//-------------------------------------------------------------------------- +// Helpers for merging property definitions +//-------------------------------------------------------------------------- -/// BranchCallItems are those where a call to the value can be implemented as -/// a branch. At the moment these are only used for generating branch calls back to -/// the entry label of the method currently being generated. -and BranchCallItem = - | BranchCallClosure of ArityInfo - | BranchCallMethod of - // Argument counts for compiled form of F# method or value - ArityInfo * - // Arg infos for compiled form of F# method or value - (TType * ArgReprInfo) list list * - // Typars for F# method or value - Tast.Typars * - // Typars for F# method or value - int * - // num obj args - int - -and Mark = - | Mark of ILCodeLabel (* places we can branch to *) - member x.CodeLabel = (let (Mark(lab)) = x in lab) +let HashRangeSorted (ht: IDictionary<_, (int * _)>) = + [ for KeyValue(_k,v) in ht -> v ] |> List.sortBy fst |> List.map snd -and IlxGenEnv = - { tyenv: TypeReprEnv - someTypeInThisAssembly: ILType - isFinalFile: bool - /// Where to place the stuff we're currently generating - cloc: CompileLocation - /// Hiding information down the signature chain, used to compute what's public to the assembly - sigToImplRemapInfo: (Remap * SignatureHidingInfo) list - /// All values in scope - valsInScope: ValMap> - /// For optimizing direct tail recursion to a loop - mark says where to branch to. Length is 0 or 1. - /// REVIEW: generalize to arbitrary nested local loops?? - innerVals: (ValRef * (BranchCallItem * Mark)) list - /// Full list of enclosing bound values. First non-compiler-generated element is used to help give nice names for closures and other expressions. - letBoundVars: ValRef list - /// The set of IL local variable indexes currently in use by lexically scoped variables, to allow reuse on different branches. - /// Really an integer set. - liveLocals: IntMap - /// Are we under the scope of a try, catch or finally? If so we can't tailcall. SEH = structured exception handling - withinSEH: bool } +let MergeOptions m o1 o2 = + match o1,o2 with + | Some x, None | None, Some x -> Some x + | None, None -> None + | Some x, Some _ -> +#if DEBUG + // This warning fires on some code that also triggers this warning: + // warning(Error("The implementation of a specified generic interface required a method implementation not fully supported by F# Interactive. In the unlikely event that the resulting class fails to load then compile the interface type into a statically-compiled DLL and reference it using '#r'",m)) + // The code is OK so we don't print this. + errorR(InternalError("MergeOptions: two values given",m)) +#else + ignore m +#endif + Some x -let ReplaceTyenv tyenv (eenv: IlxGenEnv) = {eenv with tyenv = tyenv } -let EnvForTypars tps eenv = {eenv with tyenv = TypeReprEnv.ForTypars tps } -let AddTyparsToEnv typars (eenv: IlxGenEnv) = {eenv with tyenv = eenv.tyenv.Add typars} +let MergePropertyPair m (pd: ILPropertyDef) pdef = + {pd with GetMethod=MergeOptions m pd.GetMethod pdef.GetMethod + SetMethod=MergeOptions m pd.SetMethod pdef.SetMethod} -let AddSignatureRemapInfo _msg (rpi, mhi) eenv = - { eenv with sigToImplRemapInfo = (mkRepackageRemapping rpi,mhi) :: eenv.sigToImplRemapInfo } - -//-------------------------------------------------------------------------- -// Print eenv -//-------------------------------------------------------------------------- +type PropKey = PropKey of string * ILTypes * ILThisConvention -let OutputStorage (pps: TextWriter) s = - match s with - | StaticField _ -> pps.Write "(top)" - | StaticProperty _ -> pps.Write "(top)" - | Method _ -> pps.Write "(top)" - | Local _ -> pps.Write "(local)" - | Arg _ -> pps.Write "(arg)" - | Env _ -> pps.Write "(env)" - | Null -> pps.Write "(null)" +let AddPropertyDefToHash (m:range) (ht:Dictionary) (pdef: ILPropertyDef) = + let nm = PropKey(pdef.Name, pdef.Args, pdef.CallingConv) + if ht.ContainsKey nm then + let idx,pd = ht.[nm] + ht.[nm] <- (idx, MergePropertyPair m pd pdef) + else + ht.[nm] <- (ht.Count, pdef) + + +/// Merge a whole group of properties all at once +let MergePropertyDefs m ilPropertyDefs = + let ht = new Dictionary<_,_>(3,HashIdentity.Structural) + ilPropertyDefs |> List.iter (AddPropertyDefToHash m ht) + HashRangeSorted ht //-------------------------------------------------------------------------- -// Augment eenv with values +// Buffers for compiling modules. The entire assembly gets compiled via an AssemblyBuilder //-------------------------------------------------------------------------- -let AddStorageForVal (g: TcGlobals) (v,s) eenv = - let eenv = { eenv with valsInScope = eenv.valsInScope.Add v s } - // If we're compiling fslib then also bind the value as a non-local path to - // allow us to resolve the compiler-non-local-references that arise from env.fs - // - // Do this by generating a fake "looking from the outside in" non-local value reference for - // v, dereferencing it to find the corresponding signature Val, and adding an entry for the signature val. - // - // A similar code path exists in ilxgen.fs for the tables of "optimization data" for values - if g.compilingFslib then - // Passing an empty remap is sufficient for FSharp.Core.dll because it turns out the remapped type signature can - // still be resolved. - match tryRescopeVal g.fslibCcu Remap.Empty v with - | None -> eenv - | Some vref -> - match vref.TryDeref with - | VNone -> - //let msg = sprintf "could not dereference external value reference to something in FSharp.Core.dll during code generation, v.MangledName = '%s', v.Range = %s" v.MangledName (stringOfRange v.Range) - //System.Diagnostics.Debug.Assert(false, msg) - eenv - | VSome gv -> - { eenv with valsInScope = eenv.valsInScope.Add gv s } - else - eenv +/// Information collected imperatively for each type definition +type TypeDefBuilder(tdef, tdefDiscards) = + let gmethods = new ResizeArray(0) + let gfields = new ResizeArray(0) + let gproperties : Dictionary = new Dictionary<_,_>(3,HashIdentity.Structural) + let gevents = new ResizeArray(0) + let gnested = new TypeDefsBuilder() + + member b.Close() = + { tdef with + Methods = mkILMethods (tdef.Methods.AsList @ ResizeArray.toList gmethods) + Fields = mkILFields (tdef.Fields.AsList @ ResizeArray.toList gfields) + Properties = mkILProperties (tdef.Properties.AsList @ HashRangeSorted gproperties ) + Events = mkILEvents (tdef.Events.AsList @ ResizeArray.toList gevents) + NestedTypes = mkILTypeDefs (tdef.NestedTypes.AsList @ gnested.Close()) } -let AddStorageForLocalVals g vals eenv = List.foldBack (fun (v,s) acc -> AddStorageForVal g (v,notlazy s) acc) vals eenv -//-------------------------------------------------------------------------- -// Lookup eenv -//-------------------------------------------------------------------------- - -open Microsoft.FSharp.Compiler.AbstractIL -open Microsoft.FSharp.Compiler.AbstractIL.Internal -open Microsoft.FSharp.Compiler.AbstractIL.Internal.Library + member b.AddEventDef(edef) = gevents.Add edef + member b.AddFieldDef(ilFieldDef) = gfields.Add ilFieldDef + member b.AddMethodDef(ilMethodDef) = + let discard = + match tdefDiscards with + | Some (mdefDiscard, _) -> mdefDiscard ilMethodDef + | None -> false + if not discard then + gmethods.Add ilMethodDef + member b.NestedTypeDefs = gnested + member b.GetCurrentFields() = gfields |> Seq.readonly -let StorageForVal m v eenv = - let v = - try eenv.valsInScope.[v] - with :? KeyNotFoundException -> - assert false - errorR(Error(FSComp.SR.ilUndefinedValue(showL(vspecAtBindL v)),m)) - notlazy (Arg 668(* random value for post-hoc diagnostic analysis on generated tree *) ) - v.Force() + /// Merge Get and Set property nodes, which we generate independently for F# code + /// when we come across their corresponding methods. + member b.AddOrMergePropertyDef(pdef,m) = + let discard = + match tdefDiscards with + | Some (_, pdefDiscard) -> pdefDiscard pdef + | None -> false + if not discard then + AddPropertyDefToHash m gproperties pdef -let StorageForValRef m (v: ValRef) eenv = StorageForVal m v.Deref eenv + member b.PrependInstructionsToSpecificMethodDef(cond,instrs,tag) = + match ResizeArray.tryFindIndex cond gmethods with + | Some idx -> gmethods.[idx] <- prependInstrsToMethod instrs gmethods.[idx] + | None -> gmethods.Add(mkILClassCtor (mkMethodBody (false,[],1,nonBranchingInstrsToCode instrs,tag))) -//-------------------------------------------------------------------------- -// Imported modules and the environment -// -// How a top level value is represented depends on its type. If it's a -// function or is polymorphic, then it gets represented as a -// method (possibly and instance method). Otherwise it gets represented as a -// static field. -//-------------------------------------------------------------------------- -let IsValRefIsDllImport g (vref:ValRef) = - vref.Attribs |> HasFSharpAttributeOpt g g.attrib_DllImportAttribute +and TypeDefsBuilder() = + let tdefs : Internal.Utilities.Collections.HashMultiMap = HashMultiMap(0, HashIdentity.Structural) + let mutable countDown = System.Int32.MaxValue -let GetMethodSpecForMemberVal amap g (memberInfo:ValMemberInfo) (vref:ValRef) = - let m = vref.Range - let tps,curriedArgInfos,returnTy,retInfo = - assert(vref.ValReprInfo.IsSome) - GetTopValTypeInCompiledForm g (Option.get vref.ValReprInfo) vref.Type m - let tyenvUnderTypars = TypeReprEnv.ForTypars tps - let flatArgInfos = List.concat curriedArgInfos - let isCtor = (memberInfo.MemberFlags.MemberKind = MemberKind.Constructor) - let cctor = (memberInfo.MemberFlags.MemberKind = MemberKind.ClassConstructor) - let parentTcref = vref.TopValDeclaringEntity - let parentTypars = parentTcref.TyparsNoRange - let numParentTypars = parentTypars.Length - if tps.Length < numParentTypars then error(InternalError("CodeGen check: type checking did not ensure that this method is sufficiently generic", m)) - let ctps,mtps = List.chop numParentTypars tps - let isCompiledAsInstance = ValRefIsCompiledAsInstanceMember g vref + member b.Close() = + //The order we emit type definitions is not deterministic since it is using the reverse of a range from a hash table. We should use an approximation of source order. + // Ideally it shouldn't matter which order we use. + // However, for some tests FSI generated code appears sensitive to the order, especially for nested types. + + [ for (b, eliminateIfEmpty) in HashRangeSorted tdefs do + let tdef = b.Close() + // Skip the type if it is empty + if not eliminateIfEmpty + || not tdef.NestedTypes.AsList.IsEmpty + || not tdef.Fields.AsList.IsEmpty + || not tdef.Events.AsList.IsEmpty + || not tdef.Properties.AsList.IsEmpty + || not tdef.Methods.AsList.IsEmpty then + yield tdef ] - let ilActualRetTy = - let ilRetTy = GenReturnType amap m tyenvUnderTypars returnTy - if isCtor || cctor then ILType.Void else ilRetTy - let ilTy = GenType amap m tyenvUnderTypars (mkAppTy parentTcref (List.map mkTyparTy ctps)) - if isCompiledAsInstance || isCtor then - // Find the 'this' argument type if any - let thisTy,flatArgInfos = - if isCtor then (GetFSharpViewOfReturnType g returnTy),flatArgInfos - else - match flatArgInfos with - | [] -> error(InternalError("This instance method '" + vref.LogicalName + "' has no arguments", m)) - | (h,_):: t -> h,t + member b.FindTypeDefBuilder(nm) = + try tdefs.[nm] |> snd |> fst + with :? KeyNotFoundException -> failwith ("FindTypeDefBuilder: " + nm + " not found") - let thisTy = if isByrefTy g thisTy then destByrefTy g thisTy else thisTy - let thisArgTys = argsOfAppTy g thisTy - if ctps.Length <> thisArgTys.Length then - warning(InternalError(sprintf "CodeGen check: type checking did not quantify the correct number of type variables for this method, #parentTypars = %d, #ctps = %d, #mtps = %d, #thisArgTys = %d" numParentTypars ctps.Length mtps.Length thisArgTys.Length,m)) - else - List.iter2 - (fun gtp ty2 -> - if not (typeEquiv g (mkTyparTy gtp) ty2) then - warning(InternalError("CodeGen check: type checking did not quantify the correct type variables for this method: generalization list contained " + gtp.Name + "#" + string gtp.Stamp + " and list from 'this' pointer contained " + (showL(typeL ty2)), m))) - ctps - thisArgTys - let methodArgTys,paramInfos = List.unzip flatArgInfos - let ilMethodArgTys = GenParamTypes amap m tyenvUnderTypars methodArgTys - let ilMethodInst = GenTypeArgs amap m tyenvUnderTypars (List.map mkTyparTy mtps) - let mspec = mkILInstanceMethSpecInTy (ilTy,vref.CompiledName,ilMethodArgTys,ilActualRetTy,ilMethodInst) - - mspec,ctps,mtps,paramInfos,retInfo - else - let methodArgTys,paramInfos = List.unzip flatArgInfos - let ilMethodArgTys = GenParamTypes amap m tyenvUnderTypars methodArgTys - let ilMethodInst = GenTypeArgs amap m tyenvUnderTypars (List.map mkTyparTy mtps) - let mspec = mkILStaticMethSpecInTy (ilTy,vref.CompiledName,ilMethodArgTys,ilActualRetTy,ilMethodInst) - - mspec,ctps,mtps,paramInfos,retInfo + member b.FindNestedTypeDefsBuilder(path) = + List.fold (fun (acc:TypeDefsBuilder) x -> acc.FindTypeDefBuilder(x).NestedTypeDefs) b path -// Generate the ILFieldSpec for a top-level value + member b.FindNestedTypeDefBuilder(tref:ILTypeRef) = + b.FindNestedTypeDefsBuilder(tref.Enclosing).FindTypeDefBuilder(tref.Name) -let ComputeFieldSpecForVal(optIntraAssemblyInfo:IlxGenIntraAssemblyInfo option, isInteractive, g, ilTyForProperty, vspec:Val, nm, m, cloc, ilTy, ilGetterMethRef) = - assert vspec.IsCompiledAsTopLevel - let generate() = GenFieldSpecForStaticField (isInteractive, g, ilTyForProperty, vspec, nm, m, cloc, ilTy) - match optIntraAssemblyInfo with - | None -> generate() - | Some intraAssemblyInfo -> - if vspec.IsMutable && vspec.IsCompiledAsTopLevel && isStructTy g vspec.Type then - let ok, res = intraAssemblyInfo.StaticFieldInfo.TryGetValue ilGetterMethRef - if ok then - res - else - let res = generate() - intraAssemblyInfo.StaticFieldInfo.[ilGetterMethRef] <- res - res - else - generate() + member b.AddTypeDef(tdef:ILTypeDef, eliminateIfEmpty, addAtEnd, tdefDiscards) = + let idx = if addAtEnd then (countDown <- countDown - 1; countDown) else tdefs.Count + tdefs.Add (tdef.Name, (idx, (new TypeDefBuilder(tdef, tdefDiscards), eliminateIfEmpty))) +type AnonTypeGenerationTable() = + let dict = Dictionary(HashIdentity.Structural) + member __.Table = dict -let IsValCompiledAsMethod g (v:Val) = - match v.ValReprInfo with - | None -> false - | Some topValInfo -> - not (isUnitTy g v.Type && not v.IsMemberOrModuleBinding && not v.IsMutable) && - not v.IsCompiledAsStaticPropertyWithoutField && - match GetTopValTypeInFSharpForm g topValInfo v.Type v.Range with - | [],[],_,_ when not v.IsMember -> false - | _ -> true +/// Assembly generation buffers +type AssemblyBuilder(cenv:cenv, anonTypeTable: AnonTypeGenerationTable) as mgbuf = + // The Abstract IL table of types + let gtdefs= new TypeDefsBuilder() + // The definitions of top level values, as quotations. + let mutable reflectedDefinitions : Dictionary = Dictionary(HashIdentity.Reference) + let mutable extraBindingsToGenerate = [] -// This called via 2 routes. -// (a) ComputeAndAddStorageForLocalTopVal -// (b) ComputeStorageForNonLocalTopVal -// -/// This function decides the storage for the val. -/// The decision is based on arityInfo. -let ComputeStorageForTopVal (amap, g, optIntraAssemblyInfo:IlxGenIntraAssemblyInfo option, isInteractive, optShadowLocal, vref:ValRef, cloc) = + // A memoization table for generating value types for big constant arrays + let rawDataValueTypeGenerator = + new MemoizationTable<(CompileLocation * int) , ILTypeSpec> + ((fun (cloc,size) -> + let name = CompilerGeneratedName ("T" + string(newUnique()) + "_" + string size + "Bytes") // Type names ending ...$T_37Bytes + let vtdef = mkRawDataValueTypeDef cenv.g.iltyp_ValueType (name,size,0us) + let vtref = NestedTypeRefForCompLoc cloc vtdef.Name + let vtspec = mkILTySpec(vtref,[]) + let vtdef = vtdef.WithAccess(ComputeTypeAccess vtref true) + mgbuf.AddTypeDef(vtref, vtdef, false, true, None) + vtspec), + keyComparer=HashIdentity.Structural) - if isUnitTy g vref.Type && not vref.IsMemberOrModuleBinding && not vref.IsMutable then - Null - else - let topValInfo = - match vref.ValReprInfo with - | None -> error(InternalError("ComputeStorageForTopVal: no arity found for " + showL(valRefL vref),vref.Range)) - | Some a -> a + let generateAnonType genToStringMethod (isStruct, ilTypeRef, nms) = - let m = vref.Range - let nm = vref.CompiledName - - if vref.Deref.IsCompiledAsStaticPropertyWithoutField then - let nm = "get_"+nm - let tyenvUnderTypars = TypeReprEnv.ForTypars [] - let ilRetTy = GenType amap m tyenvUnderTypars vref.Type - let typ = mkILTyForCompLoc cloc - let mspec = mkILStaticMethSpecInTy (typ, nm, [], ilRetTy, []) - - StaticProperty (mspec, optShadowLocal) - else + let flds = [ for (i,nm) in Array.indexed nms -> (nm, nm + "@", ILType.TypeVar (uint16 i)) ] + // Note that this alternative below would give the same names as C#, but the generated + // comparison/equality doesn't know about these names. + //let flds = [ for (i,nm) in Array.indexed nms -> (nm, "<" + nm + ">" + "i__Field", ILType.TypeVar (uint16 i)) ] + + let ilGenericParams = + [ for nm in nms -> + { Name = sprintf "<%s>j__TPar" nm + Constraints = [] + Variance=NonVariant + CustomAttrs = emptyILCustomAttrs + HasReferenceTypeConstraint=false + HasNotNullableValueTypeConstraint=false + HasDefaultConstructorConstraint= false } ] + + let ilTy = mkILFormalNamedTy (if isStruct then ILBoxity.AsValue else ILBoxity.AsObject) ilTypeRef ilGenericParams - // Determine when a static field is required. - // - // REVIEW: This call to GetTopValTypeInFSharpForm is only needed to determine if this is a (type) function or a value - // We should just look at the arity - match GetTopValTypeInFSharpForm g topValInfo vref.Type vref.Range with - | [],[], returnTy,_ when not vref.IsMember -> - // Mutable and literal static fields must have stable names and live in the "public" location - // See notes on GenFieldSpecForStaticField above. - let vspec = vref.Deref - let ilTy = GenType amap m TypeReprEnv.Empty returnTy (* TypeReprEnv.Empty ok: not a field in a generic class *) - let ilTyForProperty = mkILTyForCompLoc cloc - let attribs = vspec.Attribs - let hasLiteralAttr = HasFSharpAttribute g g.attrib_LiteralAttribute attribs + // Generate the IL fields + let ilFieldDefs = + mkILFields + [ for (_, fldName, fldTy) in flds -> + let fdef = mkILInstanceField (fldName, fldTy, None, ILMemberAccess.Private) + { fdef with CustomAttrs = mkILCustomAttrs [ cenv.g.DebuggerBrowsableNeverAttribute ] } ] + + // Generate property definitions for the fields compiled as properties + let ilProperties = + mkILProperties + [ for (i,(propName, _fldName, fldTy)) in List.indexed flds -> + { Name = propName + Attributes = PropertyAttributes.None + SetMethod = None + GetMethod = Some(mkILMethRef(ilTypeRef,ILCallingConv.Instance,"get_" + propName,0,[],fldTy )) + CallingConv = ILCallingConv.Instance.ThisConv + Type = fldTy + Init = None + Args = [] + CustomAttrs = mkILCustomAttrs [ mkCompilationMappingAttrWithSeqNum cenv.g (int SourceConstructFlags.Field) i ] } ] + + let ilMethods = + [ for (propName, fldName, fldTy) in flds -> + mkLdfldMethodDef ("get_" + propName,ILMemberAccess.Public,false,ilTy,fldName,fldTy) + yield! genToStringMethod ilTy ] - let ilTypeRefForProperty = ilTyForProperty.TypeRef - let ilGetterMethRef = mkILMethRef (ilTypeRefForProperty, ILCallingConv.Static, "get_"+nm, 0, [], ilTy) - let ilSetterMethRef = mkILMethRef (ilTypeRefForProperty, ILCallingConv.Static, "set_"+nm, 0, [ilTy], ILType.Void) + let ilBaseTy = (if isStruct then cenv.g.iltyp_ValueType else cenv.g.ilg.typ_Object) + + let ilCtorDef = mkILSimpleStorageCtorWithParamNames(None, (if isStruct then None else Some ilBaseTy.TypeSpec), ilTy, [], flds, ILMemberAccess.Public) + let ilCtorRef = mkRefToILMethod(ilTypeRef, ilCtorDef) + let ilMethodRefs = [| for mdef in ilMethods -> mkRefToILMethod(ilTypeRef, mdef) |] + + if ilTypeRef.Scope.IsLocalRef then + + // Create a tycon that looks exactly like a record definition, to help drive the generation of equality/comparison code + let m = range0 + let tps = + [ for nm in nms -> + let stp = Typar(mkSynId m ("T"+nm),TyparStaticReq.NoStaticReq,true) + NewTypar (TyparKind.Type, TyparRigidity.WarnIfNotRigid,stp,false,TyparDynamicReq.Yes,[],true,true) ] + + let tycon = + let lmtyp = MaybeLazy.Strict (NewEmptyModuleOrNamespaceType ModuleOrType) + let cpath = CompPath(ilTypeRef.Scope,[]) + NewTycon(Some cpath, ilTypeRef.Name, m, taccessPublic, taccessPublic, TyparKind.Type, LazyWithContext.NotLazy tps, XmlDoc.Empty, false, false, false, lmtyp) + + if isStruct then + tycon.SetIsStructRecordOrUnion(true) + + tycon.entity_tycon_repr <- + TRecdRepr (MakeRecdFieldsTable + [ for (tp, (propName, _fldName, _fldTy)) in (List.zip tps flds) -> + NewRecdField false None (mkSynId m propName) false (mkTyparTy tp) true false [] [] XmlDoc.Empty taccessPublic false ]) + + let tcref = mkLocalTyconRef tycon + let _,typ = generalizeTyconRef tcref + let tcaug = tcref.TypeContents + + tcaug.tcaug_interfaces <- + [ (cenv.g.mk_IStructuralComparable_ty,true,m) + (cenv.g.mk_IComparable_ty,true,m) + (mkAppTy cenv.g.system_GenericIComparable_tcref [typ],true,m) + (cenv.g.mk_IStructuralEquatable_ty,true,m) + (mkAppTy cenv.g.system_GenericIEquatable_tcref [typ],true,m) ] + + let vspec1,vspec2 = AugmentWithHashCompare.MakeValsForEqualsAugmentation cenv.g tcref + let evspec1,evspec2,evspec3 = AugmentWithHashCompare.MakeValsForEqualityWithComparerAugmentation cenv.g tcref + let cvspec1,cvspec2 = AugmentWithHashCompare.MakeValsForCompareAugmentation cenv.g tcref + let cvspec3 = AugmentWithHashCompare.MakeValsForCompareWithComparerAugmentation cenv.g tcref + + tcaug.SetCompare (mkLocalValRef cvspec1, mkLocalValRef cvspec2) + tcaug.SetCompareWith (mkLocalValRef cvspec3) + tcaug.SetEquals (mkLocalValRef vspec1, mkLocalValRef vspec2) + tcaug.SetHashAndEqualsWith (mkLocalValRef evspec1, mkLocalValRef evspec2, mkLocalValRef evspec3) + + // Build the ILTypeDef. We don't rely on the normal record generation process because we want very specific field names + + let ilTypeDefAttribs = mkILCustomAttrs [ cenv.g.CompilerGeneratedAttribute; mkCompilationMappingAttr cenv.g (int SourceConstructFlags.RecordType) ] + + let ilInterfaceTys = [ for (ity,_,_) in tcaug.tcaug_interfaces -> GenTypeAux cenv.amap m (TypeReprEnv.ForTypars tps) ity ] + + let ilTypeDef = + mkILGenericClass (ilTypeRef.Name, ILTypeDefAccess.Public, ilGenericParams, ilBaseTy, ilInterfaceTys, + mkILMethods (ilCtorDef :: ilMethods), ilFieldDefs, emptyILTypeDefs, + ilProperties, mkILEvents [], ilTypeDefAttribs, + ILTypeInit.BeforeField) + - let fspec = ComputeFieldSpecForVal(optIntraAssemblyInfo, isInteractive, g, ilTyForProperty, vspec, nm, m, cloc, ilTy, ilGetterMethRef) + let ilTypeDef = ilTypeDef.WithSealed(true).WithSerializable(true) - StaticField (fspec, vref, hasLiteralAttr, ilTyForProperty, nm, ilTy, ilGetterMethRef, ilSetterMethRef, optShadowLocal) - - | _ -> - match vref.MemberInfo with - | Some memberInfo when not vref.IsExtensionMember -> - let mspec,_,_,paramInfos,retInfo = GetMethodSpecForMemberVal amap g memberInfo vref - Method (topValInfo, vref, mspec, m, paramInfos, retInfo) - | _ -> - let (tps, curriedArgInfos, returnTy, retInfo) = GetTopValTypeInCompiledForm g topValInfo vref.Type m - let tyenvUnderTypars = TypeReprEnv.ForTypars tps - let (methodArgTys,paramInfos) = curriedArgInfos |> List.concat |> List.unzip - let ilMethodArgTys = GenParamTypes amap m tyenvUnderTypars methodArgTys - let ilRetTy = GenReturnType amap m tyenvUnderTypars returnTy - let ilLocTy = mkILTyForCompLoc cloc - let ilMethodInst = GenTypeArgs amap m tyenvUnderTypars (List.map mkTyparTy tps) - let mspec = mkILStaticMethSpecInTy (ilLocTy, nm, ilMethodArgTys, ilRetTy, ilMethodInst) - Method (topValInfo, vref, mspec, m, paramInfos, retInfo) + let ilTypeDef = { ilTypeDef with MethodImpls=mkILMethodImpls [] } + + mgbuf.AddTypeDef(ilTypeRef, ilTypeDef, false, true, None) + + let extraBindings = + [ yield! AugmentWithHashCompare.MakeBindingsForCompareAugmentation cenv.g tycon + yield! AugmentWithHashCompare.MakeBindingsForCompareWithComparerAugmentation cenv.g tycon + yield! AugmentWithHashCompare.MakeBindingsForEqualityWithComparerAugmentation cenv.g tycon + yield! AugmentWithHashCompare.MakeBindingsForEqualsAugmentation cenv.g tycon ] -let ComputeAndAddStorageForLocalTopVal (amap, g, intraAssemblyFieldTable, isInteractive, optShadowLocal) cloc (v:Val) eenv = - let storage = ComputeStorageForTopVal (amap, g, Some intraAssemblyFieldTable, isInteractive, optShadowLocal, mkLocalValRef v, cloc) - AddStorageForVal g (v,notlazy storage) eenv + let optimizedExtraBindings = extraBindings |> List.map (fun (TBind(a,b,c)) -> TBind(a,cenv.optimizeDuringCodeGen b,c)) -let ComputeStorageForNonLocalTopVal amap g cloc modref (v:Val) = - match v.ValReprInfo with - | None -> error(InternalError("ComputeStorageForNonLocalTopVal, expected an arity for " + v.LogicalName,v.Range)) - | Some _ -> ComputeStorageForTopVal (amap, g, None, false, NoShadowLocal, mkNestedValRef modref v, cloc) + extraBindingsToGenerate <- optimizedExtraBindings @ extraBindingsToGenerate -let rec ComputeStorageForNonLocalModuleOrNamespaceRef amap g cloc acc (modref:ModuleOrNamespaceRef) (modul:ModuleOrNamespace) = - let acc = - (acc, modul.ModuleOrNamespaceType.ModuleAndNamespaceDefinitions) ||> List.fold (fun acc smodul -> - ComputeStorageForNonLocalModuleOrNamespaceRef amap g (CompLocForSubModuleOrNamespace cloc smodul) acc (modref.NestedTyconRef smodul) smodul) + (ilCtorRef,ilMethodRefs,ilTy) - let acc = - (acc, modul.ModuleOrNamespaceType.AllValsAndMembers) ||> Seq.fold (fun acc v -> - AddStorageForVal g (v, lazy (ComputeStorageForNonLocalTopVal amap g cloc modref v)) acc) - acc + let mutable explicitEntryPointInfo : ILTypeRef option = None -let ComputeStorageForExternalCcu amap g eenv (ccu:CcuThunk) = - if not ccu.IsFSharp then eenv else - let cloc = CompLocForCcu ccu - let eenv = - List.foldBack - (fun smodul acc -> - let cloc = CompLocForSubModuleOrNamespace cloc smodul - let modref = mkNonLocalCcuRootEntityRef ccu smodul - ComputeStorageForNonLocalModuleOrNamespaceRef amap g cloc acc modref smodul) - ccu.RootModulesAndNamespaces - eenv - let eenv = - let eref = ERefNonLocalPreResolved ccu.Contents (mkNonLocalEntityRef ccu [| |]) - (eenv, ccu.Contents.ModuleOrNamespaceType.AllValsAndMembers) ||> Seq.fold (fun acc v -> - AddStorageForVal g (v, lazy (ComputeStorageForNonLocalTopVal amap g cloc eref v)) acc) - eenv + /// static init fields on script modules. + let mutable scriptInitFspecs : (ILFieldSpec * range) list = [] -let rec AddBindingsForLocalModuleType allocVal cloc eenv (mty:ModuleOrNamespaceType) = - let eenv = List.fold (fun eenv submodul -> AddBindingsForLocalModuleType allocVal (CompLocForSubModuleOrNamespace cloc submodul) eenv submodul.ModuleOrNamespaceType) eenv mty.ModuleAndNamespaceDefinitions - let eenv = Seq.fold (fun eenv v -> allocVal cloc v eenv) eenv mty.AllValsAndMembers - eenv + member mgbuf.AddScriptInitFieldSpec(fieldSpec,range) = + scriptInitFspecs <- (fieldSpec,range) :: scriptInitFspecs + + /// This initializes the script in #load and fsc command-line order causing their + /// sideeffects to be executed. + member mgbuf.AddInitializeScriptsInOrderToEntryPoint() = + // Get the entry point and initialized any scripts in order. + match explicitEntryPointInfo with + | Some tref -> + let IntializeCompiledScript(fspec,m) = + mgbuf.AddExplicitInitToSpecificMethodDef((fun md -> md.IsEntryPoint), tref, fspec, GenPossibleILSourceMarker cenv m, [], []) + scriptInitFspecs |> List.iter IntializeCompiledScript + | None -> () -let AddExternalCcusToIlxGenEnv amap g eenv ccus = List.fold (ComputeStorageForExternalCcu amap g) eenv ccus + member mgbuf.GenerateRawDataValueType(cloc,size) = + // Byte array literals require a ValueType of size the required number of bytes. + // With fsi.exe, S.R.Emit TypeBuilder CreateType has restrictions when a ValueType VT is nested inside a type T, and T has a field of type VT. + // To avoid this situation, these ValueTypes are generated under the private implementation rather than in the current cloc. [was bug 1532]. + let cloc = CompLocForPrivateImplementationDetails cloc + rawDataValueTypeGenerator.Apply((cloc,size)) -let AddBindingsForTycon allocVal (cloc:CompileLocation) (tycon:Tycon) eenv = - let unrealizedSlots = - if tycon.IsFSharpObjectModelTycon - then tycon.FSharpObjectModelTypeInfo.fsobjmodel_vslots - else [] - (eenv,unrealizedSlots) ||> List.fold (fun eenv vref -> allocVal cloc vref.Deref eenv) + member mgbuf.GenerateAnonType(genToStringMethod, anonInfo:AnonRecdTypeInfo) = + let isStruct = evalAnonInfoIsStruct anonInfo + let key = anonInfo.Stamp + match anonTypeTable.Table.TryGetValue key with + | true, res -> res + | _ -> + let info = generateAnonType genToStringMethod (isStruct,anonInfo.ILTypeRef,anonInfo.SortedNames) + anonTypeTable.Table.[key] <- info + info -let rec AddBindingsForModuleDefs allocVal (cloc:CompileLocation) eenv mdefs = - List.fold (AddBindingsForModuleDef allocVal cloc) eenv mdefs + member mgbuf.LookupAnonType(anonInfo:AnonRecdTypeInfo) = + match anonTypeTable.Table.TryGetValue anonInfo.Stamp with + | true, res -> res + | _ -> failwithf "the anonymous record %A has not been generated in the pre-phase of generating this module" anonInfo.ILTypeRef -and AddBindingsForModuleDef allocVal cloc eenv x = - match x with - | TMDefRec(_isRec,tycons,mbinds,_) -> - (* Virtual don't have 'let' bindings and must be added to the environment *) - let eenv = List.foldBack (AddBindingsForTycon allocVal cloc) tycons eenv - let eenv = List.foldBack (AddBindingsForModule allocVal cloc) mbinds eenv - eenv - | TMDefLet(bind,_) -> - allocVal cloc bind.Var eenv - | TMDefDo _ -> - eenv - | TMAbstract(ModuleOrNamespaceExprWithSig(mtyp,_,_)) -> - AddBindingsForLocalModuleType allocVal cloc eenv mtyp - | TMDefs(mdefs) -> - AddBindingsForModuleDefs allocVal cloc eenv mdefs + member mgbuf.GrabExtraBindingsToGenerate() = + let result = extraBindingsToGenerate + extraBindingsToGenerate <- [] + result -and AddBindingsForModule allocVal cloc x eenv = - match x with - | ModuleOrNamespaceBinding.Binding bind -> - allocVal cloc bind.Var eenv - | ModuleOrNamespaceBinding.Module (mspec, mdef) -> - let cloc = - if mspec.IsNamespace then cloc - else CompLocForFixedModule cloc.clocQualifiedNameOfFile cloc.clocTopImplQualifiedName mspec - - AddBindingsForModuleDef allocVal cloc eenv mdef + member mgbuf.AddTypeDef(tref:ILTypeRef, tdef, eliminateIfEmpty, addAtEnd, tdefDiscards) = + gtdefs.FindNestedTypeDefsBuilder(tref.Enclosing).AddTypeDef(tdef, eliminateIfEmpty, addAtEnd, tdefDiscards) -and AddBindingsForModuleTopVals _g allocVal _cloc eenv vs = - List.foldBack allocVal vs eenv + member mgbuf.GetCurrentFields(tref:ILTypeRef) = + gtdefs.FindNestedTypeDefBuilder(tref).GetCurrentFields() + member mgbuf.AddReflectedDefinition(vspec : Tast.Val,expr) = + // preserve order by storing index of item + let n = reflectedDefinitions.Count + reflectedDefinitions.Add(vspec, (vspec.CompiledName, n, expr)) + + member mgbuf.ReplaceNameOfReflectedDefinition(vspec, newName) = + match reflectedDefinitions.TryGetValue vspec with + | true, (name, n, expr) when name <> newName -> reflectedDefinitions.[vspec] <- (newName, n, expr) + | _ -> () -// Put the partial results for a generated fragment (i.e. a part of a CCU generated by FSI) -// into the stored results for the whole CCU. -// isIncrementalFragment = true --> "typed input" -// isIncrementalFragment = false --> "#load" -let AddIncrementalLocalAssemblyFragmentToIlxGenEnv (amap:ImportMap, isIncrementalFragment, g, ccu, fragName, intraAssemblyInfo, eenv, typedImplFiles) = - let cloc = CompLocForFragment fragName ccu - let allocVal = ComputeAndAddStorageForLocalTopVal (amap, g, intraAssemblyInfo, true, NoShadowLocal) - (eenv, typedImplFiles) ||> List.fold (fun eenv (TImplFile(qname,_,mexpr,_,_)) -> - let cloc = { cloc with clocTopImplQualifiedName = qname.Text } - if isIncrementalFragment then - match mexpr with - | ModuleOrNamespaceExprWithSig(_,mdef,_) -> AddBindingsForModuleDef allocVal cloc eenv mdef - (* | ModuleOrNamespaceExprWithSig(mtyp,_,m) -> error(Error("don't expect inner defs to have a constraint",m)) *) - else - AddBindingsForLocalModuleType allocVal cloc eenv mexpr.Type) + member mgbuf.AddMethodDef(tref:ILTypeRef,ilMethodDef) = + gtdefs.FindNestedTypeDefBuilder(tref).AddMethodDef(ilMethodDef) + if ilMethodDef.IsEntryPoint then + explicitEntryPointInfo <- Some(tref) + + member mgbuf.AddExplicitInitToSpecificMethodDef(cond,tref,fspec,sourceOpt,feefee,seqpt) = + // Authoring a .cctor with effects forces the cctor for the 'initialization' module by doing a dummy store & load of a field + // Doing both a store and load keeps FxCop happier because it thinks the field is useful + let instrs = + [ yield! (if condition "NO_ADD_FEEFEE_TO_CCTORS" then [] elif condition "ADD_SEQPT_TO_CCTORS" then seqpt else feefee) // mark start of hidden code + yield mkLdcInt32 0 + yield mkNormalStsfld fspec + yield mkNormalLdsfld fspec + yield AI_pop] + gtdefs.FindNestedTypeDefBuilder(tref).PrependInstructionsToSpecificMethodDef(cond,instrs,sourceOpt) + + member mgbuf.AddEventDef(tref,edef) = + gtdefs.FindNestedTypeDefBuilder(tref).AddEventDef(edef) + member mgbuf.AddFieldDef(tref,ilFieldDef) = + gtdefs.FindNestedTypeDefBuilder(tref).AddFieldDef(ilFieldDef) + + member mgbuf.AddOrMergePropertyDef(tref,pdef,m) = + gtdefs.FindNestedTypeDefBuilder(tref).AddOrMergePropertyDef(pdef,m) + + member mgbuf.Close() = + // old implementation adds new element to the head of list so result was accumulated in reversed order + let orderedReflectedDefinitions = + [for (KeyValue(vspec, (name, n, expr))) in reflectedDefinitions -> n, ((name,vspec), expr)] + |> List.sortBy (fst >> (~-)) // invert the result to get 'order-by-descending' behavior (items in list are 0..* so we don't need to worry about int.MinValue) + |> List.map snd + gtdefs.Close(), orderedReflectedDefinitions + member mgbuf.cenv = cenv + member mgbuf.GetExplicitEntryPointInfo() = explicitEntryPointInfo + +/// Type generators which walk the types first to make sure all anonymous types are generated +let GenType cenv m tyenv ty = GenTypeAux cenv.amap m tyenv ty +let GenTypes cenv m tyenv tys = GenTypesAux cenv.amap m tyenv tys +let GenUnionCaseSpec cenv m tyenv c tyargs = GenUnionCaseSpecAux cenv.amap m tyenv c tyargs +let GenUnionSpec cenv m tyenv tcref tyargs = GenUnionSpecAux cenv.amap m tyenv tcref tyargs +let GenTypePermitVoid cenv m tyenv ty = GenTypeAuxAux cenv.amap m tyenv VoidOK PtrTypesNotOK ty +let GenTypesPermitVoid cenv m tyenv tys = List.map (GenTypePermitVoid cenv m tyenv) tys +let GenTyApp cenv m tyenv repr tyargs = GenTyAppAux cenv.amap m tyenv repr tyargs +let GenNamedTyApp cenv m tyenv tcref tinst = GenNamedTyAppAux cenv.amap m tyenv PtrTypesNotOK tcref tinst +let GenReturnType cenv m tyenv returnTyOpt = GenReturnTypeAux cenv.amap m tyenv returnTyOpt +let GenParamType cenv m tyenv ty = GenParamTypeAux cenv.amap m tyenv ty +let GenParamTypes cenv m tyenv tys = GenParamTypesAux cenv.amap m tyenv tys +let GenTypeArgs cenv m tyenv tyargs = GenTypeArgsAux cenv.amap m tyenv tyargs +let GenExnType amap m tyenv (ecref:TyconRef) = GenTyAppAux amap m tyenv ecref.CompiledRepresentation [] + //-------------------------------------------------------------------------- -// Generate debugging marks +// Representation of term declarations = Environments for compiling expressions. //-------------------------------------------------------------------------- -let GenILSourceMarker (g: TcGlobals) (m:range) = - ILSourceMarker.Create(document=g.memoize_file m.FileIndex, - line=m.StartLine, - /// NOTE: .NET && VS measure first column as column 1 - column= m.StartColumn+1, - endLine= m.EndLine, - endColumn=m.EndColumn+1) + +[] +type ValStorage = + /// Indicates the value is always null + | Null + /// Indicates the value is stored in a static field. + | StaticField of ILFieldSpec * ValRef * (*hasLiteralAttr:*)bool * ILType * string * ILType * ILMethodRef * ILMethodRef * OptionalShadowLocal + /// Indicates the value is "stored" as a property that recomputes it each time it is referenced. Used for simple constants that do not cause initialization triggers + | StaticProperty of ILMethodSpec * OptionalShadowLocal + /// Indicates the value is "stored" as a IL static method (in a "main" class for a F# + /// compilation unit, or as a member) according to its inferred or specified arity. + | Method of ValReprInfo * ValRef * ILMethodSpec * Range.range * ArgReprInfo list * ArgReprInfo + /// Indicates the value is stored at the given position in the closure environment accessed via "ldarg 0" + | Env of ILType * int * ILFieldSpec * NamedLocalIlxClosureInfo ref option + /// Indicates that the value is an argument of a method being generated + | Arg of int + /// Indicates that the value is stored in local of the method being generated. NamedLocalIlxClosureInfo is normally empty. + /// It is non-empty for 'local type functions', see comments on definition of NamedLocalIlxClosureInfo. + | Local of int * NamedLocalIlxClosureInfo ref option -let GenPossibleILSourceMarker cenv m = - if cenv.opts.generateDebugSymbols then - Some (GenILSourceMarker cenv.g m ) - else - None +and OptionalShadowLocal = + | NoShadowLocal + | ShadowLocal of ValStorage -//-------------------------------------------------------------------------- -// Helpers for merging property definitions -//-------------------------------------------------------------------------- +/// The representation of a NamedLocalClosure is based on a cloinfo. However we can't generate a cloinfo until we've +/// decided the representations of other items in the recursive set. Hence we use two phases to decide representations in +/// a recursive set. Yuck. +and NamedLocalIlxClosureInfo = + | NamedLocalIlxClosureInfoGenerator of (IlxGenEnv -> IlxClosureInfo) + | NamedLocalIlxClosureInfoGenerated of IlxClosureInfo + +and ModuleStorage = + { Vals: Lazy> + SubModules: Lazy> } -let HashRangeSorted (ht: IDictionary<_, (int * _)>) = - [ for KeyValue(_k,v) in ht -> v ] |> List.sortBy fst |> List.map snd +/// BranchCallItems are those where a call to the value can be implemented as +/// a branch. At the moment these are only used for generating branch calls back to +/// the entry label of the method currently being generated. +and BranchCallItem = + | BranchCallClosure of ArityInfo + | BranchCallMethod of + // Argument counts for compiled form of F# method or value + ArityInfo * + // Arg infos for compiled form of F# method or value + (TType * ArgReprInfo) list list * + // Typars for F# method or value + Tast.Typars * + // Typars for F# method or value + int * + // num obj args + int + +and Mark = + | Mark of ILCodeLabel (* places we can branch to *) + member x.CodeLabel = (let (Mark(lab)) = x in lab) -let MergeOptions m o1 o2 = - match o1,o2 with - | Some x, None | None, Some x -> Some x - | None, None -> None - | Some x, Some _ -> -#if DEBUG - // This warning fires on some code that also triggers this warning: - // warning(Error("The implementation of a specified generic interface required a method implementation not fully supported by F# Interactive. In the unlikely event that the resulting class fails to load then compile the interface type into a statically-compiled DLL and reference it using '#r'",m)) - // The code is OK so we don't print this. - errorR(InternalError("MergeOptions: two values given",m)) -#else - ignore m -#endif - Some x +and IlxGenEnv = + { tyenv: TypeReprEnv + someTypeInThisAssembly: ILType + isFinalFile: bool + /// Where to place the stuff we're currently generating + cloc: CompileLocation + /// Hiding information down the signature chain, used to compute what's public to the assembly + sigToImplRemapInfo: (Remap * SignatureHidingInfo) list + /// All values in scope + valsInScope: ValMap> + /// For optimizing direct tail recursion to a loop - mark says where to branch to. Length is 0 or 1. + /// REVIEW: generalize to arbitrary nested local loops?? + innerVals: (ValRef * (BranchCallItem * Mark)) list + /// Full list of enclosing bound values. First non-compiler-generated element is used to help give nice names for closures and other expressions. + letBoundVars: ValRef list + /// The set of IL local variable indexes currently in use by lexically scoped variables, to allow reuse on different branches. + /// Really an integer set. + liveLocals: IntMap + /// Are we under the scope of a try, catch or finally? If so we can't tailcall. SEH = structured exception handling + withinSEH: bool } -let MergePropertyPair m (pd: ILPropertyDef) pdef = - {pd with GetMethod=MergeOptions m pd.GetMethod pdef.GetMethod - SetMethod=MergeOptions m pd.SetMethod pdef.SetMethod} +let ReplaceTyenv tyenv (eenv: IlxGenEnv) = {eenv with tyenv = tyenv } +let EnvForTypars tps eenv = {eenv with tyenv = TypeReprEnv.ForTypars tps } +let AddTyparsToEnv typars (eenv: IlxGenEnv) = {eenv with tyenv = eenv.tyenv.Add typars} -type PropKey = PropKey of string * ILTypes * ILThisConvention +let AddSignatureRemapInfo _msg (rpi, mhi) eenv = + { eenv with sigToImplRemapInfo = (mkRepackageRemapping rpi,mhi) :: eenv.sigToImplRemapInfo } + +//-------------------------------------------------------------------------- +// Print eenv +//-------------------------------------------------------------------------- -let AddPropertyDefToHash (m:range) (ht:Dictionary) (pdef: ILPropertyDef) = - let nm = PropKey(pdef.Name, pdef.Args, pdef.CallingConv) - if ht.ContainsKey nm then - let idx,pd = ht.[nm] - ht.[nm] <- (idx, MergePropertyPair m pd pdef) +let OutputStorage (pps: TextWriter) s = + match s with + | StaticField _ -> pps.Write "(top)" + | StaticProperty _ -> pps.Write "(top)" + | Method _ -> pps.Write "(top)" + | Local _ -> pps.Write "(local)" + | Arg _ -> pps.Write "(arg)" + | Env _ -> pps.Write "(env)" + | Null -> pps.Write "(null)" + +//-------------------------------------------------------------------------- +// Augment eenv with values +//-------------------------------------------------------------------------- + +let AddStorageForVal (g: TcGlobals) (v,s) eenv = + let eenv = { eenv with valsInScope = eenv.valsInScope.Add v s } + // If we're compiling fslib then also bind the value as a non-local path to + // allow us to resolve the compiler-non-local-references that arise from env.fs + // + // Do this by generating a fake "looking from the outside in" non-local value reference for + // v, dereferencing it to find the corresponding signature Val, and adding an entry for the signature val. + // + // A similar code path exists in ilxgen.fs for the tables of "optimization data" for values + if g.compilingFslib then + // Passing an empty remap is sufficient for FSharp.Core.dll because it turns out the remapped type signature can + // still be resolved. + match tryRescopeVal g.fslibCcu Remap.Empty v with + | None -> eenv + | Some vref -> + match vref.TryDeref with + | VNone -> + //let msg = sprintf "could not dereference external value reference to something in FSharp.Core.dll during code generation, v.MangledName = '%s', v.Range = %s" v.MangledName (stringOfRange v.Range) + //System.Diagnostics.Debug.Assert(false, msg) + eenv + | VSome gv -> + { eenv with valsInScope = eenv.valsInScope.Add gv s } else - ht.[nm] <- (ht.Count, pdef) - + eenv -/// Merge a whole group of properties all at once -let MergePropertyDefs m ilPropertyDefs = - let ht = new Dictionary<_,_>(3,HashIdentity.Structural) - ilPropertyDefs |> List.iter (AddPropertyDefToHash m ht) - HashRangeSorted ht +let AddStorageForLocalVals g vals eenv = List.foldBack (fun (v,s) acc -> AddStorageForVal g (v,notlazy s) acc) vals eenv //-------------------------------------------------------------------------- -// Buffers for compiling modules. The entire assembly gets compiled via an AssemblyBuilder +// Lookup eenv //-------------------------------------------------------------------------- + +open Microsoft.FSharp.Compiler.AbstractIL +open Microsoft.FSharp.Compiler.AbstractIL.Internal +open Microsoft.FSharp.Compiler.AbstractIL.Internal.Library -/// Information collected imperatively for each type definition -type TypeDefBuilder(tdef, tdefDiscards) = - let gmethods = new ResizeArray(0) - let gfields = new ResizeArray(0) - let gproperties : Dictionary = new Dictionary<_,_>(3,HashIdentity.Structural) - let gevents = new ResizeArray(0) - let gnested = new TypeDefsBuilder() - - member b.Close() = - { tdef with - Methods = mkILMethods (tdef.Methods.AsList @ ResizeArray.toList gmethods) - Fields = mkILFields (tdef.Fields.AsList @ ResizeArray.toList gfields) - Properties = mkILProperties (tdef.Properties.AsList @ HashRangeSorted gproperties ) - Events = mkILEvents (tdef.Events.AsList @ ResizeArray.toList gevents) - NestedTypes = mkILTypeDefs (tdef.NestedTypes.AsList @ gnested.Close()) } +let StorageForVal m v eenv = + let v = + try eenv.valsInScope.[v] + with :? KeyNotFoundException -> + assert false + errorR(Error(FSComp.SR.ilUndefinedValue(showL(vspecAtBindL v)),m)) + notlazy (Arg 668(* random value for post-hoc diagnostic analysis on generated tree *) ) + v.Force() +let StorageForValRef m (v: ValRef) eenv = StorageForVal m v.Deref eenv - member b.AddEventDef(edef) = gevents.Add edef - member b.AddFieldDef(ilFieldDef) = gfields.Add ilFieldDef - member b.AddMethodDef(ilMethodDef) = - let discard = - match tdefDiscards with - | Some (mdefDiscard, _) -> mdefDiscard ilMethodDef - | None -> false - if not discard then - gmethods.Add ilMethodDef - member b.NestedTypeDefs = gnested - member b.GetCurrentFields() = gfields |> Seq.readonly +//-------------------------------------------------------------------------- +// Imported modules and the environment +// +// How a top level value is represented depends on its type. If it's a +// function or is polymorphic, then it gets represented as a +// method (possibly and instance method). Otherwise it gets represented as a +// static field. +//-------------------------------------------------------------------------- - /// Merge Get and Set property nodes, which we generate independently for F# code - /// when we come across their corresponding methods. - member b.AddOrMergePropertyDef(pdef,m) = - let discard = - match tdefDiscards with - | Some (_, pdefDiscard) -> pdefDiscard pdef - | None -> false - if not discard then - AddPropertyDefToHash m gproperties pdef +let IsValRefIsDllImport g (vref:ValRef) = + vref.Attribs |> HasFSharpAttributeOpt g g.attrib_DllImportAttribute - member b.PrependInstructionsToSpecificMethodDef(cond,instrs,tag) = - match ResizeArray.tryFindIndex cond gmethods with - | Some idx -> gmethods.[idx] <- prependInstrsToMethod instrs gmethods.[idx] - | None -> gmethods.Add(mkILClassCtor (mkMethodBody (false,[],1,nonBranchingInstrsToCode instrs,tag))) +let GetMethodSpecForMemberVal amap g (memberInfo:ValMemberInfo) (vref:ValRef) = + let m = vref.Range + let tps,curriedArgInfos,returnTy,retInfo = + assert(vref.ValReprInfo.IsSome) + GetTopValTypeInCompiledForm g (Option.get vref.ValReprInfo) vref.Type m + let tyenvUnderTypars = TypeReprEnv.ForTypars tps + let flatArgInfos = List.concat curriedArgInfos + let isCtor = (memberInfo.MemberFlags.MemberKind = MemberKind.Constructor) + let cctor = (memberInfo.MemberFlags.MemberKind = MemberKind.ClassConstructor) + let parentTcref = vref.TopValDeclaringEntity + let parentTypars = parentTcref.TyparsNoRange + let numParentTypars = parentTypars.Length + if tps.Length < numParentTypars then error(InternalError("CodeGen check: type checking did not ensure that this method is sufficiently generic", m)) + let ctps,mtps = List.chop numParentTypars tps + let isCompiledAsInstance = ValRefIsCompiledAsInstanceMember g vref + let ilActualRetTy = + let ilRetTy = GenReturnTypeAux amap m tyenvUnderTypars returnTy + if isCtor || cctor then ILType.Void else ilRetTy -and TypeDefsBuilder() = - let tdefs : Internal.Utilities.Collections.HashMultiMap = HashMultiMap(0, HashIdentity.Structural) - let mutable countDown = System.Int32.MaxValue + let ilTy = GenTypeAux amap m tyenvUnderTypars (mkAppTy parentTcref (List.map mkTyparTy ctps)) - member b.Close() = - //The order we emit type definitions is not deterministic since it is using the reverse of a range from a hash table. We should use an approximation of source order. - // Ideally it shouldn't matter which order we use. - // However, for some tests FSI generated code appears sensitive to the order, especially for nested types. + if isCompiledAsInstance || isCtor then + // Find the 'this' argument type if any + let thisTy,flatArgInfos = + if isCtor then (GetFSharpViewOfReturnType g returnTy),flatArgInfos + else + match flatArgInfos with + | [] -> error(InternalError("This instance method '" + vref.LogicalName + "' has no arguments", m)) + | (h,_):: t -> h,t + + let thisTy = if isByrefTy g thisTy then destByrefTy g thisTy else thisTy + let thisArgTys = argsOfAppTy g thisTy + if ctps.Length <> thisArgTys.Length then + warning(InternalError(sprintf "CodeGen check: type checking did not quantify the correct number of type variables for this method, #parentTypars = %d, #ctps = %d, #mtps = %d, #thisArgTys = %d" numParentTypars ctps.Length mtps.Length thisArgTys.Length,m)) + else + List.iter2 + (fun gtp ty2 -> + if not (typeEquiv g (mkTyparTy gtp) ty2) then + warning(InternalError("CodeGen check: type checking did not quantify the correct type variables for this method: generalization list contained " + gtp.Name + "#" + string gtp.Stamp + " and list from 'this' pointer contained " + (showL(typeL ty2)), m))) + ctps + thisArgTys + let methodArgTys,paramInfos = List.unzip flatArgInfos + let ilMethodArgTys = GenParamTypesAux amap m tyenvUnderTypars methodArgTys + let ilMethodInst = GenTypeArgsAux amap m tyenvUnderTypars (List.map mkTyparTy mtps) + let mspec = mkILInstanceMethSpecInTy (ilTy,vref.CompiledName,ilMethodArgTys,ilActualRetTy,ilMethodInst) - [ for (b, eliminateIfEmpty) in HashRangeSorted tdefs do - let tdef = b.Close() - // Skip the type if it is empty - if not eliminateIfEmpty - || not tdef.NestedTypes.AsList.IsEmpty - || not tdef.Fields.AsList.IsEmpty - || not tdef.Events.AsList.IsEmpty - || not tdef.Properties.AsList.IsEmpty - || not tdef.Methods.AsList.IsEmpty then - yield tdef ] + mspec,ctps,mtps,paramInfos,retInfo + else + let methodArgTys,paramInfos = List.unzip flatArgInfos + let ilMethodArgTys = GenParamTypesAux amap m tyenvUnderTypars methodArgTys + let ilMethodInst = GenTypeArgsAux amap m tyenvUnderTypars (List.map mkTyparTy mtps) + let mspec = mkILStaticMethSpecInTy (ilTy,vref.CompiledName,ilMethodArgTys,ilActualRetTy,ilMethodInst) + + mspec,ctps,mtps,paramInfos,retInfo + +// Generate the ILFieldSpec for a top-level value + +let ComputeFieldSpecForVal(optIntraAssemblyInfo:IlxGenIntraAssemblyInfo option, isInteractive, g, ilTyForProperty, vspec:Val, nm, m, cloc, ilTy, ilGetterMethRef) = + assert vspec.IsCompiledAsTopLevel + let generate() = GenFieldSpecForStaticField (isInteractive, g, ilTyForProperty, vspec, nm, m, cloc, ilTy) + match optIntraAssemblyInfo with + | None -> generate() + | Some intraAssemblyInfo -> + if vspec.IsMutable && vspec.IsCompiledAsTopLevel && isStructTy g vspec.Type then + let ok, res = intraAssemblyInfo.StaticFieldInfo.TryGetValue ilGetterMethRef + if ok then + res + else + let res = generate() + intraAssemblyInfo.StaticFieldInfo.[ilGetterMethRef] <- res + res + else + generate() + +let IsValCompiledAsMethod g (v:Val) = + match v.ValReprInfo with + | None -> false + | Some topValInfo -> + not (isUnitTy g v.Type && not v.IsMemberOrModuleBinding && not v.IsMutable) && + not v.IsCompiledAsStaticPropertyWithoutField && + match GetTopValTypeInFSharpForm g topValInfo v.Type v.Range with + | [],[],_,_ when not v.IsMember -> false + | _ -> true + +// This called via 2 routes. +// (a) ComputeAndAddStorageForLocalTopVal +// (b) ComputeStorageForNonLocalTopVal +// +/// This function decides the storage for the val. +/// The decision is based on arityInfo. +let ComputeStorageForTopVal (amap, g, optIntraAssemblyInfo:IlxGenIntraAssemblyInfo option, isInteractive, optShadowLocal, vref:ValRef, cloc) = + + if isUnitTy g vref.Type && not vref.IsMemberOrModuleBinding && not vref.IsMutable then + Null + else + let topValInfo = + match vref.ValReprInfo with + | None -> error(InternalError("ComputeStorageForTopVal: no arity found for " + showL(valRefL vref),vref.Range)) + | Some a -> a + + let m = vref.Range + let nm = vref.CompiledName - member b.FindTypeDefBuilder(nm) = - try tdefs.[nm] |> snd |> fst - with :? KeyNotFoundException -> failwith ("FindTypeDefBuilder: " + nm + " not found") + if vref.Deref.IsCompiledAsStaticPropertyWithoutField then + let nm = "get_"+nm + let tyenvUnderTypars = TypeReprEnv.ForTypars [] + let ilRetTy = GenTypeAux amap m tyenvUnderTypars vref.Type + let typ = mkILTyForCompLoc cloc + let mspec = mkILStaticMethSpecInTy (typ, nm, [], ilRetTy, []) + + StaticProperty (mspec, optShadowLocal) + else - member b.FindNestedTypeDefsBuilder(path) = - List.fold (fun (acc:TypeDefsBuilder) x -> acc.FindTypeDefBuilder(x).NestedTypeDefs) b path + // Determine when a static field is required. + // + // REVIEW: This call to GetTopValTypeInFSharpForm is only needed to determine if this is a (type) function or a value + // We should just look at the arity + match GetTopValTypeInFSharpForm g topValInfo vref.Type vref.Range with + | [],[], returnTy,_ when not vref.IsMember -> + // Mutable and literal static fields must have stable names and live in the "public" location + // See notes on GenFieldSpecForStaticField above. + let vspec = vref.Deref + let ilTy = GenTypeAux amap m TypeReprEnv.Empty returnTy (* TypeReprEnv.Empty ok: not a field in a generic class *) + let ilTyForProperty = mkILTyForCompLoc cloc + let attribs = vspec.Attribs + let hasLiteralAttr = HasFSharpAttribute g g.attrib_LiteralAttribute attribs - member b.FindNestedTypeDefBuilder(tref:ILTypeRef) = - b.FindNestedTypeDefsBuilder(tref.Enclosing).FindTypeDefBuilder(tref.Name) + let ilTypeRefForProperty = ilTyForProperty.TypeRef + let ilGetterMethRef = mkILMethRef (ilTypeRefForProperty, ILCallingConv.Static, "get_"+nm, 0, [], ilTy) + let ilSetterMethRef = mkILMethRef (ilTypeRefForProperty, ILCallingConv.Static, "set_"+nm, 0, [ilTy], ILType.Void) - member b.AddTypeDef(tdef:ILTypeDef, eliminateIfEmpty, addAtEnd, tdefDiscards) = - let idx = if addAtEnd then (countDown <- countDown - 1; countDown) else tdefs.Count - tdefs.Add (tdef.Name, (idx, (new TypeDefBuilder(tdef, tdefDiscards), eliminateIfEmpty))) + let fspec = ComputeFieldSpecForVal(optIntraAssemblyInfo, isInteractive, g, ilTyForProperty, vspec, nm, m, cloc, ilTy, ilGetterMethRef) -/// Assembly generation buffers -type AssemblyBuilder(cenv:cenv) as mgbuf = - // The Abstract IL table of types - let gtdefs= new TypeDefsBuilder() - // The definitions of top level values, as quotations. - let mutable reflectedDefinitions : System.Collections.Generic.Dictionary = System.Collections.Generic.Dictionary(HashIdentity.Reference) - // A memoization table for generating value types for big constant arrays - let vtgenerator= - new MemoizationTable<(CompileLocation * int) , ILTypeSpec> - ((fun (cloc,size) -> - let name = CompilerGeneratedName ("T" + string(newUnique()) + "_" + string size + "Bytes") // Type names ending ...$T_37Bytes - let vtdef = mkRawDataValueTypeDef cenv.g.iltyp_ValueType (name,size,0us) - let vtref = NestedTypeRefForCompLoc cloc vtdef.Name - let vtspec = mkILTySpec(vtref,[]) - let vtdef = vtdef.WithAccess(ComputeTypeAccess vtref true) - mgbuf.AddTypeDef(vtref, vtdef, false, true, None) - vtspec), - keyComparer=HashIdentity.Structural) + StaticField (fspec, vref, hasLiteralAttr, ilTyForProperty, nm, ilTy, ilGetterMethRef, ilSetterMethRef, optShadowLocal) + + | _ -> + match vref.MemberInfo with + | Some memberInfo when not vref.IsExtensionMember -> + let mspec,_,_,paramInfos,retInfo = GetMethodSpecForMemberVal amap g memberInfo vref + Method (topValInfo, vref, mspec, m, paramInfos, retInfo) + | _ -> + let (tps, curriedArgInfos, returnTy, retInfo) = GetTopValTypeInCompiledForm g topValInfo vref.Type m + let tyenvUnderTypars = TypeReprEnv.ForTypars tps + let (methodArgTys,paramInfos) = curriedArgInfos |> List.concat |> List.unzip + let ilMethodArgTys = GenParamTypesAux amap m tyenvUnderTypars methodArgTys + let ilRetTy = GenReturnTypeAux amap m tyenvUnderTypars returnTy + let ilLocTy = mkILTyForCompLoc cloc + let ilMethodInst = GenTypeArgsAux amap m tyenvUnderTypars (List.map mkTyparTy tps) + let mspec = mkILStaticMethSpecInTy (ilLocTy, nm, ilMethodArgTys, ilRetTy, ilMethodInst) + Method (topValInfo, vref, mspec, m, paramInfos, retInfo) - let mutable explicitEntryPointInfo : ILTypeRef option = None +let ComputeAndAddStorageForLocalTopVal (amap, g, intraAssemblyFieldTable, isInteractive, optShadowLocal) cloc (v:Val) eenv = + let storage = ComputeStorageForTopVal (amap, g, Some intraAssemblyFieldTable, isInteractive, optShadowLocal, mkLocalValRef v, cloc) + AddStorageForVal g (v,notlazy storage) eenv - /// static init fields on script modules. - let mutable scriptInitFspecs : (ILFieldSpec * range) list = [] - - member mgbuf.AddScriptInitFieldSpec(fieldSpec,range) = - scriptInitFspecs <- (fieldSpec,range) :: scriptInitFspecs - - /// This initializes the script in #load and fsc command-line order causing their - /// sideeffects to be executed. - member mgbuf.AddInitializeScriptsInOrderToEntryPoint() = - // Get the entry point and initialized any scripts in order. - match explicitEntryPointInfo with - | Some tref -> - let IntializeCompiledScript(fspec,m) = - mgbuf.AddExplicitInitToSpecificMethodDef((fun md -> md.IsEntryPoint), tref, fspec, GenPossibleILSourceMarker cenv m, [], []) - scriptInitFspecs |> List.iter IntializeCompiledScript - | None -> () +let ComputeStorageForNonLocalTopVal amap g cloc modref (v:Val) = + match v.ValReprInfo with + | None -> error(InternalError("ComputeStorageForNonLocalTopVal, expected an arity for " + v.LogicalName,v.Range)) + | Some _ -> ComputeStorageForTopVal (amap, g, None, false, NoShadowLocal, mkNestedValRef modref v, cloc) - +let rec ComputeStorageForNonLocalModuleOrNamespaceRef amap g cloc acc (modref:ModuleOrNamespaceRef) (modul:ModuleOrNamespace) = + let acc = + (acc, modul.ModuleOrNamespaceType.ModuleAndNamespaceDefinitions) ||> List.fold (fun acc smodul -> + ComputeStorageForNonLocalModuleOrNamespaceRef amap g (CompLocForSubModuleOrNamespace cloc smodul) acc (modref.NestedTyconRef smodul) smodul) - member mgbuf.GenerateRawDataValueType(cloc,size) = - // Byte array literals require a ValueType of size the required number of bytes. - // With fsi.exe, S.R.Emit TypeBuilder CreateType has restrictions when a ValueType VT is nested inside a type T, and T has a field of type VT. - // To avoid this situation, these ValueTypes are generated under the private implementation rather than in the current cloc. [was bug 1532]. - let cloc = CompLocForPrivateImplementationDetails cloc - vtgenerator.Apply((cloc,size)) + let acc = + (acc, modul.ModuleOrNamespaceType.AllValsAndMembers) ||> Seq.fold (fun acc v -> + AddStorageForVal g (v, lazy (ComputeStorageForNonLocalTopVal amap g cloc modref v)) acc) + acc - member mgbuf.AddTypeDef(tref:ILTypeRef, tdef, eliminateIfEmpty, addAtEnd, tdefDiscards) = - gtdefs.FindNestedTypeDefsBuilder(tref.Enclosing).AddTypeDef(tdef, eliminateIfEmpty, addAtEnd, tdefDiscards) +let ComputeStorageForExternalCcu amap g eenv (ccu:CcuThunk) = + if not ccu.IsFSharp then eenv else + let cloc = CompLocForCcu ccu + let eenv = + List.foldBack + (fun smodul acc -> + let cloc = CompLocForSubModuleOrNamespace cloc smodul + let modref = mkNonLocalCcuRootEntityRef ccu smodul + ComputeStorageForNonLocalModuleOrNamespaceRef amap g cloc acc modref smodul) + ccu.RootModulesAndNamespaces + eenv + let eenv = + let eref = ERefNonLocalPreResolved ccu.Contents (mkNonLocalEntityRef ccu [| |]) + (eenv, ccu.Contents.ModuleOrNamespaceType.AllValsAndMembers) ||> Seq.fold (fun acc v -> + AddStorageForVal g (v, lazy (ComputeStorageForNonLocalTopVal amap g cloc eref v)) acc) + eenv + +let rec AddBindingsForLocalModuleType allocVal cloc eenv (mty:ModuleOrNamespaceType) = + let eenv = List.fold (fun eenv submodul -> AddBindingsForLocalModuleType allocVal (CompLocForSubModuleOrNamespace cloc submodul) eenv submodul.ModuleOrNamespaceType) eenv mty.ModuleAndNamespaceDefinitions + let eenv = Seq.fold (fun eenv v -> allocVal cloc v eenv) eenv mty.AllValsAndMembers + eenv - member mgbuf.GetCurrentFields(tref:ILTypeRef) = - gtdefs.FindNestedTypeDefBuilder(tref).GetCurrentFields() +let AddExternalCcusToIlxGenEnv amap g eenv ccus = List.fold (ComputeStorageForExternalCcu amap g) eenv ccus - member mgbuf.AddReflectedDefinition(vspec : Tast.Val,expr) = - // preserve order by storing index of item - let n = reflectedDefinitions.Count - reflectedDefinitions.Add(vspec, (vspec.CompiledName, n, expr)) - - member mgbuf.ReplaceNameOfReflectedDefinition(vspec, newName) = - match reflectedDefinitions.TryGetValue vspec with - | true, (name, n, expr) when name <> newName -> reflectedDefinitions.[vspec] <- (newName, n, expr) - | _ -> () +let AddBindingsForTycon allocVal (cloc:CompileLocation) (tycon:Tycon) eenv = + let unrealizedSlots = + if tycon.IsFSharpObjectModelTycon + then tycon.FSharpObjectModelTypeInfo.fsobjmodel_vslots + else [] + (eenv,unrealizedSlots) ||> List.fold (fun eenv vref -> allocVal cloc vref.Deref eenv) - member mgbuf.AddMethodDef(tref:ILTypeRef,ilMethodDef) = - gtdefs.FindNestedTypeDefBuilder(tref).AddMethodDef(ilMethodDef) - if ilMethodDef.IsEntryPoint then - explicitEntryPointInfo <- Some(tref) +let rec AddBindingsForModuleDefs allocVal (cloc:CompileLocation) eenv mdefs = + List.fold (AddBindingsForModuleDef allocVal cloc) eenv mdefs - member mgbuf.AddExplicitInitToSpecificMethodDef(cond,tref,fspec,sourceOpt,feefee,seqpt) = - // Authoring a .cctor with effects forces the cctor for the 'initialization' module by doing a dummy store & load of a field - // Doing both a store and load keeps FxCop happier because it thinks the field is useful - let instrs = - [ yield! (if condition "NO_ADD_FEEFEE_TO_CCTORS" then [] elif condition "ADD_SEQPT_TO_CCTORS" then seqpt else feefee) // mark start of hidden code - yield mkLdcInt32 0 - yield mkNormalStsfld fspec - yield mkNormalLdsfld fspec - yield AI_pop] - gtdefs.FindNestedTypeDefBuilder(tref).PrependInstructionsToSpecificMethodDef(cond,instrs,sourceOpt) +and AddBindingsForModuleDef allocVal cloc eenv x = + match x with + | TMDefRec(_isRec,tycons,mbinds,_) -> + (* Virtual don't have 'let' bindings and must be added to the environment *) + let eenv = List.foldBack (AddBindingsForTycon allocVal cloc) tycons eenv + let eenv = List.foldBack (AddBindingsForModule allocVal cloc) mbinds eenv + eenv + | TMDefLet(bind,_) -> + allocVal cloc bind.Var eenv + | TMDefDo _ -> + eenv + | TMAbstract(ModuleOrNamespaceExprWithSig(mtyp,_,_)) -> + AddBindingsForLocalModuleType allocVal cloc eenv mtyp + | TMDefs(mdefs) -> + AddBindingsForModuleDefs allocVal cloc eenv mdefs - member mgbuf.AddEventDef(tref,edef) = - gtdefs.FindNestedTypeDefBuilder(tref).AddEventDef(edef) +and AddBindingsForModule allocVal cloc x eenv = + match x with + | ModuleOrNamespaceBinding.Binding bind -> + allocVal cloc bind.Var eenv + | ModuleOrNamespaceBinding.Module (mspec, mdef) -> + let cloc = + if mspec.IsNamespace then cloc + else CompLocForFixedModule cloc.clocQualifiedNameOfFile cloc.clocTopImplQualifiedName mspec + + AddBindingsForModuleDef allocVal cloc eenv mdef - member mgbuf.AddFieldDef(tref,ilFieldDef) = - gtdefs.FindNestedTypeDefBuilder(tref).AddFieldDef(ilFieldDef) +and AddBindingsForModuleTopVals _g allocVal _cloc eenv vs = + List.foldBack allocVal vs eenv - member mgbuf.AddOrMergePropertyDef(tref,pdef,m) = - gtdefs.FindNestedTypeDefBuilder(tref).AddOrMergePropertyDef(pdef,m) - member mgbuf.Close() = - // old implementation adds new element to the head of list so result was accumulated in reversed order - let orderedReflectedDefinitions = - [for (KeyValue(vspec, (name, n, expr))) in reflectedDefinitions -> n, ((name,vspec), expr)] - |> List.sortBy (fst >> (~-)) // invert the result to get 'order-by-descending' behavior (items in list are 0..* so we don't need to worry about int.MinValue) - |> List.map snd - gtdefs.Close(), orderedReflectedDefinitions - member mgbuf.cenv = cenv - member mgbuf.GetExplicitEntryPointInfo() = explicitEntryPointInfo +// Put the partial results for a generated fragment (i.e. a part of a CCU generated by FSI) +// into the stored results for the whole CCU. +// isIncrementalFragment = true --> "typed input" +// isIncrementalFragment = false --> "#load" +let AddIncrementalLocalAssemblyFragmentToIlxGenEnv (amap:ImportMap, isIncrementalFragment, g, ccu, fragName, intraAssemblyInfo, eenv, typedImplFiles) = + let cloc = CompLocForFragment fragName ccu + let allocVal = ComputeAndAddStorageForLocalTopVal (amap, g, intraAssemblyInfo, true, NoShadowLocal) + (eenv, typedImplFiles) ||> List.fold (fun eenv (TImplFile(qname, _, mexpr, _, _, _)) -> + let cloc = { cloc with clocTopImplQualifiedName = qname.Text } + if isIncrementalFragment then + match mexpr with + | ModuleOrNamespaceExprWithSig(_,mdef,_) -> AddBindingsForModuleDef allocVal cloc eenv mdef + (* | ModuleOrNamespaceExprWithSig(mtyp,_,m) -> error(Error("don't expect inner defs to have a constraint",m)) *) + else + AddBindingsForLocalModuleType allocVal cloc eenv mexpr.Type) - /// Record the types of the things on the evaluation stack. /// Used for the few times we have to flush the IL evaluation stack and to compute maxStack. @@ -1270,11 +1416,7 @@ let FeeFeeInstr (cenv:cenv) doc = endColumn = 0)) /// Buffers for IL code generation -type CodeGenBuffer(m:range, - mgbuf: AssemblyBuilder, - methodName, - alreadyUsedArgs:int, - alreadyUsedLocals:int) = +type CodeGenBuffer(m:range, mgbuf: AssemblyBuilder, methodName, alreadyUsedArgs:int, alreadyUsedLocals:int) = let locals = new ResizeArray<((string * (Mark * Mark)) list * ILType * bool)>(10) let codebuf = new ResizeArray(200) @@ -1870,13 +2012,17 @@ let rec GenExpr (cenv:cenv) (cgbuf:CodeGenBuffer) eenv sp expr sequel = | Expr.Val(v,_,m) -> GenGetVal cenv cgbuf eenv (v,m) sequel | Expr.Op(op,tyargs,args,m) -> - begin match op,args,tyargs with + match op,args,tyargs with | TOp.ExnConstr(c),_,_ -> GenAllocExn cenv cgbuf eenv (c,args,m) sequel | TOp.UnionCase(c),_,_ -> GenAllocUnionCase cenv cgbuf eenv (c,tyargs,args,m) sequel | TOp.Recd(isCtor,tycon),_,_ -> GenAllocRecd cenv cgbuf eenv isCtor (tycon,tyargs,args,m) sequel + | TOp.AnonRecd(anonInfo),_,_ -> + GenAllocAnonRecd cenv cgbuf eenv (anonInfo,tyargs,args,m) sequel + | TOp.AnonRecdGet (anonInfo,n),[e],_ -> + GenGetAnonRecdField cenv cgbuf eenv (anonInfo,e,tyargs,n,m) sequel | TOp.TupleFieldGet (tupInfo,n),[e],_ -> GenGetTupleField cenv cgbuf eenv (tupInfo,e,tyargs,n,m) sequel | TOp.ExnFieldGet(ecref,n),[e],_ -> @@ -1956,7 +2102,6 @@ let rec GenExpr (cenv:cenv) (cgbuf:CodeGenBuffer) eenv sp expr sequel = cgbuf.SetMarkToHere (Mark label) GenUnitThenSequel cenv eenv m eenv.cloc cgbuf sequel | _ -> error(InternalError("Unexpected operator node expression",expr.Range)) - end | Expr.StaticOptimization(constraints,e2,e3,m) -> GenStaticOptimization cenv cgbuf eenv (constraints,e2,e3,m) sequel | Expr.Obj(_,typ,_,_,[meth],[],m) when isDelegateTy cenv.g typ -> @@ -2059,7 +2204,7 @@ and GenSequel cenv cloc cgbuf sequel = //-------------------------------------------------------------------------- and GenConstant cenv cgbuf eenv (c,m,ty) sequel = - let ilTy = GenType cenv.amap m eenv.tyenv ty + let ilTy = GenType cenv m eenv.tyenv ty // Check if we need to generate the value at all match sequelAfterDiscard sequel with | None -> @@ -2101,7 +2246,7 @@ and GenConstant cenv cgbuf eenv (c,m,ty) sequel = and GenUnitTy cenv eenv m = match cenv.ilUnitTy with | None -> - let res = GenType cenv.amap m eenv.tyenv cenv.g.unit_ty + let res = GenType cenv m eenv.tyenv cenv.g.unit_ty cenv.ilUnitTy <- Some res res | Some res -> res @@ -2123,7 +2268,7 @@ and GenAllocTuple cenv cgbuf eenv (tupInfo, args,argtys,m) sequel = let tupInfo = evalTupInfoIsStruct tupInfo let tcref, tys, args, newm = mkCompiledTuple cenv.g tupInfo (argtys,args,m) - let typ = GenNamedTyApp cenv.amap newm eenv.tyenv tcref tys + let typ = GenNamedTyApp cenv newm eenv.tyenv tcref tys let ntyvars = if (tys.Length - 1) < goodTupleFields then (tys.Length - 1) else goodTupleFields let formalTyvars = [ for n in 0 .. ntyvars do yield mkILTyvarTy (uint16 n) ] @@ -2141,14 +2286,14 @@ and GenGetTupleField cenv cgbuf eenv (tupInfo,e,tys,n,m) sequel = if ar <= 0 then failwith "getCompiledTupleItem" elif ar < maxTuple then let tcr' = mkCompiledTupleTyconRef g tupInfo ar - let typ = GenNamedTyApp cenv.amap m eenv.tyenv tcr' tys + let typ = GenNamedTyApp cenv m eenv.tyenv tcr' tys mkGetTupleItemN g m n typ tupInfo e tys.[n] else let tysA,tysB = List.splitAfter (goodTupleFields) tys let tyB = mkCompiledTupleTy g tupInfo tysB let tys' = tysA@[tyB] let tcr' = mkCompiledTupleTyconRef g tupInfo (List.length tys') - let typ' = GenNamedTyApp cenv.amap m eenv.tyenv tcr' tys' + let typ' = GenNamedTyApp cenv m eenv.tyenv tcr' tys' let n' = (min n goodTupleFields) let elast = mkGetTupleItemN g m n' typ' tupInfo e tys'.[n'] if n < goodTupleFields then @@ -2161,7 +2306,7 @@ and GenAllocExn cenv cgbuf eenv (c,args,m) sequel = GenExprs cenv cgbuf eenv args let typ = GenExnType cenv.amap m eenv.tyenv c let flds = recdFieldsOfExnDefRef c - let argtys = flds |> List.map (fun rfld -> GenType cenv.amap m eenv.tyenv rfld.FormalType) + let argtys = flds |> List.map (fun rfld -> GenType cenv m eenv.tyenv rfld.FormalType) let mspec = mkILCtorMethSpecForTy (typ, argtys) CG.EmitInstr cgbuf (pop args.Length) (Push [typ]) @@ -2170,12 +2315,12 @@ and GenAllocExn cenv cgbuf eenv (c,args,m) sequel = and GenAllocUnionCase cenv cgbuf eenv (c,tyargs,args,m) sequel = GenExprs cenv cgbuf eenv args - let cuspec,idx = GenUnionCaseSpec cenv.amap m eenv.tyenv c tyargs + let cuspec,idx = GenUnionCaseSpec cenv m eenv.tyenv c tyargs CG.EmitInstrs cgbuf (pop args.Length) (Push [cuspec.DeclaringType]) (EraseUnions.mkNewData cenv.g.ilg (cuspec, idx)) GenSequel cenv eenv.cloc cgbuf sequel and GenAllocRecd cenv cgbuf eenv ctorInfo (tcref,argtys,args,m) sequel = - let typ = GenNamedTyApp cenv.amap m eenv.tyenv tcref argtys + let typ = GenNamedTyApp cenv m eenv.tyenv tcref argtys // Filter out fields with default initialization let relevantFields = @@ -2198,12 +2343,30 @@ and GenAllocRecd cenv cgbuf eenv ctorInfo (tcref,argtys,args,m) sequel = let tyenvinner = TypeReprEnv.ForTyconRef tcref CG.EmitInstr cgbuf (pop args.Length) (Push [typ]) (mkNormalNewobj - (mkILCtorMethSpecForTy (typ,relevantFields |> List.map (fun f -> GenType cenv.amap m tyenvinner f.FormalType) ))) + (mkILCtorMethSpecForTy (typ,relevantFields |> List.map (fun f -> GenType cenv m tyenvinner f.FormalType) ))) GenSequel cenv eenv.cloc cgbuf sequel +and GenAllocAnonRecd cenv cgbuf eenv (anonInfo: AnonRecdTypeInfo, tyargs, args, m) sequel = + let anonCtor, _anonMethods, anonType = cgbuf.mgbuf.LookupAnonType(anonInfo) + let boxity = anonType.Boxity + GenExprs cenv cgbuf eenv args + let ilTypeArgs = GenTypeArgs cenv m eenv.tyenv tyargs + let anonTypeWithInst = mkILTy boxity (mkILTySpec(anonType.TypeSpec.TypeRef,ilTypeArgs)) + CG.EmitInstr cgbuf (pop args.Length) (Push [anonTypeWithInst]) (mkNormalNewobj (mkILMethSpec(anonCtor,boxity,ilTypeArgs,[]))) + GenSequel cenv eenv.cloc cgbuf sequel + +and GenGetAnonRecdField cenv cgbuf eenv (anonInfo: AnonRecdTypeInfo, e, tyargs, n, m) sequel = + let _anonCtor, anonMethods, anonType = cgbuf.mgbuf.LookupAnonType(anonInfo) + let boxity = anonType.Boxity + let ilTypeArgs = GenTypeArgs cenv m eenv.tyenv tyargs + let anonMethod = anonMethods.[n] + let anonFieldType = ilTypeArgs.[n] + GenExpr cenv cgbuf eenv SPSuppress e Continue + CG.EmitInstr cgbuf (pop 1) (Push [anonFieldType]) (mkNormalCall (mkILMethSpec(anonMethod,boxity,ilTypeArgs,[]))) + GenSequel cenv eenv.cloc cgbuf sequel and GenNewArraySimple cenv cgbuf eenv (elems,elemTy,m) sequel = - let ilElemTy = GenType cenv.amap m eenv.tyenv elemTy + let ilElemTy = GenType cenv m eenv.tyenv elemTy let ilArrTy = mkILArr1DTy ilElemTy CG.EmitInstrs cgbuf (pop 0) (Push [ilArrTy]) [ (AI_ldc (DT_I4,ILConst.I4 (elems.Length))); I_newarr (ILArrayShape.SingleDimensional,ilElemTy) ] @@ -2240,7 +2403,7 @@ and GenNewArray cenv cgbuf eenv (elems: Expr list,elemTy,m) sequel = | _ -> (function _ -> false), (fun _ _ -> failwith "unreachable") if elems' |> Array.forall (function Expr.Const(c,_,_) -> test c | _ -> false) then - let ilElemTy = GenType cenv.amap m eenv.tyenv elemTy + let ilElemTy = GenType cenv m eenv.tyenv elemTy GenConstArray cenv cgbuf eenv ilElemTy elems' (fun buf -> function Expr.Const(c,_,_) -> write buf c | _ -> failwith "unreachable") GenSequel cenv eenv.cloc cgbuf sequel @@ -2255,7 +2418,7 @@ and GenCoerce cenv cgbuf eenv (e,tgty,m,srcty) sequel = begin if (isInterfaceTy cenv.g tgty) then ( GenExpr cenv cgbuf eenv SPSuppress e Continue - let ilToTy = GenType cenv.amap m eenv.tyenv tgty + let ilToTy = GenType cenv m eenv.tyenv tgty // Section "III.1.8.1.3 Merging stack states" of ECMA-335 implies that no unboxing // is required, but we still push the coerce'd type on to the code gen buffer. CG.EmitInstrs cgbuf (pop 1) (Push [ilToTy]) [] @@ -2267,15 +2430,15 @@ and GenCoerce cenv cgbuf eenv (e,tgty,m,srcty) sequel = else GenExpr cenv cgbuf eenv SPSuppress e Continue if not (isObjTy cenv.g srcty) then - let ilFromTy = GenType cenv.amap m eenv.tyenv srcty + let ilFromTy = GenType cenv m eenv.tyenv srcty CG.EmitInstrs cgbuf (pop 1) (Push [cenv.g.ilg.typ_Object]) [ I_box ilFromTy ] if not (isObjTy cenv.g tgty) then - let ilToTy = GenType cenv.amap m eenv.tyenv tgty + let ilToTy = GenType cenv m eenv.tyenv tgty CG.EmitInstrs cgbuf (pop 1) (Push [ilToTy]) [ I_unbox_any ilToTy ] GenSequel cenv eenv.cloc cgbuf sequel and GenReraise cenv cgbuf eenv (rtnty,m) sequel = - let ilReturnTy = GenType cenv.amap m eenv.tyenv rtnty + let ilReturnTy = GenType cenv m eenv.tyenv rtnty CG.EmitInstrs cgbuf (pop 0) Push0 [I_rethrow] // [See comment related to I_throw]. // Rethrow does not return. Required to push dummy value on the stack. @@ -2290,7 +2453,7 @@ and GenGetExnField cenv cgbuf eenv (e,ecref,fieldNum,m) sequel = CG.EmitInstrs cgbuf (pop 0) Push0 [ I_castclass typ] let fld = List.item fieldNum exnc.TrueInstanceFieldsAsList - let ftyp = GenType cenv.amap m eenv.tyenv fld.FormalType + let ftyp = GenType cenv m eenv.tyenv fld.FormalType let mspec = mkILNonGenericInstanceMethSpecInTy (typ,"get_" + fld.Name, [], ftyp) CG.EmitInstr cgbuf (pop 1) (Push [ftyp]) (mkNormalCall mspec) @@ -2303,7 +2466,7 @@ and GenSetExnField cenv cgbuf eenv (e,ecref,fieldNum,e2,m) sequel = let typ = GenExnType cenv.amap m eenv.tyenv ecref CG.EmitInstrs cgbuf (pop 0) Push0 [ I_castclass typ ] let fld = List.item fieldNum exnc.TrueInstanceFieldsAsList - let ftyp = GenType cenv.amap m eenv.tyenv fld.FormalType + let ftyp = GenType cenv m eenv.tyenv fld.FormalType let ilFieldName = ComputeFieldName exnc fld GenExpr cenv cgbuf eenv SPSuppress e2 Continue CG.EmitInstr cgbuf (pop 2) Push0 (mkNormalStfld(mkILFieldSpecInTy (typ,ilFieldName,ftyp))) @@ -2321,7 +2484,7 @@ and UnionCodeGen (cgbuf: CodeGenBuffer) = and GenUnionCaseProof cenv cgbuf eenv (e,ucref,tyargs,m) sequel = GenExpr cenv cgbuf eenv SPSuppress e Continue - let cuspec,idx = GenUnionCaseSpec cenv.amap m eenv.tyenv ucref tyargs + let cuspec,idx = GenUnionCaseSpec cenv m eenv.tyenv ucref tyargs let fty = EraseUnions.GetILTypeForAlternative cuspec idx let avoidHelpers = entityRefInThisAssembly cenv.g.compilingFslib ucref.TyconRef EraseUnions.emitCastData cenv.g.ilg (UnionCodeGen cgbuf) (false,avoidHelpers,cuspec,idx) @@ -2332,7 +2495,7 @@ and GenGetUnionCaseField cenv cgbuf eenv (e,ucref,tyargs,n,m) sequel = assert (ucref.Tycon.IsStructOrEnumTycon || isProvenUnionCaseTy (tyOfExpr cenv.g e)) GenExpr cenv cgbuf eenv SPSuppress e Continue - let cuspec,idx = GenUnionCaseSpec cenv.amap m eenv.tyenv ucref tyargs + let cuspec,idx = GenUnionCaseSpec cenv m eenv.tyenv ucref tyargs let fty = actualTypOfIlxUnionField cuspec idx n let avoidHelpers = entityRefInThisAssembly cenv.g.compilingFslib ucref.TyconRef CG.EmitInstrs cgbuf (pop 1) (Push [fty]) (EraseUnions.mkLdData (avoidHelpers, cuspec, idx, n)) @@ -2342,7 +2505,7 @@ and GenGetUnionCaseFieldAddr cenv cgbuf eenv (e,ucref,tyargs,n,m) sequel = assert (ucref.Tycon.IsStructOrEnumTycon || isProvenUnionCaseTy (tyOfExpr cenv.g e)) GenExpr cenv cgbuf eenv SPSuppress e Continue - let cuspec,idx = GenUnionCaseSpec cenv.amap m eenv.tyenv ucref tyargs + let cuspec,idx = GenUnionCaseSpec cenv m eenv.tyenv ucref tyargs let fty = actualTypOfIlxUnionField cuspec idx n let avoidHelpers = entityRefInThisAssembly cenv.g.compilingFslib ucref.TyconRef CG.EmitInstrs cgbuf (pop 1) (Push [ILType.Byref fty]) (EraseUnions.mkLdDataAddr (avoidHelpers, cuspec, idx, n)) @@ -2350,7 +2513,7 @@ and GenGetUnionCaseFieldAddr cenv cgbuf eenv (e,ucref,tyargs,n,m) sequel = and GenGetUnionCaseTag cenv cgbuf eenv (e,tcref,tyargs,m) sequel = GenExpr cenv cgbuf eenv SPSuppress e Continue - let cuspec = GenUnionSpec cenv.amap m eenv.tyenv tcref tyargs + let cuspec = GenUnionSpec cenv m eenv.tyenv tcref tyargs let avoidHelpers = entityRefInThisAssembly cenv.g.compilingFslib tcref EraseUnions.emitLdDataTag cenv.g.ilg (UnionCodeGen cgbuf) (avoidHelpers, cuspec) CG.EmitInstrs cgbuf (pop 1) (Push [cenv.g.ilg.typ_Int32]) [ ] // push/pop to match the line above @@ -2358,7 +2521,7 @@ and GenGetUnionCaseTag cenv cgbuf eenv (e,tcref,tyargs,m) sequel = and GenSetUnionCaseField cenv cgbuf eenv (e,ucref,tyargs,n,e2,m) sequel = GenExpr cenv cgbuf eenv SPSuppress e Continue - let cuspec,idx = GenUnionCaseSpec cenv.amap m eenv.tyenv ucref tyargs + let cuspec,idx = GenUnionCaseSpec cenv m eenv.tyenv ucref tyargs let avoidHelpers = entityRefInThisAssembly cenv.g.compilingFslib ucref.TyconRef EraseUnions.emitCastData cenv.g.ilg (UnionCodeGen cgbuf) (false,avoidHelpers,cuspec,idx) CG.EmitInstrs cgbuf (pop 1) (Push [cuspec.DeclaringType]) [ ] // push/pop to match the line above @@ -2591,7 +2754,7 @@ and GenApp cenv cgbuf eenv (f,fty,tyargs,args,m) sequel = let actualRetTy = applyTys cenv.g vref.Type (tyargs,nowArgs) let _,curriedArgInfos,returnTy,_ = GetTopValTypeInCompiledForm cenv.g topValInfo vref.Type m - let ilTyArgs = GenTypeArgs cenv.amap m eenv.tyenv tyargs + let ilTyArgs = GenTypeArgs cenv m eenv.tyenv tyargs // For instance method calls chop off some type arguments, which are already @@ -2636,7 +2799,7 @@ and GenApp cenv cgbuf eenv (f,fty,tyargs,args,m) sequel = let callInstr = match valUseFlags with | PossibleConstrainedCall ty -> - let ilThisTy = GenType cenv.amap m eenv.tyenv ty + let ilThisTy = GenType cenv m eenv.tyenv ty I_callconstraint ( isTailCall, ilThisTy,mspec,None) | _ -> if newobj then I_newobj (mspec, None) @@ -2655,7 +2818,7 @@ and GenApp cenv cgbuf eenv (f,fty,tyargs,args,m) sequel = (eenv,laterArgs) ||> List.mapFold (fun eenv laterArg -> // Only save arguments that have effects if Optimizer.ExprHasEffect cenv.g laterArg then - let ilTy = laterArg |> tyOfExpr cenv.g |> GenType cenv.amap m eenv.tyenv + let ilTy = laterArg |> tyOfExpr cenv.g |> GenType cenv m eenv.tyenv let loc,eenv = AllocLocal cenv cgbuf eenv true (ilxgenGlobalNng.FreshCompilerGeneratedName ("arg",m), ilTy, false) scopeMarks GenExpr cenv cgbuf eenv SPSuppress laterArg Continue EmitSetLocal cgbuf loc @@ -2665,7 +2828,7 @@ and GenApp cenv cgbuf eenv (f,fty,tyargs,args,m) sequel = let nargs = mspec.FormalArgTypes.Length CG.EmitInstr cgbuf (pop (nargs + (if mspec.CallingConv.IsStatic || newobj then 0 else 1))) - (if mustGenerateUnitAfterCall || isSuperInit || isSelfInit then Push0 else (Push [(GenType cenv.amap m eenv.tyenv actualRetTy)])) callInstr + (if mustGenerateUnitAfterCall || isSuperInit || isSelfInit then Push0 else (Push [(GenType cenv m eenv.tyenv actualRetTy)])) callInstr // For isSuperInit, load the 'this' pointer as the pretend 'result' of the operation. It will be popped again in most cases if isSuperInit then CG.EmitInstrs cgbuf (pop 0) (Push [mspec.DeclaringType]) [ mkLdarg0 ] @@ -2718,12 +2881,12 @@ and GenNamedLocalTyFuncCall cenv (cgbuf: CodeGenBuffer) eenv typ cloinfo tyargs let ilContractClassTyargs = cloinfo.localTypeFuncContractFreeTypars |> List.map mkTyparTy - |> GenTypeArgs cenv.amap m eenv.tyenv + |> GenTypeArgs cenv m eenv.tyenv - let ilTyArgs = tyargs |> GenTypeArgs cenv.amap m eenv.tyenv + let ilTyArgs = tyargs |> GenTypeArgs cenv m eenv.tyenv let _,(ilContractMethTyargs: ILGenericParameterDefs),(ilContractCloTySpec:ILTypeSpec),ilContractFormalRetTy = - GenNamedLocalTypeFuncContractInfo cenv eenv m cloinfo + GenNamedLocalTypeFuncContractInfo cenv cgbuf.mgbuf eenv m cloinfo let ilContractTy = mkILBoxedTy ilContractCloTySpec.TypeRef ilContractClassTyargs @@ -2735,7 +2898,7 @@ and GenNamedLocalTyFuncCall cenv (cgbuf: CodeGenBuffer) eenv typ cloinfo tyargs let actualRetTy = applyTys cenv.g typ (tyargs,[]) let ilDirectInvokeMethSpec = mkILInstanceMethSpecInTy(ilContractTy, "DirectInvoke", [], ilContractFormalRetTy, ilTyArgs) - let ilActualRetTy = GenType cenv.amap m eenv.tyenv actualRetTy + let ilActualRetTy = GenType cenv m eenv.tyenv actualRetTy CountCallFuncInstructions() CG.EmitInstr cgbuf (pop 1) (Push [ilActualRetTy]) (mkNormalCallvirt ilDirectInvokeMethSpec) actualRetTy @@ -2765,16 +2928,16 @@ and GenIndirectCall cenv cgbuf eenv (functy,tyargs,args,m) sequel = List.fold (fun (formalFuncTyp,sofar) _ -> let dty,rty = destFunTy cenv.g formalFuncTyp - (rty,(fun acc -> sofar (Apps_app(GenType cenv.amap m feenv dty,acc))))) + (rty,(fun acc -> sofar (Apps_app(GenType cenv m feenv dty,acc))))) (formalFuncTyp,id) args - let ilxRetApps = Apps_done (GenType cenv.amap m feenv formalRetTy) + let ilxRetApps = Apps_done (GenType cenv m feenv formalRetTy) - List.foldBack (fun tyarg acc -> Apps_tyapp(GenType cenv.amap m eenv.tyenv tyarg,acc)) tyargs (appBuilder ilxRetApps) + List.foldBack (fun tyarg acc -> Apps_tyapp(GenType cenv m eenv.tyenv tyarg,acc)) tyargs (appBuilder ilxRetApps) let actualRetTy = applyTys cenv.g functy (tyargs, args) - let ilActualRetTy = GenType cenv.amap m eenv.tyenv actualRetTy + let ilActualRetTy = GenType cenv m eenv.tyenv actualRetTy // Check if any byrefs are involved to make sure we don't tailcall let hasByrefArg = @@ -2811,7 +2974,7 @@ and GenTry cenv cgbuf eenv scopeMarks (e1,m,resty,spTry) = let endTryMark = CG.GenerateDelayMark cgbuf "endTryMark" let afterHandler = CG.GenerateDelayMark cgbuf "afterHandler" let eenvinner = {eenvinner with withinSEH = true} - let ilResultTy = GenType cenv.amap m eenvinner.tyenv resty + let ilResultTy = GenType cenv m eenvinner.tyenv resty let whereToSave,eenvinner = AllocLocal cenv cgbuf eenvinner true (ilxgenGlobalNng.FreshCompilerGeneratedName ("tryres",m),ilResultTy, false) (startTryMark,endTryMark) // Generate the body of the try. In the normal case (SequencePointAtTry) we generate a sequence point @@ -3086,8 +3249,8 @@ and GenSequential cenv cgbuf eenv spIn (e1,e2,specialSeqFlag,spSeq,_m) sequel = //-------------------------------------------------------------------------- and GenAsmCode cenv cgbuf eenv (il,tyargs,args,returnTys,m) sequel = - let ilTyArgs = GenTypesPermitVoid cenv.amap m eenv.tyenv tyargs - let ilReturnTys = GenTypesPermitVoid cenv.amap m eenv.tyenv returnTys + let ilTyArgs = GenTypesPermitVoid cenv m eenv.tyenv tyargs + let ilReturnTys = GenTypesPermitVoid cenv m eenv.tyenv returnTys let ilAfterInst = il |> List.filter (function AI_nop -> false | _ -> true) |> List.map (fun i -> @@ -3256,7 +3419,7 @@ and GenQuotation cenv cgbuf eenv (ast,conv,m,ety) sequel = let someTypeInModuleExpr = mkTypeOfExpr cenv m eenv.someTypeInThisAssembly let rawTy = mkRawQuotedExprTy cenv.g - let spliceTypeExprs = List.map (GenType cenv.amap m eenv.tyenv >> (mkTypeOfExpr cenv m)) spliceTypes + let spliceTypeExprs = List.map (GenType cenv m eenv.tyenv >> (mkTypeOfExpr cenv m)) spliceTypes let bytesExpr = Expr.Op(TOp.Bytes(astSerializedBytes),[],[],m) @@ -3298,9 +3461,9 @@ and GenILCall cenv cgbuf eenv (virt,valu,newobj,valUseFlags,isDllImport,ilMethRe let makesNoCriticalTailcalls = (newobj || not virt) // Don't tailcall for 'newobj', or 'call' to IL code let tail = CanTailcall(valu,ccallInfo,eenv.withinSEH,hasByrefArg,mustGenerateUnitAfterCall,isDllImport,false,makesNoCriticalTailcalls,sequel) - let ilEnclArgTys = GenTypeArgs cenv.amap m eenv.tyenv enclArgTys - let ilMethArgTys = GenTypeArgs cenv.amap m eenv.tyenv methArgTys - let ilReturnTys = GenTypes cenv.amap m eenv.tyenv returnTys + let ilEnclArgTys = GenTypeArgs cenv m eenv.tyenv enclArgTys + let ilMethArgTys = GenTypeArgs cenv m eenv.tyenv methArgTys + let ilReturnTys = GenTypes cenv m eenv.tyenv returnTys let ilMethSpec = mkILMethSpec (ilMethRef,boxity,ilEnclArgTys,ilMethArgTys) let useICallVirt = virt || useCallVirt cenv boxity ilMethSpec isBaseCall @@ -3313,7 +3476,7 @@ and GenILCall cenv cgbuf eenv (virt,valu,newobj,valUseFlags,isDllImport,ilMethRe else match ccallInfo with | Some objArgTy -> - let ilObjArgTy = GenType cenv.amap m eenv.tyenv objArgTy + let ilObjArgTy = GenType cenv m eenv.tyenv objArgTy [ I_callconstraint(tail,ilObjArgTy,ilMethSpec,None) ] | None -> if useICallVirt then [ I_callvirt(tail,ilMethSpec,None) ] @@ -3377,19 +3540,19 @@ and GenGetValAddr cenv cgbuf eenv (v: ValRef, m) sequel = and GenGetByref cenv cgbuf eenv (v:ValRef,m) sequel = GenGetLocalVRef cenv cgbuf eenv m v None - let ilty = GenType cenv.amap m eenv.tyenv (destByrefTy cenv.g v.Type) + let ilty = GenType cenv m eenv.tyenv (destByrefTy cenv.g v.Type) CG.EmitInstrs cgbuf (pop 1) (Push [ilty]) [ mkNormalLdobj ilty ] GenSequel cenv eenv.cloc cgbuf sequel and GenSetByref cenv cgbuf eenv (v:ValRef,e,m) sequel = GenGetLocalVRef cenv cgbuf eenv m v None GenExpr cenv cgbuf eenv SPSuppress e Continue - let ilty = GenType cenv.amap m eenv.tyenv (destByrefTy cenv.g v.Type) + let ilty = GenType cenv m eenv.tyenv (destByrefTy cenv.g v.Type) CG.EmitInstrs cgbuf (pop 2) Push0 [ mkNormalStobj ilty ] GenUnitThenSequel cenv eenv m eenv.cloc cgbuf sequel and GenDefaultValue cenv cgbuf eenv (ty,m) = - let ilTy = GenType cenv.amap m eenv.tyenv ty + let ilTy = GenType cenv m eenv.tyenv ty if isRefTy cenv.g ty then CG.EmitInstr cgbuf (pop 0) (Push [ilTy]) AI_ldnull else @@ -3411,7 +3574,7 @@ and GenDefaultValue cenv cgbuf eenv (ty,m) = | Some tcref when (tyconRefEq cenv.g cenv.g.system_Double_tcref tcref) -> CG.EmitInstr cgbuf (pop 0) (Push [ilTy]) (iLdcDouble 0.0) | _ -> - let ilTy = GenType cenv.amap m eenv.tyenv ty + let ilTy = GenType cenv m eenv.tyenv ty LocalScope "ilzero" cgbuf (fun scopeMarks -> let locIdx, _ = AllocLocal cenv cgbuf eenv true (ilxgenGlobalNng.FreshCompilerGeneratedName ("default",m), ilTy, false) scopeMarks // "initobj" (Generated by EmitInitLocal) doesn't work on byref types @@ -3427,8 +3590,8 @@ and GenDefaultValue cenv cgbuf eenv (ty,m) = // Generate generic parameters //-------------------------------------------------------------------------- -and GenGenericParam cenv eenv (tp:Typar) = - let subTypeConstraints = tp.Constraints |> List.choose (function | TyparConstraint.CoercesTo(ty,_) -> Some(ty) | _ -> None) |> List.map (GenTypeAux cenv.amap tp.Range eenv.tyenv VoidNotOK PtrTypesNotOK) +and GenGenericParam cenv mgbuf eenv (tp:Typar) = + let subTypeConstraints = tp.Constraints |> List.choose (function | TyparConstraint.CoercesTo(ty,_) -> Some(ty) | _ -> None) |> List.map (GenTypeAuxAux cenv.amap tp.Range eenv.tyenv VoidNotOK PtrTypesNotOK) let refTypeConstraint = tp.Constraints |> List.exists (function TyparConstraint.IsReferenceType _ -> true | TyparConstraint.SupportsNull _ -> true | _ -> false) let notNullableValueTypeConstraint = tp.Constraints |> List.exists (function TyparConstraint.IsNonNullableStruct _ -> true | _ -> false) let defaultConstructorConstraint = tp.Constraints |> List.exists (function TyparConstraint.RequiresDefaultConstructor _ -> true | _ -> false) @@ -3455,7 +3618,7 @@ and GenGenericParam cenv eenv (tp:Typar) = Constraints = subTypeConstraints Variance=NonVariant - CustomAttrs = mkILCustomAttrs (GenAttrs cenv eenv tp.Attribs) + CustomAttrs = mkILCustomAttrs (GenAttrs cenv mgbuf eenv tp.Attribs) HasReferenceTypeConstraint=refTypeConstraint HasNotNullableValueTypeConstraint=notNullableValueTypeConstraint HasDefaultConstructorConstraint= defaultConstructorConstraint } @@ -3465,44 +3628,44 @@ and GenGenericParam cenv eenv (tp:Typar) = //-------------------------------------------------------------------------- /// Generates the data used for parameters at definitions of abstract method slots such as interface methods or override methods. -and GenSlotParam m cenv eenv (TSlotParam(nm,ty,inFlag,outFlag,optionalFlag,attribs)) : ILParameter = +and GenSlotParam m cenv mgbuf eenv (TSlotParam(nm,ty,inFlag,outFlag,optionalFlag,attribs)) : ILParameter = let inFlag2,outFlag2,optionalFlag2,defaultParamValue,paramMarshal2,attribs = GenParamAttribs cenv attribs { Name=nm - Type= GenParamType cenv.amap m eenv.tyenv ty + Type= GenParamType cenv m eenv.tyenv ty Default=defaultParamValue Marshal=paramMarshal2 IsIn=inFlag || inFlag2 IsOut=outFlag || outFlag2 IsOptional=optionalFlag || optionalFlag2 - CustomAttrs= mkILCustomAttrs (GenAttrs cenv eenv attribs) } + CustomAttrs= mkILCustomAttrs (GenAttrs cenv mgbuf eenv attribs) } -and GenFormalSlotsig m cenv eenv (TSlotSig(_,typ,ctps,mtps,paraml,returnTy)) = +and GenFormalSlotsig m cenv mgbuf eenv (TSlotSig(_,typ,ctps,mtps,paraml,returnTy)) = let paraml = List.concat paraml - let ilTy = GenType cenv.amap m eenv.tyenv typ + let ilTy = GenType cenv m eenv.tyenv typ let eenvForSlotSig = EnvForTypars (ctps @ mtps) eenv - let ilParams = paraml |> List.map (GenSlotParam m cenv eenvForSlotSig) - let ilRetTy = GenReturnType cenv.amap m eenvForSlotSig.tyenv returnTy + let ilParams = paraml |> List.map (GenSlotParam m cenv mgbuf eenvForSlotSig) + let ilRetTy = GenReturnType cenv m eenvForSlotSig.tyenv returnTy let ilRet = mkILReturn ilRetTy ilTy, ilParams, ilRet and instSlotParam inst (TSlotParam(nm,ty,inFlag,fl2,fl3,attrs)) = TSlotParam(nm,instType inst ty,inFlag,fl2,fl3,attrs) -and GenActualSlotsig m cenv eenv (TSlotSig(_,typ,ctps,mtps,ilSlotParams,ilSlotRetTy)) methTyparsOfOverridingMethod (methodParams: Val list) = +and GenActualSlotsig m cenv mgbuf eenv (TSlotSig(_,typ,ctps,mtps,ilSlotParams,ilSlotRetTy)) methTyparsOfOverridingMethod (methodParams: Val list) = let ilSlotParams = List.concat ilSlotParams let instForSlotSig = mkTyparInst (ctps@mtps) (argsOfAppTy cenv.g typ @ generalizeTypars methTyparsOfOverridingMethod) - let ilParams = ilSlotParams |> List.map (instSlotParam instForSlotSig >> GenSlotParam m cenv eenv) + let ilParams = ilSlotParams |> List.map (instSlotParam instForSlotSig >> GenSlotParam m cenv mgbuf eenv) // Use the better names if available let ilParams = if ilParams.Length = methodParams.Length then (ilParams, methodParams) ||> List.map2 (fun p pv -> { p with Name = Some (nameOfVal pv) }) else ilParams - let ilRetTy = GenReturnType cenv.amap m eenv.tyenv (Option.map (instType instForSlotSig) ilSlotRetTy) + let ilRetTy = GenReturnType cenv m eenv.tyenv (Option.map (instType instForSlotSig) ilSlotRetTy) let iLRet = mkILReturn ilRetTy ilParams,iLRet and GenNameOfOverridingMethod cenv (useMethodImpl,(TSlotSig(nameOfOverridenMethod,enclTypOfOverridenMethod,_,_,_,_))) = if useMethodImpl then qualifiedMangledNameOfTyconRef (tcrefOfAppTy cenv.g enclTypOfOverridenMethod) nameOfOverridenMethod else nameOfOverridenMethod -and GenMethodImpl cenv eenv (useMethodImpl,(TSlotSig(nameOfOverridenMethod,_,_,_,_,_) as slotsig)) m = - let ilOverrideTy,ilOverrideParams,ilOverrideRet = GenFormalSlotsig m cenv eenv slotsig +and GenMethodImpl cenv mgbuf eenv (useMethodImpl,(TSlotSig(nameOfOverridenMethod,_,_,_,_,_) as slotsig)) m = + let ilOverrideTy,ilOverrideParams,ilOverrideRet = GenFormalSlotsig m cenv mgbuf eenv slotsig let nameOfOverridingMethod = GenNameOfOverridingMethod cenv (useMethodImpl,slotsig) nameOfOverridingMethod, @@ -3510,8 +3673,8 @@ and GenMethodImpl cenv eenv (useMethodImpl,(TSlotSig(nameOfOverridenMethod,_,_,_ let ilOverrideTyRef = ilOverrideTy.TypeRef let ilOverrideMethRef = mkILMethRef(ilOverrideTyRef, ILCallingConv.Instance, nameOfOverridenMethod, List.length (DropErasedTypars methTyparsOfOverridingMethod), (typesOfILParams ilOverrideParams), ilOverrideRet.Type) let eenvForOverrideBy = AddTyparsToEnv methTyparsOfOverridingMethod eenv - let ilParamsOfOverridingMethod,ilReturnOfOverridingMethod = GenActualSlotsig m cenv eenvForOverrideBy slotsig methTyparsOfOverridingMethod [] - let ilOverrideMethGenericParams = GenGenericParams cenv eenvForOverrideBy methTyparsOfOverridingMethod + let ilParamsOfOverridingMethod,ilReturnOfOverridingMethod = GenActualSlotsig m cenv mgbuf eenvForOverrideBy slotsig methTyparsOfOverridingMethod [] + let ilOverrideMethGenericParams = GenGenericParams cenv mgbuf eenvForOverrideBy methTyparsOfOverridingMethod let ilOverrideMethGenericArgs = mkILFormalGenericArgs 0 ilOverrideMethGenericParams let ilOverrideBy = mkILInstanceMethSpecInTy(ilTyForOverriding, nameOfOverridingMethod, typesOfILParams ilParamsOfOverridingMethod, ilReturnOfOverridingMethod.Type, ilOverrideMethGenericArgs) { Overrides = OverridesSpec(ilOverrideMethRef,ilOverrideTy) @@ -3542,20 +3705,20 @@ and GenObjectMethod cenv eenvinner (cgbuf:CodeGenBuffer) useMethodImpl tmethod = let eenvUnderTypars = AddTyparsToEnv methTyparsOfOverridingMethod eenvinner let methodParams = List.concat methodParams let methodParamsNonSelf = match methodParams with [] -> [] | _::t -> t // drop the 'this' arg when computing better argument names for IL parameters - let ilParamsOfOverridingMethod,ilReturnOfOverridingMethod = GenActualSlotsig m cenv eenvUnderTypars slotsig methTyparsOfOverridingMethod methodParamsNonSelf - let ilAttribs = GenAttrs cenv eenvinner attribs + let ilParamsOfOverridingMethod,ilReturnOfOverridingMethod = GenActualSlotsig m cenv cgbuf.mgbuf eenvUnderTypars slotsig methTyparsOfOverridingMethod methodParamsNonSelf + let ilAttribs = GenAttrs cenv cgbuf.mgbuf eenvinner attribs // Args are stored starting at #1 let eenvForMeth = AddStorageForLocalVals cenv.g (methodParams |> List.mapi (fun i v -> (v,Arg i))) eenvUnderTypars let ilMethodBody = CodeGenMethodForExpr cenv cgbuf.mgbuf (SPAlways,[],nameOfOverridenMethod,eenvForMeth,0,0,methodBodyExpr,(if slotSigHasVoidReturnTy slotsig then discardAndReturnVoid else Return)) - let nameOfOverridingMethod,methodImplGenerator = GenMethodImpl cenv eenvinner (useMethodImpl,slotsig) methodBodyExpr.Range + let nameOfOverridingMethod,methodImplGenerator = GenMethodImpl cenv cgbuf.mgbuf eenvinner (useMethodImpl,slotsig) methodBodyExpr.Range let mdef = mkILGenericVirtualMethod (nameOfOverridingMethod, ILMemberAccess.Public, - GenGenericParams cenv eenvUnderTypars methTyparsOfOverridingMethod, + GenGenericParams cenv cgbuf.mgbuf eenvUnderTypars methTyparsOfOverridingMethod, ilParamsOfOverridingMethod, ilReturnOfOverridingMethod, MethodBody.IL ilMethodBody) @@ -3566,7 +3729,7 @@ and GenObjectMethod cenv eenvinner (cgbuf:CodeGenBuffer) useMethodImpl tmethod = [(useMethodImpl,methodImplGenerator,methTyparsOfOverridingMethod),mdef] and GenObjectExpr cenv cgbuf eenvouter expr (baseType,baseValOpt,basecall,overrides,interfaceImpls,m) sequel = - let cloinfo,_,eenvinner = GetIlxClosureInfo cenv m false None eenvouter expr + let cloinfo,_,eenvinner = GetIlxClosureInfo cenv cgbuf.mgbuf m false None eenvouter expr let cloAttribs = cloinfo.cloAttribs let cloFreeVars = cloinfo.cloFreeVars @@ -3585,7 +3748,6 @@ and GenObjectExpr cenv cgbuf eenvouter expr (baseType,baseValOpt,basecall,overri let eenvinner = bindBaseOrThisVarOpt cenv eenvinner baseValOpt let ilCtorBody = CodeGenMethodForExpr cenv cgbuf.mgbuf (SPAlways,[],cloName,eenvinner,1,0,basecall,discardAndReturnVoid) - let genMethodAndOptionalMethodImpl tmethod useMethodImpl = [ for ((useMethodImpl,methodImplGeneratorFunction,methTyparsOfOverridingMethod),mdef) in GenObjectMethod cenv eenvinner cgbuf useMethodImpl tmethod do let mimpl = (if useMethodImpl then Some(methodImplGeneratorFunction (ilTyForOverriding,methTyparsOfOverridingMethod)) else None) @@ -3601,9 +3763,9 @@ and GenObjectExpr cenv cgbuf eenvouter expr (baseType,baseValOpt,basecall,overri let mimpls = mimpls |> List.choose id // choose the ones that actually have method impls - let interfaceTys = interfaceImpls |> List.map (fst >> GenType cenv.amap m eenvinner.tyenv) + let interfaceTys = interfaceImpls |> List.map (fst >> GenType cenv m eenvinner.tyenv) - let attrs = GenAttrs cenv eenvinner cloAttribs + let attrs = GenAttrs cenv cgbuf.mgbuf eenvinner cloAttribs let super = (if isInterfaceTy cenv.g baseType then cenv.g.ilg.typ_Object else ilCloRetTy) let interfaceTys = interfaceTys @ (if isInterfaceTy cenv.g baseType then [ilCloRetTy] else []) let cloTypeDefs = GenClosureTypeDefs cenv (ilCloTypeRef,ilCloGenericFormals,attrs,ilCloFreeVars,ilCloLambdas,ilCtorBody,mdefs,mimpls,super,interfaceTys) @@ -3625,16 +3787,16 @@ and GenSequenceExpr cenv (cgbuf:CodeGenBuffer) eenvouter (nextEnumeratorValRef:V // Get the free variables. Make a lambda to pretend that the 'nextEnumeratorValRef' is bound (it is an argument to GenerateNext) let (cloAttribs,_,_,cloFreeTyvars,cloFreeVars,ilCloTypeRef:ILTypeRef,ilCloFreeVars,eenvinner) = - GetIlxClosureFreeVars cenv m None eenvouter [] (mkLambda m nextEnumeratorValRef.Deref (generateNextExpr, cenv.g.int32_ty)) + GetIlxClosureFreeVars cenv cgbuf.mgbuf m None eenvouter [] (mkLambda m nextEnumeratorValRef.Deref (generateNextExpr, cenv.g.int32_ty)) - let ilCloSeqElemTy = GenType cenv.amap m eenvinner.tyenv seqElemTy + let ilCloSeqElemTy = GenType cenv m eenvinner.tyenv seqElemTy let cloRetTy = mkSeqTy cenv.g seqElemTy - let ilCloRetTyInner = GenType cenv.amap m eenvinner.tyenv cloRetTy - let ilCloRetTyOuter = GenType cenv.amap m eenvouter.tyenv cloRetTy - let ilCloEnumeratorTy = GenType cenv.amap m eenvinner.tyenv (mkIEnumeratorTy cenv.g seqElemTy) - let ilCloEnumerableTy = GenType cenv.amap m eenvinner.tyenv (mkSeqTy cenv.g seqElemTy) - let ilCloBaseTy = GenType cenv.amap m eenvinner.tyenv (mkAppTy cenv.g.seq_base_tcr [seqElemTy]) - let ilCloGenericParams = GenGenericParams cenv eenvinner cloFreeTyvars + let ilCloRetTyInner = GenType cenv m eenvinner.tyenv cloRetTy + let ilCloRetTyOuter = GenType cenv m eenvouter.tyenv cloRetTy + let ilCloEnumeratorTy = GenType cenv m eenvinner.tyenv (mkIEnumeratorTy cenv.g seqElemTy) + let ilCloEnumerableTy = GenType cenv m eenvinner.tyenv (mkSeqTy cenv.g seqElemTy) + let ilCloBaseTy = GenType cenv m eenvinner.tyenv (mkAppTy cenv.g.seq_base_tcr [seqElemTy]) + let ilCloGenericParams = GenGenericParams cenv cgbuf.mgbuf eenvinner cloFreeTyvars // Create a new closure class with a single "MoveNext" method that implements the iterator. let ilCloTyInner = mkILFormalBoxedTy ilCloTypeRef ilCloGenericParams @@ -3648,12 +3810,6 @@ and GenSequenceExpr cenv (cgbuf:CodeGenBuffer) eenvouter (nextEnumeratorValRef:V CodeGenMethod cenv cgbuf.mgbuf ([],"GetFreshEnumerator",eenvinner,1,0, (fun cgbuf eenv -> for fv in cloFreeVars do -(* TODO: Emit CompareExchange - if (System.Threading.Interlocked.CompareExchange(&__state, 1, 0) = 0) then - (x :> IEnumerator<'T>) - else - ... -*) /// State variables always get zero-initialized if stateVarsSet.Contains fv then GenDefaultValue cenv cgbuf eenv (fv.Type,m) @@ -3689,7 +3845,7 @@ and GenSequenceExpr cenv (cgbuf:CodeGenBuffer) eenvouter (nextEnumeratorValRef:V let ilCtorBody = mkILSimpleStorageCtor(None, Some ilCloBaseTy.TypeSpec, ilCloTyInner, [], [], ILMemberAccess.Assembly).MethodBody - let attrs = GenAttrs cenv eenvinner cloAttribs + let attrs = GenAttrs cenv cgbuf.mgbuf eenvinner cloAttribs let cloTypeDefs = GenClosureTypeDefs cenv (ilCloTypeRef,ilCloGenericParams,attrs,ilCloFreeVars,ilCloLambdas,ilCtorBody,[generateNextMethod;closeMethod;checkCloseMethod;lastGeneratedMethod;getFreshMethod],[],ilCloBaseTy,[]) for cloTypeDef in cloTypeDefs do cgbuf.mgbuf.AddTypeDef(ilCloTypeRef, cloTypeDef, false, false, None) @@ -3735,7 +3891,7 @@ and GenClosureTypeDefs cenv (tref:ILTypeRef, ilGenParams, attrs, ilCloFreeVars, let tdefs = EraseClosures.convIlxClosureDef cenv.g.ilxPubCloEnv tref.Enclosing td cloInfo tdefs -and GenGenericParams cenv eenv tps = tps |> DropErasedTypars |> List.map (GenGenericParam cenv eenv) +and GenGenericParams cenv mgbuf eenv tps = tps |> DropErasedTypars |> List.map (GenGenericParam cenv mgbuf eenv) and GenGenericArgs m (tyenv:TypeReprEnv) tps = tps |> DropErasedTypars |> List.map (fun c -> (mkILTyvarTy tyenv.[c,m])) /// Generate the closure class for a function @@ -3744,19 +3900,20 @@ and GenLambdaClosure cenv (cgbuf:CodeGenBuffer) eenv isLocalTypeFunc selfv expr | Expr.Lambda (_,_,_,_,_,m,_) | Expr.TyLambda(_,_,_,m,_) -> - let cloinfo,body,eenvinner = GetIlxClosureInfo cenv m isLocalTypeFunc selfv eenv expr + let cloinfo,body,eenvinner = GetIlxClosureInfo cenv cgbuf.mgbuf m isLocalTypeFunc selfv eenv expr let entryPointInfo = match selfv with | Some v -> [(v, BranchCallClosure (cloinfo.cloArityInfo))] | _ -> [] + let ilCloBody = CodeGenMethodForExpr cenv cgbuf.mgbuf (SPAlways,entryPointInfo,cloinfo.cloName,eenvinner,1,0,body,Return) let ilCloTypeRef = cloinfo.cloSpec.TypeRef let cloTypeDefs = if isLocalTypeFunc then // Work out the contract type and generate a class with an abstract method for this type - let (ilContractGenericParams,ilContractMethTyargs,ilContractTySpec:ILTypeSpec,ilContractFormalRetTy) = GenNamedLocalTypeFuncContractInfo cenv eenv m cloinfo + let (ilContractGenericParams,ilContractMethTyargs,ilContractTySpec:ILTypeSpec,ilContractFormalRetTy) = GenNamedLocalTypeFuncContractInfo cenv cgbuf.mgbuf eenv m cloinfo let ilContractTypeRef = ilContractTySpec.TypeRef let ilContractTy = mkILFormalBoxedTy ilContractTypeRef ilContractGenericParams let ilContractCtor = mkILNonGenericEmptyCtor None cenv.g.ilg.typ_Object @@ -3806,7 +3963,7 @@ and GenLambda cenv cgbuf eenv isLocalTypeFunc selfv expr sequel = GenSequel cenv eenv.cloc cgbuf sequel and GenTypeOfVal cenv eenv (v:Val) = - GenType cenv.amap v.Range eenv.tyenv v.Type + GenType cenv v.Range eenv.tyenv v.Type and GenFreevar cenv m eenvouter tyenvinner (fv:Val) = match StorageForVal m fv eenvouter with @@ -3816,9 +3973,9 @@ and GenFreevar cenv m eenvouter tyenvinner (fv:Val) = // Check for things that should never make it into the free variable set. Only do this in debug for performance reasons | (StaticField _ | StaticProperty _ | Method _ | Null) -> error(InternalError("GenFreevar: compiler error: unexpected unrealized value",fv.Range)) #endif - | _ -> GenType cenv.amap m tyenvinner fv.Type + | _ -> GenType cenv m tyenvinner fv.Type -and GetIlxClosureFreeVars cenv m selfv eenvouter takenNames expr = +and GetIlxClosureFreeVars cenv mgbuf m selfv eenvouter takenNames expr = // Choose a base name for the closure let basename = @@ -3882,7 +4039,7 @@ and GetIlxClosureFreeVars cenv m selfv eenvouter takenNames expr = let eenvinner = eenvouter |> EnvForTypars cloFreeTyvars let ilCloTyInner = - let ilCloGenericParams = GenGenericParams cenv eenvinner cloFreeTyvars + let ilCloGenericParams = GenGenericParams cenv mgbuf eenvinner cloFreeTyvars mkILFormalBoxedTy ilCloTypeRef ilCloGenericParams // If generating a named closure, add the closure itself as a var, available via "arg0" . @@ -3913,7 +4070,7 @@ and GetIlxClosureFreeVars cenv m selfv eenvouter takenNames expr = (cloAttribs,cloInternalFreeTyvars,cloContractFreeTyvars,cloFreeTyvars,cloFreeVars,ilCloTypeRef,Array.ofList ilCloFreeVars,eenvinner) -and GetIlxClosureInfo cenv m isLocalTypeFunc selfv eenvouter expr = +and GetIlxClosureInfo cenv mgbuf m isLocalTypeFunc selfv eenvouter expr = let returnTy = match expr with | Expr.Lambda (_,_,_,_,_,_,returnTy) | Expr.TyLambda(_,_,_,_,returnTy) -> returnTy @@ -3939,7 +4096,7 @@ and GetIlxClosureInfo cenv m isLocalTypeFunc selfv eenvouter expr = let takenNames = vs |> List.map (fun v -> v.CompiledName) // Get the free variables and the information about the closure, add the free variables to the environment - let (cloAttribs,cloInternalFreeTyvars,cloContractFreeTyvars,_,cloFreeVars,ilCloTypeRef,ilCloFreeVars,eenvinner) = GetIlxClosureFreeVars cenv m selfv eenvouter takenNames expr + let (cloAttribs,cloInternalFreeTyvars,cloContractFreeTyvars,_,cloFreeVars,ilCloTypeRef,ilCloFreeVars,eenvinner) = GetIlxClosureFreeVars cenv mgbuf m selfv eenvouter takenNames expr // Put the type and value arguments into the environment let rec getClosureArgs eenv ntmargs tvsl (vs:Val list) = @@ -3947,7 +4104,7 @@ and GetIlxClosureInfo cenv m isLocalTypeFunc selfv eenvouter expr = | tvs :: rest, _ -> let eenv = AddTyparsToEnv tvs eenv let l,eenv = getClosureArgs eenv ntmargs rest vs - let lambdas = (tvs, l) ||> List.foldBack (fun tv sofar -> Lambdas_forall(GenGenericParam cenv eenv tv,sofar)) + let lambdas = (tvs, l) ||> List.foldBack (fun tv sofar -> Lambdas_forall(GenGenericParam cenv mgbuf eenv tv,sofar)) lambdas,eenv | [], v :: rest -> let nm = v.CompiledName @@ -3957,7 +4114,7 @@ and GetIlxClosureInfo cenv m isLocalTypeFunc selfv eenvouter expr = let lambdas = Lambdas_lambda (mkILParamNamed(nm,GenTypeOfVal cenv eenv v),l) lambdas,eenv | _ -> - let returnTy' = GenType cenv.amap m eenv.tyenv returnTy + let returnTy' = GenType cenv m eenv.tyenv returnTy Lambdas_return returnTy', eenv // start at arg number 1 as "this" pointer holds the current closure @@ -3967,7 +4124,7 @@ and GetIlxClosureInfo cenv m isLocalTypeFunc selfv eenvouter expr = let narginfo = vs |> List.map (fun _ -> 1) // Generate the ILX view of the lambdas - let ilReturnTy = GenType cenv.amap m eenvinner.tyenv returnTy + let ilReturnTy = GenType cenv m eenvinner.tyenv returnTy // The general shape is: // {LAM . expr }[free-typars] : overall-type[contract-typars] @@ -4006,9 +4163,9 @@ and GetIlxClosureInfo cenv m isLocalTypeFunc selfv eenvouter expr = // function values. /// Compute the contract if it is a local type function - let ilContractGenericParams = GenGenericParams cenv eenvinner cloContractFreeTyvars + let ilContractGenericParams = GenGenericParams cenv mgbuf eenvinner cloContractFreeTyvars let ilContractGenericActuals = GenGenericArgs m eenvouter.tyenv cloContractFreeTyvars - let ilInternalGenericParams = GenGenericParams cenv eenvinner cloInternalFreeTyvars + let ilInternalGenericParams = GenGenericParams cenv mgbuf eenvinner cloInternalFreeTyvars let ilInternalGenericActuals = GenGenericArgs m eenvouter.tyenv cloInternalFreeTyvars let ilCloGenericFormals = ilContractGenericParams @ ilInternalGenericParams @@ -4055,25 +4212,25 @@ and IsNamedLocalTypeFuncVal g (v:Val) expr = (match stripExpr expr with Expr.TyLambda _ -> true | _ -> false) /// Generate the information relevant to the contract portion of a named local type function -and GenNamedLocalTypeFuncContractInfo cenv eenv m cloinfo = +and GenNamedLocalTypeFuncContractInfo cenv mgbuf eenv m cloinfo = let ilCloTypeRef = cloinfo.cloSpec.TypeRef let ilContractTypeRef = ILTypeRef.Create(scope=ilCloTypeRef.Scope,enclosing=ilCloTypeRef.Enclosing,name=ilCloTypeRef.Name + "$contract") let eenvForContract = EnvForTypars cloinfo.localTypeFuncContractFreeTypars eenv - let ilContractGenericParams = GenGenericParams cenv eenv cloinfo.localTypeFuncContractFreeTypars + let ilContractGenericParams = GenGenericParams cenv mgbuf eenv cloinfo.localTypeFuncContractFreeTypars let tvs,contractRetTy = match cloinfo.cloExpr with | Expr.TyLambda(_,tvs,_,_,bty) -> tvs, bty | e -> [], tyOfExpr cenv.g e let eenvForContract = AddTyparsToEnv tvs eenvForContract - let ilContractMethTyargs = GenGenericParams cenv eenvForContract tvs - let ilContractFormalRetTy = GenType cenv.amap m eenvForContract.tyenv contractRetTy + let ilContractMethTyargs = GenGenericParams cenv mgbuf eenvForContract tvs + let ilContractFormalRetTy = GenType cenv m eenvForContract.tyenv contractRetTy ilContractGenericParams,ilContractMethTyargs,mkILTySpec(ilContractTypeRef,cloinfo.localTypeFuncILGenericArgs),ilContractFormalRetTy /// Generate a new delegate construction including a closure class if necessary. This is a lot like generating function closures /// and object expression closures, and most of the code is shared. and GenDelegateExpr cenv cgbuf eenvouter expr (TObjExprMethod((TSlotSig(_,delegateTy, _,_,_, _) as slotsig),_attribs,methTyparsOfOverridingMethod,tmvs,body,_),m) sequel = // Get the instantiation of the delegate type - let ilCtxtDelTy = GenType cenv.amap m eenvouter.tyenv delegateTy + let ilCtxtDelTy = GenType cenv m eenvouter.tyenv delegateTy let tmvs = List.concat tmvs // Yuck. TLBIMP.EXE generated APIs use UIntPtr for the delegate ctor. @@ -4095,8 +4252,8 @@ and GenDelegateExpr cenv cgbuf eenvouter expr (TObjExprMethod((TSlotSig(_,delega // Work out the free type variables for the morphing thunk let takenNames = List.map nameOfVal tmvs - let (cloAttribs,_,_,cloFreeTyvars,cloFreeVars,ilDelegeeTypeRef,ilCloFreeVars,eenvinner) = GetIlxClosureFreeVars cenv m None eenvouter takenNames expr - let ilDelegeeGenericParams = GenGenericParams cenv eenvinner cloFreeTyvars + let (cloAttribs,_,_,cloFreeTyvars,cloFreeVars,ilDelegeeTypeRef,ilCloFreeVars,eenvinner) = GetIlxClosureFreeVars cenv cgbuf.mgbuf m None eenvouter takenNames expr + let ilDelegeeGenericParams = GenGenericParams cenv cgbuf.mgbuf eenvinner cloFreeTyvars let ilDelegeeGenericActualsInner = mkILFormalGenericArgs 0 ilDelegeeGenericParams // Create a new closure class with a single "delegee" method that implements the delegate. @@ -4110,7 +4267,7 @@ and GenDelegateExpr cenv cgbuf eenvouter expr (TObjExprMethod((TSlotSig(_,delega // The slot sig contains a formal instantiation. When creating delegates we're only // interested in the actual instantiation since we don't have to emit a method impl. - let ilDelegeeParams,ilDelegeeRet = GenActualSlotsig m cenv envForDelegeeUnderTypars slotsig methTyparsOfOverridingMethod tmvs + let ilDelegeeParams,ilDelegeeRet = GenActualSlotsig m cenv cgbuf.mgbuf envForDelegeeUnderTypars slotsig methTyparsOfOverridingMethod tmvs let envForDelegeeMeth = AddStorageForLocalVals cenv.g (List.mapi (fun i v -> (v,Arg (i+numthis))) tmvs) envForDelegeeUnderTypars let ilMethodBody = CodeGenMethodForExpr cenv cgbuf.mgbuf (SPAlways,[],delegeeMethName,envForDelegeeMeth,1,0,body,(if slotSigHasVoidReturnTy slotsig then discardAndReturnVoid else Return)) @@ -4124,7 +4281,7 @@ and GenDelegateExpr cenv cgbuf eenvouter expr (TObjExprMethod((TSlotSig(_,delega let ilCtorBody = delegeeCtorMeth.MethodBody let ilCloLambdas = Lambdas_return ilCtxtDelTy - let ilAttribs = GenAttrs cenv eenvinner cloAttribs + let ilAttribs = GenAttrs cenv cgbuf.mgbuf eenvinner cloAttribs let cloTypeDefs = GenClosureTypeDefs cenv (ilDelegeeTypeRef,ilDelegeeGenericParams,ilAttribs,ilCloFreeVars,ilCloLambdas,ilCtorBody,[delegeeInvokeMeth],[],cenv.g.ilg.typ_Object,[]) for cloTypeDef in cloTypeDefs do cgbuf.mgbuf.AddTypeDef(ilDelegeeTypeRef, cloTypeDef, false, false, None) @@ -4190,7 +4347,7 @@ and GenJoinPoint cenv cgbuf pos eenv ty m sequel = // The others (e.g. Continue, LeaveFilter and CmpThenBrOrContinue) can't be done at the end of each branch. We must create a join point. | _ -> - let pushed = GenType cenv.amap m eenv.tyenv ty + let pushed = GenType cenv m eenv.tyenv ty let stackAfterJoin = (pushed :: (cgbuf.GetCurrentStack())) let afterJoin = CG.GenerateDelayMark cgbuf (pos + "_join") // go to the join point @@ -4392,7 +4549,7 @@ and GenDecisionTreeSwitch cenv cgbuf inplabOpt stackAtTargets eenv e cases defau match defaultTargetOpt with | None -> rest.Head.CaseTree | Some tg -> tg - let cuspec = GenUnionSpec cenv.amap m eenv.tyenv c.TyconRef tyargs + let cuspec = GenUnionSpec cenv m eenv.tyenv c.TyconRef tyargs let idx = c.Index let avoidHelpers = entityRefInThisAssembly cenv.g.compilingFslib c.TyconRef GenDecisionTreeTest cenv eenv.cloc cgbuf stackAtTargets e (Some (pop 1, Push [cenv.g.ilg.typ_Bool], Choice1Of2 (avoidHelpers, cuspec, idx))) eenv successTree failureTree targets repeatSP targetInfos sequel @@ -4417,7 +4574,7 @@ and GenDecisionTreeSwitch cenv cgbuf inplabOpt stackAtTargets eenv e cases defau GenExpr cenv cgbuf eenv SPSuppress e Continue let srcTy = tyOfExpr cenv.g e if isTyparTy cenv.g srcTy then - let ilFromTy = GenType cenv.amap m eenv.tyenv srcTy + let ilFromTy = GenType cenv m eenv.tyenv srcTy CG.EmitInstr cgbuf (pop 1) (Push [cenv.g.ilg.typ_Object]) (I_box ilFromTy) BI_brfalse | DecisionTreeTest.IsInst (_srcty,tgty) -> @@ -4431,7 +4588,7 @@ and GenDecisionTreeSwitch cenv cgbuf inplabOpt stackAtTargets eenv e cases defau | DecisionTreeTest.ActivePatternCase _ -> error(InternalError("internal error in codegen: DecisionTreeTest.ActivePatternCase",switchm)) | DecisionTreeTest.UnionCase (hdc,tyargs) -> GenExpr cenv cgbuf eenv SPSuppress e Continue - let cuspec = GenUnionSpec cenv.amap m eenv.tyenv hdc.TyconRef tyargs + let cuspec = GenUnionSpec cenv m eenv.tyenv hdc.TyconRef tyargs let dests = if cases.Length <> caseLabels.Length then failwith "internal error: DecisionTreeTest.UnionCase" (cases , caseLabels) ||> List.map2 (fun case label -> @@ -4567,7 +4724,7 @@ and GenLetRecFixup cenv cgbuf eenv (ilxCloSpec:IlxClosureSpec,e,ilField:ILFieldS GenExpr cenv cgbuf eenv SPSuppress e2 Continue CG.EmitInstrs cgbuf (pop 2) Push0 [ mkNormalStfld (mkILFieldSpec(ilField.FieldRef,ilxCloSpec.ILType)) ] -and GenLetRecBindings cenv cgbuf eenv (allBinds: Bindings,m) = +and GenLetRecBindings cenv (cgbuf:CodeGenBuffer) eenv (allBinds: Bindings,m) = // Fix up recursion for non-toplevel recursive bindings let bindsPossiblyRequiringFixup = allBinds |> List.filter (fun b -> @@ -4584,7 +4741,7 @@ and GenLetRecBindings cenv cgbuf eenv (allBinds: Bindings,m) = | Expr.Lambda _ | Expr.TyLambda _ | Expr.Obj _ -> let isLocalTypeFunc = Option.isSome selfv && (IsNamedLocalTypeFuncVal cenv.g (Option.get selfv) e) let selfv = (match e with Expr.Obj _ -> None | _ when isLocalTypeFunc -> None | _ -> Option.map mkLocalValRef selfv) - let clo,_,eenvclo = GetIlxClosureInfo cenv m isLocalTypeFunc selfv {eenv with letBoundVars=(mkLocalValRef boundv)::eenv.letBoundVars} e + let clo,_,eenvclo = GetIlxClosureInfo cenv cgbuf.mgbuf m isLocalTypeFunc selfv {eenv with letBoundVars=(mkLocalValRef boundv)::eenv.letBoundVars} e clo.cloFreeVars |> List.iter (fun fv -> if Zset.contains fv forwardReferenceSet then match StorageForVal m fv eenvclo with @@ -4695,11 +4852,11 @@ and GenBindingAfterSequencePoint cenv cgbuf eenv sp (TBind(vspec,rhsExpr,_)) sta let tps,ctorThisValOpt,baseValOpt,vsl,body',bodyty = IteratedAdjustArityOfLambda cenv.g cenv.amap topValInfo rhsExpr let methodVars = List.concat vsl CommitStartScope cgbuf startScopeMarkOpt - GenMethodForBinding cenv cgbuf eenv (vspec,mspec,access,paramInfos,retInfo) (topValInfo,ctorThisValOpt,baseValOpt,tps,methodVars, body', bodyty) + GenMethodForBinding cenv cgbuf.mgbuf eenv (vspec,mspec,access,paramInfos,retInfo) (topValInfo,ctorThisValOpt,baseValOpt,tps,methodVars, body', bodyty) | StaticProperty (ilGetterMethSpec, optShadowLocal) -> - let ilAttribs = GenAttrs cenv eenv vspec.Attribs + let ilAttribs = GenAttrs cenv cgbuf.mgbuf eenv vspec.Attribs let ilTy = ilGetterMethSpec.FormalReturnType let ilPropDef = { Name = PrettyNaming.ChopPropertyName ilGetterMethSpec.Name @@ -4753,9 +4910,9 @@ and GenBindingAfterSequencePoint cenv cgbuf eenv sp (TBind(vspec,rhsExpr,_)) sta if not hasLiteralAttr then vspec.Attribs |> List.filter (fun (Attrib(_,_,_,_,_,targets,_)) -> canTarget(targets, System.AttributeTargets.Field)) - |> GenAttrs cenv eenv // backing field only gets attributes that target fields + |> GenAttrs cenv cgbuf.mgbuf eenv // backing field only gets attributes that target fields else - GenAttrs cenv eenv vspec.Attribs // literals have no property, so preserve all the attributes on the field itself + GenAttrs cenv cgbuf.mgbuf eenv vspec.Attribs // literals have no property, so preserve all the attributes on the field itself let ilFieldDef = { ilFieldDef with @@ -4774,7 +4931,7 @@ and GenBindingAfterSequencePoint cenv cgbuf eenv sp (TBind(vspec,rhsExpr,_)) sta let ilAttribs = vspec.Attribs |> List.filter (fun (Attrib(_,_,_,_,_,targets,_)) -> canTarget(targets, System.AttributeTargets.Property)) - |> GenAttrs cenv eenv // property only gets attributes that target properties + |> GenAttrs cenv cgbuf.mgbuf eenv // property only gets attributes that target properties let ilPropDef = { Name=ilPropName Attributes = PropertyAttributes.None @@ -4963,7 +5120,7 @@ and GenParamAttribs cenv attribs = let Marshal,attribs = GenMarshal cenv attribs inFlag,outFlag,optionalFlag,defaultValue,Marshal,attribs -and GenParams cenv eenv (mspec:ILMethodSpec) (attribs:ArgReprInfo list) (implValsOpt: Val list option) = +and GenParams cenv mgbuf eenv (mspec:ILMethodSpec) (attribs:ArgReprInfo list) (implValsOpt: Val list option) = let ilArgTys = mspec.FormalArgTypes let argInfosAndTypes = if List.length attribs = List.length ilArgTys then List.zip ilArgTys attribs @@ -5002,16 +5159,16 @@ and GenParams cenv eenv (mspec:ILMethodSpec) (attribs:ArgReprInfo list) (implVal IsIn=inFlag IsOut=outFlag IsOptional=optionalFlag - CustomAttrs= mkILCustomAttrs (GenAttrs cenv eenv attribs) } + CustomAttrs= mkILCustomAttrs (GenAttrs cenv mgbuf eenv attribs) } param, takenNames) |> fst -and GenReturnInfo cenv eenv ilRetTy (retInfo : ArgReprInfo) : ILReturn = +and GenReturnInfo cenv mgbuf eenv ilRetTy (retInfo : ArgReprInfo) : ILReturn = let marshal,attrs = GenMarshal cenv retInfo.Attribs { Type=ilRetTy Marshal=marshal - CustomAttrs= mkILCustomAttrs (GenAttrs cenv eenv attrs) } + CustomAttrs= mkILCustomAttrs (GenAttrs cenv mgbuf eenv attrs) } and GenPropertyForMethodDef compileAsInstance tref mdef (v:Val) (memberInfo:ValMemberInfo) ilArgTys ilPropTy ilAttrs compiledName = let name = match compiledName with | Some n -> n | _ -> v.PropertyName in (* chop "get_" *) @@ -5029,7 +5186,7 @@ and GenPropertyForMethodDef compileAsInstance tref mdef (v:Val) (memberInfo:ValM and GenEventForProperty cenv eenvForMeth (mspec:ILMethodSpec) (v:Val) ilAttrsThatGoOnPrimaryItem m returnTy = let evname = v.PropertyName let delegateTy = Infos.FindDelegateTypeOfPropertyEvent cenv.g cenv.amap evname m returnTy - let ilDelegateTy = GenType cenv.amap m eenvForMeth.tyenv delegateTy + let ilDelegateTy = GenType cenv m eenvForMeth.tyenv delegateTy let ilThisTy = mspec.DeclaringType let addMethRef = mkILMethRef (ilThisTy.TypeRef,mspec.CallingConv,"add_" + evname,0,[ilDelegateTy],ILType.Void) let removeMethRef = mkILMethRef (ilThisTy.TypeRef,mspec.CallingConv,"remove_" + evname,0,[ilDelegateTy],ILType.Void) @@ -5100,7 +5257,7 @@ and ComputeMethodImplAttribs cenv (_v:Val) attrs = hasPreserveSigImplFlag, hasSynchronizedImplFlag, hasNoInliningImplFlag, hasAggressiveInliningImplFlag, attrs and GenMethodForBinding - cenv cgbuf eenv + cenv mgbuf eenv (v:Val,mspec,access,paramInfos,retInfo) (topValInfo,ctorThisValOpt,baseValOpt,tps,methodVars, body, returnTy) = @@ -5164,7 +5321,7 @@ and GenMethodForBinding // This is the main code generation for most methods false, - MethodBody.IL(CodeGenMethodForExpr cenv cgbuf.mgbuf (SPAlways,tailCallInfo, mspec.Name, eenvForMeth, 0, 0, bodyExpr, sequel)), + MethodBody.IL(CodeGenMethodForExpr cenv mgbuf (SPAlways,tailCallInfo, mspec.Name, eenvForMeth, 0, 0, bodyExpr, sequel)), false // Do not generate DllImport attributes into the code - they are implicit from the P/Invoke @@ -5186,7 +5343,7 @@ and GenMethodForBinding let securityAttributes,attrs = attrs |> List.partition (fun a -> IsSecurityAttribute cenv.g cenv.amap cenv.casApplied a m) - let permissionSets = CreatePermissionSets cenv.g cenv.amap eenv securityAttributes + let permissionSets = CreatePermissionSets cenv mgbuf eenv securityAttributes let secDecls = if List.isEmpty securityAttributes then emptyILSecurityDecls else mkILSecurityDecls permissionSets @@ -5194,12 +5351,12 @@ and GenMethodForBinding let ilAttrsCompilerGenerated = if v.IsCompilerGenerated then [ cenv.g.CompilerGeneratedAttribute ] else [] let ilAttrsThatGoOnPrimaryItem = - [ yield! GenAttrs cenv eenv attrs + [ yield! GenAttrs cenv mgbuf eenv attrs yield! GenCompilationArgumentCountsAttr cenv v ] - let ilTypars = GenGenericParams cenv eenvUnderMethLambdaTypars tps - let ilParams = GenParams cenv eenv mspec paramInfos (Some(nonUnitNonSelfMethodVars)) - let ilReturn = GenReturnInfo cenv eenv mspec.FormalReturnType retInfo + let ilTypars = GenGenericParams cenv mgbuf eenvUnderMethLambdaTypars tps + let ilParams = GenParams cenv mgbuf eenv mspec paramInfos (Some(nonUnitNonSelfMethodVars)) + let ilReturn = GenReturnInfo cenv mgbuf eenv mspec.FormalReturnType retInfo let methName = mspec.Name let tref = mspec.MethodRef.DeclaringTypeRef @@ -5225,7 +5382,7 @@ and GenMethodForBinding else mdef CountMethodDef() - cgbuf.mgbuf.AddMethodDef(tref,mdef) + mgbuf.AddMethodDef(tref,mdef) match v.MemberInfo with @@ -5262,7 +5419,7 @@ and GenMethodForBinding let mdef = List.fold (fun mdef f -> f mdef) mdef flagFixups // fixup can potentially change name of reflected definition that was already recorded - patch it if necessary - cgbuf.mgbuf.ReplaceNameOfReflectedDefinition(v, mdef.Name) + mgbuf.ReplaceNameOfReflectedDefinition(v, mdef.Name) mdef else mkILGenericNonVirtualMethod (v.CompiledName,access,ilMethTypars,ilParams,ilReturn,ilMethodBody) @@ -5289,20 +5446,20 @@ and GenMethodForBinding // Emit the pseudo-property as an event, but not if its a private method impl if mdef.Access <> ILMemberAccess.Private then let edef = GenEventForProperty cenv eenvForMeth mspec v ilAttrsThatGoOnPrimaryItem m returnTy - cgbuf.mgbuf.AddEventDef(tref,edef) + mgbuf.AddEventDef(tref,edef) // The method def is dropped on the floor here else // Emit the property, but not if its a private method impl if mdef.Access <> ILMemberAccess.Private then let vtyp = ReturnTypeOfPropertyVal cenv.g v - let ilPropTy = GenType cenv.amap m eenvUnderMethTypeTypars.tyenv vtyp - let ilArgTys = v |> ArgInfosOfPropertyVal cenv.g |> List.map fst |> GenTypes cenv.amap m eenvUnderMethTypeTypars.tyenv + let ilPropTy = GenType cenv m eenvUnderMethTypeTypars.tyenv vtyp + let ilArgTys = v |> ArgInfosOfPropertyVal cenv.g |> List.map fst |> GenTypes cenv m eenvUnderMethTypeTypars.tyenv let ilPropDef = GenPropertyForMethodDef compileAsInstance tref mdef v memberInfo ilArgTys ilPropTy (mkILCustomAttrs ilAttrsThatGoOnPrimaryItem) compiledName - cgbuf.mgbuf.AddOrMergePropertyDef(tref,ilPropDef,m) + mgbuf.AddOrMergePropertyDef(tref,ilPropDef,m) // Add the special name flag for all properties - let mdef = { mdef.WithSpecialName with CustomAttrs= mkILCustomAttrs ((GenAttrs cenv eenv attrsAppliedToGetterOrSetter) @ sourceNameAttribs @ ilAttrsCompilerGenerated) } + let mdef = { mdef.WithSpecialName with CustomAttrs= mkILCustomAttrs ((GenAttrs cenv mgbuf eenv attrsAppliedToGetterOrSetter) @ sourceNameAttribs @ ilAttrsCompilerGenerated) } EmitTheMethodDef mdef | _ -> let mdef = { mdef with CustomAttrs= mkILCustomAttrs (ilAttrsThatGoOnPrimaryItem @ sourceNameAttribs @ ilAttrsCompilerGenerated) } @@ -5316,7 +5473,7 @@ and GenMethodForBinding match v.MemberInfo with | Some memberInfo when v.IsExtensionMember -> match memberInfo.MemberFlags.MemberKind with - | (MemberKind.PropertySet | MemberKind.PropertyGet) -> ilAttrsThatGoOnPrimaryItem @ GenAttrs cenv eenv attrsAppliedToGetterOrSetter + | (MemberKind.PropertySet | MemberKind.PropertyGet) -> ilAttrsThatGoOnPrimaryItem @ GenAttrs cenv mgbuf eenv attrsAppliedToGetterOrSetter | _ -> ilAttrsThatGoOnPrimaryItem | _ -> ilAttrsThatGoOnPrimaryItem @@ -5374,7 +5531,7 @@ and GenSetVal cenv cgbuf eenv (vref,e,m) sequel = and GenGetValRefAndSequel cenv cgbuf eenv m (v:ValRef) fetchSequel = let ty = v.Type - GenGetStorageAndSequel cenv cgbuf eenv m (ty, GenType cenv.amap m eenv.tyenv ty) (StorageForValRef m v eenv) fetchSequel + GenGetStorageAndSequel cenv cgbuf eenv m (ty, GenType cenv m eenv.tyenv ty) (StorageForValRef m v eenv) fetchSequel and GenGetVal cenv cgbuf eenv (v:ValRef,m) sequel = GenGetValRefAndSequel cenv cgbuf eenv m v None @@ -5531,7 +5688,7 @@ and AllocLocalVal cenv cgbuf v eenv repr scopeMarks = let eenvinner = {eenv with letBoundVars=(mkLocalValRef v)::eenv.letBoundVars} - let cloinfo,_,_ = GetIlxClosureInfo cenv v.Range true None eenvinner (Option.get repr) + let cloinfo,_,_ = GetIlxClosureInfo cenv cgbuf.mgbuf v.Range true None eenvinner (Option.get repr) cloinfo let idx,eenv = AllocLocal cenv cgbuf eenv v.IsCompilerGenerated (v.CompiledName, cenv.g.ilg.typ_Object, false) scopeMarks @@ -5621,7 +5778,8 @@ and EmitRestoreStack cgbuf (savedStack,savedStackLocals) = //GenAttr: custom attribute generation //------------------------------------------------------------------------- -and GenAttribArg amap g eenv x (ilArgTy:ILType) = +and GenAttribArg cenv mgbuf eenv x (ilArgTy:ILType) = + let g = cenv.g match x,ilArgTy with @@ -5662,31 +5820,31 @@ and GenAttribArg amap g eenv x (ilArgTy:ILType) = // Detect '[| ... |]' nodes | Expr.Op(TOp.Array,[elemTy],args,m),_ -> - let ilElemTy = GenType amap m eenv.tyenv elemTy - ILAttribElem.Array (ilElemTy, List.map (fun arg -> GenAttribArg amap g eenv arg ilElemTy) args) + let ilElemTy = GenType cenv m eenv.tyenv elemTy + ILAttribElem.Array (ilElemTy, List.map (fun arg -> GenAttribArg cenv mgbuf eenv arg ilElemTy) args) // Detect 'typeof' calls | TypeOfExpr g ty, _ -> - ILAttribElem.Type (Some (GenType amap x.Range eenv.tyenv ty)) + ILAttribElem.Type (Some (GenType cenv x.Range eenv.tyenv ty)) // Detect 'typedefof' calls | TypeDefOfExpr g ty, _ -> - ILAttribElem.TypeRef (Some (GenType amap x.Range eenv.tyenv ty).TypeRef) + ILAttribElem.TypeRef (Some (GenType cenv x.Range eenv.tyenv ty).TypeRef) // Ignore upcasts | Expr.Op(TOp.Coerce,_,[arg2],_),_ -> - GenAttribArg amap g eenv arg2 ilArgTy + GenAttribArg cenv mgbuf eenv arg2 ilArgTy // Detect explicit enum values | EnumExpr g arg1, _ -> - GenAttribArg amap g eenv arg1 ilArgTy + GenAttribArg cenv mgbuf eenv arg1 ilArgTy // Detect bitwise or of attribute flags: one case of constant folding (a more general treatment is needed) | AttribBitwiseOrExpr g (arg1,arg2),_ -> - let v1 = GenAttribArg amap g eenv arg1 ilArgTy - let v2 = GenAttribArg amap g eenv arg2 ilArgTy + let v1 = GenAttribArg cenv mgbuf eenv arg1 ilArgTy + let v2 = GenAttribArg cenv mgbuf eenv arg2 ilArgTy match v1,v2 with | ILAttribElem.SByte i1, ILAttribElem.SByte i2 -> ILAttribElem.SByte (i1 ||| i2) | ILAttribElem.Int16 i1, ILAttribElem.Int16 i2-> ILAttribElem.Int16 (i1 ||| i2) @@ -5703,24 +5861,25 @@ and GenAttribArg amap g eenv x (ilArgTy:ILType) = error (InternalError ("invalid custom attribute value (not a constant): " + showL (exprL x),x.Range)) -and GenAttr amap g eenv (Attrib(_,k,args,props,_,_,_)) = +and GenAttr cenv mgbuf eenv (Attrib(_,k,args,props,_,_,_)) = + let g = cenv.g let props = props |> List.map (fun (AttribNamedArg(s,ty,fld,AttribExpr(_,expr))) -> let m = expr.Range - let ilTy = GenType amap m eenv.tyenv ty - let cval = GenAttribArg amap g eenv expr ilTy + let ilTy = GenType cenv m eenv.tyenv ty + let cval = GenAttribArg cenv mgbuf eenv expr ilTy (s,ilTy,fld,cval)) let mspec = match k with | ILAttrib(mref) -> mkILMethSpec(mref,AsObject,[],[]) | FSAttrib(vref) -> assert(vref.IsMember) - let mspec,_,_,_,_ = GetMethodSpecForMemberVal amap g (Option.get vref.MemberInfo) vref + let mspec,_,_,_,_ = GetMethodSpecForMemberVal cenv.amap g (Option.get vref.MemberInfo) vref mspec - let ilArgs = List.map2 (fun (AttribExpr(_,vexpr)) ty -> GenAttribArg amap g eenv vexpr ty) args mspec.FormalArgTypes + let ilArgs = List.map2 (fun (AttribExpr(_,vexpr)) ty -> GenAttribArg cenv mgbuf eenv vexpr ty) args mspec.FormalArgTypes mkILCustomAttribMethRef g.ilg (mspec,ilArgs, props) -and GenAttrs cenv eenv attrs = List.map (GenAttr cenv.amap cenv.g eenv) attrs +and GenAttrs cenv mgbuf eenv attrs = List.map (GenAttr cenv mgbuf eenv) attrs and GenCompilationArgumentCountsAttr cenv (v:Val) = [ match v.ValReprInfo with @@ -5732,18 +5891,18 @@ and GenCompilationArgumentCountsAttr cenv (v:Val) = () ] // Create a permission set for a list of security attributes -and CreatePermissionSets g amap eenv (securityAttributes : Attrib list) = +and CreatePermissionSets cenv mgbuf eenv (securityAttributes : Attrib list) = [for ((Attrib(tcref,_,actions,_,_,_,_)) as attr) in securityAttributes do let action = match actions with | [AttribInt32Arg act] -> act | _ -> failwith "internal error: unrecognized security action" let secaction = (List.assoc action (Lazy.force ILSecurityActionRevMap)) let tref = tcref.CompiledRepresentationForNamedType - let ilattr = GenAttr amap g eenv attr + let ilattr = GenAttr cenv mgbuf eenv attr let _, ilNamedArgs = - match TryDecodeILAttribute g tref (mkILCustomAttrs [ilattr]) with + match TryDecodeILAttribute cenv.g tref (mkILCustomAttrs [ilattr]) with | Some(ae,na) -> ae, na | _ -> [],[] let setArgs = ilNamedArgs |> List.map (fun (n,ilt,_,ilae) -> (n,ilt,ilae)) - yield IL.mkPermissionSet g.ilg (secaction, [(tref, setArgs)])] + yield IL.mkPermissionSet cenv.g.ilg (secaction, [(tref, setArgs)])] //-------------------------------------------------------------------------- // Generate the set of modules for an assembly, and the declarations in each module @@ -5762,7 +5921,7 @@ and GenTypeDefForCompLoc (cenv, eenv, mgbuf: AssemblyBuilder, cloc, hidden, attr emptyILProperties, emptyILEvents, mkILCustomAttrs - (GenAttrs cenv eenv attribs @ + (GenAttrs cenv mgbuf eenv attribs @ (if List.contains tref.Name [TypeNameForImplicitMainMethod cloc; TypeNameForInitClass cloc; TypeNameForPrivateImplementationDetails cloc] then [ ] else [mkCompilationMappingAttr cenv.g (int SourceConstructFlags.Module)])), @@ -5849,7 +6008,14 @@ and GenModuleBinding cenv (cgbuf:CodeGenBuffer) (qname:QualifiedNameOfFile) lazy /// Generate the namespace fragments in a single file -and GenTopImpl cenv mgbuf mainInfoOpt eenv (TImplFile(qname, _, mexpr, hasExplicitEntryPoint, isScript), optimizeDuringCodeGen) = +and GenTopImpl cenv (mgbuf: AssemblyBuilder) mainInfoOpt eenv (TImplFile(qname, _, mexpr, hasExplicitEntryPoint, isScript, anonRecdTypes), optimizeDuringCodeGen) = + + let m = qname.Range + + // Generate all the anonymous record types mentioned anywhere in this module + for anonInfo in anonRecdTypes.Values do + mgbuf.GenerateAnonType((fun ilThisTy -> GenToStringMethod cenv eenv ilThisTy m), anonInfo) |> ignore + let eenv = {eenv with cloc = { eenv.cloc with clocTopImplQualifiedName = qname.Text } } cenv.optimizeDuringCodeGen <- optimizeDuringCodeGen @@ -5879,7 +6045,6 @@ and GenTopImpl cenv mgbuf mainInfoOpt eenv (TImplFile(qname, _, mexpr, hasExplic let lazyInitInfo = new ResizeArray ILInstr list -> ILInstr list -> unit>() // codegen .cctor/main for outer module - let m = qname.Range let clocCcu = CompLocForCcu cenv.viewCcu // This method name is only used internally in ilxgen.fs to aid debugging @@ -5905,8 +6070,6 @@ and GenTopImpl cenv mgbuf mainInfoOpt eenv (TImplFile(qname, _, mexpr, hasExplic // Library file (mainInfoOpt = None) : optional .cctor if topCode has initialization effect // Final file, explicit entry point (mainInfoOpt = Some _, GetExplicitEntryPointInfo() = Some) : main + optional .cctor if topCode has initialization effect // Final file, implicit entry point (mainInfoOpt = Some _, GetExplicitEntryPointInfo() = None) : main + initialize + optional .cctor calling initialize - - let doesSomething = CheckCodeDoesSomething topCode.Code // Make a FEEFEE instruction to mark hidden code regions @@ -5946,7 +6109,7 @@ and GenTopImpl cenv mgbuf mainInfoOpt eenv (TImplFile(qname, _, mexpr, hasExplic // } | None -> - let ilAttrs = mkILCustomAttrs (GenAttrs cenv eenv mainInfo) + let ilAttrs = mkILCustomAttrs (GenAttrs cenv mgbuf eenv mainInfo) if not cenv.opts.isInteractive && not doesSomething then let errorM = m.EndRange warning (Error(FSComp.SR.ilMainModuleEmpty(), errorM)) @@ -6033,7 +6196,7 @@ and GenFieldInit m c = | ConstToILFieldInit fieldInit -> fieldInit | _ -> error(Error(FSComp.SR.ilTypeCannotBeUsedForLiteralField(),m)) -and GenAbstractBinding cenv eenv tref (vref:ValRef) = +and GenAbstractBinding cenv mgbuf eenv tref (vref:ValRef) = assert(vref.IsMember) let m = vref.Range let memberInfo = Option.get vref.MemberInfo @@ -6041,14 +6204,14 @@ and GenAbstractBinding cenv eenv tref (vref:ValRef) = let hasPreserveSigImplFlag,hasSynchronizedImplFlag,hasNoInliningFlag,hasAggressiveInliningImplFlag,attribs = ComputeMethodImplAttribs cenv vref.Deref attribs if memberInfo.MemberFlags.IsDispatchSlot && not memberInfo.IsImplemented then let ilAttrs = - [ yield! GenAttrs cenv eenv attribs + [ yield! GenAttrs cenv mgbuf eenv attribs yield! GenCompilationArgumentCountsAttr cenv vref.Deref ] let mspec,ctps,mtps,argInfos,retInfo = GetMethodSpecForMemberVal cenv.amap cenv.g memberInfo vref let eenvForMeth = EnvForTypars (ctps@mtps) eenv - let ilMethTypars = GenGenericParams cenv eenvForMeth mtps - let ilReturn = GenReturnInfo cenv eenvForMeth mspec.FormalReturnType retInfo - let ilParams = GenParams cenv eenvForMeth mspec argInfos None + let ilMethTypars = GenGenericParams cenv mgbuf eenvForMeth mtps + let ilReturn = GenReturnInfo cenv mgbuf eenvForMeth mspec.FormalReturnType retInfo + let ilParams = GenParams cenv mgbuf eenvForMeth mspec argInfos None let compileAsInstance = ValRefIsCompiledAsInstanceMember cenv.g vref let mdef = mkILGenericVirtualMethod (vref.CompiledName,ILMemberAccess.Public,ilMethTypars,ilParams,ilReturn,MethodBody.Abstract) @@ -6076,8 +6239,8 @@ and GenAbstractBinding cenv eenv tref (vref:ValRef) = [],[],[edef] else let ilPropDef = - let ilPropTy = GenType cenv.amap m eenvForMeth.tyenv vtyp - let ilArgTys = v |> ArgInfosOfPropertyVal cenv.g |> List.map fst |> GenTypes cenv.amap m eenvForMeth.tyenv + let ilPropTy = GenType cenv m eenvForMeth.tyenv vtyp + let ilArgTys = v |> ArgInfosOfPropertyVal cenv.g |> List.map fst |> GenTypes cenv m eenvForMeth.tyenv GenPropertyForMethodDef compileAsInstance tref mdef v memberInfo ilArgTys ilPropTy (mkILCustomAttrs ilAttrs) None let mdef = mdef.WithSpecialName [mdef], [ilPropDef],[] @@ -6085,12 +6248,11 @@ and GenAbstractBinding cenv eenv tref (vref:ValRef) = else [],[],[] -and GenTypeDef cenv mgbuf lazyInitInfo eenv m (tycon:Tycon) = - let genToString ilThisTy = - [ - match (eenv.valsInScope.TryFind cenv.g.sprintf_vref.Deref, - eenv.valsInScope.TryFind cenv.g.new_format_vref.Deref) with - | Some(Lazy(Method(_,_,sprintfMethSpec,_,_,_))), Some(Lazy(Method(_,_,newFormatMethSpec,_,_,_))) -> +/// Generate a ToString method that calls 'sprintf "%A"' +and GenToStringMethod cenv eenv ilThisTy m = + [ match (eenv.valsInScope.TryFind cenv.g.sprintf_vref.Deref, + eenv.valsInScope.TryFind cenv.g.new_format_vref.Deref) with + | Some(Lazy(Method(_,_,sprintfMethSpec,_,_,_))), Some(Lazy(Method(_,_,newFormatMethSpec,_,_,_))) -> // The type returned by the 'sprintf' call let funcTy = EraseClosures.mkILFuncTy cenv.g.ilxPubCloEnv ilThisTy cenv.g.ilg.typ_String // Give the instantiation of the printf format object, i.e. a Format`5 object compatible with StringFormat @@ -6123,9 +6285,9 @@ and GenTypeDef cenv mgbuf lazyInitInfo eenv m (tycon:Tycon) = None)) let mdef = { ilMethodDef with CustomAttrs = mkILCustomAttrs [ cenv.g.CompilerGeneratedAttribute ] } yield mdef - | None,_ -> () - | _,None -> () - | _ -> ()] + | _ -> () ] + +and GenTypeDef cenv mgbuf lazyInitInfo eenv m (tycon:Tycon) = let tcref = mkLocalTyconRef tycon if tycon.IsTypeAbbrev then () else match tycon.TypeReprInfo with @@ -6139,10 +6301,10 @@ and GenTypeDef cenv mgbuf lazyInitInfo eenv m (tycon:Tycon) = let eenvinner = ReplaceTyenv (TypeReprEnv.ForTycon tycon) eenv let thisTy = generalizedTyconRef tcref - let ilThisTy = GenType cenv.amap m eenvinner.tyenv thisTy + let ilThisTy = GenType cenv m eenvinner.tyenv thisTy let tref = ilThisTy.TypeRef - let ilGenParams = GenGenericParams cenv eenvinner tycon.TyparsNoRange - let ilIntfTys = tycon.ImmediateInterfaceTypesOfFSharpTycon |> List.map (GenType cenv.amap m eenvinner.tyenv) + let ilGenParams = GenGenericParams cenv mgbuf eenvinner tycon.TyparsNoRange + let ilIntfTys = tycon.ImmediateInterfaceTypesOfFSharpTycon |> List.map (GenType cenv m eenvinner.tyenv) let ilTypeName = tref.Name let hidden = IsHiddenTycon eenv.sigToImplRemapInfo tycon @@ -6177,7 +6339,7 @@ and GenTypeDef cenv mgbuf lazyInitInfo eenv m (tycon:Tycon) = // REVIEW: this should be based off tcaug_adhoc_list, which is in declaration order tycon.MembersOfFSharpTyconSorted |> List.sortWith (fun v1 v2 -> rangeOrder.Compare(v1.DefinitionRange,v2.DefinitionRange)) - |> List.map (GenAbstractBinding cenv eenv tref) + |> List.map (GenAbstractBinding cenv mgbuf eenv tref) |> List.unzip3 |> mapTriple (List.concat, List.concat, List.concat) @@ -6207,7 +6369,7 @@ and GenTypeDef cenv mgbuf lazyInitInfo eenv m (tycon:Tycon) = let useMethodImpl = true let eenvUnderTypars = EnvForTypars memberParentTypars eenv - let _,methodImplGenerator = GenMethodImpl cenv eenvUnderTypars (useMethodImpl,slotsig) m + let _,methodImplGenerator = GenMethodImpl cenv mgbuf eenvUnderTypars (useMethodImpl,slotsig) m if useMethodImpl then yield methodImplGenerator (ilThisTy,memberMethodTypars) @@ -6237,11 +6399,11 @@ and GenTypeDef cenv mgbuf lazyInitInfo eenv m (tycon:Tycon) = let generateDebugProxies = (not (tyconRefEq cenv.g tcref cenv.g.unit_tcr_canon) && not (HasFSharpAttribute cenv.g cenv.g.attrib_DebuggerTypeProxyAttribute tycon.Attribs)) - let permissionSets = CreatePermissionSets cenv.g cenv.amap eenv securityAttrs + let permissionSets = CreatePermissionSets cenv mgbuf eenv securityAttrs let secDecls = if List.isEmpty securityAttrs then emptyILSecurityDecls else mkILSecurityDecls permissionSets let ilDebugDisplayAttributes = - [ yield! GenAttrs cenv eenv debugDisplayAttrs + [ yield! GenAttrs cenv mgbuf eenv debugDisplayAttrs if generateDebugDisplayAttribute then yield cenv.g.mkDebuggerDisplayAttribute ("{" + debugDisplayMethodName + "(),nq}") ] @@ -6250,7 +6412,7 @@ and GenTypeDef cenv mgbuf lazyInitInfo eenv m (tycon:Tycon) = [ yield! defaultMemberAttrs yield! normalAttrs |> List.filter (IsMatchingFSharpAttribute cenv.g cenv.g.attrib_StructLayoutAttribute >> not) - |> GenAttrs cenv eenv + |> GenAttrs cenv mgbuf eenv yield! ilDebugDisplayAttributes ] let reprAccess = ComputeMemberAccess hiddenRepr @@ -6293,7 +6455,7 @@ and GenTypeDef cenv mgbuf lazyInitInfo eenv m (tycon:Tycon) = ((fspec.IsCompilerGenerated && not tycon.IsEnumTycon) || hiddenRepr || IsHiddenRecdField eenv.sigToImplRemapInfo (tcref.MakeNestedRecdFieldRef fspec)) - let ilType = GenType cenv.amap m eenvinner.tyenv fspec.FormalType + let ilType = GenType cenv m eenvinner.tyenv fspec.FormalType let ilFieldName = ComputeFieldName tycon fspec yield (useGenuineField, ilFieldName, fspec.IsMutable, fspec.IsStatic, fspec.PropertyAttribs, ilType, isPropHidden, fspec) ] @@ -6351,7 +6513,7 @@ and GenTypeDef cenv mgbuf lazyInitInfo eenv m (tycon:Tycon) = LiteralValue = literalValue Offset = ilFieldOffset Marshal = ilFieldMarshal - CustomAttrs = mkILCustomAttrs (GenAttrs cenv eenv fattribs @ extraAttribs) } + CustomAttrs = mkILCustomAttrs (GenAttrs cenv mgbuf eenv fattribs @ extraAttribs) } let fdef = fdef.WithAccess(access) .WithStatic(isStatic) @@ -6372,7 +6534,7 @@ and GenTypeDef cenv mgbuf lazyInitInfo eenv m (tycon:Tycon) = let ilCallingConv = if isStatic then ILCallingConv.Static else ILCallingConv.Instance let ilPropName = fspec.Name let ilHasSetter = isCLIMutable || isFSharpMutable - let ilFieldAttrs = GenAttrs cenv eenv propAttribs @ [mkCompilationMappingAttrWithSeqNum cenv.g (int SourceConstructFlags.Field) i] + let ilFieldAttrs = GenAttrs cenv mgbuf eenv propAttribs @ [mkCompilationMappingAttrWithSeqNum cenv.g (int SourceConstructFlags.Field) i] yield { Name = ilPropName Attributes = PropertyAttributes.None @@ -6490,7 +6652,7 @@ and GenTypeDef cenv mgbuf lazyInitInfo eenv m (tycon:Tycon) = yield mkILSimpleStorageCtor(None, Some cenv.g.ilg.typ_Object.TypeSpec, ilThisTy, [], [], reprAccess) if not (tycon.HasMember cenv.g "ToString" []) then - yield! genToString ilThisTy + yield! GenToStringMethod cenv eenv ilThisTy m | TFSharpObjectRepr r when tycon.IsFSharpDelegateTycon -> // Build all the methods that go with a delegate type @@ -6504,13 +6666,12 @@ and GenTypeDef cenv mgbuf lazyInitInfo eenv m (tycon:Tycon) = match paraml with | [[tsp]] when isUnitTy cenv.g tsp.Type -> [] (* suppress unit arg *) | paraml -> paraml - GenActualSlotsig m cenv eenvinner (TSlotSig(nm,typ,ctps,mtps,paraml,returnTy)) [] [] - for ilMethodDef in mkILDelegateMethods reprAccess cenv.g.ilg (cenv.g.iltyp_AsyncCallback, cenv.g.iltyp_IAsyncResult) (p,r) do - yield ilMethodDef + GenActualSlotsig m cenv mgbuf eenvinner (TSlotSig(nm,typ,ctps,mtps,paraml,returnTy)) [] [] + yield! mkILDelegateMethods reprAccess cenv.g.ilg (cenv.g.iltyp_AsyncCallback, cenv.g.iltyp_IAsyncResult) (p,r) | _ -> () | TUnionRepr _ when not (tycon.HasMember cenv.g "ToString" []) -> - yield! genToString ilThisTy + yield! GenToStringMethod cenv eenv ilThisTy m | _ -> () ] let ilMethods = methodDefs @ augmentOverrideMethodDefs @ abstractMethodDefs @@ -6529,7 +6690,7 @@ and GenTypeDef cenv mgbuf lazyInitInfo eenv m (tycon:Tycon) = | TRecdRepr _ | TFSharpObjectRepr _ as tyconRepr -> let super = superOfTycon cenv.g tycon - let ilBaseTy = GenType cenv.amap m eenvinner.tyenv super + let ilBaseTy = GenType cenv m eenvinner.tyenv super // Build a basic type definition let isObjectType = (match tyconRepr with TFSharpObjectRepr _ -> true | _ -> false) @@ -6637,7 +6798,7 @@ and GenTypeDef cenv mgbuf lazyInitInfo eenv m (tycon:Tycon) = tycon.UnionCasesArray |> Array.mapi (fun i ucspec -> { altName=ucspec.CompiledName altFields=GenUnionCaseRef cenv.amap m eenvinner.tyenv i ucspec.RecdFieldsArray - altCustomAttrs= mkILCustomAttrs (GenAttrs cenv eenv ucspec.Attribs @ [mkCompilationMappingAttrWithSeqNum cenv.g (int SourceConstructFlags.UnionCase) i]) }) + altCustomAttrs= mkILCustomAttrs (GenAttrs cenv mgbuf eenv ucspec.Attribs @ [mkCompilationMappingAttrWithSeqNum cenv.g (int SourceConstructFlags.UnionCase) i]) }) let cuinfo = { cudReprAccess=reprAccess cudNullPermitted=IsUnionTypeWithNullAsTrueValue cenv.g tycon @@ -6732,7 +6893,7 @@ and GenExnDef cenv mgbuf eenv m (exnc:Tycon) = let ilMethodDefsForProperties,ilFieldDefs,ilPropertyDefs,fieldNamesAndTypes = [ for i,fld in markup fspecs do let ilPropName = fld.Name - let ilPropType = GenType cenv.amap m eenv.tyenv fld.FormalType + let ilPropType = GenType cenv m eenv.tyenv fld.FormalType let ilMethName = "get_" + fld.Name let ilFieldName = ComputeFieldName exnc fld let ilMethodDef = mkLdfldMethodDef (ilMethName,reprAccess,false,ilThisTy,ilFieldName,ilPropType) @@ -6746,7 +6907,7 @@ and GenExnDef cenv mgbuf eenv m (exnc:Tycon) = Type = ilPropType Init = None Args = [] - CustomAttrs=mkILCustomAttrs (GenAttrs cenv eenv fld.PropertyAttribs @ [mkCompilationMappingAttrWithSeqNum cenv.g (int SourceConstructFlags.Field) i]) } + CustomAttrs=mkILCustomAttrs (GenAttrs cenv mgbuf eenv fld.PropertyAttribs @ [mkCompilationMappingAttrWithSeqNum cenv.g (int SourceConstructFlags.Field) i]) } yield (ilMethodDef,ilFieldDef,ilPropDef,(ilPropName,ilFieldName,ilPropType)) ] |> List.unzip4 @@ -6811,7 +6972,7 @@ and GenExnDef cenv mgbuf eenv m (exnc:Tycon) = let ilTypeName = tref.Name - let interfaces = exnc.ImmediateInterfaceTypesOfFSharpTycon |> List.map (GenType cenv.amap m eenv.tyenv) + let interfaces = exnc.ImmediateInterfaceTypesOfFSharpTycon |> List.map (GenType cenv m eenv.tyenv) let tdef = mkILGenericClass (ilTypeName,access,[],cenv.g.iltyp_Exception, @@ -6831,7 +6992,26 @@ let CodegenAssembly cenv eenv mgbuf fileImpls = if not (isNil fileImpls) then let a,b = List.frontAndBack fileImpls let eenv = List.fold (GenTopImpl cenv mgbuf None) eenv a - let _eenv = GenTopImpl cenv mgbuf cenv.opts.mainMethodInfo eenv b + let eenv = GenTopImpl cenv mgbuf cenv.opts.mainMethodInfo eenv b + + // Some constructs generate residue types and bindings. Generate these now. They don't result in any + // top-level initialization code. + begin + let extraBindings = mgbuf.GrabExtraBindingsToGenerate() + //printfn "#extraBindings = %d" extraBindings.Length + if extraBindings.Length > 0 then + let mexpr = TMDefs [ for b in extraBindings -> TMDefLet(b,range0) ] + let _emptyTopInstrs,_emptyTopCode = + CodeGenMethod cenv mgbuf ([],"unused",eenv,0,0, (fun cgbuf eenv -> + let lazyInitInfo = ResizeArray() + let qname = QualifiedNameOfFile(mkSynId range0 "unused") + LocalScope "module" cgbuf (fun scopeMarks -> + let eenv = AddBindingsForModuleDef (fun cloc v -> AllocTopValWithinExpr cenv cgbuf cloc scopeMarks v) eenv.cloc eenv mexpr + GenModuleDef cenv cgbuf qname lazyInitInfo eenv mexpr)),range0) + //printfn "#_emptyTopInstrs = %d" _emptyTopInstrs.Length + () + end + mgbuf.AddInitializeScriptsInOrderToEntryPoint() //------------------------------------------------------------------------- @@ -6856,15 +7036,17 @@ type IlxGenResults = { ilTypeDefs: ILTypeDef list ilAssemAttrs : ILAttribute list ilNetModuleAttrs: ILAttribute list + topAssemblyAttrs : Attribs + permissionSets : ILPermission list quotationResourceInfo: (ILTypeRef list * byte[]) list } -let GenerateCode (cenv, eenv, TypedAssemblyAfterOptimization fileImpls, assemAttribs, moduleAttribs) = +let GenerateCode (cenv, anonTypeTable, eenv, TypedAssemblyAfterOptimization fileImpls, assemAttribs, moduleAttribs) = use unwindBuildPhase = PushThreadBuildPhaseUntilUnwind BuildPhase.IlxGen // Generate the implementations into the mgbuf - let mgbuf= new AssemblyBuilder(cenv) + let mgbuf = new AssemblyBuilder(cenv, anonTypeTable) let eenv = { eenv with cloc = CompLocForFragment cenv.opts.fragName cenv.viewCcu } // Generate the PrivateImplementationDetails type @@ -6873,10 +7055,11 @@ let GenerateCode (cenv, eenv, TypedAssemblyAfterOptimization fileImpls, assemAtt // Generate the whole assembly CodegenAssembly cenv eenv mgbuf fileImpls - let ilAssemAttrs = GenAttrs cenv eenv assemAttribs + let ilAssemAttrs = GenAttrs cenv mgbuf eenv assemAttribs let tdefs,reflectedDefinitions = mgbuf.Close() + // Generate the quotations let quotationResourceInfo = match reflectedDefinitions with @@ -6911,11 +7094,18 @@ let GenerateCode (cenv, eenv, TypedAssemblyAfterOptimization fileImpls, assemAtt [ (referencedTypeDefs, defnsResourceBytes) ] - let ilNetModuleAttrs = GenAttrs cenv eenv moduleAttribs + let ilNetModuleAttrs = GenAttrs cenv mgbuf eenv moduleAttribs + + let casApplied = new Dictionary() + let securityAttrs, topAssemblyAttrs = assemAttribs |> List.partition (fun a -> TypeChecker.IsSecurityAttribute cenv.g cenv.amap casApplied a rangeStartup) + // remove any security attributes from the top-level assembly attribute list + let permissionSets = CreatePermissionSets cenv mgbuf eenv securityAttrs { ilTypeDefs= tdefs ilAssemAttrs = ilAssemAttrs ilNetModuleAttrs = ilNetModuleAttrs + topAssemblyAttrs = topAssemblyAttrs + permissionSets = permissionSets quotationResourceInfo = quotationResourceInfo } @@ -6954,7 +7144,7 @@ let LookupGeneratedValue (amap:ImportMap) (ctxt: ExecutionContext) eenv (v:Val) try // Convert the v.Type into a System.Type according to ilxgen and ilreflect. let objTyp = - let ilTy = GenType amap v.Range TypeReprEnv.Empty v.Type (* TypeReprEnv.Empty ok, not expecting typars *) + let ilTy = GenTypeAux amap v.Range TypeReprEnv.Empty v.Type (* TypeReprEnv.Empty ok, not expecting typars *) ctxt.LookupType ilTy // Lookup the compiled v value (as an object). match StorageForVal v.Range v eenv with @@ -7015,37 +7205,13 @@ let ClearGeneratedValue (ctxt: ExecutionContext) (_g:TcGlobals) eenv (v:Val) = #endif () -(* -let LookupGeneratedInfo (ctxt: ExecutionContext) (g:TcGlobals) eenv (v:Val) = - try - match StorageForVal v.Range v eenv with - | StaticField (fspec, _, hasLiteralAttr, ilContainerTy, _, _, ilGetterMethRef, _, _) -> - let staticTyp = ctxt.LookupTypeRef ilContainerTy.TypeRef - if hasLiteralAttr then - Some (staticTyp.GetField(fspec.Name) :> MemberInfo) - else - Some (staticTyp.GetMethod(ilGetterMethRef.Name,[||]) :> MemberInfo) - | Null -> None - | Local _ -> None - | Method _ -> None - | Arg _ -> None - | Env _ -> None - with - e -> -#if DEBUG - printf "ilxGen.lookupGenertedInfo for v=%s caught exception:\n%A\n\n" v.LogicalName e -#endif - None - - -*) - /// The published API from the ILX code generator type IlxAssemblyGenerator(amap: ImportMap, tcGlobals: TcGlobals, tcVal : ConstraintSolver.TcValF, ccu: Tast.CcuThunk) = // The incremental state held by the ILX code generator let mutable ilxGenEnv = GetEmptyIlxGenEnv tcGlobals.ilg ccu + let anonTypeTable = AnonTypeGenerationTable() let intraAssemblyInfo = { StaticFieldInfo = new Dictionary<_,_>(HashIdentity.Structural) } let casApplied = new Dictionary() @@ -7070,7 +7236,7 @@ type IlxAssemblyGenerator(amap: ImportMap, tcGlobals: TcGlobals, tcVal : Constra intraAssemblyInfo = intraAssemblyInfo opts = codeGenOpts optimizeDuringCodeGen = (fun x -> x) } - GenerateCode (cenv, ilxGenEnv, typedAssembly, assemAttribs, moduleAttribs) + GenerateCode (cenv, anonTypeTable, ilxGenEnv, typedAssembly, assemAttribs, moduleAttribs) /// Invert the compilation of the given value and clear the storage of the value member __.ClearGeneratedValue (ctxt, v) = ClearGeneratedValue ctxt tcGlobals ilxGenEnv v @@ -7078,5 +7244,4 @@ type IlxAssemblyGenerator(amap: ImportMap, tcGlobals: TcGlobals, tcVal : Constra /// Invert the compilation of the given value and return its current dynamic value and its compiled System.Type member __.LookupGeneratedValue (ctxt, v) = LookupGeneratedValue amap ctxt ilxGenEnv v - /// Create the CAS permission sets for an assembly fragment - member __.CreatePermissionSets attribs = CreatePermissionSets tcGlobals amap ilxGenEnv attribs + diff --git a/src/fsharp/IlxGen.fsi b/src/fsharp/IlxGen.fsi index f3db0386983..8ff68fd3ebb 100644 --- a/src/fsharp/IlxGen.fsi +++ b/src/fsharp/IlxGen.fsi @@ -44,6 +44,10 @@ type public IlxGenResults = ilAssemAttrs : ILAttribute list /// The generated IL/ILX .NET module attributes ilNetModuleAttrs : ILAttribute list + /// The attributes for the assembly in F# form + topAssemblyAttrs : Attribs + /// The security attributes to attach to the assembly + permissionSets : ILPermission list /// The generated IL/ILX resources associated with F# quotations quotationResourceInfo : (ILTypeRef list * byte[]) list } @@ -70,9 +74,6 @@ type public IlxAssemblyGenerator = /// Generate ILX code for an assembly fragment member GenerateCode : IlxGenOptions * TypedAssemblyAfterOptimization * Attribs * Attribs -> IlxGenResults - /// Create the CAS permission sets for an assembly fragment - member CreatePermissionSets : Attrib list -> ILPermission list - /// Invert the compilation of the given value and clear the storage of the value member ClearGeneratedValue : ExecutionContext * Val -> unit diff --git a/src/fsharp/InnerLambdasToTopLevelFuncs.fs b/src/fsharp/InnerLambdasToTopLevelFuncs.fs index f8fc1354494..091f56acd69 100644 --- a/src/fsharp/InnerLambdasToTopLevelFuncs.fs +++ b/src/fsharp/InnerLambdasToTopLevelFuncs.fs @@ -1281,9 +1281,9 @@ module Pass4_RewriteAssembly = let rhs,z = TransModuleDef penv z rhs ModuleOrNamespaceBinding.Module(nm,rhs),z - let TransImplFile penv z (TImplFile(fragName,pragmas,moduleExpr,hasExplicitEntryPoint,isScript)) = + let TransImplFile penv z (TImplFile(fragName,pragmas,moduleExpr,hasExplicitEntryPoint,isScript,anonRecdTypes)) = let moduleExpr,z = TransModuleExpr penv z moduleExpr - (TImplFile(fragName,pragmas,moduleExpr,hasExplicitEntryPoint,isScript)),z + (TImplFile(fragName,pragmas,moduleExpr,hasExplicitEntryPoint,isScript,anonRecdTypes)),z //------------------------------------------------------------------------- // pass5: copyExpr diff --git a/src/fsharp/LexFilter.fs b/src/fsharp/LexFilter.fs index c933a847bbb..8d92b6edb64 100755 --- a/src/fsharp/LexFilter.fs +++ b/src/fsharp/LexFilter.fs @@ -342,7 +342,7 @@ let rec isSeqBlockElementContinuator token = // ... // ), <------- NOTE RPAREN HERE // Shortcut.CtrlO) - | END | AND | WITH | THEN | RPAREN | RBRACE | RBRACK | BAR_RBRACK | RQUOTE _ -> true + | END | AND | WITH | THEN | RPAREN | RBRACE | BAR_RBRACE | RBRACK | BAR_RBRACK | RQUOTE _ -> true // The following arise during reprocessing of the inserted tokens when we hit a DONE | ORIGHT_BLOCK_END | OBLOCKEND | ODECLEND -> true @@ -370,7 +370,7 @@ let isAtomicExprEndToken token = | UINT8 _ | UINT16 _ | UINT32 _ | UINT64 _ | UNATIVEINT _ | DECIMAL _ | BIGNUM _ | STRING _ | BYTEARRAY _ | CHAR _ | IEEE32 _ | IEEE64 _ - | RPAREN | RBRACK | RBRACE | BAR_RBRACK | END + | RPAREN | RBRACK | RBRACE | BAR_RBRACE | BAR_RBRACK | END | NULL | FALSE | TRUE | UNDERSCORE -> true | _ -> false @@ -381,6 +381,7 @@ let parenTokensBalance t1 t2 = match t1,t2 with | (LPAREN,RPAREN) | (LBRACE,RBRACE) + | (LBRACE_BAR,BAR_RBRACE) | (LBRACK,RBRACK) | (INTERFACE,END) | (CLASS,END) @@ -749,8 +750,8 @@ type LexFilterImpl (lightSyntaxStatus:LightSyntaxStatus, compilingFsLib, lexer, // 'if ... else [' limited by 'if' // 'if ... else [|' limited by 'if' | _,(CtxtParen ((SIG | STRUCT | BEGIN),_) :: CtxtSeqBlock _ :: (CtxtModuleBody (_,false) as limitCtxt) :: _) - | _,(CtxtParen ((BEGIN | LPAREN | LBRACK | LBRACE | LBRACK_BAR) ,_) :: CtxtSeqBlock _ :: CtxtThen _ :: (CtxtIf _ as limitCtxt) :: _) - | _,(CtxtParen ((BEGIN | LPAREN | LBRACK | LBRACE | LBRACK_BAR) ,_) :: CtxtSeqBlock _ :: CtxtElse _ :: (CtxtIf _ as limitCtxt) :: _) + | _,(CtxtParen ((BEGIN | LPAREN | LBRACK | LBRACE | LBRACE_BAR | LBRACK_BAR) ,_) :: CtxtSeqBlock _ :: CtxtThen _ :: (CtxtIf _ as limitCtxt) :: _) + | _,(CtxtParen ((BEGIN | LPAREN | LBRACK | LBRACE | LBRACE_BAR | LBRACK_BAR | LBRACK_LESS) ,_) :: CtxtSeqBlock _ :: CtxtElse _ :: (CtxtIf _ as limitCtxt) :: _) // 'f ... (' in seqblock limited by 'f' // 'f ... {' in seqblock limited by 'f' NOTE: this is covered by the more generous case above @@ -914,10 +915,15 @@ type LexFilterImpl (lightSyntaxStatus:LightSyntaxStatus, compilingFsLib, lexer, // fx // fx // f x>x + // f<{| C : int |}>x // fx // fx | DEFAULT | COLON | COLON_GREATER | STRUCT | NULL | DELEGATE | AND | WHEN | DOT_DOT + | NEW + | LBRACE_BAR + | SEMICOLON + | BAR_RBRACE | INFIX_AT_HAT_OP "^" | INFIX_AT_HAT_OP "^-" | INFIX_STAR_DIV_MOD_OP "/" @@ -1163,6 +1169,7 @@ type LexFilterImpl (lightSyntaxStatus:LightSyntaxStatus, compilingFsLib, lexer, | RPAREN | GREATER true | RBRACE + | BAR_RBRACE | RBRACK | BAR_RBRACK | WITH @@ -1201,7 +1208,7 @@ type LexFilterImpl (lightSyntaxStatus:LightSyntaxStatus, compilingFsLib, lexer, while not offsideStack.IsEmpty && (not(nextOuterMostInterestingContextIsNamespaceOrModule(offsideStack))) && (match offsideStack.Head with // open-parens of sorts - | CtxtParen((LPAREN|LBRACK|LBRACE|LBRACK_BAR),_) -> true + | CtxtParen((LPAREN|LBRACK|LBRACE|LBRACE_BAR|LBRACK_BAR),_) -> true // seq blocks | CtxtSeqBlock _ -> true // vanillas @@ -1294,9 +1301,9 @@ type LexFilterImpl (lightSyntaxStatus:LightSyntaxStatus, compilingFsLib, lexer, hwTokenFetch(useBlockRule) // Balancing rule. Encountering a ')' or '}' balances with a '(' or '{', even if not offside - | ((END | RPAREN | RBRACE | RBRACK | BAR_RBRACK | RQUOTE _ | GREATER true) as t2), (CtxtParen (t1,_) :: _) + | ((END | RPAREN | RBRACE | BAR_RBRACE | RBRACK | BAR_RBRACK | RQUOTE _ | GREATER true) as t2), (CtxtParen (t1,_) :: _) when parenTokensBalance t1 t2 -> - if debug then dprintf "RPAREN/RBRACE/RBRACK/BAR_RBRACK/RQUOTE/END at %a terminates CtxtParen()\n" outputPos tokenStartPos + if debug then dprintf "RPAREN/RBRACE/BAR_RBRACE/RBRACK/BAR_RBRACK/RQUOTE/END at %a terminates CtxtParen()\n" outputPos tokenStartPos popCtxt() // Queue a dummy token at this position to check if any closing rules apply delayToken(tokenTup.UseLocation(ODUMMY(token))) @@ -1813,7 +1820,7 @@ type LexFilterImpl (lightSyntaxStatus:LightSyntaxStatus, compilingFsLib, lexer, returnToken tokenLexbufState token // '(' tokens are balanced with ')' tokens and also introduce a CtxtSeqBlock - | (BEGIN | LPAREN | SIG | LBRACE | LBRACK | LBRACK_BAR | LQUOTE _ | LESS true), _ -> + | (BEGIN | LPAREN | SIG | LBRACE | LBRACE_BAR | LBRACK | LBRACK_BAR | LQUOTE _ | LESS true), _ -> if debug then dprintf "LPAREN etc., pushes CtxtParen, pushing CtxtSeqBlock, tokenStartPos = %a\n" outputPos tokenStartPos pushCtxt tokenTup (CtxtParen (token,tokenStartPos)) pushCtxtSeqBlock(false,NoAddBlockEnd) @@ -1839,7 +1846,7 @@ type LexFilterImpl (lightSyntaxStatus:LightSyntaxStatus, compilingFsLib, lexer, // comprehension/match | (CtxtWhile _ | CtxtFor _ | CtxtWhen _ | CtxtMatchClauses _ | CtxtFun _) :: _ -> true // comprehension - | (CtxtSeqBlock _ :: CtxtParen ((LBRACK | LBRACE | LBRACK_BAR), _) :: _) -> true + | (CtxtSeqBlock _ :: CtxtParen ((LBRACK | LBRACE | LBRACE_BAR | LBRACK_BAR), _) :: _) -> true // comprehension | (CtxtSeqBlock _ :: (CtxtDo _ | CtxtWhile _ | CtxtFor _ | CtxtWhen _ | CtxtMatchClauses _ | CtxtTry _ | CtxtThen _ | CtxtElse _) :: _) -> true | _ -> false) -> diff --git a/src/fsharp/NameResolution.fs b/src/fsharp/NameResolution.fs index 2715b65e27d..a62d489cb1e 100644 --- a/src/fsharp/NameResolution.fs +++ b/src/fsharp/NameResolution.fs @@ -155,6 +155,9 @@ type Item = /// Represents the resolution of a name to an F# record field. | RecdField of RecdFieldInfo + /// Represents the resolution of a name to a field of an anonymous record type. + | AnonRecdField of AnonRecdTypeInfo * TTypes * int * range + // The following are never in the items table but are valid results of binding // an identifier in different circumstances. @@ -226,6 +229,7 @@ type Item = | Item.UnionCase(uinfo,_) -> DecompileOpName uinfo.UnionCase.DisplayName | Item.ExnCase tcref -> tcref.LogicalName | Item.RecdField rfinfo -> DecompileOpName rfinfo.RecdField.Name + | Item.AnonRecdField (anonInfo, _tys, i, _m) -> anonInfo.SortedNames.[i] | Item.NewDef id -> id.idText | Item.ILField finfo -> finfo.FieldName | Item.Event einfo -> einfo.EventName @@ -1389,6 +1393,8 @@ let ItemsAreEffectivelyEqual g orig other = | (Item.ArgName (id,_, _), ValUse vref) | (ValUse vref, Item.ArgName (id, _, _)) -> ((id.idRange = vref.DefinitionRange || id.idRange = vref.SigRange) && id.idText = vref.DisplayName) + | Item.AnonRecdField(anon1, _, i1, _), Item.AnonRecdField(anon2, _, i2, _) -> Tastops.anonInfoEquiv anon1 anon2 && i1 = i2 + | ILFieldUse f1, ILFieldUse f2 -> ILFieldInfo.ILFieldInfosUseIdenticalDefinitions f1 f2 @@ -1637,6 +1643,7 @@ let CheckAllTyparsInferrable amap m item = | Item.UnionCase _ | Item.ExnCase _ | Item.RecdField _ + | Item.AnonRecdField _ | Item.NewDef _ | Item.ILField _ | Item.Event _ @@ -2000,6 +2007,15 @@ let TryFindUnionCaseOfType g typ nm = else None +/// Try to find a union case of a type, with the given name +let TryFindAnonRecdFieldOfType g typ nm = + match tryDestAnonRecdTy g typ with + | Some (anonInfo, tys) -> + match anonInfo.SortedIds |> Array.tryFindIndex (fun x -> x.idText = nm) with + | Some i -> Some (Item.AnonRecdField(anonInfo, tys, i, anonInfo.SortedIds.[i].idRange)) + | None -> None + | None -> None + let CoreDisplayName(pinfo:PropInfo) = match pinfo with | FSProp(_,_,_,Some set) -> set.CoreDisplayName @@ -2060,7 +2076,18 @@ let rec ResolveLongIdentInTypePrim (ncenv:NameResolver) nenv lookupKind (resInfo | Some ucase -> OneResult (success(resInfo,Item.UnionCase(ucase,false),rest)) | None -> - let isLookUpExpr = lookupKind = LookupKind.Expr + + let anonRecdSearch = + match lookupKind with + | LookupKind.Expr -> TryFindAnonRecdFieldOfType g typ nm + | _ -> None + + match anonRecdSearch with + | Some item -> + OneResult (success(resInfo, item, rest)) + | None -> + + let isLookUpExpr = (lookupKind = LookupKind.Expr) match TryFindIntrinsicNamedItemOfType ncenv.InfoReader (nm,ad) findFlag m typ with | Some (PropertyItem psets) when isLookUpExpr -> let pinfos = psets |> ExcludeHiddenOfPropInfos g ncenv.amap m @@ -2073,6 +2100,7 @@ let rec ResolveLongIdentInTypePrim (ncenv:NameResolver) nenv lookupKind (resInfo match DecodeFSharpEvent (pinfos@extensionPropInfos) ad g ncenv m with | Some x -> success [resInfo, x, rest] | None -> raze (UndefinedName (depth,FSComp.SR.undefinedNameFieldConstructorOrMember, id,NoSuggestions)) + | Some(MethodItem msets) when isLookUpExpr -> let minfos = msets |> ExcludeHiddenOfMethInfos g ncenv.amap m @@ -2080,13 +2108,16 @@ let rec ResolveLongIdentInTypePrim (ncenv:NameResolver) nenv lookupKind (resInfo let extensionMethInfos = ExtensionMethInfosOfTypeInScope ncenv.InfoReader nenv optFilter m typ success [resInfo,Item.MakeMethGroup (nm,minfos@extensionMethInfos),rest] + | Some (ILFieldItem (finfo:: _)) when (match lookupKind with LookupKind.Expr | LookupKind.Pattern -> true | _ -> false) -> success [resInfo,Item.ILField finfo,rest] | Some (EventItem (einfo :: _)) when isLookUpExpr -> success [resInfo,Item.Event einfo,rest] + | Some (RecdFieldItem (rfinfo)) when (match lookupKind with LookupKind.Expr | LookupKind.RecdField | LookupKind.Pattern -> true | _ -> false) -> success [resInfo,Item.RecdField(rfinfo),rest] + | _ -> let pinfos = ExtensionPropInfosOfTypeInScope ncenv.InfoReader nenv (optFilter, ad) m typ @@ -3633,10 +3664,20 @@ let ResolveCompletionsInType (ncenv: NameResolver) nenv (completionTargets: Reso let nm = h.LogicalName partitionl t (NameMultiMap.add nm h acc) + let anonFields = + if statics then [] + else + match tryDestAnonRecdTy g typ with + | Some (anonInfo, tys) -> + [ for (i,id) in Array.indexed anonInfo.SortedIds do + yield Item.AnonRecdField(anonInfo, tys, i, id.idRange) ] + | _ -> [] + // Build the results ucinfos @ List.map Item.RecdField rfinfos @ pinfoItems @ + anonFields @ List.map Item.ILField finfos @ List.map Item.Event einfos @ List.map (ItemOfTy g) nestedTypes @ @@ -3674,6 +3715,12 @@ let rec ResolvePartialLongIdentInType (ncenv: NameResolver) nenv isApplicableMet |> List.filter (IsPropInfoAccessible g amap m ad) |> List.collect (fun pinfo -> (FullTypeOfPinfo pinfo) |> ResolvePartialLongIdentInType ncenv nenv isApplicableMeth m ad false rest)) @ + (if statics then [] + else + match TryFindAnonRecdFieldOfType g typ id with + | Some (Item.AnonRecdField(_anonInfo, tys, i, _)) -> ResolvePartialLongIdentInType ncenv nenv isApplicableMeth m ad false rest tys.[i] + | _ -> []) @ + // e.g. .. (ncenv.InfoReader.GetEventInfosOfType(Some id,ad,m,typ) |> List.collect (PropTypOfEventInfo ncenv.InfoReader m ad >> ResolvePartialLongIdentInType ncenv nenv isApplicableMeth m ad false rest)) @ @@ -4133,6 +4180,13 @@ let ResolveCompletionsInTypeForItem (ncenv: NameResolver) nenv m ad statics typ if statics then yield! typ |> GetNestedTypesOfType (ad, ncenv, None, TypeNameResolutionStaticArgsInfo.Indefinite, false, m) |> List.map (ItemOfTy g) | _ -> + if not statics then + match tryDestAnonRecdTy g typ with + | Some (anonInfo, tys) -> + for (i,id) in Array.indexed anonInfo.SortedIds do + yield Item.AnonRecdField(anonInfo, tys, i, id.idRange) + | _ -> () + let pinfosIncludingUnseen = AllPropInfosOfTypeInScope ncenv.InfoReader nenv (None,ad) PreferOverrides m typ |> List.filter (fun x -> @@ -4301,6 +4355,12 @@ let rec ResolvePartialLongIdentInTypeForItem (ncenv: NameResolver) nenv m ad sta for pinfo in pinfos do yield! (fullTypeOfPinfo pinfo) |> ResolvePartialLongIdentInTypeForItem ncenv nenv m ad false rest item + match TryFindAnonRecdFieldOfType g typ id with + | Some (Item.AnonRecdField(_anonInfo, tys, i, _)) -> + let tyinfo = tys.[i] + yield! ResolvePartialLongIdentInTypeForItem ncenv nenv m ad false rest item tyinfo + | _ -> () + // e.g. .. for einfo in ncenv.InfoReader.GetEventInfosOfType(Some id, ad, m, typ) do let tyinfo = PropTypOfEventInfo ncenv.InfoReader m ad einfo diff --git a/src/fsharp/NameResolution.fsi b/src/fsharp/NameResolution.fsi index 859009e3645..0b092954f50 100755 --- a/src/fsharp/NameResolution.fsi +++ b/src/fsharp/NameResolution.fsi @@ -64,6 +64,9 @@ type Item = /// Represents the resolution of a name to an F# record field. | RecdField of RecdFieldInfo + /// Represents the resolution of a name to a field of an anonymous record type. + | AnonRecdField of AnonRecdTypeInfo * TTypes * int * range + // The following are never in the items table but are valid results of binding // an identifier in different circumstances. @@ -169,6 +172,9 @@ type BulkAdd = Yes | No /// Lookup patterns in name resolution environment val internal TryFindPatternByName : string -> NameResolutionEnv -> Item option +/// Find a field in anonymous record type +val internal TryFindAnonRecdFieldOfType : TcGlobals -> TType -> string -> Item option + /// Add extra items to the environment for Visual Studio, e.g. static members val internal AddFakeNamedValRefToNameEnv : string -> NameResolutionEnv -> ValRef -> NameResolutionEnv diff --git a/src/fsharp/NicePrint.fs b/src/fsharp/NicePrint.fs index d3116650608..aa20fba4d05 100755 --- a/src/fsharp/NicePrint.fs +++ b/src/fsharp/NicePrint.fs @@ -33,6 +33,7 @@ module internal PrintUtilities = let squareAngleL x = LeftL.leftBracketAngle ^^ x ^^ RightL.rightBracketAngle let angleL x = sepL Literals.leftAngle ^^ x ^^ rightL Literals.rightAngle let braceL x = leftL Literals.leftBrace ^^ x ^^ rightL Literals.rightBrace + let braceBarL x = leftL Literals.leftBraceBar ^^ x ^^ rightL Literals.rightBraceBar let comment str = wordL (tagText (sprintf "(* %s *)" str)) @@ -921,6 +922,14 @@ module private PrintTypes = | TType_ucase (UCRef(tc,_),args) -> layoutTypeAppWithInfoAndPrec denv env (layoutTyconRef denv tc) prec tc.IsPrefixDisplay args + // Layout a tuple type + | TType_anon (anonInfo,tys) -> + let core = sepListL (wordL (tagPunctuation ";")) (List.map2 (fun nm ty -> wordL (tagField nm) ^^ wordL (tagPunctuation ":") ^^ layoutTypeWithInfoAndPrec denv env prec ty) (Array.toList anonInfo.SortedNames) tys) + if evalAnonInfoIsStruct anonInfo then + WordL.keywordStruct --- braceBarL core + else + braceBarL core + // Layout a tuple type | TType_tuple (tupInfo,t) -> if evalTupInfoIsStruct tupInfo then diff --git a/src/fsharp/Optimizer.fs b/src/fsharp/Optimizer.fs index 7ce763fede8..fe8052fc2b0 100644 --- a/src/fsharp/Optimizer.fs +++ b/src/fsharp/Optimizer.fs @@ -156,17 +156,20 @@ let braceL x = leftL (tagText "{") ^^ x ^^ rightL (tagText "}") let seqL xL xs = Seq.fold (fun z x -> z @@ xL x) emptyL xs let namemapL xL xmap = NameMap.foldBack (fun nm x z -> xL nm x @@ z) xmap emptyL -let rec exprValueInfoL g = function - | ConstValue (x, ty) -> NicePrint.layoutConst g ty x - | UnknownValue -> wordL (tagText "?") - | SizeValue (_, vinfo) -> exprValueInfoL g vinfo - | ValValue (vr, vinfo) -> bracketL ((valRefL vr ^^ wordL (tagText "alias")) --- exprValueInfoL g vinfo) - | TupleValue vinfos -> bracketL (exprValueInfosL g vinfos) - | RecdValue (_, vinfos) -> braceL (exprValueInfosL g vinfos) - | UnionCaseValue (ucr, vinfos) -> unionCaseRefL ucr ^^ bracketL (exprValueInfosL g vinfos) - | CurriedLambdaValue(_lambdaId, _arities, _bsize, expr', _ety) -> wordL (tagText "lam") ++ exprL expr' (* (sprintf "lam(size=%d)" bsize) *) - | ConstExprValue (_size, x) -> exprL x +let rec exprValueInfoL g exprVal = + match exprVal with + | ConstValue (x, ty) -> NicePrint.layoutConst g ty x + | UnknownValue -> wordL (tagText "?") + | SizeValue (_, vinfo) -> exprValueInfoL g vinfo + | ValValue (vr, vinfo) -> bracketL ((valRefL vr ^^ wordL (tagText "alias")) --- exprValueInfoL g vinfo) + | TupleValue vinfos -> bracketL (exprValueInfosL g vinfos) + | RecdValue (_, vinfos) -> braceL (exprValueInfosL g vinfos) + | UnionCaseValue (ucr, vinfos) -> unionCaseRefL ucr ^^ bracketL (exprValueInfosL g vinfos) + | CurriedLambdaValue(_lambdaId, _arities, _bsize, expr', _ety) -> wordL (tagText "lam") ++ exprL expr' (* (sprintf "lam(size=%d)" bsize) *) + | ConstExprValue (_size, x) -> exprL x + and exprValueInfosL g vinfos = commaListL (List.map (exprValueInfoL g) (Array.toList vinfos)) + and moduleInfoL g (x:LazyModuleInfo) = let x = x.Force() braceL ((wordL (tagText "Modules: ") @@ (x.ModuleOrNamespaceInfos |> namemapL (fun nm x -> wordL (tagText nm) ^^ moduleInfoL g x) ) ) @@ -1258,6 +1261,7 @@ and BindingHasEffect g bind = bind.Expr |> ExprHasEffect g and OpHasEffect g op = match op with | TOp.Tuple _ -> false + | TOp.AnonRecd _ -> false | TOp.Recd (ctor, tcref) -> match ctor with | RecdExprIsObjInit -> true @@ -1272,6 +1276,7 @@ and OpHasEffect g op = | TOp.TupleFieldGet(_) -> false | TOp.ExnFieldGet(ecref, n) -> isExnFieldMutable ecref n | TOp.RefAddrGet -> false + | TOp.AnonRecdGet _ -> true (* conservative *) | TOp.ValFieldGet rfref -> rfref.RecdField.IsMutable || (TryFindTyconRefBoolAttribute g Range.range0 g.attrib_AllowNullLiteralAttribute rfref.TyconRef = Some(true)) | TOp.ValFieldGetAddr rfref -> rfref.RecdField.IsMutable (* data is immutable, so taking address is ok *) | TOp.UnionCaseFieldGetAddr _ -> false (* data is immutable, so taking address is ok *) @@ -1857,7 +1862,12 @@ and OptimizeExprOpFallback cenv env (op, tyargs, args', m) arginfos valu = | TOp.Tuple tupInfo -> let isStruct = evalTupInfoIsStruct tupInfo if isStruct then 0, valu - else 1, MakeValueInfoForTuple (Array.ofList argValues) + else 1,MakeValueInfoForTuple (Array.ofList argValues) + | TOp.AnonRecd anonInfo -> + let isStruct = evalAnonInfoIsStruct anonInfo + if isStruct then 0, valu + else 1, valu + | TOp.AnonRecdGet _ | TOp.ValFieldGet _ | TOp.TupleFieldGet _ | TOp.UnionCaseFieldGet _ @@ -3154,7 +3164,7 @@ and OptimizeModuleDefs cenv (env, bindInfosColl) defs = let defs, minfos = List.unzip defs (defs, UnionOptimizationInfos minfos), (env, bindInfosColl) -and OptimizeImplFileInternal cenv env isIncrementalFragment hidden (TImplFile(qname, pragmas, (ModuleOrNamespaceExprWithSig(mty, _, _) as mexpr), hasExplicitEntryPoint, isScript)) = +and OptimizeImplFileInternal cenv env isIncrementalFragment hidden (TImplFile(qname, pragmas, (ModuleOrNamespaceExprWithSig(mty, _, _) as mexpr), hasExplicitEntryPoint, isScript, anonRecdTypes)) = let env, mexpr', minfo = match mexpr with // FSI: FSI compiles everything as if you're typing incrementally into one module @@ -3173,7 +3183,7 @@ and OptimizeImplFileInternal cenv env isIncrementalFragment hidden (TImplFile(qn let hidden = ComputeHidingInfoAtAssemblyBoundary mty hidden let minfo = AbstractLazyModulInfoByHiding true hidden minfo - env, TImplFile(qname, pragmas, mexpr', hasExplicitEntryPoint, isScript), minfo, hidden + env, TImplFile(qname, pragmas, mexpr', hasExplicitEntryPoint, isScript, anonRecdTypes), minfo, hidden //------------------------------------------------------------------------- // Entry point diff --git a/src/fsharp/PostInferenceChecks.fs b/src/fsharp/PostInferenceChecks.fs index c22fb3f4098..e741dc20eca 100644 --- a/src/fsharp/PostInferenceChecks.fs +++ b/src/fsharp/PostInferenceChecks.fs @@ -163,6 +163,7 @@ let SetArgVals env (vs: Val list) = type cenv = { boundVals: Dictionary // really a hash set mutable potentialUnboundUsesOfVals: StampMap + mutable anonRecdTypes: StampMap g: TcGlobals amap: Import.ImportMap /// For reading metadata @@ -200,7 +201,7 @@ let BindVals cenv env vs = List.iter (BindVal cenv env) vs // approx walk of type //-------------------------------------------------------------------------- -let rec CheckTypeDeep ((visitTyp,visitTyconRefOpt,visitAppTyOpt,visitTraitSolutionOpt, visitTyparOpt) as f) g env typ = +let rec CheckTypeDeep (cenv: cenv) ((visitTyp,visitTyconRefOpt,visitAppTyOpt,visitTraitSolutionOpt, visitTyparOpt) as f) g env typ = // We iterate the _solved_ constraints as well, to pick up any record of trait constraint solutions // This means we walk _all_ the constraints _everywhere_ in a type, including // those attached to _solved_ type variables. This is used by PostTypeCheckSemanticChecks to detect uses of @@ -225,22 +226,27 @@ let rec CheckTypeDeep ((visitTyp,visitTyconRefOpt,visitAppTyOpt,visitTraitSoluti match typ with | TType_forall (tps,body) -> let env = BindTypars g env tps - CheckTypeDeep f g env body - tps |> List.iter (fun tp -> tp.Constraints |> List.iter (CheckTypeConstraintDeep f g env)) + CheckTypeDeep cenv f g env body + tps |> List.iter (fun tp -> tp.Constraints |> List.iter (CheckTypeConstraintDeep cenv f g env)) | TType_measure _ -> () | TType_app (tcref,tinst) -> match visitTyconRefOpt with | Some visitTyconRef -> visitTyconRef tcref | None -> () - CheckTypesDeep f g env tinst + CheckTypesDeep cenv f g env tinst match visitAppTyOpt with | Some visitAppTy -> visitAppTy (tcref, tinst) | None -> () - - | TType_ucase (_,tinst) -> CheckTypesDeep f g env tinst - | TType_tuple (_,typs) -> CheckTypesDeep f g env typs - | TType_fun (s,t) -> CheckTypeDeep f g env s; CheckTypeDeep f g env t + | TType_anon (anonInfo,typs) -> + if not (cenv.anonRecdTypes.ContainsKey anonInfo.Stamp) then + cenv.anonRecdTypes <- cenv.anonRecdTypes.Add(anonInfo.Stamp, anonInfo) + CheckTypesDeep cenv f g env typs + + | TType_ucase (_,typs) + | TType_anon (_,typs) + | TType_tuple (_,typs) -> CheckTypesDeep cenv f g env typs + | TType_fun (s,t) -> CheckTypeDeep cenv f g env s; CheckTypeDeep cenv f g env t | TType_var tp -> if not tp.IsSolved then match visitTyparOpt with @@ -248,16 +254,16 @@ let rec CheckTypeDeep ((visitTyp,visitTyconRefOpt,visitAppTyOpt,visitTraitSoluti | Some visitTypar -> visitTypar (env,tp) -and CheckTypesDeep f g env tys = List.iter (CheckTypeDeep f g env) tys +and CheckTypesDeep cenv f g env tys = List.iter (CheckTypeDeep cenv f g env) tys -and CheckTypeConstraintDeep f g env x = +and CheckTypeConstraintDeep cenv f g env x = match x with - | TyparConstraint.CoercesTo(ty,_) -> CheckTypeDeep f g env ty - | TyparConstraint.MayResolveMember(traitInfo,_) -> CheckTraitInfoDeep f g env traitInfo - | TyparConstraint.DefaultsTo(_,ty,_) -> CheckTypeDeep f g env ty - | TyparConstraint.SimpleChoice(tys,_) -> CheckTypesDeep f g env tys - | TyparConstraint.IsEnum(uty,_) -> CheckTypeDeep f g env uty - | TyparConstraint.IsDelegate(aty,bty,_) -> CheckTypeDeep f g env aty; CheckTypeDeep f g env bty + | TyparConstraint.CoercesTo(ty,_) -> CheckTypeDeep cenv f g env ty + | TyparConstraint.MayResolveMember(traitInfo,_) -> CheckTraitInfoDeep cenv f g env traitInfo + | TyparConstraint.DefaultsTo(_,ty,_) -> CheckTypeDeep cenv f g env ty + | TyparConstraint.SimpleChoice(tys,_) -> CheckTypesDeep cenv f g env tys + | TyparConstraint.IsEnum(uty,_) -> CheckTypeDeep cenv f g env uty + | TyparConstraint.IsDelegate(aty,bty,_) -> CheckTypeDeep cenv f g env aty; CheckTypeDeep cenv f g env bty | TyparConstraint.SupportsComparison _ | TyparConstraint.SupportsEquality _ | TyparConstraint.SupportsNull _ @@ -265,10 +271,10 @@ and CheckTypeConstraintDeep f g env x = | TyparConstraint.IsUnmanaged _ | TyparConstraint.IsReferenceType _ | TyparConstraint.RequiresDefaultConstructor _ -> () -and CheckTraitInfoDeep ((_,_,_,visitTraitSolutionOpt,_) as f) g env (TTrait(typs,_,_,argtys,rty,soln)) = - CheckTypesDeep f g env typs - CheckTypesDeep f g env argtys - Option.iter (CheckTypeDeep f g env) rty +and CheckTraitInfoDeep cenv ((_,_,_,visitTraitSolutionOpt,_) as f) g env (TTrait(typs,_,_,argtys,rty,soln)) = + CheckTypesDeep cenv f g env typs + CheckTypesDeep cenv f g env argtys + Option.iter (CheckTypeDeep cenv f g env) rty match visitTraitSolutionOpt, !soln with | Some visitTraitSolution, Some sln -> visitTraitSolution sln | _ -> () @@ -278,7 +284,7 @@ and CheckTraitInfoDeep ((_,_,_,visitTraitSolutionOpt,_) as f) g env (TTrait(typs //-------------------------------------------------------------------------- let CheckForByrefLikeType cenv env typ check = - CheckTypeDeep (ignore, Some (fun tcref -> if isByrefLikeTyconRef cenv.g tcref then check()), None, None, None) cenv.g env typ + CheckTypeDeep cenv (ignore, Some (fun tcref -> if isByrefLikeTyconRef cenv.g tcref then check()), None, None, None) cenv.g env typ //-------------------------------------------------------------------------- @@ -353,7 +359,7 @@ let CheckTypeForAccess (cenv:cenv) env objName valAcc m ty = if isLessAccessible tyconAcc valAcc then errorR(Error(FSComp.SR.chkTypeLessAccessibleThanType(tcref.DisplayName, (objName())), m)) - CheckTypeDeep (visitType, None, None, None, None) cenv.g env ty + CheckTypeDeep cenv (visitType, None, None, None, None) cenv.g env ty let WarnOnWrongTypeForAccess (cenv:cenv) env objName valAcc m ty = if cenv.reportErrors then @@ -371,7 +377,7 @@ let WarnOnWrongTypeForAccess (cenv:cenv) env objName valAcc m ty = let warningText = errorText + System.Environment.NewLine + FSComp.SR.tcTypeAbbreviationsCheckedAtCompileTime() warning(AttributeChecking.ObsoleteWarning(warningText, m)) - CheckTypeDeep (visitType, None, None, None, None) cenv.g env ty + CheckTypeDeep cenv (visitType, None, None, None, None) cenv.g env ty //-------------------------------------------------------------------------- // check type instantiations @@ -402,7 +408,7 @@ let CheckType permitByrefs (cenv:cenv) env m ty = | Some tcref -> if isByrefLikeTyconRef cenv.g tcref then errorR(Error(FSComp.SR.chkNoByrefsOfByrefs(NicePrint.minimalStringOfType cenv.denv ty), m)) - CheckTypesDeep (visitType, None, None, None, None) cenv.g env tinst + CheckTypesDeep cenv (visitType, None, None, None, None) cenv.g env tinst let visitTraitSolution info = match info with @@ -413,7 +419,7 @@ let CheckType permitByrefs (cenv:cenv) env m ty = cenv.potentialUnboundUsesOfVals <- cenv.potentialUnboundUsesOfVals.Add(vref.Stamp,m) | _ -> () - CheckTypeDeep (ignore, Some visitTyconRef, Some visitAppTy, Some visitTraitSolution, Some visitTypar) cenv.g env ty + CheckTypeDeep cenv (ignore, Some visitTyconRef, Some visitAppTy, Some visitTraitSolution, Some visitTypar) cenv.g env ty /// Check types occurring in TAST (like CheckType) and additionally reject any byrefs. @@ -801,6 +807,7 @@ and CheckExprOp cenv env (op,tyargs,args,m) context expr = // Address-of operator generates byref, and context permits this. CheckExprsNoByrefs cenv env args + | TOp.AnonRecdGet _,_,[arg1] | TOp.TupleFieldGet _,_,[arg1] -> CheckTypeInstNoByrefs cenv env m tyargs CheckExprsPermitByrefs cenv env [arg1] (* Compiled pattern matches on immutable value structs come through here. *) @@ -1703,6 +1710,7 @@ let CheckTopImpl (g,amap,reportErrors,infoReader,internalsVisibleToPaths,viewCcu reportErrors=reportErrors boundVals= new Dictionary<_,_>(100, HashIdentity.Structural) potentialUnboundUsesOfVals=Map.empty + anonRecdTypes = StampMap.Empty usesQuotations=false infoReader=infoReader internalsVisibleToPaths=internalsVisibleToPaths @@ -1737,4 +1745,4 @@ let CheckTopImpl (g,amap,reportErrors,infoReader,internalsVisibleToPaths,viewCcu CheckAttribs cenv env extraAttribs if cenv.usesQuotations && QuotationTranslator.QuotationGenerationScope.ComputeQuotationFormat(cenv.g) = QuotationTranslator.QuotationSerializationFormat.FSharp_20_Plus then viewCcu.UsesFSharp20PlusQuotations <- true - cenv.entryPointGiven + cenv.entryPointGiven, cenv.anonRecdTypes diff --git a/src/fsharp/PostInferenceChecks.fsi b/src/fsharp/PostInferenceChecks.fsi index d918df258ac..bbb24c44abf 100644 --- a/src/fsharp/PostInferenceChecks.fsi +++ b/src/fsharp/PostInferenceChecks.fsi @@ -11,4 +11,6 @@ open Microsoft.FSharp.Compiler.Tastops open Microsoft.FSharp.Compiler.TcGlobals val testFlagMemberBody : bool ref -val CheckTopImpl : TcGlobals * ImportMap * bool * InfoReader * CompilationPath list * CcuThunk * DisplayEnv * ModuleOrNamespaceExprWithSig * Attribs * (bool * bool) -> bool + +/// Perform the checks on the TAST for a file after type inference is complete. +val CheckTopImpl : TcGlobals * ImportMap * bool * InfoReader * CompilationPath list * CcuThunk * DisplayEnv * ModuleOrNamespaceExprWithSig * Attribs * (bool * bool) -> bool * StampMap diff --git a/src/fsharp/QuotationTranslator.fs b/src/fsharp/QuotationTranslator.fs index 7216a700158..da1b9813adf 100644 --- a/src/fsharp/QuotationTranslator.fs +++ b/src/fsharp/QuotationTranslator.fs @@ -425,6 +425,20 @@ and private ConvExprCore cenv (env : QuotationTranslationEnv) (expr: Expr) : QP. let argsR = ConvExprs cenv env args QP.mkRecdMk(rgtypR,tyargsR,argsR) + | TOp.AnonRecd anonInfo, _, _ -> + let tref = anonInfo.ILTypeRef + let rgtypR = ConvILTypeRef cenv tref + let tyargsR = ConvTypes cenv env m tyargs + let argsR = ConvExprs cenv env args + QP.mkRecdMk(rgtypR,tyargsR,argsR) + + | TOp.AnonRecdGet (anonInfo, n), _, _ -> + let tref = anonInfo.ILTypeRef + let rgtypR = ConvILTypeRef cenv tref + let tyargsR = ConvTypes cenv env m tyargs + let argsR = ConvExprs cenv env args + QP.mkRecdGet((rgtypR,anonInfo.SortedNames.[n]),tyargsR,argsR) + | TOp.UnionCaseFieldGet (ucref,n),tyargs,[e] -> ConvUnionFieldGet cenv env m ucref n tyargs e @@ -808,6 +822,10 @@ and ConvType cenv env m typ = | TType_fun(a,b) -> QP.mkFunTy(ConvType cenv env m a,ConvType cenv env m b) | TType_tuple(tupInfo,l) -> ConvType cenv env m (mkCompiledTupleTy cenv.g (evalTupInfoIsStruct tupInfo) l) + | TType_anon(anonInfo,tinst) -> + let tref = anonInfo.ILTypeRef + let tinstR = ConvTypes cenv env m tinst + QP.mkILNamedTy(ConvILTypeRefUnadjusted cenv m tref, tinstR) | TType_var(tp) -> QP.mkVarTy(ConvTyparRef cenv env m tp) | TType_forall(_spec,_ty) -> wfail(Error(FSComp.SR.crefNoInnerGenericsInQuotations(),m)) | _ -> wfail(Error (FSComp.SR.crefQuotationsCantContainThisType(),m)) diff --git a/src/fsharp/TastOps.fs b/src/fsharp/TastOps.fs index a5f59868f54..c69527bdbb6 100644 --- a/src/fsharp/TastOps.fs +++ b/src/fsharp/TastOps.fs @@ -177,6 +177,12 @@ let rec remapTypeAux (tyenv : Remap) (ty:TType) = | Some tcr' -> TType_ucase (UCRef(tcr', n), remapTypesAux tyenv tinst) | None -> TType_ucase (UCRef(tcr, n), remapTypesAux tyenv tinst) + | TType_anon (anonInfo, l) as ty -> + let tupInfo' = remapTupInfoAux tyenv anonInfo.TupInfo + let l' = remapTypesAux tyenv l + if anonInfo.TupInfo === tupInfo' && l === l' then ty else + TType_anon (AnonRecdTypeInfo.Create(anonInfo.Assembly, tupInfo', anonInfo.SortedIds), l') + | TType_tuple (tupInfo, l) as ty -> let tupInfo' = remapTupInfoAux tyenv tupInfo let l' = remapTypesAux tyenv l @@ -258,6 +264,8 @@ and remapTraitAux tyenv (TTrait(typs, nm, mf, argtys, rty, slnCell)) = FSMethSln(remapTypeAux tyenv typ, remapValRef tyenv vref, remapTypesAux tyenv minst) | FSRecdFieldSln(tinst, rfref, isSet) -> FSRecdFieldSln(remapTypesAux tyenv tinst, remapRecdFieldRef tyenv.tyconRefRemap rfref, isSet) + | FSAnonRecdFieldSln(anonInfo, tinst, n) -> + FSAnonRecdFieldSln(anonInfo, remapTypesAux tyenv tinst, n) | BuiltInSln -> BuiltInSln | ClosedExprSln e -> @@ -682,6 +690,9 @@ let evalTupInfoIsStruct aexpr = match aexpr with | TupInfo.Const b -> b +let evalAnonInfoIsStruct (anonInfo: AnonRecdTypeInfo) = + evalTupInfoIsStruct anonInfo.TupInfo + /// This erases outermost occurrences of inference equations, type abbreviations, non-generated provided types /// and measureable types (float<_>). /// It also optionally erases all "compilation representations", i.e. function and @@ -732,6 +743,8 @@ let isForallTy g ty = ty |> stripTyEqns g |> (function TType_forall _ -> tru let isAnyTupleTy g ty = ty |> stripTyEqns g |> (function TType_tuple _ -> true | _ -> false) let isRefTupleTy g ty = ty |> stripTyEqns g |> (function TType_tuple (tupInfo, _) -> not (evalTupInfoIsStruct tupInfo) | _ -> false) let isStructTupleTy g ty = ty |> stripTyEqns g |> (function TType_tuple (tupInfo, _) -> evalTupInfoIsStruct tupInfo | _ -> false) +let isAnonRecdTy g ty = ty |> stripTyEqns g |> (function TType_anon _ -> true | _ -> false) +let isStructAnonRecdTy g ty = ty |> stripTyEqns g |> (function TType_anon (anonInfo, _) -> evalAnonInfoIsStruct anonInfo | _ -> false) let isUnionTy g ty = ty |> stripTyEqns g |> (function TType_app(tcr, _) -> tcr.IsUnionTycon | _ -> false) let isReprHiddenTy g ty = ty |> stripTyEqns g |> (function TType_app(tcr, _) -> tcr.IsHiddenReprTycon | _ -> false) let isFSharpObjModelTy g ty = ty |> stripTyEqns g |> (function TType_app(tcr, _) -> tcr.IsFSharpObjectModelTycon | _ -> false) @@ -754,6 +767,7 @@ let argsOfAppTy g ty = ty |> stripTyEqns g |> (function TType_app(_, tinst) -> let tryDestTyparTy g ty = ty |> stripTyEqns g |> (function TType_var v -> Some v | _ -> None) let tryDestFunTy g ty = ty |> stripTyEqns g |> (function TType_fun (tyv, tau) -> Some(tyv, tau) | _ -> None) let tryDestAppTy g ty = ty |> stripTyEqns g |> (function TType_app(tcref, _) -> Some tcref | _ -> None) +let tryDestAnonRecdTy g ty = ty |> stripTyEqns g |> (function TType_anon (anonInfo, tys) -> Some (anonInfo, tys) | _ -> None) let tryAnyParTy g ty = ty |> stripTyEqns g |> (function TType_var v -> Some v | TType_measure unt when isUnitParMeasure g unt -> Some(destUnitParMeasure g unt) | _ -> None) let (|AppTy|_|) g ty = ty |> stripTyEqns g |> (function TType_app(tcref, tinst) -> Some (tcref, tinst) | _ -> None) let (|RefTupleTy|_|) g ty = ty |> stripTyEqns g |> (function TType_tuple(tupInfo, tys) when not (evalTupInfoIsStruct tupInfo) -> Some tys | _ -> None) @@ -907,6 +921,9 @@ and typeAEquivAux erasureFlag g aenv ty1 ty2 = typesAEquivAux erasureFlag g aenv b1 b2 | TType_tuple (s1, l1), TType_tuple (s2, l2) -> structnessAEquiv s1 s2 && typesAEquivAux erasureFlag g aenv l1 l2 + | TType_anon (anonInfo1, l1), TType_anon (anonInfo2, l2) -> + anonInfoEquiv anonInfo1 anonInfo2 && + typesAEquivAux erasureFlag g aenv l1 l2 | TType_fun (dtys1, rty1), TType_fun (dtys2, rty2) -> typeAEquivAux erasureFlag g aenv dtys1 dtys2 && typeAEquivAux erasureFlag g aenv rty1 rty2 | TType_measure m1, TType_measure m2 -> @@ -915,6 +932,12 @@ and typeAEquivAux erasureFlag g aenv ty1 ty2 = | _ -> true | _ -> false + +and anonInfoEquiv (anonInfo1: AnonRecdTypeInfo) (anonInfo2: AnonRecdTypeInfo) = + ccuEq anonInfo1.Assembly anonInfo2.Assembly && + structnessAEquiv anonInfo1.TupInfo anonInfo2.TupInfo && + anonInfo1.SortedNames = anonInfo2.SortedNames + and structnessAEquiv un1 un2 = match un1, un2 with | TupInfo.Const b1, TupInfo.Const b2 -> (b1 = b2) @@ -961,7 +984,7 @@ let rec getErasedTypes g ty = getErasedTypes g rty | TType_var tp -> if tp.IsErased then [ty] else [] - | TType_app (_, b) | TType_ucase(_, b) | TType_tuple (_, b) -> + | TType_app (_, b) | TType_ucase(_, b) | TType_anon (_, b) | TType_tuple (_, b) -> List.foldBack (fun ty tys -> getErasedTypes g ty @ tys) b [] | TType_fun (dty, rty) -> getErasedTypes g dty @ getErasedTypes g rty @@ -1220,6 +1243,7 @@ let mkAsmExpr(code, tinst, args, rettys, m) = Expr.Op (TOp.ILAsm let mkUnionCaseExpr(uc, tinst, args, m) = Expr.Op (TOp.UnionCase uc, tinst, args, m) let mkExnExpr(uc, args, m) = Expr.Op (TOp.ExnConstr uc, [], args, m) let mkTupleFieldGetViaExprAddr(tupInfo, e, tinst, i, m) = Expr.Op (TOp.TupleFieldGet(tupInfo, i), tinst, [e], m) +let mkAnonRecdFieldGetViaExprAddr(anonInfo, e, tinst, i, m) = Expr.Op (TOp.AnonRecdGet(anonInfo, i), tinst, [e], m) let mkRecdFieldGetViaExprAddr(e, fref, tinst, m) = Expr.Op (TOp.ValFieldGet(fref), tinst, [e], m) let mkRecdFieldGetAddrViaExprAddr(e, fref, tinst, m) = Expr.Op (TOp.ValFieldGetAddr(fref), tinst, [e], m) @@ -1660,7 +1684,7 @@ let isStructTy g ty = | Some tcref -> let tycon = tcref.Deref tycon.IsStructRecordOrUnionTycon || tycon.IsStructOrEnumTycon - | _ -> false + | _ -> isStructAnonRecdTy g ty let isRefTy g ty = not (isStructOrEnumTyconTy g ty) && @@ -1938,6 +1962,8 @@ and accFreeInTraitSln opts sln acc = accFreeInType opts typ (accFreeValRefInTraitSln opts vref (accFreeInTypes opts minst acc)) + | FSAnonRecdFieldSln(_anonInfo, tinst, _n) -> + accFreeInTypes opts tinst acc | FSRecdFieldSln(tinst, _rfref, _isSet) -> accFreeInTypes opts tinst acc | BuiltInSln -> acc @@ -1964,6 +1990,7 @@ and accFreeTyparRef opts (tp:Typar) acc = and accFreeInType opts ty acc = match stripTyparEqns ty with | TType_tuple (tupInfo, l) -> accFreeInTypes opts l (accFreeInTupInfo opts tupInfo acc) + | TType_anon (anonInfo, l) -> accFreeInTypes opts l (accFreeInTupInfo opts anonInfo.TupInfo acc) | TType_app (tc, tinst) -> let acc = accFreeTycon opts tc acc match tinst with @@ -2047,6 +2074,9 @@ and accFreeTyparRefLeftToRight g cxFlag thruFlag acc (tp:Typar) = and accFreeInTypeLeftToRight g cxFlag thruFlag acc ty = if verbose then dprintf "--> accFreeInTypeLeftToRight \n" match (if thruFlag then stripTyEqns g ty else stripTyparEqns ty) with + | TType_anon (anonInfo, l) -> + let acc = accFreeInTupInfoLeftToRight g cxFlag thruFlag acc anonInfo.TupInfo + accFreeInTypesLeftToRight g cxFlag thruFlag acc l | TType_tuple (tupInfo, l) -> let acc = accFreeInTupInfoLeftToRight g cxFlag thruFlag acc tupInfo accFreeInTypesLeftToRight g cxFlag thruFlag acc l @@ -2439,8 +2469,9 @@ module SimplifyTypes = let z = f z typ match typ with | TType_forall (_, body) -> foldTypeButNotConstraints f z body - | TType_app (_, tinst) -> List.fold (foldTypeButNotConstraints f) z tinst - | TType_ucase (_, tinst) -> List.fold (foldTypeButNotConstraints f) z tinst + | TType_app (_, typs) + | TType_ucase (_, typs) + | TType_anon (_, typs) | TType_tuple (_, typs) -> List.fold (foldTypeButNotConstraints f) z typs | TType_fun (s, t) -> foldTypeButNotConstraints f (foldTypeButNotConstraints f z s) t | TType_var _ -> z @@ -3032,6 +3063,7 @@ module DebugPrint = begin let squareAngleL x = LeftL.leftBracketAngle ^^ x ^^ RightL.rightBracketAngle let angleL x = sepL Literals.leftAngle ^^ x ^^ rightL Literals.rightAngle let braceL x = leftL Literals.leftBrace ^^ x ^^ rightL Literals.rightBrace + let braceBarL x = leftL Literals.leftBraceBar ^^ x ^^ rightL Literals.rightBraceBar let boolL = function true -> WordL.keywordTrue | false -> WordL.keywordFalse let intL (n:int) = wordL (tagNumericLiteral (string n )) @@ -3093,6 +3125,7 @@ module DebugPrint = begin let prefix = tcref.IsPrefixDisplay let tcL = layoutTyconRef tcref auxTyparsL env tcL prefix tinst + | TType_anon (anonInfo, typs) -> braceBarL (sepListL (wordL (tagText ";")) (List.map2 (fun nm ty -> wordL (tagField nm) --- auxTypeAtomL env ty) (Array.toList anonInfo.SortedNames) typs)) | TType_tuple (_tupInfo, typs) -> sepListL (wordL (tagText "*")) (List.map (auxTypeAtomL env) typs) |> wrap | TType_fun (f, x) -> ((auxTypeAtomL env f ^^ wordL (tagText "->")) --- auxTypeL env x) |> wrap | TType_var typar -> auxTyparWrapL env isAtomic typar @@ -3598,8 +3631,8 @@ module DebugPrint = begin let z = z --- sepL(tagText "`") --- (spaceListL (List.map atomL args)) z - and implFileL (TImplFile(_, _, e, _, _)) = - aboveListL [(wordL(tagText "top implementation ")) @@-- mexprL e] + and implFileL (TImplFile(_, _, mexpr, _, _, _)) = + aboveListL [(wordL(tagText "top implementation ")) @@-- mexprL mexpr] and mexprL x = match x with @@ -3690,7 +3723,7 @@ let wrapModuleOrNamespaceExprInNamespace (id :Ident) cpath mexpr = TMDefRec (false, [], [ModuleOrNamespaceBinding.Module(mspec, mexpr)], id.idRange) // cleanup: make this a property -let SigTypeOfImplFile (TImplFile(_, _, mexpr, _, _)) = mexpr.Type +let SigTypeOfImplFile (TImplFile(_, _, mexpr, _, _, _)) = mexpr.Type //-------------------------------------------------------------------------- // Data structures representing what gets hidden and what gets remapped (i.e. renamed or alpha-converted) @@ -4292,7 +4325,9 @@ and accFreeInOp opts op acc = | TOp.Goto _ | TOp.Label _ | TOp.Return | TOp.TupleFieldGet _ -> acc - | TOp.Tuple tupInfo -> accFreeTyvars opts accFreeInTupInfo tupInfo acc + | TOp.Tuple tupInfo -> accFreeTyvars opts accFreeInTupInfo tupInfo acc + | TOp.AnonRecd anonInfo + | TOp.AnonRecdGet (anonInfo, _) -> accFreeTyvars opts accFreeInTupInfo anonInfo.TupInfo acc | TOp.UnionCaseTagGet tr -> accUsedRecdOrUnionTyconRepr opts tr.Deref acc @@ -5261,6 +5296,9 @@ let mkAnyTupledTy (g:TcGlobals) tupInfo tys = | [h] -> h | _ -> TType_tuple(tupInfo, tys) +let mkAnyAnonRecdTy (_g:TcGlobals) anonInfo tys = + TType_anon(anonInfo, tys) + let mkRefTupledTy g tys = mkAnyTupledTy g tupInfoRef tys let mkRefTupledVarsTy g vs = mkRefTupledTy g (typesOfVals vs) @@ -5299,8 +5337,10 @@ let rec tyOfExpr g e = | TOp.ExnConstr _ -> g.exn_ty | TOp.Bytes _ -> mkByteArrayTy g | TOp.UInt16s _ -> mkArrayType g g.uint16_ty + | TOp.AnonRecdGet(_, i) -> List.item i tinst | TOp.TupleFieldGet(_, i) -> List.item i tinst | TOp.Tuple tupInfo -> mkAnyTupledTy g tupInfo tinst + | TOp.AnonRecd anonInfo -> mkAnyAnonRecdTy g anonInfo tinst | (TOp.For _ | TOp.While _) -> g.unit_ty | TOp.Array -> (match tinst with [ty] -> mkArrayType g ty | _ -> failwith "bad TOp.Array node") | (TOp.TryCatch _ | TOp.TryFinally _) -> (match tinst with [ty] -> ty | _ -> failwith "bad TOp_try node") @@ -5694,6 +5734,10 @@ let mkTupleFieldGet g (tupInfo, e, tinst, i, m) = let wrap, e' = mkExprAddrOfExpr g (evalTupInfoIsStruct tupInfo) false NeverMutates e None m wrap (mkTupleFieldGetViaExprAddr(tupInfo, e', tinst, i, m)) +let mkAnonRecdFieldGet g (anonInfo:AnonRecdTypeInfo, e, tinst, i, m) = + let wrap,e' = mkExprAddrOfExpr g (evalAnonInfoIsStruct anonInfo) false NeverMutates e None m + wrap (mkAnonRecdFieldGetViaExprAddr(anonInfo, e', tinst, i, m)) + let mkRecdFieldGet g (e, fref:RecdFieldRef, tinst, m) = assert (not (isByrefTy g (tyOfExpr g e))) let wrap, e' = mkExprAddrOfExpr g fref.Tycon.IsStructOrEnumTycon false NeverMutates e None m @@ -6006,6 +6050,9 @@ let mkRefTupled g m es tys = mkAnyTupled g m tupInfoRef es tys let mkRefTupledNoTypes g m args = mkRefTupled g m args (List.map (tyOfExpr g) args) let mkRefTupledVars g m vs = mkRefTupled g m (List.map (exprForVal m) vs) (typesOfVals vs) +let mkAnonRecd (_g:TcGlobals) m anonInfo es tys = Expr.Op (TOp.AnonRecd (anonInfo),tys,es,m) + + //-------------------------------------------------------------------------- // Permute expressions //-------------------------------------------------------------------------- @@ -6061,11 +6108,6 @@ let permuteExprList (sigma:int[]) (exprs: Expr list) (typ: TType list) (names:st let reorderedExprs = permute sigma (Array.ofList newExprs) binds, Array.toList reorderedExprs -//------------------------------------------------------------------------- -// Build record expressions... -//------------------------------------------------------------------------- - - /// Evaluate the expressions in the original order, but build a record with the results in field order /// Note some fields may be static. If this were not the case we could just use /// let sigma = Array.map #Index () @@ -7128,6 +7170,10 @@ let rec typeEnc g (gtpsType, gtpsMethod) ty = textOfPath (List.map DemangleGenericTypeName path) | _ -> assert(false); failwith "impossible" tyName + tyargsEnc g (gtpsType, gtpsMethod) tinst + + | TType_anon (anonInfo, tinst) -> + sprintf "%s%s" anonInfo.ILTypeRef.FullName (tyargsEnc g (gtpsType, gtpsMethod) tinst) + | TType_tuple (tupInfo, typs) -> if evalTupInfoIsStruct tupInfo then sprintf "System.ValueTuple%s"(tyargsEnc g (gtpsType, gtpsMethod) typs) @@ -7297,6 +7343,8 @@ let rec TypeHasDefaultValue g m ty = flds |> List.forall (actualTyOfRecdField (mkTyconRefInst tcref tinst) >> TypeHasDefaultValue g m) elif isStructTupleTy g ty then destStructTupleTy g ty |> List.forall (TypeHasDefaultValue g m) + elif isStructAnonRecdTy g ty then + tryDestAnonRecdTy g ty |> Option.get |> snd |> List.forall (TypeHasDefaultValue g m) else // All struct types defined in other .NET languages have a DefaultValue regardless of their // instantiation @@ -7309,6 +7357,9 @@ let (|SpecialComparableHeadType|_|) g ty = if isAnyTupleTy g ty then let _tupInfo, elemTys = destAnyTupleTy g ty Some elemTys + elif isAnonRecdTy g ty then + let _anonInfo, elemTys = tryDestAnonRecdTy g ty |> Option.get + Some elemTys else match ty with | AppTy g (tcref, tinst) -> diff --git a/src/fsharp/TastOps.fsi b/src/fsharp/TastOps.fsi index 9f23629b25e..2c839c645a1 100755 --- a/src/fsharp/TastOps.fsi +++ b/src/fsharp/TastOps.fsi @@ -181,6 +181,8 @@ val mkReraiseLibCall : TcGlobals -> TType -> range -> Expr //------------------------------------------------------------------------- val mkTupleFieldGet : TcGlobals -> TupInfo * Expr * TypeInst * int * range -> Expr +val mkAnonRecdFieldGet : TcGlobals -> AnonRecdTypeInfo * Expr * TypeInst * int * range -> Expr +val mkAnonRecdFieldGetViaExprAddr : AnonRecdTypeInfo * Expr * TypeInst * int * range -> Expr val mkRecdFieldGetViaExprAddr : Expr * RecdFieldRef * TypeInst * range -> Expr val mkRecdFieldGetAddrViaExprAddr : Expr * RecdFieldRef * TypeInst * range -> Expr val mkStaticRecdFieldGet : RecdFieldRef * TypeInst * range -> Expr @@ -249,6 +251,7 @@ val mkGetTupleItemN : TcGlobals -> range -> int -> ILType -> bool -> Expr -> TTy /// Evaluate the TupInfo to work out if it is a struct or a ref. Currently this is very simple /// but TupInfo may later be used carry variables that infer structness. val evalTupInfoIsStruct : TupInfo -> bool +val evalAnonInfoIsStruct : AnonRecdTypeInfo -> bool /// If it is a tuple type, ensure it's outermost type is a .NET tuple type, otherwise leave unchanged val helpEnsureTypeHasMetadata : TcGlobals -> TType -> TType @@ -430,6 +433,8 @@ val isForallTy : TcGlobals -> TType -> bool val isAnyTupleTy : TcGlobals -> TType -> bool val isRefTupleTy : TcGlobals -> TType -> bool val isStructTupleTy : TcGlobals -> TType -> bool +val isStructAnonRecdTy : TcGlobals -> TType -> bool +val isAnonRecdTy : TcGlobals -> TType -> bool val isUnionTy : TcGlobals -> TType -> bool val isReprHiddenTy : TcGlobals -> TType -> bool val isFSharpObjModelTy : TcGlobals -> TType -> bool @@ -452,6 +457,7 @@ val tcrefOfAppTy : TcGlobals -> TType -> TyconRef val tryDestAppTy : TcGlobals -> TType -> TyconRef option val tryDestTyparTy : TcGlobals -> TType -> Typar option val tryDestFunTy : TcGlobals -> TType -> (TType * TType) option +val tryDestAnonRecdTy : TcGlobals -> TType -> (AnonRecdTypeInfo * TType list) option val argsOfAppTy : TcGlobals -> TType -> TypeInst val mkInstForAppTy : TcGlobals -> TType -> TyparInst @@ -577,6 +583,7 @@ val returnTypesAEquivAux : Erasure -> TcGlobals -> TypeEquivEnv -> TType op val returnTypesAEquiv : TcGlobals -> TypeEquivEnv -> TType option -> TType option -> bool val tcrefAEquiv : TcGlobals -> TypeEquivEnv -> TyconRef -> TyconRef -> bool val valLinkageAEquiv : TcGlobals -> TypeEquivEnv -> Val -> Val -> bool +val anonInfoEquiv : AnonRecdTypeInfo -> AnonRecdTypeInfo -> bool //------------------------------------------------------------------------- // Erasure of types wrt units-of-measure and type providers @@ -1408,7 +1415,6 @@ val isRefTupleExpr : Expr -> bool val tryDestRefTupleExpr : Expr -> Exprs val mkAnyTupledTy : TcGlobals -> TupInfo -> TType list -> TType - val mkAnyTupled : TcGlobals -> range -> TupInfo -> Exprs -> TType list -> Expr val mkRefTupled : TcGlobals -> range -> Exprs -> TType list -> Expr val mkRefTupledNoTypes : TcGlobals -> range -> Exprs -> Expr @@ -1417,6 +1423,14 @@ val mkRefTupledVarsTy : TcGlobals -> Val list -> TType val mkRefTupledVars : TcGlobals -> range -> Val list -> Expr val mkMethodTy : TcGlobals -> TType list list -> TType -> TType + +//------------------------------------------------------------------------- +// Anonymous records +//------------------------------------------------------------------------- + +val mkAnyAnonRecdTy : TcGlobals -> AnonRecdTypeInfo -> TType list -> TType +val mkAnonRecd : TcGlobals -> range -> AnonRecdTypeInfo -> Exprs -> TType list -> Expr + //------------------------------------------------------------------------- // //------------------------------------------------------------------------- diff --git a/src/fsharp/TastPickle.fs b/src/fsharp/TastPickle.fs index 1726db26070..cb5476a424b 100755 --- a/src/fsharp/TastPickle.fs +++ b/src/fsharp/TastPickle.fs @@ -113,9 +113,10 @@ type WriterState = { os: ByteBuffer oscope: CcuThunk occus: Table - otycons: NodeOutTable + oentities: NodeOutTable otypars: NodeOutTable ovals: NodeOutTable + oanoninfos: NodeOutTable ostrings: Table opubpaths: Table onlerefs: Table @@ -144,9 +145,10 @@ type ReaderState = { is: ByteStream iilscope: ILScopeRef iccus: InputTable - itycons: NodeInTable + ientities: NodeInTable itypars: NodeInTable ivals: NodeInTable + ianoninfos: NodeInTable istrings: InputTable ipubpaths: InputTable inlerefs: InputTable @@ -317,10 +319,13 @@ let u_used_space1 f st = let inline u_tup2 p1 p2 (st:ReaderState) = let a = p1 st in let b = p2 st in (a,b) + let inline u_tup3 p1 p2 p3 (st:ReaderState) = let a = p1 st in let b = p2 st in let c = p3 st in (a,b,c) + let inline u_tup4 p1 p2 p3 p4 (st:ReaderState) = let a = p1 st in let b = p2 st in let c = p3 st in let d = p4 st in (a,b,c,d) + let inline u_tup5 p1 p2 p3 p4 p5 (st:ReaderState) = let a = p1 st let b = p2 st @@ -328,32 +333,41 @@ let inline u_tup5 p1 p2 p3 p4 p5 (st:ReaderState) = let d = p4 st let e = p5 st (a,b,c,d,e) + let inline u_tup6 p1 p2 p3 p4 p5 p6 (st:ReaderState) = let a = p1 st in let b = p2 st in let c = p3 st in let d = p4 st in let e = p5 st in let f = p6 st in (a,b,c,d,e,f) + let inline u_tup7 p1 p2 p3 p4 p5 p6 p7 (st:ReaderState) = let a = p1 st in let b = p2 st in let c = p3 st in let d = p4 st in let e = p5 st in let f = p6 st in let x7 = p7 st in (a,b,c,d,e,f,x7) + let inline u_tup8 p1 p2 p3 p4 p5 p6 p7 p8 (st:ReaderState) = let a = p1 st in let b = p2 st in let c = p3 st in let d = p4 st in let e = p5 st in let f = p6 st in let x7 = p7 st in let x8 = p8 st in (a,b,c,d,e,f,x7,x8) + let inline u_tup9 p1 p2 p3 p4 p5 p6 p7 p8 p9 (st:ReaderState) = let a = p1 st in let b = p2 st in let c = p3 st in let d = p4 st in let e = p5 st in let f = p6 st in let x7 = p7 st in let x8 = p8 st in let x9 = p9 st in (a,b,c,d,e,f,x7,x8,x9) + let inline u_tup10 p1 p2 p3 p4 p5 p6 p7 p8 p9 p10 (st:ReaderState) = let a = p1 st in let b = p2 st in let c = p3 st in let d = p4 st in let e = p5 st in let f = p6 st in let x7 = p7 st in let x8 = p8 st in let x9 = p9 st in let x10 = p10 st in (a,b,c,d,e,f,x7,x8,x9,x10) + let inline u_tup11 p1 p2 p3 p4 p5 p6 p7 p8 p9 p10 p11 (st:ReaderState) = let a = p1 st in let b = p2 st in let c = p3 st in let d = p4 st in let e = p5 st in let f = p6 st in let x7 = p7 st in let x8 = p8 st in let x9 = p9 st in let x10 = p10 st in let x11 = p11 st in (a,b,c,d,e,f,x7,x8,x9,x10,x11) + let inline u_tup12 p1 p2 p3 p4 p5 p6 p7 p8 p9 p10 p11 p12 (st:ReaderState) = let a = p1 st in let b = p2 st in let c = p3 st in let d = p4 st in let e = p5 st in let f = p6 st in let x7 = p7 st in let x8 = p8 st in let x9 = p9 st in let x10 = p10 st in let x11 = p11 st in let x12 = p12 st in (a,b,c,d,e,f,x7,x8,x9,x10,x11,x12) + let inline u_tup13 p1 p2 p3 p4 p5 p6 p7 p8 p9 p10 p11 p12 p13 (st:ReaderState) = let a = p1 st in let b = p2 st in let c = p3 st in let d = p4 st in let e = p5 st in let f = p6 st in let x7 = p7 st in let x8 = p8 st in let x9 = p9 st in let x10 = p10 st in let x11 = p11 st in let x12 = p12 st in let x13 = p13 st in (a,b,c,d,e,f,x7,x8,x9,x10,x11,x12,x13) + let inline u_tup14 p1 p2 p3 p4 p5 p6 p7 p8 p9 p10 p11 p12 p13 p14 (st:ReaderState) = let a = p1 st in let b = p2 st in let c = p3 st in let d = p4 st in let e = p5 st in let f = p6 st in let x7 = p7 st in let x8 = p8 st in @@ -391,7 +405,7 @@ let inline u_tup17 p1 p2 p3 p4 p5 p6 p7 p8 p9 p10 p11 p12 p13 p14 p15 p16 p17 (s // ctxt is for debugging let p_osgn_ref (_ctxt:string) (outMap : NodeOutTable<_,_>) x st = let idx = outMap.Table.FindOrAdd (outMap.NodeStamp x) - //if ((idx = 0) && outMap.Name = "otycons") then + //if ((idx = 0) && outMap.Name = "oentities") then // System.Diagnostics.Debug.Assert(false, sprintf "idx %d#%d in table %s has name '%s', was defined at '%s' and is referenced from context %s\n" idx (outMap.NodeStamp x) outMap.Name (outMap.NodeName x) (stringOfRange (outMap.GetRange x)) _ctxt) p_int idx st @@ -479,7 +493,7 @@ let private p_lazy_impl p v st = let fixupPos7 = st.os.Position prim_p_int32 0 st let idx1 = st.os.Position - let otyconsIdx1 = st.otycons.Size + let otyconsIdx1 = st.oentities.Size let otyparsIdx1 = st.otypars.Size let ovalsIdx1 = st.ovals.Size // Run the pickler @@ -488,7 +502,7 @@ let private p_lazy_impl p v st = let idx2 = st.os.Position st.os.FixupInt32 fixupPos1 (idx2-idx1) // Determine and fixup the ranges of OSGN nodes defined within the lazy portion - let otyconsIdx2 = st.otycons.Size + let otyconsIdx2 = st.oentities.Size let otyparsIdx2 = st.otypars.Size let ovalsIdx2 = st.ovals.Size st.os.FixupInt32 fixupPos2 otyconsIdx1 @@ -595,7 +609,7 @@ let u_lazy u st = lazy (let st = { st with is = st.is.CloneAndSeek idx1 } u st) /// Force the reading of the data as a "tripwire" for each of the OSGN thunks - for i = otyconsIdx1 to otyconsIdx2-1 do wire (st.itycons.Get(i)) res done + for i = otyconsIdx1 to otyconsIdx2-1 do wire (st.ientities.Get(i)) res done for i = ovalsIdx1 to ovalsIdx2-1 do wire (st.ivals.Get(i)) res done for i = otyparsIdx1 to otyparsIdx2-1 do wire (st.itypars.Get(i)) res done res @@ -688,21 +702,23 @@ let p_nleref x st = p_int (encode_nleref st.occus st.ostrings st.onlerefs st.osc let decode_simpletyp st _ccuTab _stringTab nlerefTab a = TType_app(ERefNonLocal (lookup_nleref st nlerefTab a),[]) let lookup_simpletyp st simpletypTab x = lookup_uniq st simpletypTab x let u_encoded_simpletyp st = u_int st +let u_encoded_anoninfo st = u_int st let u_simpletyp st = lookup_uniq st st.isimpletyps (u_int st) let encode_simpletyp ccuTab stringTab nlerefTab simpletypTab thisCcu a = encode_uniq simpletypTab (encode_nleref ccuTab stringTab nlerefTab thisCcu a) let p_encoded_simpletyp x st = p_int x st +let p_encoded_anoninfo x st = p_int x st let p_simpletyp x st = p_int (encode_simpletyp st.occus st.ostrings st.onlerefs st.osimpletyps st.oscope x) st -type sizes = int * int * int let pickleObjWithDanglingCcus inMem file g scope p x = - let ccuNameTab,(sizes: sizes),stringTab,pubpathTab,nlerefTab,simpletypTab,phase1bytes = + let ccuNameTab,(ntycons, ntypars, nvals, nanoninfos),stringTab,pubpathTab,nlerefTab,simpletypTab,phase1bytes = let st1 = { os = ByteBuffer.Create 100000 oscope=scope occus= Table<_>.Create "occus" - otycons=NodeOutTable<_,_>.Create((fun (tc:Tycon) -> tc.Stamp),(fun tc -> tc.LogicalName),(fun tc -> tc.Range),(fun osgn -> osgn),"otycons") + oentities=NodeOutTable<_,_>.Create((fun (tc:Tycon) -> tc.Stamp),(fun tc -> tc.LogicalName),(fun tc -> tc.Range),(fun osgn -> osgn),"otycons") otypars=NodeOutTable<_,_>.Create((fun (tp:Typar) -> tp.Stamp),(fun tp -> tp.DisplayName),(fun tp -> tp.Range),(fun osgn -> osgn),"otypars") ovals=NodeOutTable<_,_>.Create((fun (v:Val) -> v.Stamp),(fun v -> v.LogicalName),(fun v -> v.Range),(fun osgn -> osgn),"ovals") + oanoninfos=NodeOutTable<_,_>.Create((fun (v:AnonRecdTypeInfo) -> v.Stamp),(fun v -> string v.Stamp),(fun _ -> range0),id,"oanoninfos") ostrings=Table<_>.Create "ostrings" onlerefs=Table<_>.Create "onlerefs" opubpaths=Table<_>.Create "opubpaths" @@ -712,19 +728,21 @@ let pickleObjWithDanglingCcus inMem file g scope p x = oInMem=inMem } p x st1 let sizes = - st1.otycons.Size, + st1.oentities.Size, st1.otypars.Size, - st1.ovals.Size + st1.ovals.Size, + st1.oanoninfos.Size st1.occus, sizes, st1.ostrings, st1.opubpaths,st1.onlerefs, st1.osimpletyps, st1.os.Close() - let phase2data = (ccuNameTab.AsArray,sizes,stringTab.AsArray,pubpathTab.AsArray,nlerefTab.AsArray,simpletypTab.AsArray,phase1bytes) + let phase2bytes = let st2 = { os = ByteBuffer.Create 100000 oscope=scope occus= Table<_>.Create "occus (fake)" - otycons=NodeOutTable<_,_>.Create((fun (tc:Tycon) -> tc.Stamp),(fun tc -> tc.LogicalName),(fun tc -> tc.Range),(fun osgn -> osgn),"otycons") + oentities=NodeOutTable<_,_>.Create((fun (tc:Tycon) -> tc.Stamp),(fun tc -> tc.LogicalName),(fun tc -> tc.Range),(fun osgn -> osgn),"otycons") otypars=NodeOutTable<_,_>.Create((fun (tp:Typar) -> tp.Stamp),(fun tp -> tp.DisplayName),(fun tp -> tp.Range),(fun osgn -> osgn),"otypars") ovals=NodeOutTable<_,_>.Create((fun (v:Val) -> v.Stamp),(fun v -> v.LogicalName),(fun v -> v.Range),(fun osgn -> osgn),"ovals") + oanoninfos=NodeOutTable<_,_>.Create((fun (v:AnonRecdTypeInfo) -> v.Stamp),(fun v -> string v.Stamp),(fun _ -> range0),id,"oanoninfos") ostrings=Table<_>.Create "ostrings (fake)" opubpaths=Table<_>.Create "opubpaths (fake)" onlerefs=Table<_>.Create "onlerefs (fake)" @@ -732,15 +750,21 @@ let pickleObjWithDanglingCcus inMem file g scope p x = oglobals=g ofile=file oInMem=inMem } - p_tup7 - (p_array p_encoded_ccuref) - (p_tup3 p_int p_int p_int) - (p_array p_encoded_string) - (p_array p_encoded_pubpath) - (p_array p_encoded_nleref) - (p_array p_encoded_simpletyp) - p_bytes - phase2data st2 + p_array p_encoded_ccuref ccuNameTab.AsArray st2 + // Add a 4th integer indicated by a negative 1st integer + let z1 = if nanoninfos > 0 then -ntycons-1 else ntycons + p_int z1 st2 + p_tup2 p_int p_int (ntypars, nvals) st2 + if nanoninfos > 0 then + p_int nanoninfos st2 + p_tup5 + (p_array p_encoded_string) + (p_array p_encoded_pubpath) + (p_array p_encoded_nleref) + (p_array p_encoded_simpletyp) + p_bytes + (stringTab.AsArray,pubpathTab.AsArray,nlerefTab.AsArray,simpletypTab.AsArray,phase1bytes) + st2 st2.os.Close() phase2bytes @@ -756,39 +780,43 @@ let unpickleObjWithDanglingCcus file ilscope (iILModule:ILModuleDef option) u (p { is = ByteStream.FromBytes (phase2bytes,0,phase2bytes.Length) iilscope= ilscope iccus= new_itbl "iccus (fake)" [| |] - itycons= NodeInTable<_,_>.Create (Tycon.NewUnlinked, (fun osgn tg -> osgn.Link tg),(fun osgn -> osgn.IsLinked),"itycons",0) + ientities= NodeInTable<_,_>.Create (Tycon.NewUnlinked, (fun osgn tg -> osgn.Link tg),(fun osgn -> osgn.IsLinked),"itycons",0) itypars= NodeInTable<_,_>.Create (Typar.NewUnlinked, (fun osgn tg -> osgn.Link tg),(fun osgn -> osgn.IsLinked),"itypars",0) ivals = NodeInTable<_,_>.Create (Val.NewUnlinked , (fun osgn tg -> osgn.Link tg),(fun osgn -> osgn.IsLinked),"ivals",0) + ianoninfos=NodeInTable<_,_>.Create(AnonRecdTypeInfo.NewUnlinked, (fun osgn tg -> osgn.Link tg),(fun osgn -> osgn.IsLinked),"ianoninfos",0); istrings = new_itbl "istrings (fake)" [| |] inlerefs = new_itbl "inlerefs (fake)" [| |] ipubpaths = new_itbl "ipubpaths (fake)" [| |] isimpletyps = new_itbl "isimpletyps (fake)" [| |] ifile=file iILModule = iILModule } - let phase2data = - u_tup7 - (u_array u_encoded_ccuref) - (u_tup3 u_int u_int u_int) - (u_array u_encoded_string) - (u_array u_encoded_pubpath) - (u_array u_encoded_nleref) - (u_array u_encoded_simpletyp) - u_bytes st2 - let ccuNameTab,sizes,stringTab,pubpathTab,nlerefTab,simpletypTab,phase1bytes = phase2data + let ccuNameTab = u_array u_encoded_ccuref st2 + let z1 = u_int st2 + let ntycons = if z1 < 0 then -z1-1 else z1 + let ntypars, nvals = u_tup2 u_int u_int st2 + let nanoninfos = if z1 < 0 then u_int st2 else 0 + let stringTab,pubpathTab,nlerefTab,simpletypTab,phase1bytes = + u_tup5 + (u_array u_encoded_string) + (u_array u_encoded_pubpath) + (u_array u_encoded_nleref) + (u_array u_encoded_simpletyp) + u_bytes + st2 let ccuTab = new_itbl "iccus" (Array.map (CcuThunk.CreateDelayed) ccuNameTab) let stringTab = new_itbl "istrings" (Array.map decode_string stringTab) let pubpathTab = new_itbl "ipubpaths" (Array.map (decode_pubpath st2 stringTab) pubpathTab) let nlerefTab = new_itbl "inlerefs" (Array.map (decode_nleref st2 ccuTab stringTab) nlerefTab) let simpletypTab = new_itbl "isimpletyps" (Array.map (decode_simpletyp st2 ccuTab stringTab nlerefTab) simpletypTab) - let ((ntycons,ntypars,nvals) : sizes) = sizes let data = let st1 = { is = ByteStream.FromBytes (phase1bytes,0,phase1bytes.Length) iccus= ccuTab iilscope= ilscope - itycons= NodeInTable<_,_>.Create(Tycon.NewUnlinked,(fun osgn tg -> osgn.Link tg),(fun osgn -> osgn.IsLinked),"itycons",ntycons) + ientities= NodeInTable<_,_>.Create(Tycon.NewUnlinked,(fun osgn tg -> osgn.Link tg),(fun osgn -> osgn.IsLinked),"itycons",ntycons) itypars= NodeInTable<_,_>.Create(Typar.NewUnlinked,(fun osgn tg -> osgn.Link tg),(fun osgn -> osgn.IsLinked),"itypars",ntypars) ivals= NodeInTable<_,_>.Create(Val.NewUnlinked ,(fun osgn tg -> osgn.Link tg),(fun osgn -> osgn.IsLinked),"ivals",nvals) + ianoninfos=NodeInTable<_,_>.Create(AnonRecdTypeInfo.NewUnlinked, (fun osgn tg -> osgn.Link tg),(fun osgn -> osgn.IsLinked),"ianoninfos",nanoninfos); istrings = stringTab ipubpaths = pubpathTab inlerefs = nlerefTab @@ -796,9 +824,8 @@ let unpickleObjWithDanglingCcus file ilscope (iILModule:ILModuleDef option) u (p ifile=file iILModule = iILModule } let res = u st1 -#if LAZY_UNPICKLE -#else - check ilscope st1.itycons +#if !LAZY_UNPICKLE + check ilscope st1.ientities check ilscope st1.ivals check ilscope st1.itypars #endif @@ -808,7 +835,7 @@ let unpickleObjWithDanglingCcus file ilscope (iILModule:ILModuleDef option) u (p //========================================================================= -// PART II *) +// PART II //========================================================================= //--------------------------------------------------------------------------- @@ -819,7 +846,9 @@ let p_ILPublicKey x st = match x with | PublicKey b -> p_byte 0 st; p_bytes b st | PublicKeyToken b -> p_byte 1 st; p_bytes b st + let p_ILVersion x st = p_tup4 p_uint16 p_uint16 p_uint16 p_uint16 x st + let p_ILModuleRef (x:ILModuleRef) st = p_tup3 p_string p_bool (p_option p_bytes) (x.Name,x.HasMetadata,x.Hash) st @@ -943,8 +972,11 @@ let rec u_ILType st = | 7 -> u_uint16 st |> mkILTyvarTy | 8 -> u_tup3 u_bool u_ILTypeRef u_ILType st |> ILType.Modified | _ -> ufailwith st "u_ILType" + and u_ILTypes st = u_list u_ILType st + and u_ILCallSig = u_wrap (fun (a,b,c) -> {CallingConv=a; ArgTypes=b; ReturnType=c}) (u_tup3 u_ILCallConv u_ILTypes u_ILType) + and u_ILTypeSpec st = let a,b = u_tup2 u_ILTypeRef u_ILTypes st in ILTypeSpec.Create(a,b) @@ -1240,7 +1272,7 @@ let p_local_item_ref ctxt tab st = p_osgn_ref ctxt tab st let p_tcref ctxt (x:EntityRef) st = match x with - | ERefLocal x -> p_byte 0 st; p_local_item_ref ctxt st.otycons x st + | ERefLocal x -> p_byte 0 st; p_local_item_ref ctxt st.oentities x st | ERefNonLocal x -> p_byte 1 st; p_nleref x st let p_ucref (UCRef(a,b)) st = p_tup2 (p_tcref "ucref") p_string (a,b) st @@ -1252,7 +1284,7 @@ let u_local_item_ref tab st = u_osgn_ref tab st let u_tcref st = let tag = u_byte st match tag with - | 0 -> u_local_item_ref st.itycons st |> ERefLocal + | 0 -> u_local_item_ref st.ientities st |> ERefLocal | 1 -> u_nleref st |> ERefNonLocal | _ -> ufailwith st "u_item_ref" @@ -1357,6 +1389,12 @@ let u_MemberFlags st = let fill_u_Expr_hole,u_expr_fwd = u_hole() let fill_p_Expr_hole,p_expr_fwd = p_hole() +let p_anonInfo_data (anonInfo: AnonRecdTypeInfo) st = + p_tup3 p_ccuref p_bool (p_array p_ident) (anonInfo.Assembly, evalTupInfoIsStruct anonInfo.TupInfo, anonInfo.SortedIds) st + +let p_anonInfo x st = + p_osgn_decl st.oanoninfos p_anonInfo_data x st + let p_trait_sln sln st = match sln with | ILMethSln(a,b,c,d) -> @@ -1369,10 +1407,20 @@ let p_trait_sln sln st = p_byte 3 st; p_expr_fwd expr st | FSRecdFieldSln(a,b,c) -> p_byte 4 st; p_tup3 p_typs p_rfref p_bool (a,b,c) st + | FSAnonRecdFieldSln(a, b, c) -> + p_byte 5 st; p_tup3 p_anonInfo p_typs p_int (a,b,c) st + let p_trait (TTrait(a,b,c,d,e,f)) st = p_tup6 p_typs p_string p_MemberFlags p_typs (p_option p_typ) (p_option p_trait_sln) (a,b,c,d,e,!f) st +let u_anonInfo_data st = + let (ccu, info, nms) = u_tup3 u_ccuref u_bool (u_array u_ident) st + AnonRecdTypeInfo.Create (ccu, TupInfo.Const info, nms) + +let u_anonInfo st = + u_osgn_decl st.ianoninfos u_anonInfo_data st + // We have to store trait solutions since they can occur in optimization data let u_trait_sln st = let tag = u_byte st @@ -1390,6 +1438,9 @@ let u_trait_sln st = | 4 -> let (a,b,c) = u_tup3 u_typs u_rfref u_bool st FSRecdFieldSln(a,b,c) + | 5 -> + let (a,b,c) = u_tup3 u_anonInfo u_typs u_int st + FSAnonRecdFieldSln(a, b, c) | _ -> ufailwith st "u_trait_sln" let u_trait st = @@ -1400,7 +1451,9 @@ let u_trait st = let p_rational q st = p_int32 (GetNumerator q) st; p_int32 (GetDenominator q) st let p_measure_con tcref st = p_byte 0 st; p_tcref "measure" tcref st + let p_measure_var v st = p_byte 3 st; p_tpref v st + let p_measure_one = p_byte 4 // Pickle a unit-of-measure variable or constructor @@ -1510,7 +1563,6 @@ let p_typar_spec_data (x:Typar) st = p_int64 p_typar_constraints p_xmldoc - (x.typar_id,x.typar_attribs,int64 x.typar_flags.PickledBits,x.typar_constraints,x.typar_xmldoc) st let p_typar_spec (x:Typar) st = @@ -1551,7 +1603,12 @@ let _ = fill_p_typ (fun ty st -> | TType_var r -> p_byte 4 st; p_tpref r st | TType_forall (tps,r) -> p_byte 5 st; p_tup2 p_typar_specs p_typ (tps,r) st | TType_measure unt -> p_byte 6 st; p_measure_expr unt st - | TType_ucase (uc,tinst) -> p_byte 7 st; p_tup2 p_ucref p_typs (uc,tinst) st) + | TType_ucase (uc,tinst) -> p_byte 7 st; p_tup2 p_ucref p_typs (uc,tinst) st + // p_byte 8 taken by TType_tuple above + | TType_anon (anonInfo, l) -> + p_byte 9 st + p_anonInfo anonInfo st + p_typs l st) let _ = fill_u_typ (fun st -> let tag = u_byte st @@ -1565,6 +1622,7 @@ let _ = fill_u_typ (fun st -> | 6 -> let unt = u_measure_expr st in TType_measure unt | 7 -> let uc = u_ucref st in let tinst = u_typs st in TType_ucase (uc,tinst) | 8 -> let l = u_typs st in TType_tuple (tupInfoStruct, l) + | 9 -> let anonInfo = u_anonInfo st in let l = u_typs st in TType_anon (anonInfo, l) | _ -> ufailwith st "u_typ") @@ -1683,7 +1741,7 @@ and p_exnc_repr x st = | TExnFresh x -> p_byte 2 st; p_rfield_table x st | TExnNone -> p_byte 3 st -and p_exnc_spec x st = p_tycon_spec x st +and p_exnc_spec x st = p_entity_spec x st and p_access (TAccess n) st = p_list p_cpath n st @@ -1755,7 +1813,7 @@ and p_tcaug p st = p.tcaug_abstract, space) st -and p_tycon_spec x st = p_osgn_decl st.otycons p_entity_spec_data x st +and p_entity_spec x st = p_osgn_decl st.oentities p_entity_spec_data x st and p_parentref x st = match x with @@ -1836,7 +1894,7 @@ and p_modul_typ (x: ModuleOrNamespaceType) st = p_tup3 p_istype (p_qlist p_Val) - (p_qlist p_tycon_spec) + (p_qlist p_entity_spec) (x.ModuleOrNamespaceKind,x.AllValsAndMembers,x.AllEntities) st @@ -1921,7 +1979,7 @@ and u_exnc_repr st = | 3 -> TExnNone | _ -> ufailwith st "u_exnc_repr" -and u_exnc_spec st = u_tycon_spec st +and u_exnc_spec st = u_entity_spec st and u_access st = match u_list u_cpath st with @@ -2033,8 +2091,8 @@ and u_tcaug st = tcaug_closed=true tcaug_abstract=g} -and u_tycon_spec st = - u_osgn_decl st.itycons u_entity_spec_data st +and u_entity_spec st = + u_osgn_decl st.ientities u_entity_spec_data st and u_parentref st = let tag = u_byte st @@ -2152,7 +2210,7 @@ and u_modul_typ st = u_tup3 u_istype (u_qlist u_Val) - (u_qlist u_tycon_spec) st + (u_qlist u_entity_spec) st ModuleOrNamespaceType(x1,x3,x5) @@ -2308,6 +2366,10 @@ and p_op x st = | TOp.UnionCaseFieldGetAddr (a,b) -> p_byte 28 st; p_tup2 p_ucref p_int (a,b) st // Note tag byte 29 is taken for struct tuples, see above // Note tag byte 30 is taken for struct tuples, see above + (* 29: TOp.Tuple when evalTupInfoIsStruct tupInfo = true *) + (* 30: TOp.TupleFieldGet when evalTupInfoIsStruct tupInfo = true *) + | TOp.AnonRecd info -> p_byte 31 st; p_anonInfo info st + | TOp.AnonRecdGet (info, n) -> p_byte 32 st; p_anonInfo info st; p_int n st | TOp.Goto _ | TOp.Label _ | TOp.Return -> failwith "unexpected backend construct in pickled TAST" and u_op st = @@ -2374,6 +2436,11 @@ and u_op st = | 29 -> TOp.Tuple tupInfoStruct | 30 -> let a = u_int st TOp.TupleFieldGet (tupInfoStruct, a) + | 31 -> let info = u_anonInfo st + TOp.AnonRecd (info) + | 32 -> let info = u_anonInfo st + let n = u_int st + TOp.AnonRecdGet (info, n) | _ -> ufailwith st "u_op" and p_expr expr st = @@ -2527,11 +2594,12 @@ let _ = fill_u_Vals (u_list u_Val) // Pickle/unpickle F# interface data //--------------------------------------------------------------------------- -let pickleModuleOrNamespace mspec st = p_tycon_spec mspec st +let pickleModuleOrNamespace mspec st = p_entity_spec mspec st + let pickleCcuInfo minfo st = p_tup4 pickleModuleOrNamespace p_string p_bool (p_space 3) (minfo.mspec, minfo.compileTimeWorkingDir, minfo.usesQuotations,()) st -let unpickleModuleOrNamespace st = u_tycon_spec st +let unpickleModuleOrNamespace st = u_entity_spec st let unpickleCcuInfo st = let a,b,c,_space = u_tup4 unpickleModuleOrNamespace u_string u_bool (u_space 3) st diff --git a/src/fsharp/TypeChecker.fs b/src/fsharp/TypeChecker.fs index 6aa5ffa64a3..77fbb1daaf1 100755 --- a/src/fsharp/TypeChecker.fs +++ b/src/fsharp/TypeChecker.fs @@ -760,18 +760,46 @@ let UnifyRefTupleType contextInfo cenv denv m ty ps = AddCxTypeEqualsType contextInfo denv cenv.css m ty (TType_tuple (tupInfoRef, ptys)) ptys -/// Optimized unification routine that avoids creating new inference -/// variables unnecessarily -let UnifyStructTupleType contextInfo cenv denv m ty ps = - let ptys = - if isStructTupleTy cenv.g ty then - let ptys = destStructTupleTy cenv.g ty - if List.length ps = List.length ptys then ptys - else NewInferenceTypes ps - else NewInferenceTypes ps - AddCxTypeEqualsType contextInfo denv cenv.css m ty (TType_tuple (tupInfoStruct, ptys)) +/// Allow the inference of structness from the known type, e.g. +/// let (x : struct (int * int)) = (3,4) +let UnifyTupleTypeAndInferCharacteristics contextInfo cenv denv m knownTy isExplicitStruct ps = + let tupInfo, ptys = + if isAnyTupleTy cenv.g knownTy then + let tupInfo, ptys = destAnyTupleTy cenv.g knownTy + let tupInfo = (if isExplicitStruct then TupInfo.Const isExplicitStruct else tupInfo) + let ptys = + if List.length ps = List.length ptys then ptys + else NewInferenceTypes ps + tupInfo, ptys + else + TupInfo.Const isExplicitStruct, NewInferenceTypes ps + let ty2 = TType_tuple (tupInfo, ptys) + AddCxTypeEqualsType contextInfo denv cenv.css m knownTy ty2 + tupInfo, ptys + +// Allow inference of assembly-affinity and structness from the known type - even from another assembly. This is a rule of +// the language design and allows effective cross-assembly use of anonymous types in some limited circumstances. +let UnifyAnonRecdTypeAndInferCharacteristics contextInfo cenv denv m ty isExplicitStruct unsortedNames = + let anonInfo, ptys = + match tryDestAnonRecdTy cenv.g ty with + | Some (anonInfo, ptys) -> + // Note: use the assembly of the known type, not the current assembly + // Note: use the structness of the known type, unless explicit + // Note: use the names of our type, since they are always explicit + let tupInfo = (if isExplicitStruct then TupInfo.Const isExplicitStruct else anonInfo.TupInfo) + let anonInfo = AnonRecdTypeInfo.Create(anonInfo.Assembly, tupInfo, unsortedNames) + let ptys = + if List.length ptys = Array.length unsortedNames then ptys + else NewInferenceTypes (Array.toList anonInfo.SortedNames) + anonInfo, ptys + | None -> + // Note: no known anonymous record type - use our assembly + let anonInfo = AnonRecdTypeInfo.Create(cenv.topCcu, TupInfo.Const isExplicitStruct, unsortedNames) + anonInfo, NewInferenceTypes (Array.toList anonInfo.SortedNames) + let ty2 = TType_anon (anonInfo, ptys) + AddCxTypeEqualsType contextInfo denv cenv.css m ty ty2 + anonInfo, ptys - ptys /// Optimized unification routine that avoids creating new inference /// variables unnecessarily @@ -3214,7 +3242,7 @@ let GetMethodArgs arg = let args = match arg with | SynExpr.Const (SynConst.Unit, _) -> [] - | SynExprParen(SynExpr.Tuple (args, _, _), _, _, _) | SynExpr.Tuple (args, _, _) -> args + | SynExprParen(SynExpr.Tuple (false, args, _, _), _, _, _) | SynExpr.Tuple (false, args, _, _) -> args | SynExprParen(arg, _, _, _) | arg -> [arg] let unnamedCallerArgs, namedCallerArgs = args |> List.takeUntil IsNamedArg @@ -3491,10 +3519,10 @@ let elimFastIntegerForLoop (spBind, id, start, dir, finish, innerExpr, m) = let (|ExprAsPat|_|) (f:SynExpr) = match f with | SingleIdent v1 | SynExprParen(SingleIdent v1, _, _, _) -> Some (mkSynPatVar None v1) - | SynExprParen(SynExpr.Tuple (elems, _, _), _, _, _) -> + | SynExprParen(SynExpr.Tuple (false, elems, _, _), _, _, _) -> let elems = elems |> List.map (|SingleIdent|_|) if elems |> List.forall (fun x -> x.IsSome) then - Some (SynPat.Tuple((elems |> List.map (fun x -> mkSynPatVar None x.Value)), f.Range)) + Some (SynPat.Tuple(false, (elems |> List.map (fun x -> mkSynPatVar None x.Value)), f.Range)) else None | _ -> None @@ -4576,21 +4604,34 @@ and TcTypeOrMeasure optKind cenv newOk checkCxs occ env (tpenv:SyntacticUnscoped match ltyp with | AppTy cenv.g (tcref, tinst) -> let tcref = ResolveTypeLongIdentInTyconRef cenv.tcSink cenv.nameResolver env.eNameResEnv (TypeNameResolutionInfo.ResolveToTypeRefs (TypeNameResolutionStaticArgsInfo.FromTyArgs args.Length)) ad m tcref longId - TcTypeApp cenv newOk checkCxs occ env tpenv m tcref tinst args + TcTypeApp cenv newOk checkCxs occ env tpenv m tcref tinst args | _ -> error(Error(FSComp.SR.tcTypeHasNoNestedTypes(), m)) - | SynType.Tuple(args, m) -> - let isMeasure = match optKind with Some TyparKind.Measure -> true | None -> List.exists (fun (isquot, _) -> isquot) args | _ -> false - if isMeasure then - let ms, tpenv = TcMeasuresAsTuple cenv newOk checkCxs occ env tpenv args m - TType_measure ms, tpenv + | SynType.Tuple(isStruct, args, m) -> + let tupInfo = TupInfo.Const isStruct + if isStruct then + let args',tpenv = TcTypesAsTuple cenv newOk checkCxs occ env tpenv args m + TType_tuple(tupInfo,args'),tpenv else - let args', tpenv = TcTypesAsTuple cenv newOk checkCxs occ env tpenv args m - TType_tuple(tupInfoRef, args'), tpenv - - | SynType.StructTuple(args, m) -> - let args', tpenv = TcTypesAsTuple cenv newOk checkCxs occ env tpenv args m - TType_tuple(tupInfoStruct, args'), tpenv + let isMeasure = match optKind with Some TyparKind.Measure -> true | None -> List.exists (fun (isquot,_) -> isquot) args | _ -> false + if isMeasure then + let ms,tpenv = TcMeasuresAsTuple cenv newOk checkCxs occ env tpenv args m + TType_measure ms,tpenv + else + let args',tpenv = TcTypesAsTuple cenv newOk checkCxs occ env tpenv args m + TType_tuple(tupInfo,args'),tpenv + + | SynType.AnonRecd(isStruct, args,m) -> + let tupInfo = TupInfo.Const isStruct + let args',tpenv = TcTypesAsTuple cenv newOk checkCxs occ env tpenv (args |> List.map snd |> List.map (fun x -> (false,x))) m + let unsortedIds = args |> List.map fst |> List.toArray + let anonInfo = AnonRecdTypeInfo.Create(cenv.topCcu, tupInfo, unsortedIds) + // Sort into canonical order + let sortedArgTys, sortedCheckedArgTys = List.zip args args' |> List.indexed |> List.sortBy (fun (i,_) -> unsortedIds.[i].idText) |> List.map snd |> List.unzip + sortedArgTys |> List.iteri (fun i (x,_) -> + let item = Item.AnonRecdField(anonInfo, sortedCheckedArgTys, i, x.idRange) + CallNameResolutionSink cenv.tcSink (x.idRange,env.NameEnv,item,item,emptyTyparInst,ItemOccurence.UseInType,env.DisplayEnv,env.eAccessRights)) + TType_anon(anonInfo, sortedCheckedArgTys),tpenv | SynType.Fun(domainTy, resultTy, _) -> let domainTy', tpenv = TcTypeAndRecover cenv newOk checkCxs occ env tpenv domainTy @@ -5265,10 +5306,10 @@ and TcPat warnOnUpper cenv env topValInfo vFlags (tpenv, names, takenNames) ty p SynExpr.DiscardAfterMissingQualificationAfterDot(e, unionRanges e.Range (List.last dotms)) else SynExpr.LongIdent(false, lidwd, None, m) List.fold (fun f x -> mkSynApp1 f (convSynPatToSynExpr x) m) e args - | SynPat.Tuple (args, m) -> SynExpr.Tuple(List.map convSynPatToSynExpr args, [], m) + | SynPat.Tuple (isStruct, args, m) -> SynExpr.Tuple(isStruct, List.map convSynPatToSynExpr args, [], m) | SynPat.Paren (p, _) -> convSynPatToSynExpr p - | SynPat.ArrayOrList (isArray, args, m) -> SynExpr.ArrayOrList(isArray, List.map convSynPatToSynExpr args, m) - | SynPat.QuoteExpr (e, _) -> e + | SynPat.ArrayOrList (isArray, args, m) -> SynExpr.ArrayOrList(isArray,List.map convSynPatToSynExpr args, m) + | SynPat.QuoteExpr (e,_) -> e | SynPat.Null m -> SynExpr.Null(m) | _ -> error(Error(FSComp.SR.tcInvalidArgForParameterizedPattern(), x.Range)) let activePatArgsAsSynExprs = List.map convSynPatToSynExpr activePatArgsAsSynPats @@ -5335,13 +5376,13 @@ and TcPat warnOnUpper cenv env topValInfo vFlags (tpenv, names, takenNames) ty p let args = List.ofArray result if result.Length = 1 then args - else [ SynPat.Tuple(args, m) ] + else [ SynPat.Tuple(false, args, m) ] let args = match args with | []-> [] // note: the next will always be parenthesized - | [SynPatErrorSkip(SynPat.Tuple (args, _)) | SynPatErrorSkip(SynPat.Paren(SynPatErrorSkip(SynPat.Tuple (args, _)), _))] when nargtys > 1 -> args + | [SynPatErrorSkip(SynPat.Tuple (false, args, _)) | SynPatErrorSkip(SynPat.Paren(SynPatErrorSkip(SynPat.Tuple (false, args, _)), _))] when nargtys > 1 -> args // note: we allow both 'C _' and 'C (_)' regardless of number of argument of the pattern | [SynPatErrorSkip(SynPat.Wild _ as e) | SynPatErrorSkip(SynPat.Paren(SynPatErrorSkip(SynPat.Wild _ as e), _))] -> Array.toList (Array.create nargtys e) @@ -5405,17 +5446,10 @@ and TcPat warnOnUpper cenv env topValInfo vFlags (tpenv, names, takenNames) ty p | SynPat.QuoteExpr(_, m) -> error (Error(FSComp.SR.tcInvalidPattern(), m)) - | SynPat.Tuple (args, m) -> - let argtys = NewInferenceTypes args - UnifyTypes cenv env m ty (TType_tuple (tupInfoRef, argtys)) - let args', acc = TcPatterns warnOnUpper cenv env vFlags (tpenv, names, takenNames) argtys args - (fun values -> TPat_tuple(tupInfoRef, List.map (fun f -> f values) args', argtys, m)), acc - - | SynPat.StructTuple (args, m) -> - let argtys = NewInferenceTypes args - UnifyTypes cenv env m ty (TType_tuple (tupInfoStruct, argtys)) + | SynPat.Tuple (isExplicitStruct, args, m) -> + let tupInfo, argtys = UnifyTupleTypeAndInferCharacteristics env.eContextInfo cenv env.DisplayEnv m ty isExplicitStruct args let args', acc = TcPatterns warnOnUpper cenv env vFlags (tpenv, names, takenNames) argtys args - (fun values -> TPat_tuple(tupInfoStruct, List.map (fun f -> f values) args', argtys, m)), acc + (fun values -> TPat_tuple(tupInfo, List.map (fun f -> f values) args', argtys, m)), acc | SynPat.Paren (p, _) -> TcPat warnOnUpper cenv env None vFlags (tpenv, names, takenNames) ty p @@ -5779,19 +5813,31 @@ and TcExprUndelayed cenv overallTy env tpenv (expr: SynExpr) = let e', tpenv = TcExpr cenv ety env tpenv e mkLazyDelayed cenv.g m ety (mkUnitDelayLambda cenv.g m e'), tpenv - | SynExpr.Tuple (args, _, m) -> - let argtys = UnifyRefTupleType env.eContextInfo cenv env.DisplayEnv m overallTy args + | SynExpr.Tuple (isExplicitStruct, args, _, m) -> + let tupInfo, argtys = UnifyTupleTypeAndInferCharacteristics env.eContextInfo cenv env.DisplayEnv m overallTy isExplicitStruct args // No subsumption at tuple construction let flexes = argtys |> List.map (fun _ -> false) let args', tpenv = TcExprs cenv env m tpenv flexes argtys args - mkRefTupled cenv.g m args' argtys, tpenv + let expr = mkAnyTupled cenv.g m tupInfo args' argtys + expr, tpenv - | SynExpr.StructTuple (args, _, m) -> - let argtys = UnifyStructTupleType env.eContextInfo cenv env.DisplayEnv m overallTy args - // No subsumption at tuple construction - let flexes = argtys |> List.map (fun _ -> false) - let args', tpenv = TcExprs cenv env m tpenv flexes argtys args - mkAnyTupled cenv.g m tupInfoStruct args' argtys, tpenv + | SynExpr.AnonRecd (isStruct, unsortedArgs, m) -> + let unsortedIds = unsortedArgs |> List.map fst |> List.toArray + let anonInfo, sortedArgTys = UnifyAnonRecdTypeAndInferCharacteristics env.eContextInfo cenv env.DisplayEnv m overallTy isStruct unsortedIds + + // Sort into canonical order + let sortedIndexedArgs = unsortedArgs |> List.indexed |> List.sortBy (fun (i,_) -> unsortedIds.[i].idText) + let sigma = List.map fst sortedIndexedArgs |> List.toArray + let sortedArgs = List.map snd sortedIndexedArgs + sortedArgs |> List.iteri (fun j (x, _) -> + let item = Item.AnonRecdField(anonInfo, sortedArgTys, j, x.idRange) + CallNameResolutionSink cenv.tcSink (x.idRange, env.NameEnv, item, item, emptyTyparInst, ItemOccurence.Use, env.DisplayEnv, env.eAccessRights)) + let unsortedArgTys = sortedArgTys |> List.indexed |> List.sortBy (fun (j, _) -> sigma.[j]) |> List.map snd + let flexes = unsortedArgTys |> List.map (fun _ -> true) + let unsortedCheckedArgs, tpenv = TcExprs cenv env m tpenv flexes unsortedArgTys (List.map snd unsortedArgs) + let sortedCheckedArgs = unsortedCheckedArgs |> List.indexed |> List.sortBy (fun (i,_) -> unsortedIds.[i].idText) |> List.map snd + + mkAnonRecd cenv.g m anonInfo sortedCheckedArgs sortedArgTys, tpenv | SynExpr.ArrayOrList (isArray, args, m) -> CallExprHasTypeSink cenv.tcSink (m, env.NameEnv, overallTy, env.DisplayEnv, env.eAccessRights) @@ -6168,7 +6214,7 @@ and TcIndexerThen cenv env overallTy mWholeExpr mDot tpenv wholeExpr e1 indexArg match indexArgs with | [] -> failwith "unexpected empty index list" | [SynIndexerArg.One h] -> SynExpr.Paren(h, range0, None, idxRange) - | _ -> SynExpr.Paren(SynExpr.Tuple(GetIndexArgs indexArgs @ Option.toList vopt, [], idxRange), range0, None, idxRange) + | _ -> SynExpr.Paren(SynExpr.Tuple(false, GetIndexArgs indexArgs @ Option.toList vopt, [], idxRange), range0, None, idxRange) let attemptArrayString = if isArray || isString then @@ -6177,13 +6223,13 @@ and TcIndexerThen cenv env overallTy mWholeExpr mDot tpenv wholeExpr e1 indexArg let sliceOpPath = ["Microsoft";"FSharp";"Core";"Operators";"OperatorIntrinsics"] let info = match isString, isArray, wholeExpr with - | false, true, SynExpr.DotIndexedGet(_, [SynIndexerArg.One(SynExpr.Tuple ([_;_] as idxs, _, _))], _, _) -> Some (indexOpPath, "GetArray2D", idxs) - | false, true, SynExpr.DotIndexedGet(_, [SynIndexerArg.One(SynExpr.Tuple ([_;_;_] as idxs, _, _))], _, _) -> Some (indexOpPath, "GetArray3D", idxs) - | false, true, SynExpr.DotIndexedGet(_, [SynIndexerArg.One(SynExpr.Tuple ([_;_;_;_] as idxs, _, _))], _, _) -> Some (indexOpPath, "GetArray4D", idxs) + | false, true, SynExpr.DotIndexedGet(_, [SynIndexerArg.One(SynExpr.Tuple (false, ([_;_] as idxs), _, _))], _, _) -> Some (indexOpPath, "GetArray2D", idxs) + | false, true, SynExpr.DotIndexedGet(_, [SynIndexerArg.One(SynExpr.Tuple (false, ([_;_;_] as idxs), _, _))], _, _) -> Some (indexOpPath, "GetArray3D", idxs) + | false, true, SynExpr.DotIndexedGet(_, [SynIndexerArg.One(SynExpr.Tuple (false, ([_;_;_;_] as idxs), _, _))], _, _) -> Some (indexOpPath, "GetArray4D", idxs) | false, true, SynExpr.DotIndexedGet(_, [SynIndexerArg.One idx], _, _) -> Some (indexOpPath, "GetArray", [idx]) - | false, true, SynExpr.DotIndexedSet(_, [SynIndexerArg.One(SynExpr.Tuple ([_;_] as idxs, _, _))] , e3, _, _, _) -> Some (indexOpPath, "SetArray2D", (idxs @ [e3])) - | false, true, SynExpr.DotIndexedSet(_, [SynIndexerArg.One(SynExpr.Tuple ([_;_;_] as idxs, _, _))] , e3, _, _, _) -> Some (indexOpPath, "SetArray3D", (idxs @ [e3])) - | false, true, SynExpr.DotIndexedSet(_, [SynIndexerArg.One(SynExpr.Tuple ([_;_;_;_] as idxs, _, _))] , e3, _, _, _) -> Some (indexOpPath, "SetArray4D", (idxs @ [e3])) + | false, true, SynExpr.DotIndexedSet(_, [SynIndexerArg.One(SynExpr.Tuple (false, ([_;_] as idxs), _, _))] , e3, _, _, _) -> Some (indexOpPath, "SetArray2D", (idxs @ [e3])) + | false, true, SynExpr.DotIndexedSet(_, [SynIndexerArg.One(SynExpr.Tuple (false, ([_;_;_] as idxs), _, _))] , e3, _, _, _) -> Some (indexOpPath, "SetArray3D", (idxs @ [e3])) + | false, true, SynExpr.DotIndexedSet(_, [SynIndexerArg.One(SynExpr.Tuple (false, ([_;_;_;_] as idxs), _, _))] , e3, _, _, _) -> Some (indexOpPath, "SetArray4D", (idxs @ [e3])) | false, true, SynExpr.DotIndexedSet(_, [SynIndexerArg.One _], e3, _, _, _) -> Some (indexOpPath, "SetArray", (GetIndexArgs indexArgs @ [e3])) | true, false, SynExpr.DotIndexedGet(_, [SynIndexerArg.Two _], _, _) -> Some (sliceOpPath, "GetStringSlice", GetIndexArgs indexArgs) | true, false, SynExpr.DotIndexedGet(_, [SynIndexerArg.One _], _, _) -> Some (indexOpPath, "GetString", GetIndexArgs indexArgs) @@ -6300,10 +6346,6 @@ and TcCtorCall isNaked cenv env tpenv overallTy objTy mObjTyOpt item superInit a error(Error(FSComp.SR.tcSyntaxCanOnlyBeUsedToCreateObjectTypes(if superInit then "inherit" else "new"), mWholeCall)) -//------------------------------------------------------------------------- -// TcRecordConstruction -//------------------------------------------------------------------------- - // Check a record construction expression and TcRecordConstruction cenv overallTy env tpenv optOrigExpr objTy fldsList m = let tcref, tinst = destAppTy cenv.g objTy @@ -7109,7 +7151,7 @@ and TcComputationExpression cenv env overallTy mWhole interpExpr builderTy tpenv match args with | [] -> SynExpr.Const(SynConst.Unit, m) | [arg] -> SynExpr.Paren(SynExpr.Paren(arg, range0, None, m), range0, None, m) - | args -> SynExpr.Paren(SynExpr.Tuple(args, [], m), range0, None, m) + | args -> SynExpr.Paren(SynExpr.Tuple(false, args, [], m), range0, None, m) let builderVal = mkSynIdGet m builderValName mkSynApp1 (SynExpr.DotGet(builderVal, range0, LongIdentWithDots([mkSynId m nm], []), m)) args m @@ -7475,7 +7517,7 @@ and TcComputationExpression cenv env overallTy mWhole interpExpr builderTy tpenv match patvs with | [] -> SynExpr.Const(SynConst.Unit, m) | [v] -> SynExpr.Ident v.Id - | vs -> SynExpr.Tuple((vs |> List.map (fun v -> SynExpr.Ident v.Id)), [], m) + | vs -> SynExpr.Tuple(false, (vs |> List.map (fun v -> SynExpr.Ident v.Id)), [], m) let mkSimplePatForVarSpace m (patvs: Val list) = let spats = @@ -7489,7 +7531,7 @@ and TcComputationExpression cenv env overallTy mWhole interpExpr builderTy tpenv match patvs with | [] -> SynPat.Const (SynConst.Unit, m) | [v] -> mkSynPatVar None v.Id - | vs -> SynPat.Tuple((vs |> List.map (fun x -> mkSynPatVar None x.Id)), m) + | vs -> SynPat.Tuple(false, (vs |> List.map (fun x -> mkSynPatVar None x.Id)), m) let (|OptionalSequential|) e = match e with @@ -7506,7 +7548,7 @@ and TcComputationExpression cenv env overallTy mWhole interpExpr builderTy tpenv let estimatedRangeOfIntendedLeftAndRightArguments = unionRanges (List.last args).Range arg2.Range errorR(Error(FSComp.SR.tcUnrecognizedQueryBinaryOperator(), estimatedRangeOfIntendedLeftAndRightArguments)) true - | SynExpr.Tuple( (StripApps(SingleIdent nm2, args) :: _), _, m) when + | SynExpr.Tuple(false, (StripApps(SingleIdent nm2, args) :: _), _, m) when expectedArgCountForCustomOperator nm2 > 0 && not (List.isEmpty args) -> let estimatedRangeOfIntendedLeftAndRightArguments = unionRanges (List.last args).Range m.EndRange @@ -8490,8 +8532,8 @@ and TcItemThen cenv overallTy env tpenv (item, mItem, rest, afterResolution) del let (|FittedArgs|_|) arg = match arg with - | SynExprParen(SynExpr.Tuple(args, _, _), _, _, _) - | SynExpr.Tuple(args, _, _) when nargtys > 1 -> Some args + | SynExprParen(SynExpr.Tuple(false, args, _, _), _, _, _) + | SynExpr.Tuple(false, args, _, _) when nargtys > 1 -> Some args | SynExprParen(arg, _, _, _) | arg when nargtys = 1 -> Some [arg] | _ -> None @@ -8782,14 +8824,14 @@ and TcItemThen cenv overallTy env tpenv (item, mItem, rest, afterResolution) del | SynExpr.Const _ | SynExpr.LongIdent _ -> true - | SynExpr.Tuple(synExprs, _, _) - | SynExpr.StructTuple(synExprs, _, _) + | SynExpr.Tuple(_, synExprs, _, _) | SynExpr.ArrayOrList(_, synExprs, _) -> synExprs |> List.forall isSimpleArgument | SynExpr.Record(_, copyOpt, fields, _) -> copyOpt |> Option.forall (fst >> isSimpleArgument) && fields |> List.forall (p23 >> Option.forall isSimpleArgument) | SynExpr.App (_, _, synExpr, synExpr2, _) -> isSimpleArgument synExpr && isSimpleArgument synExpr2 | SynExpr.IfThenElse(synExpr, synExpr2, synExprOpt, _, _, _, _) -> isSimpleArgument synExpr && isSimpleArgument synExpr2 && Option.forall isSimpleArgument synExprOpt | SynExpr.DotIndexedGet(synExpr, _, _, _) -> isSimpleArgument synExpr | SynExpr.ObjExpr _ + | SynExpr.AnonRecd _ | SynExpr.While _ | SynExpr.For _ | SynExpr.ForEach _ @@ -9132,6 +9174,18 @@ and TcLookupThen cenv overallTy env tpenv mObjExpr objExpr objExprTy longId dela let objExpr' = mkRecdFieldGet cenv.g (objExpr, rfinfo.RecdFieldRef, rfinfo.TypeInst, mExprAndItem) PropagateThenTcDelayed cenv overallTy env tpenv mExprAndItem (MakeApplicableExprWithFlex cenv env objExpr') fieldTy ExprAtomicFlag.Atomic delayed + | Item.AnonRecdField (anonInfo, tinst, n, _) -> + let tgty = TType_anon (anonInfo, tinst) + AddCxTypeMustSubsumeType ContextInfo.NoContext env.DisplayEnv cenv.css mItem NoTrace tgty objExprTy + let fieldTy = List.item n tinst + match delayed with + | DelayedSet _ :: _otherDelayed -> + error(Error(FSComp.SR.tcInvalidAssignment(),mItem)) + | _ -> + // Instance F# Anonymous Record + let objExpr' = mkAnonRecdFieldGet cenv.g (anonInfo,objExpr,tinst,n,mExprAndItem) + PropagateThenTcDelayed cenv overallTy env tpenv mExprAndItem (MakeApplicableExprWithFlex cenv env objExpr') fieldTy ExprAtomicFlag.Atomic delayed + | Item.ILField finfo -> // Get or set instance IL field ILFieldInstanceChecks cenv.g cenv.amap ad mItem finfo @@ -15450,6 +15504,7 @@ module EstablishTypeDefinitionCores = let rec accInAbbrevType ty acc = match stripTyparEqns ty with + | TType_anon (_,l) | TType_tuple (_, l) -> accInAbbrevTypes l acc | TType_ucase (UCRef(tc, _), tinst) | TType_app (tc, tinst) -> @@ -17140,16 +17195,16 @@ let TypeCheckOneImplFile // We ALWAYS run the PostTypeCheckSemanticChecks phase, though we if we have already encountered some // errors we turn off error reporting. This is because it performs various fixups over the TAST, e.g. // assigning nice names for inference variables. - let hasExplicitEntryPoint = + let hasExplicitEntryPoint, anonRecdTypes = conditionallySuppressErrorReporting (checkForErrors()) (fun () -> try let reportErrors = not (checkForErrors()) PostTypeCheckSemanticChecks.CheckTopImpl (g, cenv.amap, reportErrors, cenv.infoReader, env.eInternalsVisibleCompPaths, cenv.topCcu, envAtEnd.DisplayEnv, implFileExprAfterSig, extraAttribs, isLastCompiland) with e -> errorRecovery e m - false) + false, StampMap.Empty) - let implFile = TImplFile(qualNameOfFile, scopedPragmas, implFileExprAfterSig, hasExplicitEntryPoint, isScript) + let implFile = TImplFile(qualNameOfFile, scopedPragmas, implFileExprAfterSig, hasExplicitEntryPoint, isScript, anonRecdTypes) return (topAttrs, implFile, envAtEnd, cenv.createsGeneratedProvidedTypes) } diff --git a/src/fsharp/ast.fs b/src/fsharp/ast.fs index 1963b00ed34..3bc6214ec7c 100644 --- a/src/fsharp/ast.fs +++ b/src/fsharp/ast.fs @@ -162,22 +162,26 @@ type LongIdentWithDots = /// more freedom about typechecking these expressions. /// LongIdent can be empty list - it is used to denote that name of some AST element is absent (i.e. empty type name in inherit) | LongIdentWithDots of id:LongIdent * dotms:range list - with member this.Range = - match this with - | LongIdentWithDots([],_) -> failwith "rangeOfLidwd" - | LongIdentWithDots([id],[]) -> id.idRange - | LongIdentWithDots([id],[m]) -> unionRanges id.idRange m - | LongIdentWithDots(h::t,[]) -> unionRanges h.idRange (List.last t).idRange - | LongIdentWithDots(h::t,dotms) -> unionRanges h.idRange (List.last t).idRange |> unionRanges (List.last dotms) - member this.Lid = match this with LongIdentWithDots(lid,_) -> lid - member this.ThereIsAnExtraDotAtTheEnd = match this with LongIdentWithDots(lid,dots) -> lid.Length = dots.Length - member this.RangeSansAnyExtraDot = - match this with - | LongIdentWithDots([],_) -> failwith "rangeOfLidwd" - | LongIdentWithDots([id],_) -> id.idRange - | LongIdentWithDots(h::t,dotms) -> - let nonExtraDots = if dotms.Length = t.Length then dotms else List.take t.Length dotms - unionRanges h.idRange (List.last t).idRange |> unionRanges (List.last nonExtraDots) + + member this.Range = + match this with + | LongIdentWithDots([],_) -> failwith "rangeOfLidwd" + | LongIdentWithDots([id],[]) -> id.idRange + | LongIdentWithDots([id],[m]) -> unionRanges id.idRange m + | LongIdentWithDots(h::t,[]) -> unionRanges h.idRange (List.last t).idRange + | LongIdentWithDots(h::t,dotms) -> unionRanges h.idRange (List.last t).idRange |> unionRanges (List.last dotms) + + member this.Lid = match this with LongIdentWithDots(lid,_) -> lid + + member this.ThereIsAnExtraDotAtTheEnd = match this with LongIdentWithDots(lid,dots) -> lid.Length = dots.Length + + member this.RangeSansAnyExtraDot = + match this with + | LongIdentWithDots([],_) -> failwith "rangeOfLidwd" + | LongIdentWithDots([id],_) -> id.idRange + | LongIdentWithDots(h::t,dotms) -> + let nonExtraDots = if dotms.Length = t.Length then dotms else List.take t.Length dotms + unionRanges h.idRange (List.last t).idRange |> unionRanges (List.last nonExtraDots) //------------------------------------------------------------------------ // AST: the grammar of implicitly scoped type parameters @@ -428,44 +432,56 @@ and | LongIdentApp of typeName:SynType * longDotId:LongIdentWithDots * LESSRange:range option * typeArgs:SynType list * commaRanges:range list * GREATERrange:range option * range:range /// F# syntax : type * ... * type - // the bool is true if / rather than * follows the type - | Tuple of typeNames:(bool*SynType) list * range:range - /// F# syntax : struct (type * ... * type) // the bool is true if / rather than * follows the type - | StructTuple of typeNames:(bool*SynType) list * range:range + | Tuple of isStruct:bool * typeNames:(bool*SynType) list * range:range + + /// F# syntax : {| id: type; ...; id: type |} + /// F# syntax : struct {| id: type; ...; id: type |} + | AnonRecd of isStruct:bool * typeNames:(Ident * SynType) list * range:range /// F# syntax : type[] | Array of int * elementType:SynType * range:range + /// F# syntax : type -> type | Fun of argType:SynType * returnType:SynType * range:range + /// F# syntax : 'Var | Var of genericName:SynTypar * range:range + /// F# syntax : _ | Anon of range:range + /// F# syntax : typ with constraints | WithGlobalConstraints of typeName:SynType * constraints:SynTypeConstraint list * range:range + /// F# syntax : #type | HashConstraint of SynType * range:range + /// F# syntax : for units of measure e.g. m / s | MeasureDivide of dividendType:SynType * divisorType:SynType * range:range + /// F# syntax : for units of measure e.g. m^3, kg^1/2 | MeasurePower of measureType:SynType * SynRationalConst * range:range + /// F# syntax : 1, "abc" etc, used in parameters to type providers /// For the dimensionless units i.e. 1 , and static parameters to provided types | StaticConstant of constant:SynConst * range:range + /// F# syntax : const expr, used in static parameters to type providers | StaticConstantExpr of expr:SynExpr * range:range + /// F# syntax : ident=1 etc., used in static parameters to type providers | StaticConstantNamed of expr:SynType * SynType * range:range + /// Get the syntactic range of source code covered by this construct. member x.Range = match x with | SynType.App (range=m) | SynType.LongIdentApp (range=m) | SynType.Tuple (range=m) - | SynType.StructTuple (range=m) | SynType.Array (range=m) + | SynType.AnonRecd (range=m) | SynType.Fun (range=m) | SynType.Var (range=m) | SynType.Anon (range=m) @@ -504,10 +520,11 @@ and | Typed of expr:SynExpr * typeName:SynType * range:range /// F# syntax: e1, ..., eN - | Tuple of exprs:SynExpr list * commaRanges:range list * range:range // "range list" is for interstitial commas, these only matter for parsing/design-time tooling, the typechecker may munge/discard them + | Tuple of isStruct: bool * exprs:SynExpr list * commaRanges:range list * range:range // "range list" is for interstitial commas, these only matter for parsing/design-time tooling, the typechecker may munge/discard them - /// F# syntax: struct (e1, ..., eN) - | StructTuple of exprs:SynExpr list * commaRanges:range list * range:range // "range list" is for interstitial commas, these only matter for parsing/design-time tooling, the typechecker may munge/discard them + /// F# syntax: {| id1=e1; ...; idN=eN |} + /// F# syntax: {| new id1=e1; ...; idN=eN |} + | AnonRecd of isStruct: bool * recordFields:(Ident * SynExpr) list * range:range /// F# syntax: [ e1; ...; en ], [| e1; ...; en |] | ArrayOrList of isList:bool * exprs:SynExpr list * range:range @@ -728,7 +745,7 @@ and | SynExpr.Const (range=m) | SynExpr.Typed (range=m) | SynExpr.Tuple (range=m) - | SynExpr.StructTuple (range=m) + | SynExpr.AnonRecd (range=m) | SynExpr.ArrayOrList (range=m) | SynExpr.Record (range=m) | SynExpr.New (range=m) @@ -791,8 +808,8 @@ and | SynExpr.Const (range=m) | SynExpr.Typed (range=m) | SynExpr.Tuple (range=m) - | SynExpr.StructTuple (range=m) | SynExpr.ArrayOrList (range=m) + | SynExpr.AnonRecd (range=m) | SynExpr.Record (range=m) | SynExpr.New (range=m) | SynExpr.ObjExpr (range=m) @@ -845,6 +862,7 @@ and | SynExpr.DiscardAfterMissingQualificationAfterDot (expr,_) -> expr.Range | SynExpr.Fixed (_,m) -> m | SynExpr.Ident id -> id.idRange + /// Attempt to get the range of the first token or initial portion only - this is extremely ad-hoc, just a cheap way to improve a certain 'query custom operation' error range member e.RangeOfFirstPortion = match e with @@ -853,8 +871,8 @@ and | SynExpr.Const (range=m) | SynExpr.Typed (range=m) | SynExpr.Tuple (range=m) - | SynExpr.StructTuple (range=m) | SynExpr.ArrayOrList (range=m) + | SynExpr.AnonRecd (range=m) | SynExpr.Record (range=m) | SynExpr.New (range=m) | SynExpr.ObjExpr (range=m) @@ -981,8 +999,7 @@ and | Or of SynPat * SynPat * range:range | Ands of SynPat list * range:range | LongIdent of longDotId:LongIdentWithDots * (* holds additional ident for tooling *) Ident option * SynValTyparDecls option (* usually None: temporary used to parse "f<'a> x = x"*) * SynConstructorArgs * accessibility:SynAccess option * range:range - | Tuple of SynPat list * range:range - | StructTuple of SynPat list * range:range + | Tuple of isStruct: bool * SynPat list * range:range | Paren of SynPat * range:range | ArrayOrList of bool * SynPat list * range:range | Record of ((LongIdent * Ident) * SynPat) list * range:range @@ -1013,7 +1030,6 @@ and | SynPat.LongIdent (range=m) | SynPat.ArrayOrList (range=m) | SynPat.Tuple (range=m) - | SynPat.StructTuple (range=m) | SynPat.Typed (range=m) | SynPat.Attrib (range=m) | SynPat.Record (range=m) @@ -1702,8 +1718,8 @@ let rec SimplePatsOfPat synArgNameGenerator p = SynSimplePats.Typed(p2,ty,m), laterf // | SynPat.Paren (p,m) -> SimplePatsOfPat synArgNameGenerator p - | SynPat.Tuple (ps,m) - | SynPat.Paren(SynPat.Tuple (ps,m),_) -> + | SynPat.Tuple (false,ps,m) + | SynPat.Paren(SynPat.Tuple (false,ps,m),_) -> let ps2,laterf = List.foldBack (fun (p',rhsf) (ps',rhsf') -> @@ -1823,14 +1839,14 @@ let mkSynDotBrackSeqSliceGet m mDot arr (argslist:list) = | SynIndexerArg.One x -> yield x | _ -> () ] if notsliced.Length = argslist.Length then - SynExpr.DotIndexedGet(arr,[SynIndexerArg.One (SynExpr.Tuple(notsliced,[],unionRanges (List.head notsliced).Range (List.last notsliced).Range))],mDot,m) + SynExpr.DotIndexedGet(arr,[SynIndexerArg.One (SynExpr.Tuple(false,notsliced,[],unionRanges (List.head notsliced).Range (List.last notsliced).Range))],mDot,m) else SynExpr.DotIndexedGet(arr,argslist,mDot,m) let mkSynDotParenGet lhsm dotm a b = match b with - | SynExpr.Tuple ([_;_],_,_) -> errorR(Deprecated(FSComp.SR.astDeprecatedIndexerNotation(),lhsm)) ; SynExpr.Const(SynConst.Unit,lhsm) - | SynExpr.Tuple ([_;_;_],_,_) -> errorR(Deprecated(FSComp.SR.astDeprecatedIndexerNotation(),lhsm)) ; SynExpr.Const(SynConst.Unit,lhsm) + | SynExpr.Tuple (false,[_;_],_,_) -> errorR(Deprecated(FSComp.SR.astDeprecatedIndexerNotation(),lhsm)) ; SynExpr.Const(SynConst.Unit,lhsm) + | SynExpr.Tuple (false,[_;_;_],_,_) -> errorR(Deprecated(FSComp.SR.astDeprecatedIndexerNotation(),lhsm)) ; SynExpr.Const(SynConst.Unit,lhsm) | _ -> mkSynInfix dotm a parenGet b let mkSynUnit m = SynExpr.Const(SynConst.Unit,m) @@ -2337,10 +2353,12 @@ let rec synExprContainsError inpExpr = walkExpr e1 || walkExpr e2 | SynExpr.ArrayOrList (_,es,_) - | SynExpr.Tuple (es,_,_) - | SynExpr.StructTuple (es,_,_) -> + | SynExpr.Tuple (_,es,_,_) -> walkExprs es + | SynExpr.AnonRecd (_,flds,_) -> + walkExprs (List.map snd flds) + | SynExpr.Record (_,_,fs,_) -> let flds = fs |> List.choose (fun (_, v, _) -> v) walkExprs (flds) diff --git a/src/fsharp/fsc.fs b/src/fsharp/fsc.fs index 699b6c52ec8..b7ab66e6461 100644 --- a/src/fsharp/fsc.fs +++ b/src/fsharp/fsc.fs @@ -300,7 +300,7 @@ module InterfaceFileWriter = fprintfn os "#light" fprintfn os "" - for (TImplFile(_, _, mexpr, _, _)) in declaredImpls do + for (TImplFile(_, _, mexpr, _, _, _)) in declaredImpls do let denv = BuildInitialDisplayEnvForSigFileGeneration tcGlobals writeViaBufferWithEnvironmentNewLines os (fun os s -> Printf.bprintf os "%s\n\n" s) (NicePrint.layoutInferredSigOfModuleExpr true denv infoReader AccessibleFromSomewhere range0 mexpr |> Layout.squashTo 80 |> Layout.showL) @@ -1800,7 +1800,7 @@ let main1(Args (ctok, tcGlobals, tcImports: TcImports, frameworkTcImports, gener // it as the updated global error logger and never remove it let oldLogger = errorLogger let errorLogger = - let scopedPragmas = [ for (TImplFile(_, pragmas, _, _, _)) in typedImplFiles do yield! pragmas ] + let scopedPragmas = [ for (TImplFile(_, pragmas, _, _, _, _)) in typedImplFiles do yield! pragmas ] GetErrorLoggerFilteringByScopedPragmas(true, scopedPragmas, oldLogger) let _unwindEL_3 = PushErrorLoggerPhaseUntilUnwind(fun _ -> errorLogger) @@ -1960,13 +1960,10 @@ let main2b (tcImportsCapture,dynamicAssemblyCreator) (Args (ctok, tcConfig: TcCo let ilxGenerator = CreateIlxAssemblyGenerator (tcConfig, tcImports, tcGlobals, (LightweightTcValForUsingInBuildMethodCall tcGlobals), generatedCcu) let codegenResults = GenerateIlxCode ((if Option.isSome dynamicAssemblyCreator then IlReflectBackend else IlWriteBackend), Option.isSome dynamicAssemblyCreator, false, tcConfig, topAttrs, optimizedImpls, generatedCcu.AssemblyName, ilxGenerator) - let casApplied = new Dictionary() - let securityAttrs, topAssemblyAttrs = topAttrs.assemblyAttrs |> List.partition (fun a -> TypeChecker.IsSecurityAttribute tcGlobals (tcImports.GetImportMap()) casApplied a rangeStartup) - - // remove any security attributes from the top-level assembly attribute list + let topAssemblyAttrs = codegenResults.topAssemblyAttrs let topAttrs = {topAttrs with assemblyAttrs=topAssemblyAttrs} - let permissionSets = ilxGenerator.CreatePermissionSets securityAttrs - let secDecls = if List.isEmpty securityAttrs then emptyILSecurityDecls else mkILSecurityDecls permissionSets + let permissionSets = codegenResults.permissionSets + let secDecls = mkILSecurityDecls permissionSets let ilxMainModule = MainModuleBuilder.CreateMainModule (ctok, tcConfig, tcGlobals, tcImports, pdbfile, assemblyName, outfile, topAttrs, idata, optDataResources, codegenResults, assemVerFromAttrib, metadataVersion, secDecls) diff --git a/src/fsharp/fsi/fsi.fs b/src/fsharp/fsi/fsi.fs index b0d55326c4a..f320761eec6 100644 --- a/src/fsharp/fsi/fsi.fs +++ b/src/fsharp/fsi/fsi.fs @@ -1115,7 +1115,7 @@ type internal FsiDynamicCompiler // 'Open' the path for the fragment we just compiled for any future printing. let denv = denv.AddOpenPath (pathOfLid prefixPath) - for (TImplFile(_qname,_,mexpr,_,_)) in declaredImpls do + for (TImplFile(_qname,_,mexpr,_,_,_)) in declaredImpls do let responseL = NicePrint.layoutInferredSigOfModuleExpr false denv infoReader AccessibleFromSomewhere rangeStdin mexpr if not (Layout.isEmptyL responseL) then let opts = valuePrinter.GetFsiPrintOptions() diff --git a/src/fsharp/infos.fs b/src/fsharp/infos.fs index f117f36ccad..8d2fe33be73 100755 --- a/src/fsharp/infos.fs +++ b/src/fsharp/infos.fs @@ -88,6 +88,8 @@ let GetSuperTypeOfType g amap m typ = Some(g.system_Enum_typ) else Some (g.system_Value_typ) + elif isAnonRecdTy g typ then + Some g.obj_ty elif isRecdTy g typ || isUnionTy g typ then Some g.obj_ty else diff --git a/src/fsharp/layout.fs b/src/fsharp/layout.fs index 0a59e85582a..2ee543d9b1f 100644 --- a/src/fsharp/layout.fs +++ b/src/fsharp/layout.fs @@ -109,6 +109,8 @@ module TaggedTextOps = let rightBracket = Internal.Utilities.StructuredFormat.TaggedTextOps.Literals.rightBracket let leftBrace = Internal.Utilities.StructuredFormat.TaggedTextOps.Literals.leftBrace let rightBrace = Internal.Utilities.StructuredFormat.TaggedTextOps.Literals.rightBrace + let leftBraceBar = Internal.Utilities.StructuredFormat.TaggedTextOps.Literals.leftBraceBar + let rightBraceBar = Internal.Utilities.StructuredFormat.TaggedTextOps.Literals.rightBraceBar let equals = Internal.Utilities.StructuredFormat.TaggedTextOps.Literals.equals let arrow = Internal.Utilities.StructuredFormat.TaggedTextOps.Literals.arrow let questionMark = Internal.Utilities.StructuredFormat.TaggedTextOps.Literals.questionMark diff --git a/src/fsharp/layout.fsi b/src/fsharp/layout.fsi index e2d1bcc7a3b..a9ced6d9f2a 100644 --- a/src/fsharp/layout.fsi +++ b/src/fsharp/layout.fsi @@ -104,6 +104,8 @@ module TaggedTextOps = val rightBracket : TaggedText val leftBrace: TaggedText val rightBrace : TaggedText + val leftBraceBar: TaggedText + val rightBraceBar : TaggedText val leftAngle: TaggedText val rightAngle: TaggedText val equals : TaggedText diff --git a/src/fsharp/lex.fsl b/src/fsharp/lex.fsl index cffda3b3ccb..1b13aab4e3e 100644 --- a/src/fsharp/lex.fsl +++ b/src/fsharp/lex.fsl @@ -560,11 +560,13 @@ rule token args skip = parse | "=" { EQUALS } | "[" { LBRACK } | "[|" { LBRACK_BAR } + | "{|" { LBRACE_BAR } | "<" { LESS false } | ">" { GREATER false } | "[<" { LBRACK_LESS } | "]" { RBRACK } | "|]" { BAR_RBRACK } + | "|}" { BAR_RBRACE } | ">]" { GREATER_RBRACK } | "{" { LBRACE } | "|" { BAR } diff --git a/src/fsharp/pars.fsy b/src/fsharp/pars.fsy index c36b1886418..bd6f1b12a33 100644 --- a/src/fsharp/pars.fsy +++ b/src/fsharp/pars.fsy @@ -197,8 +197,8 @@ let rangeOfLongIdent(lid:LongIdent) = %token OPEN OR REC THEN TO TRUE TRY TYPE VAL INLINE INTERFACE INSTANCE CONST %token WHEN WHILE WITH HASH AMP AMP_AMP QUOTE LPAREN RPAREN RPAREN_COMING_SOON RPAREN_IS_HERE STAR COMMA RARROW GREATER_BAR_RBRACK LPAREN_STAR_RPAREN %token QMARK QMARK_QMARK DOT COLON COLON_COLON COLON_GREATER COLON_QMARK_GREATER COLON_QMARK COLON_EQUALS SEMICOLON -%token SEMICOLON_SEMICOLON LARROW EQUALS LBRACK LBRACK_BAR LBRACK_LESS LBRACE -%token LBRACE_LESS BAR_RBRACK GREATER_RBRACE UNDERSCORE +%token SEMICOLON_SEMICOLON LARROW EQUALS LBRACK LBRACK_BAR LBRACE_BAR LBRACK_LESS LBRACE +%token BAR_RBRACK BAR_RBRACE UNDERSCORE %token BAR RBRACK RBRACE RBRACE_COMING_SOON RBRACE_IS_HERE MINUS DOLLAR %token GREATER_RBRACK STRUCT SIG %token STATIC MEMBER CLASS ABSTRACT OVERRIDE DEFAULT CONSTRUCTOR INHERIT @@ -1782,10 +1782,10 @@ memberCore: let args = if id.idText = "set" then match args with - | [SynPat.Paren(SynPat.Tuple (indexPats,_),indexPatRange);valuePat] when id.idText = "set" -> - [SynPat.Tuple(indexPats@[valuePat],unionRanges indexPatRange valuePat.Range)] + | [SynPat.Paren(SynPat.Tuple (false,indexPats,_),indexPatRange);valuePat] when id.idText = "set" -> + [SynPat.Tuple(false,indexPats@[valuePat],unionRanges indexPatRange valuePat.Range)] | [indexPat;valuePat] -> - [SynPat.Tuple(args,unionRanges indexPat.Range valuePat.Range)] + [SynPat.Tuple(false,args,unionRanges indexPat.Range valuePat.Range)] | [valuePat] -> [valuePat] | _ -> @@ -1945,11 +1945,11 @@ opt_classDefn: /* An 'inherits' definition in an object type definition */ inheritsDefn: - | INHERIT appTypeNonAtomicDeprecated optBaseSpec + | INHERIT atomTypeNonAtomicDeprecated optBaseSpec { let mDecl = unionRanges (rhs parseState 1) (($2): SynType).Range SynMemberDefn.Inherit($2,$3,mDecl) } - | INHERIT appTypeNonAtomicDeprecated opt_HIGH_PRECEDENCE_APP atomicExprAfterType optBaseSpec + | INHERIT atomTypeNonAtomicDeprecated opt_HIGH_PRECEDENCE_APP atomicExprAfterType optBaseSpec { let mDecl = unionRanges (rhs parseState 1) $4.Range SynMemberDefn.ImplicitInherit($2,$4,$5,mDecl) } @@ -2081,6 +2081,24 @@ braceFieldDeclList: | LBRACE error rbrace { [] } +anonRecdType: + | STRUCT braceBarFieldDeclListCore + { $2,true } + | braceBarFieldDeclListCore + { $1,false } + +/* The core of a record type definition */ +braceBarFieldDeclListCore: + | LBRACE_BAR recdFieldDeclList bar_rbrace + { $2 } + + | LBRACE_BAR recdFieldDeclList recover + { reportParseErrorAt (rhs parseState 1) (FSComp.SR.parsUnmatchedBraceBar()) + $2 } + + | LBRACE_BAR error bar_rbrace + { [] } + inlineAssemblyTyconRepr: | HASH stringOrKeywordString HASH { libraryOnlyError (lhs parseState) @@ -2210,8 +2228,8 @@ typeConstraint: | nm -> raiseParseErrorAt (rhs parseState 3) (FSComp.SR.parsUnexpectedIdentifier(nm)) } typarAlts: - | typarAlts OR appType { $3::$1 } - | appType { [$1] } + | typarAlts OR appType { $3::$1 } + | appType { [$1] } /* The core of a union type definition */ unionTypeRepr: @@ -2359,7 +2377,7 @@ openDecl: /*-------------------------------------------------------------------------*/ -/* F# Definitions and Expressions */ +/* F# Definitions, Types, Patterns and Expressions */ /* A 'let ...' or 'do ...' statement in the non-#light syntax */ defnBindings: @@ -2472,7 +2490,7 @@ cPrototype: SynExpr.Const(SynConst.String("extern was not given a DllImport attribute",rhs parseState 8),rhs parseState 8), mRhs) (fun attrs vis -> - let bindingId = SynPat.LongIdent (LongIdentWithDots([nm],[]), None, Some noInferredTypars, SynConstructorArgs.Pats [SynPat.Tuple(args,argsm)], vis, nmm) + let bindingId = SynPat.LongIdent (LongIdentWithDots([nm],[]), None, Some noInferredTypars, SynConstructorArgs.Pats [SynPat.Tuple(false,args,argsm)], vis, nmm) let binding = mkSynBinding (xmlDoc, bindingId) (vis, false, false, mBindLhs, NoSequencePointAtInvisibleBinding, Some rty ,rhsExpr, mRhs, [], attrs, None) @@ -2754,9 +2772,9 @@ headBindingPattern: | headBindingPattern BAR headBindingPattern { SynPat.Or($1,$3,rhs2 parseState 1 3) } | headBindingPattern COLON_COLON headBindingPattern - { SynPat.LongIdent (LongIdentWithDots(mkSynCaseName (rhs parseState 2) opNameCons,[]), None, None, SynConstructorArgs.Pats [SynPat.Tuple ([$1;$3],rhs2 parseState 1 3)],None,lhs parseState) } + { SynPat.LongIdent (LongIdentWithDots(mkSynCaseName (rhs parseState 2) opNameCons,[]), None, None, SynConstructorArgs.Pats [SynPat.Tuple (false,[$1;$3],rhs2 parseState 1 3)],None,lhs parseState) } | tuplePatternElements %prec pat_tuple - { SynPat.Tuple(List.rev $1, lhs parseState) } + { SynPat.Tuple(false,List.rev $1, lhs parseState) } | conjPatternElements %prec pat_conj { SynPat.Ands(List.rev $1, lhs parseState) } | constrPattern @@ -2790,7 +2808,7 @@ constrPattern: { let vis,lid = $1 in SynPat.LongIdent (lid,None,$2, $4,vis,lhs parseState) } | atomicPatternLongIdent opt_explicitValTyparDecls2 HIGH_PRECEDENCE_BRACK_APP atomicPatsOrNamePatPairs { let vis,lid = $1 in SynPat.LongIdent (lid,None,$2, $4,vis,lhs parseState) } - | COLON_QMARK atomType %prec pat_isinst + | COLON_QMARK atomTypeOrAnonRecdType %prec pat_isinst { SynPat.IsInst($2,lhs parseState) } | atomicPattern { $1 } @@ -2815,8 +2833,8 @@ atomicPattern: | quoteExpr { SynPat.QuoteExpr($1,lhs parseState) } | CHAR DOT_DOT CHAR { SynPat.DeprecatedCharRange ($1,$3,rhs2 parseState 1 3) } - | LBRACE recordPatternElements rbrace - { $2 } + | LBRACE recordPatternElementsAux rbrace + { let rs,m = $2 in SynPat.Record (rs,m) } | LBRACK listPatternElements RBRACK { SynPat.ArrayOrList(false,$2,lhs parseState) } | LBRACK_BAR listPatternElements BAR_RBRACK @@ -2850,10 +2868,10 @@ atomicPattern: { reportParseErrorAt (rhs parseState 1) (FSComp.SR.parsUnmatchedParen()) SynPat.Wild (lhs parseState)} | STRUCT LPAREN tupleParenPatternElements rparen - { SynPat.StructTuple(List.rev $3,lhs parseState) } + { SynPat.Tuple(true, List.rev $3,lhs parseState) } | STRUCT LPAREN tupleParenPatternElements recover { reportParseErrorAt (rhs parseState 2) (FSComp.SR.parsUnmatchedParen()); - SynPat.StructTuple(List.rev $3,lhs parseState) } + SynPat.Tuple(true, List.rev $3,lhs parseState) } | STRUCT LPAREN error rparen { (* silent recovery *) SynPat.Wild (lhs parseState) } | STRUCT LPAREN recover @@ -2899,7 +2917,7 @@ parenPattern: | parenPattern BAR parenPattern { SynPat.Or($1,$3,rhs2 parseState 1 3) } | tupleParenPatternElements - { SynPat.Tuple(List.rev $1,lhs parseState) } + { SynPat.Tuple(false,List.rev $1,lhs parseState) } | conjParenPatternElements { SynPat.Ands(List.rev $1,rhs2 parseState 1 3) } | parenPattern COLON typeWithTypeConstraints %prec paren_pat_colon @@ -2909,7 +2927,7 @@ parenPattern: { let lhsm = lhs parseState SynPat.Attrib($2,$1,lhsm) } | parenPattern COLON_COLON parenPattern - { SynPat.LongIdent (LongIdentWithDots(mkSynCaseName (rhs parseState 2) opNameCons,[]), None, None, SynConstructorArgs.Pats [ SynPat.Tuple ([$1;$3],rhs2 parseState 1 3) ],None,lhs parseState) } + { SynPat.LongIdent (LongIdentWithDots(mkSynCaseName (rhs parseState 2) opNameCons,[]), None, None, SynConstructorArgs.Pats [ SynPat.Tuple (false,[$1;$3],rhs2 parseState 1 3) ],None,lhs parseState) } | constrPattern { $1 } tupleParenPatternElements: @@ -2924,9 +2942,6 @@ conjParenPatternElements: | parenPattern AMP parenPattern { $3 :: $1 :: [] } -recordPatternElements: - | recordPatternElementsAux { let rs,m = $1 in SynPat.Record (rs,m) } - recordPatternElementsAux: /* Fix 1190 */ | recordPatternElement opt_seps { [$1],lhs parseState } @@ -3329,7 +3344,7 @@ declExpr: | declExpr COLON_EQUALS declExpr { mkSynInfix (rhs parseState 2) $1 ":=" $3 } | minusExpr LARROW declExprBlock { mkSynAssign $1 $3 } /* | minusExpr LARROW recover { mkSynAssign $1 (arbExpr("assignRhs",rhs parseState 2)) } */ - | tupleExpr %prec expr_tuple { let exprs,commas = $1 in SynExpr.Tuple(List.rev exprs, List.rev commas, (commas.Head, exprs) ||> unionRangeWithListBy (fun e -> e.Range) ) } + | tupleExpr %prec expr_tuple { let exprs,commas = $1 in SynExpr.Tuple(false, List.rev exprs, List.rev commas, (commas.Head, exprs) ||> unionRangeWithListBy (fun e -> e.Range) ) } | declExpr JOIN_IN declExpr { SynExpr.JoinIn($1,rhs parseState 2,$3,unionRanges $1.Range $3.Range) } | declExpr BAR_BAR declExpr { mkSynInfix (rhs parseState 2) $1 "||" $3 } | declExpr INFIX_BAR_OP declExpr { mkSynInfix (rhs parseState 2) $1 $2 $3 } @@ -3346,7 +3361,7 @@ declExpr: | declExpr GREATER declExpr { mkSynInfix (rhs parseState 2) $1 ">" $3 } | declExpr INFIX_AT_HAT_OP declExpr { mkSynInfix (rhs parseState 2) $1 $2 $3 } | declExpr PERCENT_OP declExpr { mkSynInfix (rhs parseState 2) $1 $2 $3 } - | declExpr COLON_COLON declExpr { SynExpr.App (ExprAtomicFlag.NonAtomic, true, mkSynIdGet (rhs parseState 2) opNameCons,SynExpr.Tuple ([$1;$3],[rhs parseState 2],unionRanges $1.Range $3.Range),unionRanges $1.Range $3.Range) } + | declExpr COLON_COLON declExpr { SynExpr.App (ExprAtomicFlag.NonAtomic, true, mkSynIdGet (rhs parseState 2) opNameCons,SynExpr.Tuple (false,[$1;$3],[rhs parseState 2],unionRanges $1.Range $3.Range),unionRanges $1.Range $3.Range) } | declExpr PLUS_MINUS_OP declExpr { mkSynInfix (rhs parseState 2) $1 $2 $3 } | declExpr MINUS declExpr { mkSynInfix (rhs parseState 2) $1 "-" $3 } | declExpr STAR declExpr { mkSynInfix (rhs parseState 2) $1 "*" $3 } @@ -3382,7 +3397,7 @@ declExpr: | declExpr PERCENT_OP OBLOCKEND_COMING_SOON { reportParseErrorAt (rhs parseState 2) (FSComp.SR.parsUnfinishedExpression($2)) exprFromParseError(mkSynInfix (rhs parseState 2) $1 $2 (arbExpr("declExprInfix",(rhs parseState 3).StartRange))) } | declExpr COLON_COLON OBLOCKEND_COMING_SOON { reportParseErrorAt (rhs parseState 2) (FSComp.SR.parsUnfinishedExpression("::")) - SynExpr.App (ExprAtomicFlag.NonAtomic, true, mkSynIdGet (rhs parseState 2) opNameCons,SynExpr.Tuple ([$1;(arbExpr("declExprInfix",(rhs parseState 3).StartRange))],[rhs parseState 2],unionRanges $1.Range (rhs parseState 3).StartRange),unionRanges $1.Range (rhs parseState 3).StartRange) } + SynExpr.App (ExprAtomicFlag.NonAtomic, true, mkSynIdGet (rhs parseState 2) opNameCons,SynExpr.Tuple (false,[$1;(arbExpr("declExprInfix",(rhs parseState 3).StartRange))],[rhs parseState 2],unionRanges $1.Range (rhs parseState 3).StartRange),unionRanges $1.Range (rhs parseState 3).StartRange) } | declExpr PLUS_MINUS_OP OBLOCKEND_COMING_SOON { reportParseErrorAt (rhs parseState 2) (FSComp.SR.parsUnfinishedExpression($2)) exprFromParseError(mkSynInfix (rhs parseState 2) $1 $2 (arbExpr("declExprInfix",(rhs parseState 3).StartRange))) } | declExpr MINUS OBLOCKEND_COMING_SOON { reportParseErrorAt (rhs parseState 2) (FSComp.SR.parsUnfinishedExpression("-")) @@ -3538,9 +3553,9 @@ minusExpr: { SynExpr.AddressOf(true,$2,rhs parseState 1,unionRanges (rhs parseState 1) $2.Range) } | AMP_AMP minusExpr { SynExpr.AddressOf(false,$2,rhs parseState 1, unionRanges (rhs parseState 1) $2.Range) } - | NEW appTypeNonAtomicDeprecated opt_HIGH_PRECEDENCE_APP atomicExprAfterType + | NEW atomTypeNonAtomicDeprecated opt_HIGH_PRECEDENCE_APP atomicExprAfterType { SynExpr.New(false,$2,$4,unionRanges (rhs parseState 1) $4.Range) } - | NEW appTypeNonAtomicDeprecated opt_HIGH_PRECEDENCE_APP error + | NEW atomTypeNonAtomicDeprecated opt_HIGH_PRECEDENCE_APP error { SynExpr.New(false,$2,arbExpr("minusExpr",(rhs parseState 4)),unionRanges (rhs parseState 1) ($2).Range) } | NEW error { arbExpr("minusExpr2",(rhs parseState 1)) } @@ -3620,10 +3635,10 @@ atomicExpr: // silent recovery exprFromParseError (SynExpr.ArrayOrList(false,[ ], rhs parseState 1)),false } | STRUCT LPAREN tupleExpr rparen - { let exprs,commas = $3 in SynExpr.StructTuple(List.rev exprs, List.rev commas, (commas.Head, exprs) ||> unionRangeWithListBy (fun e -> e.Range) ), false } + { let exprs,commas = $3 in SynExpr.Tuple(true, List.rev exprs, List.rev commas, (commas.Head, exprs) ||> unionRangeWithListBy (fun e -> e.Range) ), false } | STRUCT LPAREN tupleExpr recover { reportParseErrorAt (rhs parseState 2) (FSComp.SR.parsUnmatchedBracket()); - let exprs,commas = $3 in SynExpr.StructTuple(List.rev exprs, List.rev commas, (commas.Head, exprs) ||> unionRangeWithListBy (fun e -> e.Range) ), false } + let exprs,commas = $3 in SynExpr.Tuple(true, List.rev exprs, List.rev commas, (commas.Head, exprs) ||> unionRangeWithListBy (fun e -> e.Range) ), false } | atomicExprAfterType { $1,false } @@ -3699,6 +3714,8 @@ atomicExprAfterType: { $1 } | braceExpr { $1 } + | braceBarExpr + { $1 } | NULL { SynExpr.Null(lhs parseState) } | FALSE @@ -3925,6 +3942,10 @@ forLoopRange: | parenPattern EQUALS rangeSequenceExpr { raiseParseErrorAt (rhs parseState 2) (FSComp.SR.parsUnexpectedSymbolEqualsInsteadOfIn()) } +forLoopDirection: + | TO { true } + | DOWNTO { false } + inlineAssemblyExpr: | HASH stringOrKeywordString opt_inlineAssemblyTypeArg opt_curriedArgExprs opt_inlineAssemblyReturnTypes HASH { libraryOnlyWarning (lhs parseState) @@ -3960,7 +3981,7 @@ opt_inlineAssemblyReturnTypes: { [] } recdExpr: - | INHERIT appTypeNonAtomicDeprecated opt_HIGH_PRECEDENCE_APP opt_atomicExprAfterType recdExprBindings opt_seps_recd + | INHERIT atomTypeNonAtomicDeprecated opt_HIGH_PRECEDENCE_APP opt_atomicExprAfterType recdExprBindings opt_seps_recd { let arg = match $4 with None -> mkSynUnit (lhs parseState) | Some e -> e let l = List.rev $5 let dummyField = mkRecdField (LongIdentWithDots([], [])) // dummy identifier, it will be discarded @@ -4001,7 +4022,6 @@ recdExpr: | UNDERSCORE EQUALS declExprBlock recdExprBindings opt_seps_recd { reportParseErrorAt (rhs parseState 1) (FSComp.SR.parsUnderscoreInvalidFieldName()) let f = mkUnderscoreRecdField (rhs parseState 1) - let l = List.rev $4 let l = rebindRanges (f, Some $3) l $5 (None, None, l) } @@ -4030,6 +4050,7 @@ seps_recd: | SEMICOLON OBLOCKSEP { (rhs2 parseState 1 2), Some (rhs parseState 1).End } | OBLOCKSEP SEMICOLON { (rhs2 parseState 1 2), Some (rhs parseState 2).End } + /* identifier can start from the underscore */ @@ -4082,19 +4103,19 @@ objExpr: let fullRange = match $3 with [] -> (rhs parseState 1) | _ -> (rhs2 parseState 1 3) fullRange, (fun m -> let (a,b) = $1 in SynExpr.ObjExpr(a,b,[],$3, mNewExpr, m)) } - | NEW appTypeNonAtomicDeprecated + | NEW atomTypeNonAtomicDeprecated { let mNewExpr = rhs parseState 1 (rhs2 parseState 1 2), (fun m -> let (a,b) = $2,None in SynExpr.ObjExpr(a,b,[],[], mNewExpr, m)) } objExprBaseCall: - | NEW appTypeNonAtomicDeprecated opt_HIGH_PRECEDENCE_APP atomicExprAfterType baseSpec + | NEW atomTypeNonAtomicDeprecated opt_HIGH_PRECEDENCE_APP atomicExprAfterType baseSpec { ($2, Some($4,Some($5))) } - | NEW appTypeNonAtomicDeprecated opt_HIGH_PRECEDENCE_APP atomicExprAfterType + | NEW atomTypeNonAtomicDeprecated opt_HIGH_PRECEDENCE_APP atomicExprAfterType { ($2, Some($4,None)) } - | NEW appTypeNonAtomicDeprecated + | NEW atomTypeNonAtomicDeprecated { $2,None } @@ -4138,9 +4159,45 @@ objExprInterface: | interfaceMember appType opt_objExprBindings opt_declEnd opt_OBLOCKSEP { InterfaceImpl($2, $3, lhs parseState) } -forLoopDirection: - | TO { true } - | DOWNTO { false } +braceBarExpr: + | STRUCT braceBarExprCore + { $2 true } + | braceBarExprCore + { $1 false } + +braceBarExprCore: + | LBRACE_BAR oneOrMoreRecdExprBindings bar_rbrace + { let flds = $2 + let m = rhs2 parseState 1 3 + (fun isStruct -> SynExpr.AnonRecd(isStruct,flds,m)) } + + | LBRACE_BAR oneOrMoreRecdExprBindings recover + { reportParseErrorAt (rhs parseState 1) (FSComp.SR.parsUnmatchedBraceBar()) + let flds = $2 + let m = rhs2 parseState 1 2 + (fun isStruct -> SynExpr.AnonRecd(isStruct,flds,m)) } + + | LBRACE_BAR error bar_rbrace + { // silent recovery + let m = rhs2 parseState 1 3 + (fun _ -> arbExpr("braceBarExpr",m)) } + + | LBRACE_BAR recover + { reportParseErrorAt (rhs parseState 1) (FSComp.SR.parsUnmatchedBraceBar()) + let m = rhs2 parseState 1 1 + (fun isStruct -> SynExpr.AnonRecd(isStruct,[],m)) } + + | LBRACE_BAR bar_rbrace + { let m = rhs2 parseState 1 2 + (fun isStruct -> SynExpr.AnonRecd(isStruct,[],m)) } + +oneOrMoreRecdExprBindings: + | recdBinding recdExprBindings + { (($1, None) :: List.rev $2) |> List.choose (function + | (((LongIdentWithDots([id],_),_),Some e),_) -> Some (id,e) + | (((LongIdentWithDots([id],_),_),None),_) -> Some (id, arbExpr("anonField",id.idRange)) + | _ -> reportParseErrorAt (rhs parseState 1) (FSComp.SR.parsInvalidAnonRecdType()); None) } + anonLambdaExpr: | FUN atomicPatterns RARROW typedSeqExprBlock @@ -4224,7 +4281,7 @@ topType: topTupleType: | topAppType STAR topTupleTypeElements - { let ty,mdata = $1 in let tys,mdatas = List.unzip $3 in (SynType.Tuple(List.map (fun ty -> (false,ty)) (ty ::tys), lhs parseState)),(mdata :: mdatas) } + { let ty,mdata = $1 in let tys,mdatas = List.unzip $3 in (SynType.Tuple(false,List.map (fun ty -> (false,ty)) (ty ::tys), lhs parseState)),(mdata :: mdatas) } | topAppType { let ty,mdata = $1 in ty,[mdata] } @@ -4274,15 +4331,15 @@ typEOF: tupleType: | appType STAR tupleOrQuotTypeElements - { SynType.Tuple((false,$1) :: $3,lhs parseState) } + { SynType.Tuple(false,(false,$1) :: $3,lhs parseState) } | INFIX_STAR_DIV_MOD_OP tupleOrQuotTypeElements { if $1 <> "/" then reportParseErrorAt (rhs parseState 1) (FSComp.SR.parsUnexpectedInfixOperator()); - SynType.Tuple((true, SynType.StaticConstant (SynConst.Int32 1, lhs parseState)):: $2, lhs parseState) } + SynType.Tuple(false,(true, SynType.StaticConstant (SynConst.Int32 1, lhs parseState)):: $2, lhs parseState) } | appType INFIX_STAR_DIV_MOD_OP tupleOrQuotTypeElements { if $2 <> "/" then reportParseErrorAt (rhs parseState 1) (FSComp.SR.parsUnexpectedInfixOperator()); - SynType.Tuple((true,$1) :: $3, lhs parseState) } + SynType.Tuple(false,(true,$1) :: $3, lhs parseState) } | appType %prec prec_tuptyp_prefix { $1 } @@ -4298,13 +4355,6 @@ tupleOrQuotTypeElements: | appType %prec prec_tuptyptail_prefix { [(false,$1)] } -tupleTypeElements: - | appType STAR tupleTypeElements - { $1 :: $3 } - - | appType %prec prec_tuptyptail_prefix - { [$1] } - appTypeCon: | path %prec prec_atomtyp_path { SynType.LongIdent($1) } @@ -4378,57 +4428,37 @@ typeArgListElements: { [], [] } powerType: - | atomType + | atomTypeOrAnonRecdType { $1 } - | atomType INFIX_AT_HAT_OP atomicRationalConstant + | atomTypeOrAnonRecdType INFIX_AT_HAT_OP atomicRationalConstant { if $2 <> "^" && $2 <> "^-" then reportParseErrorAt (rhs parseState 2) (FSComp.SR.parsUnexpectedInfixOperator()); if $2 = "^-" then SynType.MeasurePower($1, SynRationalConst.Negate($3), lhs parseState) else SynType.MeasurePower($1, $3, lhs parseState) } -/* Like appType but gives a deprecation error when a non-atomic type is used */ -appTypeNonAtomicDeprecated: - | appType arrayTypeSuffix - { deprecatedWithError (FSComp.SR.parsNonAtomicType()) (lhs parseState); - SynType.Array($2,$1,lhs parseState) } - - | appType HIGH_PRECEDENCE_BRACK_APP arrayTypeSuffix /* only HPA for "name[]" allowed here */ - { deprecatedWithError (FSComp.SR.parsNonAtomicType()) (lhs parseState); - SynType.Array($3,$1,lhs parseState) } - - | appType appTypeConPower - { let mWhole = unionRanges (rhs parseState 1) $2.Range // note: use "rhs parseState 1" to deal with parens in "(int) list" - deprecatedWithError (FSComp.SR.parsNonAtomicType()) mWhole; - SynType.App($2, None, [$1], [], None, true, mWhole) } +/* Like appType but gives a deprecation error when a non-atomic type is used */ +/* Also, doesn't start with '{|' */ +atomTypeNonAtomicDeprecated: | LPAREN appTypePrefixArguments rparen appTypeConPower { let args, commas = $2 mlCompatWarning (FSComp.SR.parsMultiArgumentGenericTypeFormDeprecated()) (unionRanges (rhs parseState 1) $4.Range); SynType.App($4, None, args, commas, None, true, unionRanges (rhs parseState 1) $4.Range) } - | powerTypeNonAtomicDeprecated + | atomType { $1 } - | typar COLON_GREATER typ - { deprecatedWithError (FSComp.SR.parsNonAtomicType()) (lhs parseState); - let tp,typ = $1,$3 - let m = lhs parseState - SynType.WithGlobalConstraints(SynType.Var (tp, rhs parseState 1), [WhereTyparSubtypeOfType(tp,typ,m)],m) } - - | UNDERSCORE COLON_GREATER typ %prec COLON_GREATER - { deprecatedWithError (FSComp.SR.parsNonAtomicType()) (lhs parseState); - SynType.HashConstraint($3, lhs parseState) } - -/* Like powerType but gives a deprecation warning if a non-atomic type is used */ -powerTypeNonAtomicDeprecated: +atomTypeOrAnonRecdType: | atomType - { $1 } + { $1 } + | anonRecdType + { let flds,isStruct = $1 + let flds2 = + flds |> List.choose (function + | (Field([],false,Some id,ty,false,_xmldoc,None,_m)) -> Some (id,ty) + | _ -> reportParseErrorAt (rhs parseState 1) (FSComp.SR.parsInvalidAnonRecdType()); None) + SynType.AnonRecd (isStruct,flds2, rhs parseState 1) } - | atomType INFIX_AT_HAT_OP atomicRationalConstant - { if $2 <> "^" && $2 <> "^-" then reportParseErrorAt (rhs parseState 2) (FSComp.SR.parsUnexpectedInfixOperator()); - deprecatedWithError (FSComp.SR.parsNonAtomicType()) (lhs parseState); - if $2 = "^-" then SynType.MeasurePower($1, SynRationalConst.Negate($3), lhs parseState) - else SynType.MeasurePower($1, $3, lhs parseState) } /* Any tokens in this grammar must be added to the lex filter rule 'peekAdjacentTypars' */ @@ -4451,11 +4481,11 @@ atomType: $2 } | STRUCT LPAREN appType STAR tupleOrQuotTypeElements rparen - { SynType.StructTuple((false,$3) :: $5,lhs parseState) } + { SynType.Tuple(true, (false,$3) :: $5,lhs parseState) } | STRUCT LPAREN appType STAR tupleOrQuotTypeElements recover { reportParseErrorAt (rhs parseState 2) (FSComp.SR.parsUnmatchedParen()) - SynType.StructTuple((false,$3) :: $5,lhs parseState) } + SynType.Tuple(true, (false,$3) :: $5,lhs parseState) } | STRUCT LPAREN appType STAR recover { reportParseErrorAt (rhs parseState 2) (FSComp.SR.parsUnmatchedParen()) @@ -4927,6 +4957,9 @@ rbrace: | RBRACE_IS_HERE { } | RBRACE { } +bar_rbrace: + | BAR_RBRACE { } + rparen: | RPAREN_COMING_SOON rparen { } | RPAREN_IS_HERE { } diff --git a/src/fsharp/service/ServiceAssemblyContent.fs b/src/fsharp/service/ServiceAssemblyContent.fs index f4a7ac416c3..8702a6a7595 100644 --- a/src/fsharp/service/ServiceAssemblyContent.fs +++ b/src/fsharp/service/ServiceAssemblyContent.fs @@ -530,7 +530,7 @@ module ParsedInput = | SynTypeConstraint.WhereTyparSupportsMember (ts, sign, _) -> List.iter walkType ts; walkMemberSig sign and walkPat = function - | SynPat.Tuple (pats, _) + | SynPat.Tuple (_,pats, _) | SynPat.ArrayOrList (_, pats, _) | SynPat.Ands (pats, _) -> List.iter walkPat pats | SynPat.Named (pat, ident, _, _, _) -> @@ -578,7 +578,7 @@ module ParsedInput = | SynType.LongIdent ident -> addLongIdentWithDots ident | SynType.App (ty, _, types, _, _, _, _) -> walkType ty; List.iter walkType types | SynType.LongIdentApp (_, _, _, types, _, _, _) -> List.iter walkType types - | SynType.Tuple (ts, _) -> ts |> List.iter (fun (_, t) -> walkType t) + | SynType.Tuple (_, ts, _) -> ts |> List.iter (fun (_, t) -> walkType t) | SynType.WithGlobalConstraints (t, typeConstraints, _) -> walkType t; List.iter walkTypeConstraint typeConstraints | _ -> () @@ -616,7 +616,7 @@ module ParsedInput = | SynExpr.TypeTest (e, t, _) | SynExpr.Upcast (e, t, _) | SynExpr.Downcast (e, t, _) -> walkExpr e; walkType t - | SynExpr.Tuple (es, _, _) + | SynExpr.Tuple (_, es, _, _) | Sequentials es | SynExpr.ArrayOrList (_, es, _) -> List.iter walkExpr es | SynExpr.App (_, _, e1, e2, _) @@ -1003,4 +1003,4 @@ module ParsedInput = match tryFindNearestPointAndModules currentLine ast insertionPoint with | Some (scope, _, point), modules -> Some (findBestPositionToInsertOpenDeclaration modules scope point entity) - | _ -> None \ No newline at end of file + | _ -> None diff --git a/src/fsharp/service/ServiceDeclarationLists.fs b/src/fsharp/service/ServiceDeclarationLists.fs index 5acc998cf46..69c6eef3b48 100644 --- a/src/fsharp/service/ServiceDeclarationLists.fs +++ b/src/fsharp/service/ServiceDeclarationLists.fs @@ -284,6 +284,10 @@ module internal DescriptionListsImpl = let _prettyTyparInst, prettyRetTyL = NicePrint.prettyLayoutOfUncurriedSig denv item.TyparInst [] rfinfo.FieldType [], prettyRetTyL + | Item.AnonRecdField(_anonInfo,tys,i, _) -> + let _prettyTyparInst, prettyRetTyL = NicePrint.prettyLayoutOfUncurriedSig denv item.TyparInst [] tys.[i] + [], prettyRetTyL + | Item.ILField finfo -> let _prettyTyparInst, prettyRetTyL = NicePrint.prettyLayoutOfUncurriedSig denv item.TyparInst [] (finfo.FieldType(amap,m)) [], prettyRetTyL @@ -404,6 +408,7 @@ module internal DescriptionListsImpl = | Item.UnionCase _ | Item.ActivePatternCase _ -> FSharpGlyph.EnumMember | Item.ExnCase _ -> FSharpGlyph.Exception + | Item.AnonRecdField _ -> FSharpGlyph.Field | Item.RecdField _ -> FSharpGlyph.Field | Item.ILField _ -> FSharpGlyph.Field | Item.Event _ -> FSharpGlyph.Event diff --git a/src/fsharp/service/ServiceInterfaceStubGenerator.fs b/src/fsharp/service/ServiceInterfaceStubGenerator.fs index 04b09ec157b..34c99cd8e04 100644 --- a/src/fsharp/service/ServiceInterfaceStubGenerator.fs +++ b/src/fsharp/service/ServiceInterfaceStubGenerator.fs @@ -151,8 +151,8 @@ type internal InterfaceData = None | SynType.Anon _ -> Some "_" - | SynType.Tuple(ts, _) -> - Some (ts |> Seq.choose (snd >> (|TypeIdent|_|)) |> String.concat " * ") + | SynType.AnonRecd (_, ts, _) -> + Some (ts |> Seq.choose (snd >> (|TypeIdent|_|)) |> String.concat "; ") | SynType.Array(dimension, TypeIdent typeName, _) -> Some (sprintf "%s [%s]" typeName (new String(',', dimension-1))) | SynType.MeasurePower(TypeIdent typeName, RationalConst power, _) -> @@ -760,7 +760,7 @@ module internal InterfaceStubGenerator = | SynExpr.Typed(synExpr, _synType, _range) -> walkExpr synExpr - | SynExpr.Tuple(synExprList, _, _range) + | SynExpr.Tuple(_, synExprList, _, _range) | SynExpr.ArrayOrList(_, synExprList, _range) -> List.tryPick walkExpr synExprList diff --git a/src/fsharp/service/ServiceLexing.fs b/src/fsharp/service/ServiceLexing.fs index ce78b9101e6..393579bb5ee 100755 --- a/src/fsharp/service/ServiceLexing.fs +++ b/src/fsharp/service/ServiceLexing.fs @@ -237,16 +237,16 @@ module internal TokenClassifications = | RPAREN | RPAREN_COMING_SOON | RPAREN_IS_HERE -> (FSharpTokenColorKind.Punctuation,FSharpTokenCharKind.Delimiter, FSharpTokenTriggerClass.ParamEnd ||| FSharpTokenTriggerClass.MatchBraces) - | LBRACK_LESS | LBRACE_LESS + | LBRACK_LESS -> (FSharpTokenColorKind.Punctuation,FSharpTokenCharKind.Delimiter,FSharpTokenTriggerClass.None ) - | LQUOTE _ | LBRACK | LBRACE | LBRACK_BAR + | LQUOTE _ | LBRACK | LBRACE | LBRACK_BAR | LBRACE_BAR -> (FSharpTokenColorKind.Punctuation,FSharpTokenCharKind.Delimiter,FSharpTokenTriggerClass.MatchBraces ) - | GREATER_RBRACE | GREATER_RBRACK | GREATER_BAR_RBRACK + | GREATER_RBRACK | GREATER_BAR_RBRACK -> (FSharpTokenColorKind.Punctuation,FSharpTokenCharKind.Delimiter,FSharpTokenTriggerClass.None ) - | RQUOTE _ | RBRACK | RBRACE | RBRACE_COMING_SOON | RBRACE_IS_HERE | BAR_RBRACK + | RQUOTE _ | RBRACK | RBRACE | RBRACE_COMING_SOON | RBRACE_IS_HERE | BAR_RBRACK | BAR_RBRACE -> (FSharpTokenColorKind.Punctuation,FSharpTokenCharKind.Delimiter,FSharpTokenTriggerClass.MatchBraces ) | PUBLIC | PRIVATE | INTERNAL | BASE | GLOBAL diff --git a/src/fsharp/service/ServiceParamInfoLocations.fs b/src/fsharp/service/ServiceParamInfoLocations.fs index 987d10c2de7..1acdac88a13 100755 --- a/src/fsharp/service/ServiceParamInfoLocations.fs +++ b/src/fsharp/service/ServiceParamInfoLocations.fs @@ -96,7 +96,7 @@ module internal NoteworthyParamInfoLocationsImpl = // see bug 345385. let rec searchSynArgExpr traverseSynExpr pos expr = match expr with - | SynExprParen((SynExpr.Tuple(synExprList, commaRanges, _tupleRange) as synExpr), _lpRange, rpRangeOpt, parenRange) -> // tuple argument + | SynExprParen((SynExpr.Tuple(false, synExprList, commaRanges, _tupleRange) as synExpr), _lpRange, rpRangeOpt, parenRange) -> // tuple argument let inner = traverseSynExpr synExpr match inner with | None -> @@ -108,7 +108,7 @@ module internal NoteworthyParamInfoLocationsImpl = NotFound, None | _ -> NotFound, None - | SynExprParen(SynExprParen(SynExpr.Tuple(_, _, _), _, _, _) as synExpr, _, rpRangeOpt, parenRange) -> // f((x, y)) is special, single tuple arg + | SynExprParen(SynExprParen(SynExpr.Tuple(false, _, _, _), _, _, _) as synExpr, _, rpRangeOpt, parenRange) -> // f((x, y)) is special, single tuple arg handleSingleArg traverseSynExpr (pos, synExpr, parenRange, rpRangeOpt) // dig into multiple parens diff --git a/src/fsharp/service/ServiceParseTreeWalk.fs b/src/fsharp/service/ServiceParseTreeWalk.fs index 4a07d826880..3f1de0e7e84 100755 --- a/src/fsharp/service/ServiceParseTreeWalk.fs +++ b/src/fsharp/service/ServiceParseTreeWalk.fs @@ -191,9 +191,10 @@ module public AstTraversal = |> pick expr | SynExpr.Const(_synConst, _range) -> None | SynExpr.Typed(synExpr, synType, _range) -> [ traverseSynExpr synExpr; traverseSynType synType ] |> List.tryPick id - | SynExpr.Tuple(synExprList, _, _range) - | SynExpr.StructTuple(synExprList, _, _range) -> synExprList |> List.map (fun x -> dive x x.Range traverseSynExpr) |> pick expr + | SynExpr.Tuple(_, synExprList, _, _range) | SynExpr.ArrayOrList(_, synExprList, _range) -> synExprList |> List.map (fun x -> dive x x.Range traverseSynExpr) |> pick expr + + | SynExpr.AnonRecd(_isStruct, synExprList, _range) -> synExprList |> List.map snd |> List.map (fun x -> dive x x.Range traverseSynExpr) |> pick expr | SynExpr.Record(inheritOpt,copyOpt,fields, _range) -> [ let diveIntoSeparator offsideColumn scPosOpt copyOpt = @@ -455,8 +456,7 @@ module public AstTraversal = | SynPat.Paren (p, _) -> traversePat p | SynPat.Or (p1, p2, _) -> [ p1; p2] |> List.tryPick traversePat | SynPat.Ands (ps, _) - | SynPat.Tuple (ps, _) - | SynPat.StructTuple (ps, _) + | SynPat.Tuple (_, ps, _) | SynPat.ArrayOrList (_, ps, _) -> ps |> List.tryPick traversePat | SynPat.Attrib (p, _, _) -> traversePat p | SynPat.LongIdent(_, _, _, args, _, _) -> @@ -485,8 +485,7 @@ module public AstTraversal = | SynType.Array (_, ty, _) -> traverseSynType ty | SynType.StaticConstantNamed (ty1, ty2, _) | SynType.MeasureDivide (ty1, ty2, _) -> [ty1; ty2] |> List.tryPick traverseSynType - | SynType.Tuple (tys, _) - | SynType.StructTuple (tys, _) -> tys |> List.map snd |> List.tryPick traverseSynType + | SynType.Tuple (_, tys, _) -> tys |> List.map snd |> List.tryPick traverseSynType | SynType.StaticConstantExpr (expr, _) -> traverseSynExpr [] expr | SynType.Anon _ -> None | _ -> None diff --git a/src/fsharp/service/ServiceStructure.fs b/src/fsharp/service/ServiceStructure.fs index ffe2461d959..0c55b379e67 100644 --- a/src/fsharp/service/ServiceStructure.fs +++ b/src/fsharp/service/ServiceStructure.fs @@ -371,8 +371,7 @@ module Structure = // subtract columns so the @@> or @> is not collapsed rcheck Scope.Quote Collapse.Same r (Range.modBoth (if isRaw then 3 else 2) (if isRaw then 3 else 2) r) parseExpr e - | SynExpr.Tuple (es,_,r) - | SynExpr.StructTuple(es,_,r) -> + | SynExpr.Tuple (_, es, _, r) -> rcheck Scope.Tuple Collapse.Same r r List.iter parseExpr es | SynExpr.Paren (e,_,_,_) -> @@ -849,4 +848,4 @@ module Structure = List.iter parseModuleOrNamespaceSigs moduleSigs getCommentRanges sourceLines - acc :> seq<_> \ No newline at end of file + acc :> seq<_> diff --git a/src/fsharp/service/ServiceUntypedParse.fs b/src/fsharp/service/ServiceUntypedParse.fs index 1405443c42a..5af088ff525 100755 --- a/src/fsharp/service/ServiceUntypedParse.fs +++ b/src/fsharp/service/ServiceUntypedParse.fs @@ -218,15 +218,17 @@ type FSharpParseFileResults(errors: FSharpErrorInfo[], input: Ast.ParsedInput op yield! walkExpr false e2 | SynExpr.ArrayOrList (_,es,_) - | SynExpr.Tuple (es,_,_) - | SynExpr.StructTuple (es,_,_) -> + | SynExpr.Tuple (_,es,_,_) -> yield! walkExprs es | SynExpr.Record (_,copyExprOpt,fs,_) -> match copyExprOpt with | Some (e,_) -> yield! walkExpr true e | None -> () - yield! walkExprs (List.map (fun (_, v, _) -> v) fs |> List.choose id) + yield! walkExprs (fs |> List.choose p23) + + | SynExpr.AnonRecd (_isStruct, fs, _) -> + yield! walkExprs (fs |> List.map snd) | SynExpr.ObjExpr (_,_,bs,is,_,_) -> yield! walkBinds bs @@ -719,7 +721,7 @@ module UntypedParseImpl = List.tryPick walkTyparDecl typars |> Option.orElse (List.tryPick walkTypeConstraint constraints))) |> Option.orElse (List.tryPick walkPat pats) - | SynPat.Tuple(pats, _) -> List.tryPick walkPat pats + | SynPat.Tuple(_,pats, _) -> List.tryPick walkPat pats | SynPat.Paren(pat, _) -> walkPat pat | SynPat.ArrayOrList(_, pats, _) -> List.tryPick walkPat pats | SynPat.IsInst(t, _) -> walkType t @@ -752,7 +754,7 @@ module UntypedParseImpl = | SynType.App(ty, _, types, _, _, _, _) -> walkType ty |> Option.orElse (List.tryPick walkType types) | SynType.LongIdentApp(_, _, _, types, _, _, _) -> List.tryPick walkType types - | SynType.Tuple(ts, _) -> ts |> List.tryPick (fun (_, t) -> walkType t) + | SynType.Tuple(_,ts, _) -> ts |> List.tryPick (fun (_, t) -> walkType t) | SynType.Array(_, t, _) -> walkType t | SynType.Fun(t1, t2, _) -> walkType t1 |> Option.orElse (walkType t2) | SynType.WithGlobalConstraints(t, _, _) -> walkType t @@ -780,7 +782,7 @@ module UntypedParseImpl = | SynExpr.Paren (e, _, _, _) -> walkExprWithKind parentKind e | SynExpr.Quote(_, _, e, _, _) -> walkExprWithKind parentKind e | SynExpr.Typed(e, _, _) -> walkExprWithKind parentKind e - | SynExpr.Tuple(es, _, _) -> List.tryPick (walkExprWithKind parentKind) es + | SynExpr.Tuple(_, es, _, _) -> List.tryPick (walkExprWithKind parentKind) es | SynExpr.ArrayOrList(_, es, _) -> List.tryPick (walkExprWithKind parentKind) es | SynExpr.Record(_, _, fields, r) -> ifPosInRange r (fun _ -> @@ -1050,7 +1052,7 @@ module UntypedParseImpl = let findSetters argList = match argList with - | SynExpr.Paren(SynExpr.Tuple(parameters, _, _), _, _, _) -> + | SynExpr.Paren(SynExpr.Tuple(false, parameters, _, _), _, _, _) -> let setters = HashSet() for p in parameters do match p with @@ -1111,7 +1113,7 @@ module UntypedParseImpl = match path with | TS.Expr(SynExpr.Paren _)::TS.Expr(NewObjectOrMethodCall(args))::_ -> if Option.isSome precedingArgument then None else Some args - | TS.Expr(SynExpr.Tuple (elements, commas, _))::TS.Expr(SynExpr.Paren _)::TS.Expr(NewObjectOrMethodCall(args))::_ -> + | TS.Expr(SynExpr.Tuple (false, elements, commas, _))::TS.Expr(SynExpr.Paren _)::TS.Expr(NewObjectOrMethodCall(args))::_ -> match precedingArgument with | None -> Some args | Some e -> @@ -1213,7 +1215,7 @@ module UntypedParseImpl = match pat with | SynPat.Paren(pat, _) -> match pat with - | SynPat.Tuple(pats, _) -> + | SynPat.Tuple(_, pats, _) -> pats |> List.tryPick visitParam | _ -> visitParam pat | SynPat.Wild(range) when rangeContainsPos range pos -> diff --git a/src/fsharp/service/ServiceXmlDocParser.fs b/src/fsharp/service/ServiceXmlDocParser.fs index 187c84bdd0a..3f171716851 100644 --- a/src/fsharp/service/ServiceXmlDocParser.fs +++ b/src/fsharp/service/ServiceXmlDocParser.fs @@ -22,8 +22,7 @@ module XmlDocParsing = | SynPat.Attrib(pat,_attrs,_range) -> digNamesFrom pat | SynPat.LongIdent(_lid,_idOpt,_typDeclsOpt,ConstructorPats pats,_access,_range) -> pats |> List.collect digNamesFrom - | SynPat.Tuple(pats,_range) - | SynPat.StructTuple(pats,_range) -> pats |> List.collect digNamesFrom + | SynPat.Tuple(_,pats,_range) -> pats |> List.collect digNamesFrom | SynPat.Paren(pat,_range) -> digNamesFrom pat | SynPat.OptionalVal (id, _) -> [id.idText] | SynPat.Or _ // no one uses ors in fun decls diff --git a/src/fsharp/symbols/Exprs.fs b/src/fsharp/symbols/Exprs.fs index d818cf956a1..87f93eecc93 100644 --- a/src/fsharp/symbols/Exprs.fs +++ b/src/fsharp/symbols/Exprs.fs @@ -1223,7 +1223,7 @@ and FSharpImplementationFileDeclaration = | InitAction of FSharpExpr and FSharpImplementationFileContents(cenv, mimpl) = - let (TImplFile(qname, _pragmas, ModuleOrNamespaceExprWithSig(_mty, mdef, _), hasExplicitEntryPoint, isScript)) = mimpl + let (TImplFile(qname, _pragmas, ModuleOrNamespaceExprWithSig(_mty, mdef, _), hasExplicitEntryPoint, isScript, _anonRecdTypes)) = mimpl let rec getDecls2 (ModuleOrNamespaceExprWithSig(_mty, def, _m)) = getDecls def and getBind (bind: Binding) = let v = bind.Var diff --git a/src/fsharp/symbols/SymbolHelpers.fs b/src/fsharp/symbols/SymbolHelpers.fs index a2997654b74..89cb44394b6 100644 --- a/src/fsharp/symbols/SymbolHelpers.fs +++ b/src/fsharp/symbols/SymbolHelpers.fs @@ -359,6 +359,7 @@ module internal SymbolHelpers = | Item.UnionCase(ucinfo, _) -> Some (rangeOfUnionCaseInfo preferFlag ucinfo) | Item.ActivePatternCase apref -> Some (rangeOfValRef preferFlag apref.ActivePatternVal) | Item.ExnCase tcref -> Some tcref.Range + | Item.AnonRecdField (_,_,_,m) -> Some m | Item.RecdField rfinfo -> Some (rangeOfRecdFieldInfo preferFlag rfinfo) | Item.Event einfo -> rangeOfEventInfo preferFlag einfo | Item.ILField _ -> None @@ -425,6 +426,7 @@ module internal SymbolHelpers = | Item.UnqualifiedType(erefs) -> erefs |> List.tryPick computeCcuOfTyconRef | Item.SetterArg (_, item) -> ccuOfItem g item + | Item.AnonRecdField (info, _, _, _) -> Some info.Assembly | Item.TypeVar _ -> None | _ -> None @@ -743,6 +745,8 @@ module internal SymbolHelpers = List.zip pi1s pi2s |> List.forall(fun (pi1, pi2) -> PropInfo.PropInfosUseIdenticalDefinitions pi1 pi2) | Item.Event(evt1), Item.Event(evt2) -> EventInfo.EventInfosUseIdenticalDefintions evt1 evt2 + | Item.AnonRecdField(anon1, _, i1, _), Item.AnonRecdField(anon2, _, i2, _) -> + Tastops.anonInfoEquiv anon1 anon2 && i1 = i2 | Item.CtorGroup(_, meths1), Item.CtorGroup(_, meths2) -> List.zip meths1 meths2 |> List.forall (fun (minfo1, minfo2) -> MethInfo.MethInfosUseIdenticalDefinitions minfo1 minfo2) @@ -775,6 +779,7 @@ module internal SymbolHelpers = | Item.ExnCase(tcref) -> hash tcref.LogicalName | Item.UnionCase(UnionCaseInfo(_, UCRef(tcref, n)), _) -> hash(tcref.Stamp, n) | Item.RecdField(RecdFieldInfo(_, RFRef(tcref, n))) -> hash(tcref.Stamp, n) + | Item.AnonRecdField(anon, _, i, _) -> hash anon.SortedNames.[i] | Item.Event evt -> evt.ComputeHashCode() | Item.Property(_name, pis) -> hash (pis |> List.map (fun pi -> pi.ComputeHashCode())) | Item.UnqualifiedType(tcref :: _) -> hash tcref.LogicalName @@ -855,6 +860,7 @@ module internal SymbolHelpers = | Item.ActivePatternResult(apinfo, _ty, idx, _) -> apinfo.Names.[idx] | Item.ActivePatternCase apref -> FullNameOfItem g (Item.Value apref.ActivePatternVal) + "." + apref.Name | Item.ExnCase ecref -> fullDisplayTextOfExnRef ecref + | Item.AnonRecdField(anon, _argTys, i, _) -> anon.SortedNames.[i] | Item.RecdField rfinfo -> fullDisplayTextOfRecdFieldRef rfinfo.RecdFieldRef | Item.NewDef id -> id.idText | Item.ILField finfo -> bufs (fun os -> NicePrint.outputILTypeRef denv os finfo.ILTypeRef; bprintf os ".%s" finfo.FieldName) @@ -1191,6 +1197,17 @@ module internal SymbolHelpers = else FSharpStructuredToolTipElement.Single (layout, xml) + | Item.AnonRecdField(anon, argTys, i, _) -> + let argTy = argTys.[i] + let nm = anon.SortedNames.[i] + let argTy, _ = PrettyTypes.PrettifyType g argTy + let layout = + wordL (tagText (FSComp.SR.typeInfoAnonRecdField())) ^^ + wordL (tagRecordField nm) ^^ + RightL.colon ^^ + NicePrint.layoutType denv argTy + FSharpStructuredToolTipElement.Single (layout, FSharpXmlDoc.None) + // Named parameters | Item.ArgName (id, argTy, _) -> let argTy, _ = PrettyTypes.PrettifyType g argTy @@ -1310,6 +1327,8 @@ module internal SymbolHelpers = | Item.RecdField rfi -> (rfi.TyconRef |> ticksAndArgCountTextOfTyconRef)+"."+rfi.Name |> Some + | Item.AnonRecdField _ -> None + | Item.ILField finfo -> match finfo with | ILFieldInfo(tinfo, fdef) -> diff --git a/src/fsharp/symbols/SymbolPatterns.fs b/src/fsharp/symbols/SymbolPatterns.fs index 22b406e12fb..c8c70562cd4 100644 --- a/src/fsharp/symbols/SymbolPatterns.fs +++ b/src/fsharp/symbols/SymbolPatterns.fs @@ -185,7 +185,9 @@ module Symbol = let (|RecordField|_|) (e: FSharpSymbol) = match e with | :? FSharpField as field -> - if field.DeclaringEntity.IsFSharpRecord then Some field else None + match field.DeclaringEntity with + | None -> None + | Some e -> if e.IsFSharpRecord then Some field else None | _ -> None let (|ActivePatternCase|_|) (symbol: FSharpSymbol) = diff --git a/src/fsharp/symbols/Symbols.fs b/src/fsharp/symbols/Symbols.fs index 74aa51c9e20..ad8c68c652a 100644 --- a/src/fsharp/symbols/Symbols.fs +++ b/src/fsharp/symbols/Symbols.fs @@ -710,26 +710,43 @@ and FSharpUnionCase(cenv, v: UnionCaseRef) = and FSharpFieldData = + | AnonField of AnonRecdTypeInfo * TTypes * int * range | ILField of ILFieldInfo | RecdOrClass of RecdFieldRef | Union of UnionCaseRef * int member x.TryRecdField = match x with - | RecdOrClass v -> v.RecdField |> Choice1Of2 - | Union (v, n) -> v.FieldByIndex(n) |> Choice1Of2 - | ILField f -> f |> Choice2Of2 + | AnonField (anonInfo, tinst, n, m) -> (anonInfo, tinst, n, m) |> Choice3Of3 + | RecdOrClass v -> v.RecdField |> Choice1Of3 + | Union (v, n) -> v.FieldByIndex(n) |> Choice1Of3 + | ILField f -> f |> Choice2Of3 - member x.DeclaringTyconRef = + member x.TryDeclaringTyconRef = match x with - | RecdOrClass v -> v.TyconRef - | Union (v, _) -> v.TyconRef - | ILField f -> f.DeclaringTyconRef + | AnonField _ -> None + | RecdOrClass v -> Some v.TyconRef + | Union (v, _) -> Some v.TyconRef + | ILField f -> Some f.DeclaringTyconRef + +and FSharpAnonRecordTypeDetails(cenv: cenv, anonInfo: AnonRecdTypeInfo) = + member __.Assembly = FSharpAssembly (cenv, anonInfo.Assembly) + + /// Names of any enclosing types of the compiled form of the anonymous type (if the anonymous type was defined as a nested type) + member __.EnclosingCompiledTypeNames = anonInfo.ILTypeRef.Enclosing + + /// The name of the compiled form of the anonymous type + member __.CompiledName = anonInfo.ILTypeRef.Name + + /// The sorted labels of the anonymous type + member __.SortedFieldNames = anonInfo.SortedNames and FSharpField(cenv: cenv, d: FSharpFieldData) = inherit FSharpSymbol (cenv, (fun () -> match d with + | AnonField (anonInfo, tinst, n, m) -> + Item.AnonRecdField(anonInfo, tinst, n, m) | RecdOrClass v -> checkEntityIsResolved v.TyconRef Item.RecdField(RecdFieldInfo(generalizeTypars v.TyconRef.TyparsNoRange, v)) @@ -747,15 +764,17 @@ and FSharpField(cenv: cenv, d: FSharpFieldData) = ) let isUnresolved() = - entityIsUnresolved d.DeclaringTyconRef || + d.TryDeclaringTyconRef |> Option.exists entityIsUnresolved || match d with + | AnonField _ -> false | RecdOrClass v -> v.TryRecdField.IsNone | Union (v, _) -> v.TryUnionCase.IsNone | ILField _ -> false let checkIsResolved() = - checkEntityIsResolved d.DeclaringTyconRef + d.TryDeclaringTyconRef |> Option.iter checkEntityIsResolved match d with + | AnonField _ -> () | RecdOrClass v -> if v.TryRecdField.IsNone then invalidOp (sprintf "The record field '%s' could not be found in the target type" v.FieldName) @@ -768,7 +787,7 @@ and FSharpField(cenv: cenv, d: FSharpFieldData) = new (cenv, rfref) = FSharpField(cenv, FSharpFieldData.RecdOrClass(rfref)) member __.DeclaringEntity = - FSharpEntity(cenv, d.DeclaringTyconRef) + d.TryDeclaringTyconRef |> Option.map (fun tcref -> FSharpEntity(cenv, tcref)) member __.IsUnresolved = isUnresolved() @@ -776,32 +795,47 @@ and FSharpField(cenv: cenv, d: FSharpFieldData) = member __.IsMutable = if isUnresolved() then false else match d.TryRecdField with - | Choice1Of2 r -> r.IsMutable - | Choice2Of2 f -> not f.IsInitOnly && f.LiteralValue.IsNone + | Choice1Of3 r -> r.IsMutable + | Choice2Of3 f -> not f.IsInitOnly && f.LiteralValue.IsNone + | Choice3Of3 _ -> false member __.IsLiteral = if isUnresolved() then false else match d.TryRecdField with - | Choice1Of2 r -> r.LiteralValue.IsSome - | Choice2Of2 f -> f.LiteralValue.IsSome + | Choice1Of3 r -> r.LiteralValue.IsSome + | Choice2Of3 f -> f.LiteralValue.IsSome + | Choice3Of3 _ -> false member __.LiteralValue = if isUnresolved() then None else match d.TryRecdField with - | Choice1Of2 r -> getLiteralValue r.LiteralValue - | Choice2Of2 f -> f.LiteralValue |> Option.map AbstractIL.ILRuntimeWriter.convFieldInit + | Choice1Of3 r -> getLiteralValue r.LiteralValue + | Choice2Of3 f -> f.LiteralValue |> Option.map AbstractIL.ILRuntimeWriter.convFieldInit + | Choice3Of3 _ -> None member __.IsVolatile = if isUnresolved() then false else match d.TryRecdField with - | Choice1Of2 r -> r.IsVolatile - | Choice2Of2 _ -> false // F# doesn't actually respect "volatile" from other assemblies in any case + | Choice1Of3 r -> r.IsVolatile + | Choice2Of3 _ -> false // F# doesn't actually respect "volatile" from other assemblies in any case + | Choice3Of3 _ -> false member __.IsDefaultValue = if isUnresolved() then false else match d.TryRecdField with - | Choice1Of2 r -> r.IsZeroInit - | Choice2Of2 _ -> false + | Choice1Of3 r -> r.IsZeroInit + | Choice2Of3 _ -> false + | Choice3Of3 _ -> false + + member __.IsAnonRecordField = + match d with + | AnonField _ -> true + | _ -> false + + member __.AnonRecordFieldDetails = + match d with + | AnonField (anonInfo, types, n, _) -> FSharpAnonRecordTypeDetails(cenv, anonInfo), [| for ty in types -> FSharpType(cenv, ty) |], n + | _ -> invalidOp "not an anonymous record field" member __.XmlDocSig = checkIsResolved() @@ -815,6 +849,7 @@ and FSharpField(cenv: cenv, d: FSharpFieldData) = SymbolHelpers.GetXmlDocSigOfUnionCaseInfo unionCase | ILField f -> SymbolHelpers.GetXmlDocSigOfILFieldInfo cenv.infoReader range0 f + | AnonField _ -> None match xmlsig with | Some (_, docsig) -> docsig | _ -> "" @@ -822,71 +857,81 @@ and FSharpField(cenv: cenv, d: FSharpFieldData) = member __.XmlDoc = if isUnresolved() then XmlDoc.Empty |> makeXmlDoc else match d.TryRecdField with - | Choice1Of2 r -> r.XmlDoc - | Choice2Of2 _ -> XmlDoc.Empty + | Choice1Of3 r -> r.XmlDoc + | Choice2Of3 _ -> XmlDoc.Empty + | Choice3Of3 _ -> XmlDoc.Empty |> makeXmlDoc member __.FieldType = checkIsResolved() let fty = match d.TryRecdField with - | Choice1Of2 r -> r.FormalType - | Choice2Of2 f -> f.FieldType(cenv.amap, range0) + | Choice1Of3 r -> r.FormalType + | Choice2Of3 f -> f.FieldType(cenv.amap, range0) + | Choice3Of3 (_,tinst,n,_) -> tinst.[n] FSharpType(cenv, fty) member __.IsStatic = if isUnresolved() then false else match d.TryRecdField with - | Choice1Of2 r -> r.IsStatic - | Choice2Of2 f -> f.IsStatic + | Choice1Of3 r -> r.IsStatic + | Choice2Of3 f -> f.IsStatic + | Choice3Of3 _ -> false member __.Name = checkIsResolved() match d.TryRecdField with - | Choice1Of2 r -> r.Name - | Choice2Of2 f -> f.FieldName + | Choice1Of3 r -> r.Name + | Choice2Of3 f -> f.FieldName + | Choice3Of3 (anonInfo, _tinst, n, _) -> anonInfo.SortedNames.[n] member __.IsCompilerGenerated = if isUnresolved() then false else match d.TryRecdField with - | Choice1Of2 r -> r.IsCompilerGenerated - | Choice2Of2 _ -> false + | Choice1Of3 r -> r.IsCompilerGenerated + | Choice2Of3 _ -> false + | Choice3Of3 _ -> false member __.IsNameGenerated = if isUnresolved() then false else match d.TryRecdField with - | Choice1Of2 r -> r.rfield_name_generated + | Choice1Of3 r -> r.rfield_name_generated | _ -> false member __.DeclarationLocation = checkIsResolved() match d.TryRecdField with - | Choice1Of2 r -> r.Range - | Choice2Of2 _ -> range0 + | Choice1Of3 r -> r.Range + | Choice2Of3 _ -> range0 + | Choice3Of3 (_anonInfo, _tinst, _n, m) -> m member __.FieldAttributes = if isUnresolved() then makeReadOnlyCollection [] else match d.TryRecdField with - | Choice1Of2 r -> r.FieldAttribs |> List.map (fun a -> FSharpAttribute(cenv, AttribInfo.FSAttribInfo(cenv.g, a))) - | Choice2Of2 _ -> [] + | Choice1Of3 r -> r.FieldAttribs |> List.map (fun a -> FSharpAttribute(cenv, AttribInfo.FSAttribInfo(cenv.g, a))) + | Choice2Of3 _ -> [] + | Choice3Of3 _ -> [] |> makeReadOnlyCollection member __.PropertyAttributes = if isUnresolved() then makeReadOnlyCollection [] else match d.TryRecdField with - | Choice1Of2 r -> r.PropertyAttribs |> List.map (fun a -> FSharpAttribute(cenv, AttribInfo.FSAttribInfo(cenv.g, a))) - | Choice2Of2 _ -> [] + | Choice1Of3 r -> r.PropertyAttribs |> List.map (fun a -> FSharpAttribute(cenv, AttribInfo.FSAttribInfo(cenv.g, a))) + | Choice2Of3 _ -> [] + | Choice3Of3 _ -> [] |> makeReadOnlyCollection member __.Accessibility: FSharpAccessibility = if isUnresolved() then FSharpAccessibility(taccessPublic) else let access = match d.TryRecdField with - | Choice1Of2 r -> r.Accessibility - | Choice2Of2 _ -> taccessPublic + | Choice1Of3 r -> r.Accessibility + | Choice2Of3 _ -> taccessPublic + | Choice3Of3 _ -> taccessPublic FSharpAccessibility(access) member private x.V = d + override x.Equals(other: obj) = box x === other || match other with @@ -894,10 +939,12 @@ and FSharpField(cenv: cenv, d: FSharpFieldData) = match d, uc.V with | RecdOrClass r1, RecdOrClass r2 -> recdFieldRefOrder.Compare(r1, r2) = 0 | Union (u1, n1), Union (u2, n2) -> cenv.g.unionCaseRefEq u1 u2 && n1 = n2 + | AnonField (anonInfo1, _, _, _) , AnonField (anonInfo2, _, _, _) -> x.Name = uc.Name && anonInfoEquiv anonInfo1 anonInfo2 | _ -> false | _ -> false override x.GetHashCode() = hash x.Name + override x.ToString() = "field " + x.Name and [] FSharpRecordField = FSharpField @@ -1900,6 +1947,7 @@ and FSharpType(cenv, typ:TType) = member __.GenericArguments = protect <| fun () -> match stripTyparEqns typ with + | TType_anon (_, tyargs) | TType_app (_, tyargs) | TType_tuple (_, tyargs) -> (tyargs |> List.map (fun ty -> FSharpType(cenv, ty)) |> makeReadOnlyCollection) | TType_fun(d, r) -> [| FSharpType(cenv, d); FSharpType(cenv, r) |] |> makeReadOnlyCollection @@ -1931,6 +1979,19 @@ and FSharpType(cenv, typ:TType) = | TType_fun _ -> true | _ -> false + member __.IsAnonRecordType = + isResolved() && + protect <| fun () -> + match stripTyparEqns typ with + | TType_anon _ -> true + | _ -> false + + member __.AnonRecordTypeDetails = + protect <| fun () -> + match stripTyparEqns typ with + | TType_anon (anonInfo, _) -> FSharpAnonRecordTypeDetails(cenv, anonInfo) + | _ -> invalidOp "not an anonymous record type" + member __.IsGenericParameter = protect <| fun () -> match stripTyparEqns typ with @@ -1985,6 +2046,7 @@ and FSharpType(cenv, typ:TType) = | TType_tuple (_, l1) -> 10400 + List.sumBy hashType l1 | TType_fun (dty, rty) -> 10500 + hashType dty + hashType rty | TType_measure _ -> 10600 + | TType_anon (_,l1) -> 10800 + List.sumBy hashType l1 hashType typ member x.Format(denv: FSharpDisplayContext) = @@ -2221,6 +2283,8 @@ type FSharpSymbol with | Item.ILField finfo -> FSharpField(cenv, ILField finfo) :> _ + | Item.AnonRecdField (anonInfo, tinst, n, m) -> FSharpField(cenv, AnonField (anonInfo, tinst, n, m)) :> _ + | Item.Event einfo -> FSharpMemberOrFunctionOrValue(cenv, E einfo, item) :> _ diff --git a/src/fsharp/symbols/Symbols.fsi b/src/fsharp/symbols/Symbols.fsi index 55c1a6fbb2b..faa0f851109 100644 --- a/src/fsharp/symbols/Symbols.fsi +++ b/src/fsharp/symbols/Symbols.fsi @@ -395,7 +395,20 @@ and [] public FSharpUnionCase = /// Indicates if the union case is for a type in an unresolved assembly member IsUnresolved : bool +/// A subtype of FSharpSymbol that represents a record or union case field as seen by the F# language +and [] public FSharpAnonRecordTypeDetails = + + /// The assembly where the compiled form of the anonymous type is defined + member Assembly : FSharpAssembly + + /// Names of any enclosing types of the compiled form of the anonymous type (if the anonymous type was defined as a nested type) + member EnclosingCompiledTypeNames : string list + + /// The name of the compiled form of the anonymous type + member CompiledName : string + /// The sorted labels of the anonymous type + member SortedFieldNames : string[] /// A subtype of FSharpSymbol that represents a record or union case field as seen by the F# language and [] public FSharpField = @@ -404,8 +417,14 @@ and [] public FSharpField = internal new : Impl.cenv * RecdFieldRef -> FSharpField internal new : Impl.cenv * UnionCaseRef * int -> FSharpField - /// Get the declaring entity of this field - member DeclaringEntity: FSharpEntity + /// Get the declaring entity of this field, if any. Fields from anonymous types do not have a declaring entity + member DeclaringEntity: FSharpEntity option + + /// Is this a field from an anonymous record type? + member IsAnonRecordField: bool + + /// If the field is from an anonymous record type then get the details of the field including the index in the sorted array of fields + member AnonRecordFieldDetails: FSharpAnonRecordTypeDetails * FSharpType[] * int /// Indicates if the field is declared 'static' member IsMutable: bool @@ -922,6 +941,12 @@ and [] public FSharpType = /// Indicates if the type is a function type. The GenericArguments property returns the domain and range of the function type. member IsFunctionType : bool + /// Indicates if the type is an anonymous record type. The GenericArguments property returns the type instantiation of the anonymous record type + member IsAnonRecordType: bool + + /// Get the details of the anonymous record type. + member AnonRecordTypeDetails: FSharpAnonRecordTypeDetails + /// Indicates if the type is a variable type, whether declared, generalized or an inference type parameter member IsGenericParameter : bool diff --git a/src/fsharp/tast.fs b/src/fsharp/tast.fs index 58a348c1861..a5e3350ed55 100755 --- a/src/fsharp/tast.fs +++ b/src/fsharp/tast.fs @@ -2114,6 +2114,9 @@ and /// isSetProp -- indicates if this is a set of a record field | FSRecdFieldSln of TypeInst * RecdFieldRef * bool + /// Indicates a trait is solved by an F# anonymous record field. + | FSAnonRecdFieldSln of AnonRecdTypeInfo * TypeInst * int + /// ILMethSln(typ, extOpt, ilMethodRef, minst) /// /// Indicates a trait is solved by a .NET method. @@ -3536,6 +3539,11 @@ and /// Indicates the type is built from a named type and a number of type arguments | TType_app of TyconRef * TypeInst + /// TType_anon + /// + /// Indicates the type is an anonymous record type whose compiled representation is located in the given assembly + | TType_anon of AnonRecdTypeInfo * TType list + /// TType_tuple(elementTypes). /// /// Indicates the type is a tuple type. elementTypes must be of length 2 or greater. @@ -3567,7 +3575,12 @@ and (match tupInfo with | TupInfo.Const false -> "" | TupInfo.Const true -> "struct ") - + String.concat "," (List.map string tinst) + ")" + + String.concat "," (List.map string tinst) + | TType_anon (anonInfo, tinst) -> + (match anonInfo.TupInfo with + | TupInfo.Const false -> "" + | TupInfo.Const true -> "struct ") + + "{|" + String.concat "," (Seq.map2 (fun nm ty -> nm + " " + string ty + ";") anonInfo.SortedNames tinst) + ")" + "|}" | TType_fun (d,r) -> "(" + string d + " -> " + string r + ")" | TType_ucase (uc,tinst) -> "union case type " + uc.CaseName + (match tinst with [] -> "" | tys -> "<" + String.concat "," (List.map string tys) + ">") | TType_var tp -> tp.DisplayName @@ -3580,6 +3593,7 @@ and | TType_forall (_tps, ty) -> ty.GetAssemblyName() | TType_app (tcref, _tinst) -> tcref.CompilationPath.ILScopeRef.QualifiedName | TType_tuple (_tupInfo, _tinst) -> "" + | TType_anon (anonInfo, _tinst) -> defaultArg anonInfo.Assembly.QualifiedName "" | TType_fun (_d,_r) -> "" | TType_measure _ms -> "" | TType_var tp -> tp.Solution |> function Some sln -> sln.GetAssemblyName() | None -> "" @@ -3589,7 +3603,50 @@ and and TypeInst = TType list and TTypes = TType list - +and [] AnonRecdTypeInfo = + // Mutability for pickling/unpickling only + { mutable Assembly: CcuThunk + mutable TupInfo: TupInfo + mutable SortedIds: Ident[] + mutable Stamp: Stamp + mutable SortedNames: string[] } + + /// Create an AnonRecdTypeInfo from the basic data + static member Create(ccu: CcuThunk, tupInfo, ids: Ident[]) = + let sortedIds = ids |> Array.sortBy (fun id -> id.idText) + // Hash all the data to form a unique stamp + let stamp = + sha1HashInt64 + [| for c in ccu.AssemblyName do yield byte c; yield byte (int32 c >>> 8); + match tupInfo with + | TupInfo.Const b -> yield (if b then 0uy else 1uy) + for id in sortedIds do + for c in id.idText do yield byte c; yield byte (int32 c >>> 8) |] + let sortedNames = Array.map textOfId sortedIds + { Assembly = ccu; TupInfo = tupInfo; SortedIds = sortedIds; Stamp = stamp; SortedNames = sortedNames } + + /// Get the ILTypeRef for the generated type implied by the anonymous type + member x.ILTypeRef = + let ilTypeName = sprintf "<>f__AnonymousType%s%u`%d'" (match x.TupInfo with TupInfo.Const b -> if b then "1000" else "") (uint32 x.Stamp) x.SortedIds.Length + mkILTyRef(x.Assembly.ILScopeRef,ilTypeName) + + static member NewUnlinked() : AnonRecdTypeInfo = + { Assembly = Unchecked.defaultof<_> + TupInfo = Unchecked.defaultof<_> + SortedIds = Unchecked.defaultof<_> + Stamp = Unchecked.defaultof<_> + SortedNames = Unchecked.defaultof<_> } + + member x.Link d = + let sortedNames = Array.map textOfId d.SortedIds + x.Assembly <- d.Assembly + x.TupInfo <- d.TupInfo + x.SortedIds <- d.SortedIds + x.Stamp <- d.Stamp + x.SortedNames <- sortedNames + + member x.IsLinked = (match x.SortedIds with null -> true | _ -> false) + and [] TupInfo = /// Some constant, e.g. true or false for tupInfo | Const of bool @@ -4133,6 +4190,12 @@ and /// An operation representing the creation of a tuple value | Tuple of TupInfo + /// An operation representing the creation of an anonymous record + | AnonRecd of AnonRecdTypeInfo + + /// An operation representing the get of a property from an anonymous record + | AnonRecdGet of AnonRecdTypeInfo * int + /// An operation representing the creation of an array value | Array @@ -4377,7 +4440,7 @@ and [] /// Represents a complete typechecked implementation file, including its typechecked signature if any. /// /// TImplFile(qualifiedNameOfFile,pragmas,implementationExpressionWithSignature,hasExplicitEntryPoint,isScript) -and TypedImplFile = TImplFile of QualifiedNameOfFile * ScopedPragma list * ModuleOrNamespaceExprWithSig * bool * bool +and TypedImplFile = TImplFile of QualifiedNameOfFile * ScopedPragma list * ModuleOrNamespaceExprWithSig * bool * bool * StampMap /// Represents a complete typechecked assembly, made up of multiple implementation files. /// @@ -4519,9 +4582,9 @@ let mkRawStructTupleTy tys = TType_tuple (tupInfoStruct, tys) // make up the entire compilation unit //--------------------------------------------------------------------------- -let mapTImplFile f (TImplFile(fragName,pragmas,moduleExpr,hasExplicitEntryPoint,isScript)) = TImplFile(fragName, pragmas,f moduleExpr,hasExplicitEntryPoint,isScript) -let mapAccImplFile f z (TImplFile(fragName,pragmas,moduleExpr,hasExplicitEntryPoint,isScript)) = let moduleExpr,z = f z moduleExpr in TImplFile(fragName,pragmas,moduleExpr,hasExplicitEntryPoint,isScript), z -let foldTImplFile f z (TImplFile(_,_,moduleExpr,_,_)) = f z moduleExpr +let mapTImplFile f (TImplFile(fragName,pragmas,moduleExpr,hasExplicitEntryPoint,isScript,anonRecdTypes)) = TImplFile(fragName, pragmas,f moduleExpr,hasExplicitEntryPoint,isScript,anonRecdTypes) +let mapAccImplFile f z (TImplFile(fragName,pragmas,moduleExpr,hasExplicitEntryPoint,isScript,anonRecdTypes)) = let moduleExpr,z = f z moduleExpr in TImplFile(fragName,pragmas,moduleExpr,hasExplicitEntryPoint,isScript,anonRecdTypes), z +let foldTImplFile f z (TImplFile(_,_,moduleExpr,_,_,_)) = f z moduleExpr //--------------------------------------------------------------------------- // Equality relations on locally defined things @@ -5144,3 +5207,4 @@ let FSharpOptimizationDataResourceName2 = "FSharpOptimizationInfo." let FSharpSignatureDataResourceName2 = "FSharpSignatureInfo." + diff --git a/src/fsharp/xlf/FSComp.txt.cs.xlf b/src/fsharp/xlf/FSComp.txt.cs.xlf index ad7572ef053..13433bae31d 100644 --- a/src/fsharp/xlf/FSComp.txt.cs.xlf +++ b/src/fsharp/xlf/FSComp.txt.cs.xlf @@ -6982,6 +6982,36 @@ Tento výraz vrátí hodnotu typu {0}, ale implicitně se zahodí. Zvažte vytvoření vazby mezi výsledkem a názvem pomocí klíčového slova let, např. let výsledek = výraz. Pokud jste chtěli výraz použít jako hodnotu v sekvenci, použijte explicitní klíčové slovo yield!. + + Unmatched '{{|' + Unmatched '{{|' + + + + anonymous record field + anonymous record field + + + + Two anonymous record types are from different assemblies '{0}' and '{1}' + Two anonymous record types are from different assemblies '{0}' and '{1}' + + + + Two anonymous record types have mismatched sets of field names '{0}' and '{1}' + Two anonymous record types have mismatched sets of field names '{0}' and '{1}' + + + + Invalid anonymous record expression + Invalid anonymous record expression + + + + Invalid anonymous record type + Invalid anonymous record type + + \ No newline at end of file diff --git a/src/fsharp/xlf/FSComp.txt.de.xlf b/src/fsharp/xlf/FSComp.txt.de.xlf index 1754e4d729a..09ee764bc5a 100644 --- a/src/fsharp/xlf/FSComp.txt.de.xlf +++ b/src/fsharp/xlf/FSComp.txt.de.xlf @@ -6982,6 +6982,36 @@ Dieser Ausdruck gibt einen Wert des Typs "{0}" zurück, wird aber implizit verworfen. Verwenden Sie ggf. "let", um das Ergebnis an einen Namen zu binden. Beispiel: "let Ergebnis = Ausdruck". Falls Sie den Ausdruck als Wert in der Sequenz einsetzen möchten, verwenden Sie explizit "yield!". + + Unmatched '{{|' + Unmatched '{{|' + + + + anonymous record field + anonymous record field + + + + Two anonymous record types are from different assemblies '{0}' and '{1}' + Two anonymous record types are from different assemblies '{0}' and '{1}' + + + + Two anonymous record types have mismatched sets of field names '{0}' and '{1}' + Two anonymous record types have mismatched sets of field names '{0}' and '{1}' + + + + Invalid anonymous record expression + Invalid anonymous record expression + + + + Invalid anonymous record type + Invalid anonymous record type + + \ No newline at end of file diff --git a/src/fsharp/xlf/FSComp.txt.en.xlf b/src/fsharp/xlf/FSComp.txt.en.xlf index a1dece2d6f9..bb3d873ab9e 100644 --- a/src/fsharp/xlf/FSComp.txt.en.xlf +++ b/src/fsharp/xlf/FSComp.txt.en.xlf @@ -6982,6 +6982,36 @@ This expression returns a value of type '{0}' but is implicitly discarded. Consider using 'let' to bind the result to a name, e.g. 'let result = expression'. If you intended to use the expression as a value in the sequence then use an explicit 'yield!'. + + Unmatched '{{|' + Unmatched '{{|' + + + + anonymous record field + anonymous record field + + + + Two anonymous record types are from different assemblies '{0}' and '{1}' + Two anonymous record types are from different assemblies '{0}' and '{1}' + + + + Two anonymous record types have mismatched sets of field names '{0}' and '{1}' + Two anonymous record types have mismatched sets of field names '{0}' and '{1}' + + + + Invalid anonymous record expression + Invalid anonymous record expression + + + + Invalid anonymous record type + Invalid anonymous record type + + \ No newline at end of file diff --git a/src/fsharp/xlf/FSComp.txt.es.xlf b/src/fsharp/xlf/FSComp.txt.es.xlf index 0ea4958ff74..e02d0d40831 100644 --- a/src/fsharp/xlf/FSComp.txt.es.xlf +++ b/src/fsharp/xlf/FSComp.txt.es.xlf @@ -6982,6 +6982,36 @@ Esta expresión devuelve un valor de tipo “{0}”, pero se descarta de forma implícita. Considere el uso de “let” para enlazar el resultado a un nombre; por ejemplo, “let result = expression”. Si su intención es utilizar la expresión como un valor en la secuencia, utilice “yield” de forma explícita. + + Unmatched '{{|' + Unmatched '{{|' + + + + anonymous record field + anonymous record field + + + + Two anonymous record types are from different assemblies '{0}' and '{1}' + Two anonymous record types are from different assemblies '{0}' and '{1}' + + + + Two anonymous record types have mismatched sets of field names '{0}' and '{1}' + Two anonymous record types have mismatched sets of field names '{0}' and '{1}' + + + + Invalid anonymous record expression + Invalid anonymous record expression + + + + Invalid anonymous record type + Invalid anonymous record type + + \ No newline at end of file diff --git a/src/fsharp/xlf/FSComp.txt.fr.xlf b/src/fsharp/xlf/FSComp.txt.fr.xlf index c74eb738e59..2d00a2fbd6e 100644 --- a/src/fsharp/xlf/FSComp.txt.fr.xlf +++ b/src/fsharp/xlf/FSComp.txt.fr.xlf @@ -6982,6 +6982,36 @@ Cette expression retourne une valeur de type '{0}', mais est implicitement ignorée. Utilisez 'let' pour lier le résultat à un nom, par ex. 'let result = expression'. Si vous voulez utiliser l'expression comme valeur dans la séquence, utilisez un 'yield!' explicite. + + Unmatched '{{|' + Unmatched '{{|' + + + + anonymous record field + anonymous record field + + + + Two anonymous record types are from different assemblies '{0}' and '{1}' + Two anonymous record types are from different assemblies '{0}' and '{1}' + + + + Two anonymous record types have mismatched sets of field names '{0}' and '{1}' + Two anonymous record types have mismatched sets of field names '{0}' and '{1}' + + + + Invalid anonymous record expression + Invalid anonymous record expression + + + + Invalid anonymous record type + Invalid anonymous record type + + \ No newline at end of file diff --git a/src/fsharp/xlf/FSComp.txt.it.xlf b/src/fsharp/xlf/FSComp.txt.it.xlf index d063e9e49ce..a9a9c35e72d 100644 --- a/src/fsharp/xlf/FSComp.txt.it.xlf +++ b/src/fsharp/xlf/FSComp.txt.it.xlf @@ -6982,6 +6982,36 @@ Questa espressione restituisce un valore di tipo '{0}' ma viene rimossa in modo implicito. Provare a usare 'let' per eseguire il binding del risultato a un nome, ad esempio 'let risultato = espressione'. Se si intende usare l'espressione come valore nella sequenza, usare l'operando 'yield!' esplicito. + + Unmatched '{{|' + Unmatched '{{|' + + + + anonymous record field + anonymous record field + + + + Two anonymous record types are from different assemblies '{0}' and '{1}' + Two anonymous record types are from different assemblies '{0}' and '{1}' + + + + Two anonymous record types have mismatched sets of field names '{0}' and '{1}' + Two anonymous record types have mismatched sets of field names '{0}' and '{1}' + + + + Invalid anonymous record expression + Invalid anonymous record expression + + + + Invalid anonymous record type + Invalid anonymous record type + + \ No newline at end of file diff --git a/src/fsharp/xlf/FSComp.txt.ja.xlf b/src/fsharp/xlf/FSComp.txt.ja.xlf index f515115c15d..c9dc1d8c305 100644 --- a/src/fsharp/xlf/FSComp.txt.ja.xlf +++ b/src/fsharp/xlf/FSComp.txt.ja.xlf @@ -6982,6 +6982,36 @@ この式は型 '{0}' の値を返しますが、暗黙的に破棄されます。'let' を使用して結果を名前にバインドすることを検討してください。例: 'let result = expression'。式をシーケンス内で値として使用する場合は、明示的に 'yield!' を使用してください。 + + Unmatched '{{|' + Unmatched '{{|' + + + + anonymous record field + anonymous record field + + + + Two anonymous record types are from different assemblies '{0}' and '{1}' + Two anonymous record types are from different assemblies '{0}' and '{1}' + + + + Two anonymous record types have mismatched sets of field names '{0}' and '{1}' + Two anonymous record types have mismatched sets of field names '{0}' and '{1}' + + + + Invalid anonymous record expression + Invalid anonymous record expression + + + + Invalid anonymous record type + Invalid anonymous record type + + \ No newline at end of file diff --git a/src/fsharp/xlf/FSComp.txt.ko.xlf b/src/fsharp/xlf/FSComp.txt.ko.xlf index ca9ffe834f4..64d4bc3e904 100644 --- a/src/fsharp/xlf/FSComp.txt.ko.xlf +++ b/src/fsharp/xlf/FSComp.txt.ko.xlf @@ -6982,6 +6982,36 @@ 이 식은 '{0}' 형식의 값을 반환하지만 암시적으로 삭제됩니다. 'let'을 사용하여 결과를 이름에 바인딩하세요(예: 'let result = expression'). 식을 시퀀스의 값으로 사용하려면 명시적 'yield!'를 사용하세요. + + Unmatched '{{|' + Unmatched '{{|' + + + + anonymous record field + anonymous record field + + + + Two anonymous record types are from different assemblies '{0}' and '{1}' + Two anonymous record types are from different assemblies '{0}' and '{1}' + + + + Two anonymous record types have mismatched sets of field names '{0}' and '{1}' + Two anonymous record types have mismatched sets of field names '{0}' and '{1}' + + + + Invalid anonymous record expression + Invalid anonymous record expression + + + + Invalid anonymous record type + Invalid anonymous record type + + \ No newline at end of file diff --git a/src/fsharp/xlf/FSComp.txt.pl.xlf b/src/fsharp/xlf/FSComp.txt.pl.xlf index 4cad63a4afa..b956238d314 100644 --- a/src/fsharp/xlf/FSComp.txt.pl.xlf +++ b/src/fsharp/xlf/FSComp.txt.pl.xlf @@ -6982,6 +6982,36 @@ To wyrażenie zwraca wartość typu „{0}”, ale jest niejawnie odrzucane. Rozważ użycie instrukcji „let” do powiązania wyniku z nazwą, np. „let wynik = wyrażenie”. Jeśli chcesz użyć tego wyrażenia jako wartości w sekwencji, użyj jawnej instrukcji „yield!”. + + Unmatched '{{|' + Unmatched '{{|' + + + + anonymous record field + anonymous record field + + + + Two anonymous record types are from different assemblies '{0}' and '{1}' + Two anonymous record types are from different assemblies '{0}' and '{1}' + + + + Two anonymous record types have mismatched sets of field names '{0}' and '{1}' + Two anonymous record types have mismatched sets of field names '{0}' and '{1}' + + + + Invalid anonymous record expression + Invalid anonymous record expression + + + + Invalid anonymous record type + Invalid anonymous record type + + \ No newline at end of file diff --git a/src/fsharp/xlf/FSComp.txt.pt-BR.xlf b/src/fsharp/xlf/FSComp.txt.pt-BR.xlf index 98205cd7a14..9fdb7d83f8f 100644 --- a/src/fsharp/xlf/FSComp.txt.pt-BR.xlf +++ b/src/fsharp/xlf/FSComp.txt.pt-BR.xlf @@ -6982,6 +6982,36 @@ Essa expressão retorna um valor de tipo '{0}', mas é descartada de forma implícita. Considere o uso de 'let' para associar o resultado a um nome, por exemplo, 'let result = expression'. Se você pretende usar a expressão como um valor na sequência, use um “yield!” explícito. + + Unmatched '{{|' + Unmatched '{{|' + + + + anonymous record field + anonymous record field + + + + Two anonymous record types are from different assemblies '{0}' and '{1}' + Two anonymous record types are from different assemblies '{0}' and '{1}' + + + + Two anonymous record types have mismatched sets of field names '{0}' and '{1}' + Two anonymous record types have mismatched sets of field names '{0}' and '{1}' + + + + Invalid anonymous record expression + Invalid anonymous record expression + + + + Invalid anonymous record type + Invalid anonymous record type + + \ No newline at end of file diff --git a/src/fsharp/xlf/FSComp.txt.ru.xlf b/src/fsharp/xlf/FSComp.txt.ru.xlf index 4e32cbed5d1..9e56782f248 100644 --- a/src/fsharp/xlf/FSComp.txt.ru.xlf +++ b/src/fsharp/xlf/FSComp.txt.ru.xlf @@ -6982,6 +6982,36 @@ Это выражение возвращает значение типа "{0}", но оно неявно отбрасывается. Чтобы привязать результат к какому-то имени, используйте "let", например: "let <результат> = <выражение>". Если вы собирались использовать выражение как значение в последовательности, используйте в явном виде "yield!". + + Unmatched '{{|' + Unmatched '{{|' + + + + anonymous record field + anonymous record field + + + + Two anonymous record types are from different assemblies '{0}' and '{1}' + Two anonymous record types are from different assemblies '{0}' and '{1}' + + + + Two anonymous record types have mismatched sets of field names '{0}' and '{1}' + Two anonymous record types have mismatched sets of field names '{0}' and '{1}' + + + + Invalid anonymous record expression + Invalid anonymous record expression + + + + Invalid anonymous record type + Invalid anonymous record type + + \ No newline at end of file diff --git a/src/fsharp/xlf/FSComp.txt.tr.xlf b/src/fsharp/xlf/FSComp.txt.tr.xlf index 93cfa3de92d..67e8c1965c0 100644 --- a/src/fsharp/xlf/FSComp.txt.tr.xlf +++ b/src/fsharp/xlf/FSComp.txt.tr.xlf @@ -6982,6 +6982,36 @@ Bu ifade '{0}' türünde bir değer döndürür ancak örtük olarak atılır. Sonucu bir ada bağlamak için 'let' kullanabilirsiniz, örn. 'let sonuc = ifade'. İfadeyi dizide bir değer olarak kullanmayı amaçladıysanız açık bir 'yield!' kullanın. + + Unmatched '{{|' + Unmatched '{{|' + + + + anonymous record field + anonymous record field + + + + Two anonymous record types are from different assemblies '{0}' and '{1}' + Two anonymous record types are from different assemblies '{0}' and '{1}' + + + + Two anonymous record types have mismatched sets of field names '{0}' and '{1}' + Two anonymous record types have mismatched sets of field names '{0}' and '{1}' + + + + Invalid anonymous record expression + Invalid anonymous record expression + + + + Invalid anonymous record type + Invalid anonymous record type + + \ No newline at end of file diff --git a/src/fsharp/xlf/FSComp.txt.zh-Hans.xlf b/src/fsharp/xlf/FSComp.txt.zh-Hans.xlf index f9af6c23c8b..ca95767c04a 100644 --- a/src/fsharp/xlf/FSComp.txt.zh-Hans.xlf +++ b/src/fsharp/xlf/FSComp.txt.zh-Hans.xlf @@ -6982,6 +6982,36 @@ 此表达式返回类型为“{0}”的值,但被隐式放弃。请考虑使用 "let" 将结果绑定到名称,例如 "let result = expression"。如果要使用该表达式作为序列中的值,则使用显式 "yield!"。 + + Unmatched '{{|' + Unmatched '{{|' + + + + anonymous record field + anonymous record field + + + + Two anonymous record types are from different assemblies '{0}' and '{1}' + Two anonymous record types are from different assemblies '{0}' and '{1}' + + + + Two anonymous record types have mismatched sets of field names '{0}' and '{1}' + Two anonymous record types have mismatched sets of field names '{0}' and '{1}' + + + + Invalid anonymous record expression + Invalid anonymous record expression + + + + Invalid anonymous record type + Invalid anonymous record type + + \ No newline at end of file diff --git a/src/fsharp/xlf/FSComp.txt.zh-Hant.xlf b/src/fsharp/xlf/FSComp.txt.zh-Hant.xlf index 63e673fe136..c9bdbbe4f52 100644 --- a/src/fsharp/xlf/FSComp.txt.zh-Hant.xlf +++ b/src/fsharp/xlf/FSComp.txt.zh-Hant.xlf @@ -6982,6 +6982,36 @@ 此運算式會傳回類型為 '{0}' 的值,但會被間接捨棄。請考慮使用 'let' 將結果繫結到名稱。例如 'let result = expression'。若您想要在序列中,以值的形式使用運算式,請直接使用 'yield!'。 + + Unmatched '{{|' + Unmatched '{{|' + + + + anonymous record field + anonymous record field + + + + Two anonymous record types are from different assemblies '{0}' and '{1}' + Two anonymous record types are from different assemblies '{0}' and '{1}' + + + + Two anonymous record types have mismatched sets of field names '{0}' and '{1}' + Two anonymous record types have mismatched sets of field names '{0}' and '{1}' + + + + Invalid anonymous record expression + Invalid anonymous record expression + + + + Invalid anonymous record type + Invalid anonymous record type + + \ No newline at end of file diff --git a/src/fsharp/xlf/FSStrings.cs.xlf b/src/fsharp/xlf/FSStrings.cs.xlf index 90e272e863b..1be5ea9aaab 100644 --- a/src/fsharp/xlf/FSStrings.cs.xlf +++ b/src/fsharp/xlf/FSStrings.cs.xlf @@ -1607,6 +1607,16 @@ Vnitřní chyba: {0} + + symbol '{|' + symbol '{|' + + + + symbol '|}' + symbol '|}' + + \ No newline at end of file diff --git a/src/fsharp/xlf/FSStrings.de.xlf b/src/fsharp/xlf/FSStrings.de.xlf index 1c98a1cdb01..8775393d9d6 100644 --- a/src/fsharp/xlf/FSStrings.de.xlf +++ b/src/fsharp/xlf/FSStrings.de.xlf @@ -1607,6 +1607,16 @@ Interner Fehler: {0} + + symbol '{|' + symbol '{|' + + + + symbol '|}' + symbol '|}' + + \ No newline at end of file diff --git a/src/fsharp/xlf/FSStrings.en.xlf b/src/fsharp/xlf/FSStrings.en.xlf index 03bc0887740..7bb2d00d541 100644 --- a/src/fsharp/xlf/FSStrings.en.xlf +++ b/src/fsharp/xlf/FSStrings.en.xlf @@ -1607,6 +1607,16 @@ internal error: {0} + + symbol '{|' + symbol '{|' + + + + symbol '|}' + symbol '|}' + + \ No newline at end of file diff --git a/src/fsharp/xlf/FSStrings.es.xlf b/src/fsharp/xlf/FSStrings.es.xlf index 986deafbc5c..8fad5818503 100644 --- a/src/fsharp/xlf/FSStrings.es.xlf +++ b/src/fsharp/xlf/FSStrings.es.xlf @@ -1607,6 +1607,16 @@ error interno: {0} + + symbol '{|' + symbol '{|' + + + + symbol '|}' + symbol '|}' + + \ No newline at end of file diff --git a/src/fsharp/xlf/FSStrings.fr.xlf b/src/fsharp/xlf/FSStrings.fr.xlf index 4d4cccb39fe..d2cf29066f8 100644 --- a/src/fsharp/xlf/FSStrings.fr.xlf +++ b/src/fsharp/xlf/FSStrings.fr.xlf @@ -1607,6 +1607,16 @@ erreur interne : {0} + + symbol '{|' + symbol '{|' + + + + symbol '|}' + symbol '|}' + + \ No newline at end of file diff --git a/src/fsharp/xlf/FSStrings.it.xlf b/src/fsharp/xlf/FSStrings.it.xlf index e26f38b3270..d366d972645 100644 --- a/src/fsharp/xlf/FSStrings.it.xlf +++ b/src/fsharp/xlf/FSStrings.it.xlf @@ -1607,6 +1607,16 @@ errore interno: {0} + + symbol '{|' + symbol '{|' + + + + symbol '|}' + symbol '|}' + + \ No newline at end of file diff --git a/src/fsharp/xlf/FSStrings.ja.xlf b/src/fsharp/xlf/FSStrings.ja.xlf index 7256d1b1a49..2fcdbbb2d45 100644 --- a/src/fsharp/xlf/FSStrings.ja.xlf +++ b/src/fsharp/xlf/FSStrings.ja.xlf @@ -1607,6 +1607,16 @@ 内部エラー: {0} + + symbol '{|' + symbol '{|' + + + + symbol '|}' + symbol '|}' + + \ No newline at end of file diff --git a/src/fsharp/xlf/FSStrings.ko.xlf b/src/fsharp/xlf/FSStrings.ko.xlf index 2ba29ac4307..53437c9c1a3 100644 --- a/src/fsharp/xlf/FSStrings.ko.xlf +++ b/src/fsharp/xlf/FSStrings.ko.xlf @@ -1607,6 +1607,16 @@ 내부 오류: {0} + + symbol '{|' + symbol '{|' + + + + symbol '|}' + symbol '|}' + + \ No newline at end of file diff --git a/src/fsharp/xlf/FSStrings.pl.xlf b/src/fsharp/xlf/FSStrings.pl.xlf index d544bdcc32e..f56de53fa3f 100644 --- a/src/fsharp/xlf/FSStrings.pl.xlf +++ b/src/fsharp/xlf/FSStrings.pl.xlf @@ -1607,6 +1607,16 @@ błąd wewnętrzny: {0} + + symbol '{|' + symbol '{|' + + + + symbol '|}' + symbol '|}' + + \ No newline at end of file diff --git a/src/fsharp/xlf/FSStrings.pt-BR.xlf b/src/fsharp/xlf/FSStrings.pt-BR.xlf index b1dccf3db10..6d812fb2bc4 100644 --- a/src/fsharp/xlf/FSStrings.pt-BR.xlf +++ b/src/fsharp/xlf/FSStrings.pt-BR.xlf @@ -1607,6 +1607,16 @@ erro interno: {0} + + symbol '{|' + symbol '{|' + + + + symbol '|}' + symbol '|}' + + \ No newline at end of file diff --git a/src/fsharp/xlf/FSStrings.ru.xlf b/src/fsharp/xlf/FSStrings.ru.xlf index bd45c8d8eee..31bc70d007b 100644 --- a/src/fsharp/xlf/FSStrings.ru.xlf +++ b/src/fsharp/xlf/FSStrings.ru.xlf @@ -1607,6 +1607,16 @@ внутренняя ошибка: {0} + + symbol '{|' + symbol '{|' + + + + symbol '|}' + symbol '|}' + + \ No newline at end of file diff --git a/src/fsharp/xlf/FSStrings.tr.xlf b/src/fsharp/xlf/FSStrings.tr.xlf index 6ce85a3cc4c..87dc0f84f1b 100644 --- a/src/fsharp/xlf/FSStrings.tr.xlf +++ b/src/fsharp/xlf/FSStrings.tr.xlf @@ -1607,6 +1607,16 @@ iç hata: {0} + + symbol '{|' + symbol '{|' + + + + symbol '|}' + symbol '|}' + + \ No newline at end of file diff --git a/src/fsharp/xlf/FSStrings.zh-Hans.xlf b/src/fsharp/xlf/FSStrings.zh-Hans.xlf index 235affe46bb..3afc6bee94d 100644 --- a/src/fsharp/xlf/FSStrings.zh-Hans.xlf +++ b/src/fsharp/xlf/FSStrings.zh-Hans.xlf @@ -1607,6 +1607,16 @@ 内部错误: {0} + + symbol '{|' + symbol '{|' + + + + symbol '|}' + symbol '|}' + + \ No newline at end of file diff --git a/src/fsharp/xlf/FSStrings.zh-Hant.xlf b/src/fsharp/xlf/FSStrings.zh-Hant.xlf index 90c5a5a8066..ae07f546c5f 100644 --- a/src/fsharp/xlf/FSStrings.zh-Hant.xlf +++ b/src/fsharp/xlf/FSStrings.zh-Hant.xlf @@ -1607,6 +1607,16 @@ 內部錯誤: {0} + + symbol '{|' + symbol '{|' + + + + symbol '|}' + symbol '|}' + + \ No newline at end of file diff --git a/src/utils/sformat.fs b/src/utils/sformat.fs index d3f6bb48eda..18b571b46d3 100644 --- a/src/utils/sformat.fs +++ b/src/utils/sformat.fs @@ -199,6 +199,8 @@ namespace Microsoft.FSharp.Text.StructuredPrintfImpl let rightBracket = tagPunctuation "]" let leftBrace= tagPunctuation "{" let rightBrace = tagPunctuation "}" + let leftBraceBar = tagPunctuation "{|" + let rightBraceBar = tagPunctuation "|}" let equals = tagOperator "=" let arrow = tagPunctuation "->" let questionMark = tagPunctuation "?" diff --git a/src/utils/sformat.fsi b/src/utils/sformat.fsi index fb768703e17..afdd931f900 100644 --- a/src/utils/sformat.fsi +++ b/src/utils/sformat.fsi @@ -148,6 +148,8 @@ namespace Microsoft.FSharp.Text.StructuredPrintfImpl val rightBracket : TaggedText val leftBrace: TaggedText val rightBrace : TaggedText + val leftBraceBar: TaggedText + val rightBraceBar : TaggedText val equals : TaggedText val arrow : TaggedText val questionMark : TaggedText diff --git a/tests/fsharp/core/anon/lib.fs b/tests/fsharp/core/anon/lib.fs new file mode 100644 index 00000000000..23571cab8b5 --- /dev/null +++ b/tests/fsharp/core/anon/lib.fs @@ -0,0 +1,209 @@ + +module AnonLib + + +let failures = ref [] + +let report_failure (s : string) = + stderr.Write" NO: " + stderr.WriteLine s + failures := !failures @ [s] + +let test (s : string) b = + stderr.Write(s) + if b then stderr.WriteLine " OK" + else report_failure (s) + +let check (s:string) x1 x2 = + stderr.Write(s) + if (x1 = x2) then stderr.WriteLine " OK" + else (stderr.WriteLine (sprintf "fail, expected %A, got %A" x2 x1); report_failure (s)) + +let inline getX (x: ^TX) : ^X = + (^TX : (member get_X : unit -> ^X) (x)) + + +let inline Y (x: ^TX) : ^X = + (^TX : (member get_Y : unit -> ^X) (x)) + + +module KindB1 = + + let data1 = {| X = 1 |} + + // Types can be written with the same syntax + let data2 : {| X : int |} = data1 + + // Access is as expected + let f1 (v : {| X : int |}) = v.X + + // Access can be nested + let f2 (v : {| X: {| X : int |} |}) = v.X.X + + // Access can be nested + let f3 (v : {| Y: {| X : int |} |}) = v.Y.X + + // Access can be nested + let f4 (v : {| Y: {| X : 'T |} |}) = v.Y.X + + check "coijoiwcnkc42c2" {| Y = 1; X = "1" |} {| X = "1"; Y = 1 |} + check "coijoiwcnkc42c3" {| Y = 1; X = "1"; Z = 2 |} {| Z = 2; X = "1"; Y = 1 |} + + check "coijoiwcnkwle1" {| a = 1 |} {| a = 1 |} + check "coijoiwcnkwle2" {| a = 2 |} {| a = 2 |} + + check "coijoiwcnkwle3" (sprintf "%A" {| X = 10 |}) "{X = 10;}" + check "coijoiwcnkwle4" (sprintf "%A" {| X = 10; Y = 1 |} |> fun s -> s.Replace("\n","").Replace("\r","")) ("{X = 10; Y = 1;}".Replace("\n","").Replace("\r","")) + check "clekoiew09" (f2 {| X = {| X = 10 |} |}) 10 + check "cewkew0oijew" (f2 {| X = {| X = 20 |} |}) 20 + + check "ceoijew90ewcw1" (FSharp.Reflection.FSharpType.IsRecord(typeof<{| X : int; Y: string |}>)) true + check "ceoijew90ewcw2" (FSharp.Reflection.FSharpType.GetRecordFields(typeof<{| X : int; Y: string |}>).Length) 2 + check "ceoijew90ewcw3" (FSharp.Reflection.FSharpValue.GetRecordFields({| X = 1; Y = "a" |}).Length) 2 + check "ceoijew90ewcw4" (FSharp.Reflection.FSharpType.IsRecord(typeof<{| X : int |}>)) true + check "ceoijew90ewcw5" (FSharp.Reflection.FSharpType.GetRecordFields(typeof<{| X : int |}>).Length) 1 + check "ceoijew90ewcw6" (FSharp.Reflection.FSharpValue.GetRecordFields({| X = 1 |}).Length) 1 + check "ceoijew90ewcw7" (FSharp.Reflection.FSharpValue.GetRecordFields({| X = 1 |}).[0]) (box 1) + + // TODO: field reordering.... + //let test3b() = {| a = 1+1; b = 2 |} = {| b = 1; a = 2 |} + + // Equality is possible + check "ceijoewwekcj" {| a = 1-1 |} {| a = Unchecked.defaultof<_> |} + + // Comparison is possible if structural elements are comparable + check "ceijowere9er" ({| a = 1+1 |} > {| a = 0 |}) true + + // Check we can alias these types + type recd1 = {| a : int |} + + // test a generic function + let test7<'T>(x:'T) = {| a = x |} + + // test a generic function + let test8<'T>(x:'T) = {| a = x; b = x |} + + // Properties may satisfy member constraints + // Access code may not be generic except through existing member constraints + + + // To speciy a struct representation use this: + let data3 = struct {| X = 1 |} + + // Types can be written with the same syntax + let data4 : struct {| X : int |} = data3 + + let testConstrainedAccess = getX {| X = 0 |}, getX data1, getX {| X = 2; Y = "2" |} + + check "testConstrainedAccess1" (sprintf "%A" testConstrainedAccess) "(0, 1, 2)" + + let testConstrainedAccess2 = getX (struct {| X = 0 |}), getX data3, getX (struct {| X = 2; Y = "2" |}) + + check "testConstrainedAccess2" (sprintf "%A" testConstrainedAccess2) "(0, 1, 2)" + +module TestInAttributes = + type FooAttribute(ty: System.Type) = + inherit System.Attribute() + member x.Type = ty + + [)>] + type C() = + member x.P = 1 + check "clkwweclk" ((typeof.GetCustomAttributes(typeof,true).[0] :?> FooAttribute).Type) (typeof<{| Field1: int; Field2 : string |}>) + +module KindB2 = + + // Gives object that has full C#-compatibe anonymous metadata. Compiles to an instantiation of a generic type in the declaring assembly with appropriate .NET + // metadata (property names). The types are CLIMutable to be C#-compatible. The identity of the types are implicitly assembly-qualified. + let data1 = {| X = 1 |} + + let data1b = {| Y = 1 |} + + let data1c = {| X = 1; Y = 2 |} + + let data1d = {| X = 1; Y = 3 |} + + // Types can be written with the same syntax + let data2 : {| X : int |} = data1 + + // Struct representations may be specified, though C# doesn't allow them + let data3 = struct {| X = 1; Y = 2 |} + + // Types can be written with the same syntax + let data4 : struct {| X : int; Y : int |} = data3 + + let testAccess = (data4.X, data4.Y, data1.X, data2.X, data3.X, data3.Y) + + printfn "{| X = 10 |} = %A" ({| X = 10 |} ) + printfn "{| X = 10 ; Y = \"abc\" |} = %A" ({| X = 10 ; Y = "abc"|} ) + + let testConstrainedAccess = getX ({| X = 0 |}), getX data1, getX ({| X = 2; Y = "2" |}) + + check "cew9cwoi" testConstrainedAccess (0, 1, 2) + + let testConstrainedAccess2 = getX (struct {| X = 0 |}), getX data3, getX (struct {| X = 2; Y = "2" |}) + + check "cew9cwo3" testConstrainedAccess2 (0, 1, 2) + + // Copy-and-update may not be used, since C# doesn't allow this on anonymous objects + + // Types _can_ be used outside their assembly, but can _not_ be named in the syntax of types, nor created + + +module QuotesNewRecord = + + open FSharp.Quotations + open FSharp.Quotations.Patterns + let ty, args = match <@ {| X = 1; Y = "two" |} @> with NewRecord(a,b) -> a,b + + check "gceoijew90ewcw1" (FSharp.Reflection.FSharpType.IsRecord(ty)) true + check "gceoijew90ewcw2" (FSharp.Reflection.FSharpType.GetRecordFields(ty).Length) 2 + check "gceoijew90ewcw2" ([ for p in FSharp.Reflection.FSharpType.GetRecordFields(ty) -> p.Name ]) [ "X"; "Y" ] + check "gceoijew90ewcw3" args [ <@@ 1 @@>; <@@ "two" @@> ] + +module QuotesNewRecord2 = + + open FSharp.Quotations + open FSharp.Quotations.Patterns + let ty, args = match <@ {| Y = "two"; X = 1 |} @> with NewRecord(a,b) -> a,b + + check "qgceoijew90ewcw1" (FSharp.Reflection.FSharpType.IsRecord(ty)) true + check "qgceoijew90ewcw2" (FSharp.Reflection.FSharpType.GetRecordFields(ty).Length) 2 + // Fields are sorted + check "qgceoijew90ewcw2" ([ for p in FSharp.Reflection.FSharpType.GetRecordFields(ty) -> p.Name ]) [ "X"; "Y" ] + check "qgceoijew90ewcw3" args [ <@@ 1 @@>; <@@ "two" @@> ] + +module QuotesPropertyGet = + + open FSharp.Quotations + open FSharp.Quotations.Patterns + let obj, prop = match <@ {| X = 1; Y = "two" |}.X @> with Patterns.PropertyGet(a,b,[]) -> a,b + + check "wgceoijew90ewcw1" prop.Name "X" + + +module SampleAPI = + + let SampleFunction (arg : {| A: int; B: string |}) = arg.A + arg.B.Length + let SampleFunctionAcceptingList (args : {| A: int; B: string |} list) = args |> List.map (fun arg -> arg.A + arg.B.Length) + let SampleFunctionReturningAnonRecd () = {| A=1; B = "abc" |} + +module SampleAPIStruct = + let SampleFunction (arg : (struct {| A: int; B: string |})) = arg.A + arg.B.Length + let SampleFunctionAcceptingList (args : (struct {| A: int; B: string |}) list) = args |> List.map (fun arg -> arg.A + arg.B.Length) + let SampleFunctionReturningAnonRecd () = struct {| A=1; B = "abc" |} + +module SampleAPITupleStruct = + let SampleFunction ((a,b) : (struct (int * string))) = a + b.Length + let SampleFunctionAcceptingList (args : (struct (int * string)) list) = args |> List.map (fun (struct (a,b)) -> a + b.Length) + let SampleFunctionReturningStructTuple () = struct (1, "abc") + +module SyntaxCornerCaseTests = + + let _ = id<{| X: int |}> {| X = 3 |} + // Check use as type argument + let _ = id<{| X: int |}> {| X = 3 |} + let _ = id<{| X: int; Y: int |}> {| X = 3; Y = 4 |} + let _ = id<{| X: int; Y: int |}> ({| X = 3; Y = 4 |}) + let _ = id (struct {| X = 3; Y = 44 |}) + let _ = id (struct {| X = 3; Y = 4 |}) \ No newline at end of file diff --git a/tests/fsharp/core/anon/test.fsx b/tests/fsharp/core/anon/test.fsx new file mode 100644 index 00000000000..d45bd257165 --- /dev/null +++ b/tests/fsharp/core/anon/test.fsx @@ -0,0 +1,83 @@ +// #Regression #Conformance #Accessibility #SignatureFiles #Regression #Records +#if TESTS_AS_APP +module Core_anon +#endif + +open AnonLib +let failures = ref [] + +let report_failure (s : string) = + stderr.Write" NO: " + stderr.WriteLine s + failures := !failures @ [s] + +let test (s : string) b = + stderr.Write(s) + if b then stderr.WriteLine " OK" + else report_failure (s) + +let check (s:string) x1 x2 = + stderr.Write(s) + if (x1 = x2) then stderr.WriteLine " OK" + else (stderr.WriteLine (sprintf "fail, expected %A, got %A" x2 x1); report_failure (s)) + +module Test = + + let testAccess = (KindB1.data1.X, KindB1.data3.X) + + check "coijoiwcnkwle2" (sprintf "%A" KindB1.data1) "{X = 1;}" + +module Tests2 = + + let testAccess = (KindB2.data1.X, KindB2.data3.X, KindB2.data3.Y) + + check "coijoiwcnkwle3" (sprintf "%A" KindB2.data1) "{X = 1;}" + + let _ = (KindB2.data1 = KindB2.data1) + +module MoreTests = + + let testUseInFunctionSignatureOnly (x: {| X1 : int |}) = () + let testUseInReturnSignatureOnly () : {| X2 : int |} = Unchecked.defaultof<_> + let testUseInTypeOfOnly () = typeof<{| X3 : int |}> + + let (x : struct (int * int)) = (3, 4) + let () = match (struct (3,4)) with (a,b) -> () + +module CrossAssemblyTest = + let tests() = + check "vrknvio1" (SampleAPI.SampleFunction {| A=1; B = "abc" |}) 4 // note, this is creating an instance of an anonymous record from another assembly. + check "vrknvio2" (SampleAPI.SampleFunctionAcceptingList [ {| A=1; B = "abc" |}; {| A=2; B = "def" |} ]) [4; 5] // note, this is creating an instance of an anonymous record from another assembly. + check "vrknvio3" (let d = SampleAPI.SampleFunctionReturningAnonRecd() in d.A + d.B.Length) 4 + check "vrknvio4" (let d = SampleAPIStruct.SampleFunctionReturningAnonRecd() in d.ToString().Replace("\n","").Replace("\r","")) """{A = 1; B = "abc";}""" + tests() + +module CrossAssemblyTestStruct = + let tesvts() = + check "svrknvio1" (SampleAPIStruct.SampleFunction {| A=1; B = "abc" |}) 4 // note, this is creating an instance of an anonymous record from another assembly. The structness is inferred in this case. + check "svrknvio2" (SampleAPIStruct.SampleFunctionAcceptingList [ {| A=1; B = "abc" |}; {| A=2; B = "def" |} ]) [4; 5] // note, this is creating an instance of an anonymous record from another assembly. The structness is inferred in this case. + check "svrknvio3" (let d = SampleAPIStruct.SampleFunctionReturningAnonRecd() in d.A + d.B.Length) 4 + tests() + +module CrossAssemblyTestTupleStruct = + let tests() = + check "svrknvio1" (SampleAPITupleStruct.SampleFunction (1, "abc")) 4 // note, this is creating an instance of an anonymous record from another assembly. The structness is inferred in this case. + check "svrknvio2" (SampleAPITupleStruct.SampleFunctionAcceptingList [ (1, "abc"); (2, "def") ]) [4; 5] // note, this is creating an instance of an anonymous record from another assembly. The structness is inferred in this case. + check "svrknvio3" (match SampleAPITupleStruct.SampleFunctionReturningStructTuple() with (x,y) -> x + y.Length) 4 + check "svrknvio4" (let res = SampleAPITupleStruct.SampleFunctionReturningStructTuple() in match res with (x,y) -> x + y.Length) 4 + tests() + +#if TESTS_AS_APP +let RUN() = !failures +#else +let aa = + match !failures with + | [] -> + stdout.WriteLine "Test Passed" + System.IO.File.WriteAllText("test.ok","ok") + exit 0 + | _ -> + stdout.WriteLine "Test Failed" + exit 1 +#endif + diff --git a/tests/fsharp/core/fsi-load/test.fsx b/tests/fsharp/core/fsi-load/test.fsx index ad2ef3bef5c..f81654365e7 100644 --- a/tests/fsharp/core/fsi-load/test.fsx +++ b/tests/fsharp/core/fsi-load/test.fsx @@ -11,6 +11,9 @@ module OtherModule = let foo () = [ for (k: KeyValuePair) in [] -> () ] + let testAnonRecordInFsi1 (x : {| X : int |}) = () + + let testAnonRecordInFsi2 () : {| X : int |} = failwith "ok" let _ = stdout.WriteLine "Test Passed" diff --git a/tests/fsharp/core/queriesOverIQueryable/test.fsx b/tests/fsharp/core/queriesOverIQueryable/test.fsx index 245c32bb463..472dac742f6 100644 --- a/tests/fsharp/core/queriesOverIQueryable/test.fsx +++ b/tests/fsharp/core/queriesOverIQueryable/test.fsx @@ -142,19 +142,29 @@ module QueryExecutionOverIQueryable = (query { let q = query { for i in db -> i.Name } in for v in q do yield v } ) "db.Select(_arg1 => _arg1.Name).Select(_arg2 => _arg2)" + open FSharp.Reflection + + let t = typeof< {| Name1: string; Name2: string |} > + check "wkcwe09" (FSharpType.IsRecord t) true + check "wkcwe09" (FSharpType.GetRecordFields t |> Array.forall (fun f -> f.CanWrite)) false + +// checkLinqQueryText "ltcjhnwec6" +// (query { for i in db -> {| Name1 = i.Name; Name2 = i.Name |} } ) +// "db.Select(_arg1 => _arg1.Name).Select(_arg2 => _arg2)" +// "System.Linq.Enumerable+WhereSelectEnumerableIterator`2[Microsoft.FSharp.Linq.RuntimeHelpers.AnonymousObject`2[System.String,System.String],<>f__AnonymousType3691853213`2'[System.String,System.String]].Select(_arg2 => _arg2)" + checkCommuteSeq "cnewnc03nested" (query { let q = query { for i in db -> i.Name } in for v in q do yield v } ) (seq { for i in db -> i.Name }) - //type R = { A : int; B : int } - //let db2 = [ { A = 1; B = 2 } ] - //let results = query { for (i: MutTup) in db2 -> (i,i) } - - //System.Linq.Queryable.GroupBy( checkCommuteSeq "cnewnc06y" (query { for i in db do for j in db do yield (i.Name,j.Name) }) (seq { for i in db do for j in db do yield (i.Name,j.Name) }) + checkCommuteSeq "cnewnc06y" + (query { for i in db do for j in db do yield {| Name1 = i.Name; Name2 = j.Name |} }) + (seq { for i in db do for j in db do yield {| Name1 = i.Name; Name2 = j.Name |} }) + checkCommuteSeq "cnewnc06ynested" (query { let q = query { for i in db do for j in db do yield (i.Name,j.Name) } in for v in q do yield v }) (seq { for i in db do for j in db do yield (i.Name,j.Name) }) @@ -286,44 +296,10 @@ module QueryExecutionOverIQueryable = take 2 }) ["Don"; "Peter"] - (* - checkCommuteSeq "cnewnc06ya3b" - (query { for i in db do - yield i.Name - distinct } |> Seq.toList) - ["Don"; "Peter"; "Freddy"; "Freddi"] - *) - -#if ZIP - checkCommuteSeq "cnewnc06ya3c" - (query { for i in [1;2;3;4] do - zip [4;3;2;1] into j - yield (i,j) } |> Seq.toList) - [(1, 4); (2, 3); (3, 2); (4, 1)] - - checkCommuteSeq "cnewnc06y43" - (query { for i in [1;2;3;4] do - zip [4;3;2;1;0] into j - yield (i,j) } |> Seq.toList) - [(1, 4); (2, 3); (3, 2); (4, 1)] - - checkCommuteSeq "cnewnc06y43b" - (query { for i in [1;2;3;4] do - zip [4;3;2] into j - yield (i,j) } |> Seq.toList) - [(1, 4); (2, 3); (3, 2)] - - checkCommuteSeq "cnewnc06y43c" - (query { for i in db do - zip db into j - yield (i.Name,j.Name.Length) } |> Seq.toList) - [("Don", 3); ("Peter", 5); ("Freddy", 6); ("Freddi", 6); ("Don", 3)] - -#endif - checkLinqQueryText "ltcjhnwecd" (query { for i in db do where true; take 3 }) "db.Where(i => True).Take(3)" + checkCommuteSeq "cnewnc06yb" (query { for i in db do groupBy i.Name } |> Seq.map (fun g -> (g.Key,Seq.toList g)) |> System.Linq.Queryable.AsQueryable) (seq { for i in db do yield i } |> Seq.groupBy (fun i -> i.Name) |> Seq.map (fun (key,g) -> (key, Seq.toList g))) @@ -894,8 +870,6 @@ module QueryExecutionOverIQueryable = (query { for i in db do groupValBy i i.Name }) "db.GroupBy(i => i.Name, i => i)" - - checkLinqQueryText "ltcnewnc06yb2x" (query { for i in db do for j in db do groupValBy j i.Name }) "db.SelectMany(_arg1 => db, (_arg1, _arg2) => new AnonymousObject`2(Item1 = _arg1, Item2 = _arg2)).GroupBy(tupledArg => tupledArg.Item1.Name, tupledArg => tupledArg.Item2)" @@ -980,9 +954,6 @@ module QueryExecutionOverIQueryable = yield (i.Cost + j.Cost) }) "db.Join(db, i => i.Quantity, j => j.Quantity, (i, j) => new AnonymousObject`2(Item1 = i, Item2 = j)).Select(_arg1 => (_arg1.Item1.Cost + _arg1.Item2.Cost))" - - - checkLinqQueryText "ltcnewnc06yh9Q5" (query { for i in db do groupJoin j in db on (i.Name = j.Name) into group @@ -996,8 +967,6 @@ module QueryExecutionOverIQueryable = yield group } ) "db.Select(_arg1 => new AnonymousObject`2(Item1 = _arg1, Item2 = _arg1.Name)).GroupJoin(db, tupledArg => tupledArg.Item2, j => j.Name, (tupledArg, group) => new AnonymousObject`3(Item1 = tupledArg.Item1, Item2 = tupledArg.Item2, Item3 = group)).Select(_arg2 => _arg2.Item3)" - - checkLinqQueryText "ltcnewnc06yh9Q6" (query { for i in db do groupJoin j in db on (i.Quantity ?= j.Quantity.GetValueOrDefault()) into group @@ -1027,8 +996,6 @@ module QueryExecutionOverIQueryable = yield group } ) "db.Select(_arg1 => new AnonymousObject`2(Item1 = _arg1, Item2 = _arg1.Name)).GroupJoin(db, tupledArg => tupledArg.Item2, j => j.Name, (tupledArg, group) => new AnonymousObject`3(Item1 = tupledArg.Item1, Item2 = tupledArg.Item2, Item3 = group.DefaultIfEmpty())).Select(_arg2 => _arg2.Item3)" - - check "cnewnc06yh9Q5" (query { for i in db do groupJoin j in db on (i.Name = j.Name) into group @@ -1052,10 +1019,6 @@ module QueryExecutionOverIQueryable = (query { for i in db do groupJoin j in db on (i.Quantity ?=? j.Quantity) into group; yield group |> Seq.map (fun x -> x.Name) |> Seq.toList } |> Seq.toList) [[]; ["Peter"]; []; ["Freddi"]; []] - - - - check "cnewnc06yh9Q5left1" (query { for i in db do leftOuterJoin j in db on (i.Name = j.Name) into group @@ -1068,9 +1031,6 @@ module QueryExecutionOverIQueryable = yield (i, group |> Seq.toList) } |> Seq.toList) [("1", ["1";"12"]); ("2", [null]) ] - - - // Smoke test for returning a tuple checkCommuteSeq "smcnewnc01a" (query { yield (1,1) } ) @@ -1162,8 +1122,6 @@ module QueryExecutionOverIQueryable = (query { for x in db do yield (1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16) }) (seq { for x in db do yield (1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16) }) - - // Smoke test for returning a tuple, nested for loops checkCommuteSeq "smcnewnc01xx" (query { for x in db do for y in db do yield (1,1) }) @@ -1194,12 +1152,10 @@ module QueryExecutionOverIQueryable = (query { for x in db do for y in db do yield (1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16) }) (seq { for x in db do for y in db do yield (1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16) }) - type R1 = { V1 : int } type R7 = { V1 : int; V2 : int; V3 : int; V4 : int; V5 : int; V6 : int; V7 : int } type R8 = { V1 : int; V2 : int; V3 : int; V4 : int; V5 : int; V6 : int; V7 : int; V8 : int } - // Smoke test for returning an immutable record object, size = 1 checkCommuteSeq "rsmcnewnc01" (query { yield { R1.V1=1 } } |> Seq.map (fun r -> r.V1) |> System.Linq.Queryable.AsQueryable) @@ -1262,7 +1218,6 @@ module QueryExecutionOverIQueryable = (query { yield { MR8.V1=1; MR8.V2=2; MR8.V3=3; MR8.V4=4; MR8.V5=5; MR8.V6=6; MR8.V7=7; MR8.V8=8 } } |> qmap (fun r -> r.V1, r.V2)) [1,2;] - // Smoke test for returning a mutable record object, size = 1 checkCommuteSeq "mrsmcnewnc01x" (query { for x in db do yield { MR1.V1=1 } } |> qmap (fun r -> r.V1)) @@ -1289,6 +1244,37 @@ module QueryExecutionOverIQueryable = (seq { for x in db do yield { MR8.V1=1; MR8.V2=2; MR8.V3=3; MR8.V4=4; MR8.V5=5; MR8.V6=6; MR8.V7=7; MR8.V8=8 } } |> Seq.map (fun r -> r.V1, r.V2)) + // Smoke test for returning an immutable anonymous record object, size = 1 + checkCommuteSeq "rsmcnewnc01" + (query { yield {| V1=1 |} } |> Seq.map (fun r -> r.V1) |> System.Linq.Queryable.AsQueryable) + [1;] + + // Smoke test for returning an immutable anonymous record object, size = 7 + checkCommuteSeq "rsmcnewnc07" + (query { yield {| V1=1; V2=2; V3=3; V4=4; V5=5; V6=6; V7=7 |} } |> qmap (fun r -> r.V1, r.V2) |> System.Linq.Queryable.AsQueryable) + [1,2;] + + // Smoke test for returning an immutable anonymous record object, size = 8 + checkCommuteSeq "rsmcnewnc08" + (query { yield {| V1=1; V2=2; V3=3; V4=4; V5=5; V6=6; V7=7; V8=8 |} } |> qmap (fun r -> r.V1, r.V2) |> System.Linq.Queryable.AsQueryable) + [1,2;] + + + // Smoke test for returning an immutable anonymous record object, size = 1 + checkCommuteSeq "rsmcnewnc01x" + (query { for x in db do yield {| V1=1 |} } |> qmap (fun r -> r.V1)) + (seq { for x in db do yield {| V1=1 |} } |> Seq.map (fun r -> r.V1)) + + // Smoke test for returning an immutable anonymous record object, size = 7 + checkCommuteSeq "rsmcnewnc07x" + (query { for x in db do yield {| V1=1; V2=2; V3=3; V4=4; V5=5; V6=6; V7=7 |} } |> qmap (fun r -> r.V1, r.V2) |> System.Linq.Queryable.AsQueryable) + (seq { for x in db do yield {| V1=1; V2=2; V3=3; V4=4; V5=5; V6=6; V7=7 |} } |> Seq.map (fun r -> r.V1, r.V2)) + + // Smoke test for returning an immutable anonymous record object, size = 8 + checkCommuteSeq "rsmcnewnc08x" + (query { for x in db do yield {| V1=1; V2=2; V3=3; V4=4; V5=5; V6=6; V7=7; V8=8 |} } |> qmap (fun r -> r.V1, r.V2)) + (seq { for x in db do yield {| V1=1; V2=2; V3=3; V4=4; V5=5; V6=6; V7=7; V8=8 |} } |> Seq.map (fun r -> r.V1, r.V2)) + // Smoke test for returning an object using property-set notation for member init, size = 8 type C1() = let mutable v1 = 0 @@ -1302,8 +1288,6 @@ module QueryExecutionOverIQueryable = (query { for x in db do yield C1(V1=1) } |> qmap (fun r -> r.V1)) (seq { for x in db do yield C1(V1=1) } |> Seq.map (fun r -> r.V1)) - //<@ C1(V1=1) @> - // Smoke test for returning an object using property-set notation for member init type C2() = let mutable v1 = 0 @@ -1351,8 +1335,6 @@ module QueryExecutionOverIQueryable = (query { for i in db -> (i, i) }) (seq { for i in db -> (i,i) }) - - checkCommuteSeq "smcnewnc022df1" (query { for p in db do groupBy p.Name into g @@ -1367,9 +1349,6 @@ module QueryExecutionOverIQueryable = select (g.Key, s) }) [("Don", 0s); ("Peter", 10s); ("Freddy", 0s); ("Freddi", 32s)] - - - module QueryExecutionOverIQueryableWhereDataIsRecord = open System open Microsoft.FSharp.Linq @@ -1390,7 +1369,6 @@ module QueryExecutionOverIQueryableWhereDataIsRecord = let dbEmpty = System.Linq.Queryable.AsQueryable([] |> List.toSeq) let dbOne = System.Linq.Queryable.AsQueryable([1] |> List.toSeq) - checkCommuteSeq "rrcnewnc01" (query { yield! db }) db diff --git a/tests/fsharp/tests.fs b/tests/fsharp/tests.fs index 3c2d9c2d792..75b31fd95cc 100644 --- a/tests/fsharp/tests.fs +++ b/tests/fsharp/tests.fs @@ -30,6 +30,8 @@ module CoreTests = // These tests are enabled for .NET Framework and .NET Core [] let ``access-FSC_BASIC``() = singleTestBuildAndRun "core/access" FSC_BASIC + + // All tests below here are known to pass for .NET Core but not yet enabled due to CI problems [] let ``access-FSI_BASIC``() = singleTestBuildAndRun "core/access" FSI_BASIC @@ -228,6 +230,36 @@ module CoreTests = #if !FSHARP_SUITE_DRIVES_CORECLR_TESTS + // These tests are enabled for .NET Framework and .NET Core + [] + let ``anon-FSC_BASIC``() = + let cfg = testConfig "core/anon" + + fsc cfg "%s -a -o:lib.dll -g" cfg.fsc_flags ["lib.fs"] + + copyFile (cfg.FSCBinPath ++ "System.ValueTuple.dll") ("." ++ "System.ValueTuple.dll") + peverify cfg "lib.dll" + + fsc cfg "%s -r:lib.dll -g" cfg.fsc_flags ["test.fsx"] + + peverify cfg "test.exe" + + begin + use testOkFile = fileguard cfg "test.ok" + + exec cfg ("." ++ "test.exe") "" + + testOkFile.CheckExists() + end + + begin + use testOkFile = fileguard cfg "test.ok" + + fsi cfg "-r:lib.dll" ["test.fsx"] + + testOkFile.CheckExists() + end + [] let events () = let cfg = testConfig "core/events" @@ -2162,6 +2194,12 @@ module TypecheckTests = [] let ``type check neg101`` () = singleNegTest (testConfig "typecheck/sigs") "neg101" + [] + let ``type check neg103`` () = singleNegTest (testConfig "typecheck/sigs") "neg103" + + [] + let ``type check neg104`` () = singleNegTest (testConfig "typecheck/sigs") "neg104" + [] let ``type check neg_byref_1`` () = singleNegTest (testConfig "typecheck/sigs") "neg_byref_1" diff --git a/tests/fsharp/typecheck/sigs/neg103.bsl b/tests/fsharp/typecheck/sigs/neg103.bsl new file mode 100644 index 00000000000..4c55fca4170 --- /dev/null +++ b/tests/fsharp/typecheck/sigs/neg103.bsl @@ -0,0 +1,24 @@ + +neg103.fs(5,50,5,61): typecheck error FS0001: Two anonymous record types have mismatched sets of field names '["a"; "b"]' and '["a"]' + +neg103.fs(7,41,7,52): typecheck error FS0001: Two anonymous record types have mismatched sets of field names '["b"]' and '["a"]' + +neg103.fs(10,27,10,55): typecheck error FS0059: The type '{|a : int|}' does not have any proper subtypes and need not be used as the target of a static coercion + +neg103.fs(10,27,10,55): typecheck error FS0193: Type constraint mismatch. The type + '{|b : int|}' +is not compatible with type + '{|a : int|}' + + +neg103.fs(13,27,13,62): typecheck error FS0059: The type '{|a : int|}' does not have any proper subtypes and need not be used as the target of a static coercion + +neg103.fs(13,27,13,62): typecheck error FS0193: Type constraint mismatch. The type + '{|a : int ; b : int|}' +is not compatible with type + '{|a : int|}' + + +neg103.fs(18,34,18,36): typecheck error FS0001: The type '('a -> 'a)' does not support the 'comparison' constraint. For example, it does not support the 'System.IComparable' interface + +neg103.fs(20,42,20,44): typecheck error FS0001: The type '('a -> 'a)' does not support the 'comparison' constraint. For example, it does not support the 'System.IComparable' interface diff --git a/tests/fsharp/typecheck/sigs/neg103.fs b/tests/fsharp/typecheck/sigs/neg103.fs new file mode 100644 index 00000000000..660788f83e2 --- /dev/null +++ b/tests/fsharp/typecheck/sigs/neg103.fs @@ -0,0 +1,20 @@ + +module M + + // Check we get compile-time errors + let negTypeTest1() = ({| a = 1+1; b = 2 |} = {| a = 2 |}) + + let negTypeTest2() = ({| b = 2 |} = {| a = 2 |} ) + + // no subsumption + let negTypeTest3() = ({| b = 2 |} :> {| a : int |} ) + + // no subsumption + let negTypeTest4() = ({| b = 2; a = 1 |} :> {| a : int |} ) + + let posgTypeTest5() = ({| b = 2; a = 1 |} = {| a = 1; b = 2 |} ) + + // Comparison is not possible if structural elements are comparable + let negTypeTest6() = ({| a = id |} > {| a = id |}) + + let negTypeTest7() = (compare {| a = id |} {| a = id |}) diff --git a/tests/fsharp/typecheck/sigs/neg103.vsbsl b/tests/fsharp/typecheck/sigs/neg103.vsbsl new file mode 100644 index 00000000000..4c55fca4170 --- /dev/null +++ b/tests/fsharp/typecheck/sigs/neg103.vsbsl @@ -0,0 +1,24 @@ + +neg103.fs(5,50,5,61): typecheck error FS0001: Two anonymous record types have mismatched sets of field names '["a"; "b"]' and '["a"]' + +neg103.fs(7,41,7,52): typecheck error FS0001: Two anonymous record types have mismatched sets of field names '["b"]' and '["a"]' + +neg103.fs(10,27,10,55): typecheck error FS0059: The type '{|a : int|}' does not have any proper subtypes and need not be used as the target of a static coercion + +neg103.fs(10,27,10,55): typecheck error FS0193: Type constraint mismatch. The type + '{|b : int|}' +is not compatible with type + '{|a : int|}' + + +neg103.fs(13,27,13,62): typecheck error FS0059: The type '{|a : int|}' does not have any proper subtypes and need not be used as the target of a static coercion + +neg103.fs(13,27,13,62): typecheck error FS0193: Type constraint mismatch. The type + '{|a : int ; b : int|}' +is not compatible with type + '{|a : int|}' + + +neg103.fs(18,34,18,36): typecheck error FS0001: The type '('a -> 'a)' does not support the 'comparison' constraint. For example, it does not support the 'System.IComparable' interface + +neg103.fs(20,42,20,44): typecheck error FS0001: The type '('a -> 'a)' does not support the 'comparison' constraint. For example, it does not support the 'System.IComparable' interface diff --git a/tests/fsharp/typecheck/sigs/neg104.bsl b/tests/fsharp/typecheck/sigs/neg104.bsl new file mode 100644 index 00000000000..f0ed9fbd026 --- /dev/null +++ b/tests/fsharp/typecheck/sigs/neg104.bsl @@ -0,0 +1,20 @@ + +neg104.fs(6,38,6,39): parse error FS0010: Unexpected symbol '}' in binding. Expected '|}' or other token. + +neg104.fs(6,29,6,31): parse error FS0605: Unmatched '{|' + +neg104.fs(8,5,8,8): parse error FS0058: Possible incorrect indentation: this token is offside of context started at position (6:29). Try indenting this token further or using standard formatting conventions. + +neg104.fs(10,5,10,9): parse error FS0058: Possible incorrect indentation: this token is offside of context started at position (8:5). Try indenting this token further or using standard formatting conventions. + +neg104.fs(10,5,10,9): parse error FS0010: Unexpected keyword 'type' in binding. Expected incomplete structured construct at or before this point or other token. + +neg104.fs(6,5,6,8): parse error FS3118: Incomplete value or function definition. If this is in an expression, the body of the expression must be indented to the same column as the 'let' keyword. + +neg104.fs(10,25,10,26): parse error FS0010: Unexpected symbol '}' in type definition. Expected '|}' or other token. + +neg104.fs(10,14,10,16): parse error FS0605: Unmatched '{|' + +neg104.fs(12,5,12,8): parse error FS0058: Possible incorrect indentation: this token is offside of context started at position (10:14). Try indenting this token further or using standard formatting conventions. + +neg104.fs(14,1,14,1): parse error FS0010: Incomplete structured construct at or before this point in implementation file diff --git a/tests/fsharp/typecheck/sigs/neg104.fs b/tests/fsharp/typecheck/sigs/neg104.fs new file mode 100644 index 00000000000..adbdc0fa986 --- /dev/null +++ b/tests/fsharp/typecheck/sigs/neg104.fs @@ -0,0 +1,13 @@ + +module M + + + // Check we get parsing error and decent recovery + let negParsingTest2() = {| b = 2 } + + let normalCode1() = () + // Check we get parsing error and decent recovery + type X = {| A : int } + + let normalCode2() = () + diff --git a/tests/fsharp/typecheck/sigs/neg104.vsbsl b/tests/fsharp/typecheck/sigs/neg104.vsbsl new file mode 100644 index 00000000000..c12cacbf608 --- /dev/null +++ b/tests/fsharp/typecheck/sigs/neg104.vsbsl @@ -0,0 +1,24 @@ + +neg104.fs(6,38,6,39): parse error FS0010: Unexpected symbol '}' in binding. Expected '|}' or other token. + +neg104.fs(6,29,6,31): parse error FS0605: Unmatched '{|' + +neg104.fs(8,5,8,8): parse error FS0058: Possible incorrect indentation: this token is offside of context started at position (6:29). Try indenting this token further or using standard formatting conventions. + +neg104.fs(10,5,10,9): parse error FS0058: Possible incorrect indentation: this token is offside of context started at position (8:5). Try indenting this token further or using standard formatting conventions. + +neg104.fs(10,5,10,9): parse error FS0010: Unexpected keyword 'type' in binding. Expected incomplete structured construct at or before this point or other token. + +neg104.fs(6,5,6,8): parse error FS3118: Incomplete value or function definition. If this is in an expression, the body of the expression must be indented to the same column as the 'let' keyword. + +neg104.fs(10,25,10,26): parse error FS0010: Unexpected symbol '}' in type definition. Expected '|}' or other token. + +neg104.fs(10,14,10,16): parse error FS0605: Unmatched '{|' + +neg104.fs(12,5,12,8): parse error FS0058: Possible incorrect indentation: this token is offside of context started at position (10:14). Try indenting this token further or using standard formatting conventions. + +neg104.fs(14,1,14,1): parse error FS0010: Incomplete structured construct at or before this point in implementation file + +neg104.fs(10,10,10,11): typecheck error FS0964: Type abbreviations cannot have augmentations + +neg104.fs(12,5,12,27): typecheck error FS0912: This declaration element is not permitted in an augmentation diff --git a/tests/fsharpqa/Source/Conformance/Expressions/ApplicationExpressions/BasicApplication/E_PostfixType01.fs b/tests/fsharpqa/Source/Conformance/Expressions/ApplicationExpressions/BasicApplication/E_PostfixType01.fs index 0d719d0fd45..3fe7bda3e32 100644 --- a/tests/fsharpqa/Source/Conformance/Expressions/ApplicationExpressions/BasicApplication/E_PostfixType01.fs +++ b/tests/fsharpqa/Source/Conformance/Expressions/ApplicationExpressions/BasicApplication/E_PostfixType01.fs @@ -1,7 +1,7 @@ // #Regression #Conformance #ApplicationExpressions // Regression test for FSHARP1.0:5525 // Deprecate postfix type application in "new" and "inherit" constructs -//This construct is deprecated: The use of the type syntax 'int C' and 'C ' is not permitted here\. Consider adjusting this type to be written in the form 'C'$ +//Unexpected identifier in expression$ type T<'t> = System.Collections.Generic.List<'t> let o = new int T () diff --git a/tests/fsharpqa/Source/Conformance/Expressions/ApplicationExpressions/BasicApplication/E_PostfixType03.fs b/tests/fsharpqa/Source/Conformance/Expressions/ApplicationExpressions/BasicApplication/E_PostfixType03.fs index eed4e517a69..aedb265593a 100644 --- a/tests/fsharpqa/Source/Conformance/Expressions/ApplicationExpressions/BasicApplication/E_PostfixType03.fs +++ b/tests/fsharpqa/Source/Conformance/Expressions/ApplicationExpressions/BasicApplication/E_PostfixType03.fs @@ -1,7 +1,7 @@ // #Regression #Conformance #ApplicationExpressions // Regression test for FSHARP1.0:5525 // Deprecate postfix type application in "new" and "inherit" constructs -//This construct is deprecated: The use of the type syntax 'int C' and 'C ' is not permitted here\. Consider adjusting this type to be written in the form 'C'$ +//Unexpected identifier in member definition$ #nowarn "0988" type T<'t> = System.Collections.Generic.List<'t> diff --git a/tests/fsharpqa/Source/OCamlCompat/MultiArgumentGenericType.fs b/tests/fsharpqa/Source/OCamlCompat/MultiArgumentGenericType.fs index 54b26ccc63d..a632b981da4 100644 --- a/tests/fsharpqa/Source/OCamlCompat/MultiArgumentGenericType.fs +++ b/tests/fsharpqa/Source/OCamlCompat/MultiArgumentGenericType.fs @@ -2,7 +2,7 @@ // Regressin Test for FSharp1.0:2098 - OCaml-compat warning for generics written like this: (string, int)Dictionary -//This construct is deprecated: The use of the type syntax 'int C' and 'C ' is not permitted here\. Consider adjusting this type to be written in the form 'C'$ +//Unexpected identifier in expression$ open System.Collections.Generic diff --git a/tests/scripts/compiler-perf-results.txt b/tests/scripts/compiler-perf-results.txt index ee00b0994f9..cf61efda488 100644 --- a/tests/scripts/compiler-perf-results.txt +++ b/tests/scripts/compiler-perf-results.txt @@ -131,3 +131,9 @@ https://github.com/manofstick/visualfsharp.git all-your-collections-are-belong-t https://github.com/manofstick/visualfsharp.git all-your-collections-are-belong-to-us 87dafbc17b494c438b6db9e59e064736bd8a44e2 ba63403cb5898596c5e875a14ce22b33ef618c01 221.58 11.19 31.91 48.23 66.05 52.99 https://github.com/manofstick/visualfsharp.git all-your-collections-are-belong-to-us 87dafbc17b494c438b6db9e59e064736bd8a44e2 458e6c29d7e059a5a8a7b4cd7858c7d633fb5906 224.75 11.20 31.09 46.96 63.08 53.08 https://github.com/manofstick/visualfsharp.git all-your-collections-are-belong-to-us 87dafbc17b494c438b6db9e59e064736bd8a44e2 7e1fd6ac330f86597f3167e8067cfd805a89eec9 235.48 10.83 33.47 47.17 65.56 52.50 +https://github.com/dsyme/visualfsharp.git range1 e49ac8a2f21223e60d0d9597e52ea9e5f8705963 ac9f2af4329d2ae1c4213bb1d22dc4450b319207 259.69 11.98 32.23 47.16 56.83 58.14 +https://github.com/Microsoft/visualfsharp master ac9f2af4329d2ae1c4213bb1d22dc4450b319207 ac9f2af4329d2ae1c4213bb1d22dc4450b319207 250.78 11.70 30.18 46.84 57.18 58.49 +https://github.com/dsyme/visualfsharp.git range1 e49ac8a2f21223e60d0d9597e52ea9e5f8705963 ac9f2af4329d2ae1c4213bb1d22dc4450b319207 250.75 11.73 30.77 46.66 57.97 59.44 +https://github.com/Microsoft/visualfsharp master ac9f2af4329d2ae1c4213bb1d22dc4450b319207 ac9f2af4329d2ae1c4213bb1d22dc4450b319207 251.89 11.89 30.30 46.67 58.00 59.09 +https://github.com/dsyme/visualfsharp.git range1 e49ac8a2f21223e60d0d9597e52ea9e5f8705963 ac9f2af4329d2ae1c4213bb1d22dc4450b319207 252.83 11.66 31.05 47.17 58.80 58.59 +https://github.com/Microsoft/visualfsharp master ac9f2af4329d2ae1c4213bb1d22dc4450b319207 ac9f2af4329d2ae1c4213bb1d22dc4450b319207 250.48 11.44 30.93 46.09 57.41 58.86 diff --git a/tests/service/Common.fs b/tests/service/Common.fs index f174908114a..9765be12118 100644 --- a/tests/service/Common.fs +++ b/tests/service/Common.fs @@ -230,6 +230,9 @@ let attribsOfSymbol (s:FSharpSymbol) = if v.IsVolatile then yield "volatile" if v.IsStatic then yield "static" if v.IsLiteral then yield sprintf "%A" v.LiteralValue.Value + if v.IsAnonRecordField then + let info, tys, i = v.AnonRecordFieldDetails + yield "anon(" + string i + ", [" + info.Assembly.QualifiedName + "/" + String.concat "+" info.EnclosingCompiledTypeNames + "/" + info.CompiledName + "]" + String.concat "," info.SortedFieldNames + ")" | :? FSharpEntity as v -> diff --git a/tests/service/ProjectAnalysisTests.fs b/tests/service/ProjectAnalysisTests.fs index 34822b99fe1..5852a0a4436 100644 --- a/tests/service/ProjectAnalysisTests.fs +++ b/tests/service/ProjectAnalysisTests.fs @@ -4971,6 +4971,88 @@ let ``Test Project40 all symbols`` () = ("IsItAnAMethod", ((13, 25), (13, 40)), ["member"; "funky"]); ("g", ((13, 4), (13, 5)), ["val"]); ("M", ((2, 7), (2, 8)), ["module"])] +//-------------------------------------------- + +module internal Project41 = + open System.IO + + let fileName1 = Path.ChangeExtension(Path.GetTempFileName(), ".fs") + let base2 = Path.GetTempFileName() + let dllName = Path.ChangeExtension(base2, ".dll") + let projFileName = Path.ChangeExtension(base2, ".fsproj") + let fileSource1 = """ +module M + + let data1 = {| X = 1 |} + + // Types can be written with the same syntax + let data2 : {| X : int |} = data1 + + type D = {| X : int |} + + // Access is as expected + let f1 (v : {| X : int |}) = v.X + + // Access is as expected + let f2 (v : D) = v.X + + // Access can be nested + let f3 (v : {| X: {| X : int; Y : string |} |}) = v.X.X + + """ + File.WriteAllText(fileName1, fileSource1) + let fileNames = [fileName1] + let args = mkProjectCommandLineArgs (dllName, fileNames) + let options = checker.GetProjectOptionsFromCommandLineArgs (projFileName, args) + let cleanFileName a = if a = fileName1 then "file1" else "??" + +[] +let ``Test project41 all symbols`` () = + + let wholeProjectResults = checker.ParseAndCheckProject(Project41.options) |> Async.RunSynchronously + let allSymbolUses = wholeProjectResults.GetAllUsesOfAllSymbols() |> Async.RunSynchronously + let allSymbolUsesInfo = + [ for s in allSymbolUses do + let pos = + match s.Symbol.DeclarationLocation with + | Some r when r.FileName = Project41.fileName1 -> r.StartLine, r.StartColumn + | _ -> (0,0) + yield (s.Symbol.DisplayName, tups s.RangeAlternate, attribsOfSymbol s.Symbol, pos) ] + allSymbolUsesInfo |> shouldEqual + [("X", ((4, 19), (4, 20)), ["field"; "anon(0, [//<>f__AnonymousType3999162117`1']X)"], (4, 19)); + ("data1", ((4, 8), (4, 13)), ["val"], (4, 8)); + ("int", ((7, 23), (7, 26)), ["abbrev"], (0, 0)); + ("X", ((7, 19), (7, 20)), ["field"; "anon(0, [//<>f__AnonymousType3999162117`1']X)"], (7, 19)); + ("data1", ((7, 32), (7, 37)), ["val"], (4, 8)); + ("data2", ((7, 8), (7, 13)), ["val"], (7, 8)); + ("int", ((9, 20), (9, 23)), ["abbrev"], (0, 0)); + ("X", ((9, 16), (9, 17)), ["field"; "anon(0, [//<>f__AnonymousType3999162117`1']X)"], (9, 16)); + ("int", ((9, 20), (9, 23)), ["abbrev"], (0, 0)); + ("X", ((9, 16), (9, 17)), ["field"; "anon(0, [//<>f__AnonymousType3999162117`1']X)"], (9, 16)); + ("D", ((9, 9), (9, 10)), ["abbrev"], (9, 9)); + ("int", ((12, 23), (12, 26)), ["abbrev"], (0, 0)); + ("X", ((12, 19), (12, 20)), ["field"; "anon(0, [//<>f__AnonymousType3999162117`1']X)"], (12, 19)); + ("v", ((12, 12), (12, 13)), [], (12, 12)); + ("v", ((12, 33), (12, 34)), [], (12, 12)); + ("X", ((12, 33), (12, 36)), ["field"; "anon(0, [//<>f__AnonymousType3999162117`1']X)"], (12, 19)); + ("f1", ((12, 8), (12, 10)), ["val"], (12, 8)); + ("D", ((15, 16), (15, 17)), ["abbrev"], (9, 9)); + ("v", ((15, 12), (15, 13)), [], (15, 12)); + ("v", ((15, 21), (15, 22)), [], (15, 12)); + ("X", ((15, 21), (15, 24)), ["field"; "anon(0, [//<>f__AnonymousType3999162117`1']X)"], (9, 16)); + ("f2", ((15, 8), (15, 10)), ["val"], (15, 8)); + ("int", ((18, 29), (18, 32)), ["abbrev"], (0, 0)); + ("string", ((18, 38), (18, 44)), ["abbrev"], (0, 0)); + ("X", ((18, 25), (18, 26)), ["field"; "anon(0, [//<>f__AnonymousType3571351395`2']X,Y)"], (18, 25)); + ("Y", ((18, 34), (18, 35)), ["field"; "anon(1, [//<>f__AnonymousType3571351395`2']X,Y)"], (18, 34)); + ("X", ((18, 19), (18, 20)), ["field"; "anon(0, [//<>f__AnonymousType3999162117`1']X)"], (18, 19)); + ("v", ((18, 12), (18, 13)), [], (18, 12)); + ("v", ((18, 54), (18, 55)), [], (18, 12)); + ("X", ((18, 56), (18, 57)), ["field"; "anon(0, [//<>f__AnonymousType3999162117`1']X)"], (18, 19)); + ("X", ((18, 54), (18, 59)), ["field"; "anon(0, [//<>f__AnonymousType3571351395`2']X,Y)"], (18, 25)); + ("f3", ((18, 8), (18, 10)), ["val"], (18, 8)); + ("M", ((2, 7), (2, 8)), ["module"], (2, 7))] + module internal ProjectBig = open System.IO From 4335cff62c9ecfa1b50a2817234072d036026fb4 Mon Sep 17 00:00:00 2001 From: Don Syme Date: Tue, 13 Mar 2018 19:07:43 +0000 Subject: [PATCH 002/160] stable tests --- tests/service/ProjectAnalysisTests.fs | 39 ++++++++++++++++++--------- 1 file changed, 26 insertions(+), 13 deletions(-) diff --git a/tests/service/ProjectAnalysisTests.fs b/tests/service/ProjectAnalysisTests.fs index 5852a0a4436..6463fbd5490 100644 --- a/tests/service/ProjectAnalysisTests.fs +++ b/tests/service/ProjectAnalysisTests.fs @@ -4977,7 +4977,8 @@ module internal Project41 = open System.IO let fileName1 = Path.ChangeExtension(Path.GetTempFileName(), ".fs") - let base2 = Path.GetTempFileName() + // We need to us a stable name to keep the hashes stable + let base2 = Path.Combine(Path.GetDirectoryName(Path.GetTempFileName()), "stabletmp.tmp") let dllName = Path.ChangeExtension(base2, ".dll") let projFileName = Path.ChangeExtension(base2, ".fsproj") let fileSource1 = """ @@ -5019,37 +5020,49 @@ let ``Test project41 all symbols`` () = | _ -> (0,0) yield (s.Symbol.DisplayName, tups s.RangeAlternate, attribsOfSymbol s.Symbol, pos) ] allSymbolUsesInfo |> shouldEqual - [("X", ((4, 19), (4, 20)), ["field"; "anon(0, [//<>f__AnonymousType3999162117`1']X)"], (4, 19)); + [("X", ((4, 19), (4, 20)), + ["field"; "anon(0, [//<>f__AnonymousType1416859829`1']X)"], (4, 19)); ("data1", ((4, 8), (4, 13)), ["val"], (4, 8)); ("int", ((7, 23), (7, 26)), ["abbrev"], (0, 0)); - ("X", ((7, 19), (7, 20)), ["field"; "anon(0, [//<>f__AnonymousType3999162117`1']X)"], (7, 19)); + ("X", ((7, 19), (7, 20)), + ["field"; "anon(0, [//<>f__AnonymousType1416859829`1']X)"], (7, 19)); ("data1", ((7, 32), (7, 37)), ["val"], (4, 8)); ("data2", ((7, 8), (7, 13)), ["val"], (7, 8)); ("int", ((9, 20), (9, 23)), ["abbrev"], (0, 0)); - ("X", ((9, 16), (9, 17)), ["field"; "anon(0, [//<>f__AnonymousType3999162117`1']X)"], (9, 16)); + ("X", ((9, 16), (9, 17)), + ["field"; "anon(0, [//<>f__AnonymousType1416859829`1']X)"], (9, 16)); ("int", ((9, 20), (9, 23)), ["abbrev"], (0, 0)); - ("X", ((9, 16), (9, 17)), ["field"; "anon(0, [//<>f__AnonymousType3999162117`1']X)"], (9, 16)); + ("X", ((9, 16), (9, 17)), + ["field"; "anon(0, [//<>f__AnonymousType1416859829`1']X)"], (9, 16)); ("D", ((9, 9), (9, 10)), ["abbrev"], (9, 9)); ("int", ((12, 23), (12, 26)), ["abbrev"], (0, 0)); - ("X", ((12, 19), (12, 20)), ["field"; "anon(0, [//<>f__AnonymousType3999162117`1']X)"], (12, 19)); + ("X", ((12, 19), (12, 20)), + ["field"; "anon(0, [//<>f__AnonymousType1416859829`1']X)"], (12, 19)); ("v", ((12, 12), (12, 13)), [], (12, 12)); ("v", ((12, 33), (12, 34)), [], (12, 12)); - ("X", ((12, 33), (12, 36)), ["field"; "anon(0, [//<>f__AnonymousType3999162117`1']X)"], (12, 19)); + ("X", ((12, 33), (12, 36)), + ["field"; "anon(0, [//<>f__AnonymousType1416859829`1']X)"], (12, 19)); ("f1", ((12, 8), (12, 10)), ["val"], (12, 8)); ("D", ((15, 16), (15, 17)), ["abbrev"], (9, 9)); ("v", ((15, 12), (15, 13)), [], (15, 12)); ("v", ((15, 21), (15, 22)), [], (15, 12)); - ("X", ((15, 21), (15, 24)), ["field"; "anon(0, [//<>f__AnonymousType3999162117`1']X)"], (9, 16)); + ("X", ((15, 21), (15, 24)), + ["field"; "anon(0, [//<>f__AnonymousType1416859829`1']X)"], (9, 16)); ("f2", ((15, 8), (15, 10)), ["val"], (15, 8)); ("int", ((18, 29), (18, 32)), ["abbrev"], (0, 0)); ("string", ((18, 38), (18, 44)), ["abbrev"], (0, 0)); - ("X", ((18, 25), (18, 26)), ["field"; "anon(0, [//<>f__AnonymousType3571351395`2']X,Y)"], (18, 25)); - ("Y", ((18, 34), (18, 35)), ["field"; "anon(1, [//<>f__AnonymousType3571351395`2']X,Y)"], (18, 34)); - ("X", ((18, 19), (18, 20)), ["field"; "anon(0, [//<>f__AnonymousType3999162117`1']X)"], (18, 19)); + ("X", ((18, 25), (18, 26)), + ["field"; "anon(0, [//<>f__AnonymousType4026451324`2']X,Y)"], (18, 25)); + ("Y", ((18, 34), (18, 35)), + ["field"; "anon(1, [//<>f__AnonymousType4026451324`2']X,Y)"], (18, 34)); + ("X", ((18, 19), (18, 20)), + ["field"; "anon(0, [//<>f__AnonymousType1416859829`1']X)"], (18, 19)); ("v", ((18, 12), (18, 13)), [], (18, 12)); ("v", ((18, 54), (18, 55)), [], (18, 12)); - ("X", ((18, 56), (18, 57)), ["field"; "anon(0, [//<>f__AnonymousType3999162117`1']X)"], (18, 19)); - ("X", ((18, 54), (18, 59)), ["field"; "anon(0, [//<>f__AnonymousType3571351395`2']X,Y)"], (18, 25)); + ("X", ((18, 56), (18, 57)), + ["field"; "anon(0, [//<>f__AnonymousType1416859829`1']X)"], (18, 19)); + ("X", ((18, 54), (18, 59)), + ["field"; "anon(0, [//<>f__AnonymousType4026451324`2']X,Y)"], (18, 25)); ("f3", ((18, 8), (18, 10)), ["val"], (18, 8)); ("M", ((2, 7), (2, 8)), ["module"], (2, 7))] From 6000c34a39759d52c65a0dd93c35cfa7249394b5 Mon Sep 17 00:00:00 2001 From: Don Syme Date: Wed, 14 Mar 2018 14:08:19 +0000 Subject: [PATCH 003/160] fix build --- tests/fsharp/core/anon/test.fsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/fsharp/core/anon/test.fsx b/tests/fsharp/core/anon/test.fsx index d45bd257165..331d522f071 100644 --- a/tests/fsharp/core/anon/test.fsx +++ b/tests/fsharp/core/anon/test.fsx @@ -53,7 +53,7 @@ module CrossAssemblyTest = tests() module CrossAssemblyTestStruct = - let tesvts() = + let tests() = check "svrknvio1" (SampleAPIStruct.SampleFunction {| A=1; B = "abc" |}) 4 // note, this is creating an instance of an anonymous record from another assembly. The structness is inferred in this case. check "svrknvio2" (SampleAPIStruct.SampleFunctionAcceptingList [ {| A=1; B = "abc" |}; {| A=2; B = "def" |} ]) [4; 5] // note, this is creating an instance of an anonymous record from another assembly. The structness is inferred in this case. check "svrknvio3" (let d = SampleAPIStruct.SampleFunctionReturningAnonRecd() in d.A + d.B.Length) 4 From 1ffbee73fa422767513c326fad7b1282a49f60e3 Mon Sep 17 00:00:00 2001 From: Don Syme Date: Wed, 14 Mar 2018 17:29:55 +0000 Subject: [PATCH 004/160] copy and update --- DEVGUIDE.md | 18 +- .../FSharp.Compiler.Private/FSComp.fs | 182 +++++++++--------- .../FSharp.Compiler.Private/FSComp.resx | 3 + src/fsharp/FSComp.txt | 1 + src/fsharp/LexFilter.fs | 9 +- src/fsharp/TypeChecker.fs | 129 ++++++++++--- src/fsharp/ast.fs | 10 +- src/fsharp/pars.fsy | 51 ++--- src/fsharp/service/ServiceParseTreeWalk.fs | 32 ++- src/fsharp/service/ServiceUntypedParse.fs | 5 +- src/fsharp/xlf/FSComp.txt.cs.xlf | 5 + src/fsharp/xlf/FSComp.txt.de.xlf | 5 + src/fsharp/xlf/FSComp.txt.en.xlf | 5 + src/fsharp/xlf/FSComp.txt.es.xlf | 5 + src/fsharp/xlf/FSComp.txt.fr.xlf | 5 + src/fsharp/xlf/FSComp.txt.it.xlf | 5 + src/fsharp/xlf/FSComp.txt.ja.xlf | 5 + src/fsharp/xlf/FSComp.txt.ko.xlf | 5 + src/fsharp/xlf/FSComp.txt.pl.xlf | 5 + src/fsharp/xlf/FSComp.txt.pt-BR.xlf | 5 + src/fsharp/xlf/FSComp.txt.ru.xlf | 5 + src/fsharp/xlf/FSComp.txt.tr.xlf | 5 + src/fsharp/xlf/FSComp.txt.zh-Hans.xlf | 5 + src/fsharp/xlf/FSComp.txt.zh-Hant.xlf | 5 + tests/fsharp/core/anon/lib.fs | 45 ++++- 25 files changed, 392 insertions(+), 163 deletions(-) diff --git a/DEVGUIDE.md b/DEVGUIDE.md index 9fd93452651..b453a7bdbc7 100644 --- a/DEVGUIDE.md +++ b/DEVGUIDE.md @@ -215,12 +215,23 @@ For **Release**: - We use the proto compiler to compile the source for `FSharp.Core.dll` in this distribution. - We use the proto compiler to compile the source for `FSharp.Compiler.dll`, `fsc.exe`, `fsi.exe`, and other binaries found in this distribution. -#### Updating FSComp.fs +#### Updating FSComp.fs, FSComp.resx and XLF If you change error messages you may need to update FSComp.fs in `src\buildfromsource\FSharp.Compiler.Private`. To do this, build the non-buildfromsource version of FSharp.Compiler.Private (src\fsharp\FSharp.Compiler.Private) then check its obj\ directory for `FSComp.fs` and manually copy that into the buildfromsource directory. + copy /y src\fsharp\FSharp.Compiler.Private\obj\Debug\net40\FSComp.fs src\buildfromsource\FSharp.Compiler.Private\ + copy /y src\fsharp\FSharp.Compiler.Private\obj\Debug\net40\FSComp.resx src\buildfromsource\FSharp.Compiler.Private\ + +If your changes involve modifying the list of language keywords in any way, (e.g. when implementing a new keyword), the XLF localization files need to be synced with the corresponding resx files. This can be done automatically by running + + pushd src\fsharp\FSharp.Compiler.Private + msbuild FSharp.Compiler.Private.fsproj /t:UpdateXlf + popd + +This only works on Windows/.NETStandard framework, so changing this from any other platform requires editing and syncing all of the XLF files manually. + #### Configuring proxy server @@ -232,11 +243,6 @@ If you are behind a proxy server, NuGet client tool must be configured to use it Where you should set proper proxy address, user name and password. -#### When modifying, adding, or removing keywords or compiler messages - -If your changes involve modifying the list of language keywords in any way, (e.g. when implementing a new keyword), the XLF localization files need to be synced with the corresponding resx files. This can be done automatically by running `msbuild FSharp.Compiler.Private.fsproj /t:UpdateXlf` (located in [src\fsharp\FSharp.Compiler.Private](https://github.com/Microsoft/visualfsharp/tree/master/src/fsharp/FSharp.Compiler.Private)). This only works on Windows/.NETStandard framework, so changing this from any other platform requires editing and syncing all of the XLF files manually. - -After this, you must copy any differing `resx` files from the output directory into the corresponding subdirectory in [src\buildfromsource](https://github.com/Microsoft/visualfsharp/tree/master/src/fsharp/FSharp.Compiler.Private). This step will soon be eliminated (see issue [#3905](https://github.com/Microsoft/visualfsharp/issues/3905)). #### Resources diff --git a/src/buildfromsource/FSharp.Compiler.Private/FSComp.fs b/src/buildfromsource/FSharp.Compiler.Private/FSComp.fs index a88526f0fe7..e78c24d6146 100644 --- a/src/buildfromsource/FSharp.Compiler.Private/FSComp.fs +++ b/src/buildfromsource/FSharp.Compiler.Private/FSComp.fs @@ -4057,273 +4057,276 @@ type internal SR private() = /// Two anonymous record types are from different assemblies '%s' and '%s' /// (Originally from ..\FSComp.txt:1343) static member tcAnonRecdCcuMismatch(a0 : System.String, a1 : System.String) = (GetStringFunc("tcAnonRecdCcuMismatch",",,,%s,,,%s,,,") a0 a1) - /// One anonymous record type is assembly-bound to '%s' (syntax 'new {| ... |}'), the other is assembly-neutral (syntax '{| ... |}') + /// Two anonymous record types have mismatched sets of field names '%s' and '%s' /// (Originally from ..\FSComp.txt:1344) static member tcAnonRecdFieldNameMismatch(a0 : System.String, a1 : System.String) = (GetStringFunc("tcAnonRecdFieldNameMismatch",",,,%s,,,%s,,,") a0 a1) /// Indicates a method that either has no implementation in the type in which it is declared or that is virtual and has a default implementation. - /// (Originally from ..\FSComp.txt:1346) + /// (Originally from ..\FSComp.txt:1345) static member keywordDescriptionAbstract() = (GetStringFunc("keywordDescriptionAbstract",",,,") ) /// Used in mutually recursive bindings, in property declarations, and with multiple constraints on generic parameters. - /// (Originally from ..\FSComp.txt:1347) + /// (Originally from ..\FSComp.txt:1346) static member keyworkDescriptionAnd() = (GetStringFunc("keyworkDescriptionAnd",",,,") ) /// Used to give the current class object an object name. Also used to give a name to a whole pattern within a pattern match. - /// (Originally from ..\FSComp.txt:1348) + /// (Originally from ..\FSComp.txt:1347) static member keywordDescriptionAs() = (GetStringFunc("keywordDescriptionAs",",,,") ) /// Used to verify code during debugging. - /// (Originally from ..\FSComp.txt:1349) + /// (Originally from ..\FSComp.txt:1348) static member keywordDescriptionAssert() = (GetStringFunc("keywordDescriptionAssert",",,,") ) /// Used as the name of the base class object. - /// (Originally from ..\FSComp.txt:1350) + /// (Originally from ..\FSComp.txt:1349) static member keywordDescriptionBase() = (GetStringFunc("keywordDescriptionBase",",,,") ) /// In verbose syntax, indicates the start of a code block. - /// (Originally from ..\FSComp.txt:1351) + /// (Originally from ..\FSComp.txt:1350) static member keywordDescriptionBegin() = (GetStringFunc("keywordDescriptionBegin",",,,") ) /// In verbose syntax, indicates the start of a class definition. - /// (Originally from ..\FSComp.txt:1352) + /// (Originally from ..\FSComp.txt:1351) static member keywordDescriptionClass() = (GetStringFunc("keywordDescriptionClass",",,,") ) /// Indicates an implementation of an abstract method; used together with an abstract method declaration to create a virtual method. - /// (Originally from ..\FSComp.txt:1353) + /// (Originally from ..\FSComp.txt:1352) static member keywordDescriptionDefault() = (GetStringFunc("keywordDescriptionDefault",",,,") ) /// Used to declare a delegate. - /// (Originally from ..\FSComp.txt:1354) + /// (Originally from ..\FSComp.txt:1353) static member keywordDescriptionDelegate() = (GetStringFunc("keywordDescriptionDelegate",",,,") ) /// Used in looping constructs or to execute imperative code. - /// (Originally from ..\FSComp.txt:1355) + /// (Originally from ..\FSComp.txt:1354) static member keywordDescriptionDo() = (GetStringFunc("keywordDescriptionDo",",,,") ) /// In verbose syntax, indicates the end of a block of code in a looping expression. - /// (Originally from ..\FSComp.txt:1356) + /// (Originally from ..\FSComp.txt:1355) static member keywordDescriptionDone() = (GetStringFunc("keywordDescriptionDone",",,,") ) /// Used to convert to a type that is lower in the inheritance chain. - /// (Originally from ..\FSComp.txt:1357) + /// (Originally from ..\FSComp.txt:1356) static member keywordDescriptionDowncast() = (GetStringFunc("keywordDescriptionDowncast",",,,") ) /// In a for expression, used when counting in reverse. - /// (Originally from ..\FSComp.txt:1358) + /// (Originally from ..\FSComp.txt:1357) static member keywordDescriptionDownto() = (GetStringFunc("keywordDescriptionDownto",",,,") ) /// Used in conditional branching. A short form of else if. - /// (Originally from ..\FSComp.txt:1359) + /// (Originally from ..\FSComp.txt:1358) static member keywordDescriptionElif() = (GetStringFunc("keywordDescriptionElif",",,,") ) /// Used in conditional branching. - /// (Originally from ..\FSComp.txt:1360) + /// (Originally from ..\FSComp.txt:1359) static member keywordDescriptionElse() = (GetStringFunc("keywordDescriptionElse",",,,") ) /// In type definitions and type extensions, indicates the end of a section of member definitions. In verbose syntax, used to specify the end of a code block that starts with the begin keyword. - /// (Originally from ..\FSComp.txt:1361) + /// (Originally from ..\FSComp.txt:1360) static member keywordDescriptionEnd() = (GetStringFunc("keywordDescriptionEnd",",,,") ) /// Used to declare an exception type. - /// (Originally from ..\FSComp.txt:1362) + /// (Originally from ..\FSComp.txt:1361) static member keywordDescriptionException() = (GetStringFunc("keywordDescriptionException",",,,") ) /// Indicates that a declared program element is defined in another binary or assembly. - /// (Originally from ..\FSComp.txt:1363) + /// (Originally from ..\FSComp.txt:1362) static member keywordDescriptionExtern() = (GetStringFunc("keywordDescriptionExtern",",,,") ) /// Used as a Boolean literal. - /// (Originally from ..\FSComp.txt:1364) + /// (Originally from ..\FSComp.txt:1363) static member keywordDescriptionTrueFalse() = (GetStringFunc("keywordDescriptionTrueFalse",",,,") ) /// Used together with try to introduce a block of code that executes regardless of whether an exception occurs. - /// (Originally from ..\FSComp.txt:1365) + /// (Originally from ..\FSComp.txt:1364) static member keywordDescriptionFinally() = (GetStringFunc("keywordDescriptionFinally",",,,") ) /// Used in looping constructs. - /// (Originally from ..\FSComp.txt:1366) + /// (Originally from ..\FSComp.txt:1365) static member keywordDescriptionFor() = (GetStringFunc("keywordDescriptionFor",",,,") ) /// Used in lambda expressions, also known as anonymous functions. - /// (Originally from ..\FSComp.txt:1367) + /// (Originally from ..\FSComp.txt:1366) static member keywordDescriptionFun() = (GetStringFunc("keywordDescriptionFun",",,,") ) /// Used as a shorter alternative to the fun keyword and a match expression in a lambda expression that has pattern matching on a single argument. - /// (Originally from ..\FSComp.txt:1368) + /// (Originally from ..\FSComp.txt:1367) static member keywordDescriptionFunction() = (GetStringFunc("keywordDescriptionFunction",",,,") ) /// Used to reference the top-level .NET namespace. - /// (Originally from ..\FSComp.txt:1369) + /// (Originally from ..\FSComp.txt:1368) static member keywordDescriptionGlobal() = (GetStringFunc("keywordDescriptionGlobal",",,,") ) /// Used in conditional branching constructs. - /// (Originally from ..\FSComp.txt:1370) + /// (Originally from ..\FSComp.txt:1369) static member keywordDescriptionIf() = (GetStringFunc("keywordDescriptionIf",",,,") ) /// Used for sequence expressions and, in verbose syntax, to separate expressions from bindings. - /// (Originally from ..\FSComp.txt:1371) + /// (Originally from ..\FSComp.txt:1370) static member keywordDescriptionIn() = (GetStringFunc("keywordDescriptionIn",",,,") ) /// Used to specify a base class or base interface. - /// (Originally from ..\FSComp.txt:1372) + /// (Originally from ..\FSComp.txt:1371) static member keywordDescriptionInherit() = (GetStringFunc("keywordDescriptionInherit",",,,") ) /// Used to indicate a function that should be integrated directly into the caller's code. - /// (Originally from ..\FSComp.txt:1373) + /// (Originally from ..\FSComp.txt:1372) static member keywordDescriptionInline() = (GetStringFunc("keywordDescriptionInline",",,,") ) /// Used to declare and implement interfaces. - /// (Originally from ..\FSComp.txt:1374) + /// (Originally from ..\FSComp.txt:1373) static member keywordDescriptionInterface() = (GetStringFunc("keywordDescriptionInterface",",,,") ) /// Used to specify that a member is visible inside an assembly but not outside it. - /// (Originally from ..\FSComp.txt:1375) + /// (Originally from ..\FSComp.txt:1374) static member keywordDescriptionInternal() = (GetStringFunc("keywordDescriptionInternal",",,,") ) /// Used to specify a computation that is to be performed only when a result is needed. - /// (Originally from ..\FSComp.txt:1376) + /// (Originally from ..\FSComp.txt:1375) static member keywordDescriptionLazy() = (GetStringFunc("keywordDescriptionLazy",",,,") ) /// Used to associate, or bind, a name to a value or function. - /// (Originally from ..\FSComp.txt:1377) + /// (Originally from ..\FSComp.txt:1376) static member keywordDescriptionLet() = (GetStringFunc("keywordDescriptionLet",",,,") ) /// Used in asynchronous workflows to bind a name to the result of an asynchronous computation, or, in other computation expressions, used to bind a name to a result, which is of the computation type. - /// (Originally from ..\FSComp.txt:1378) + /// (Originally from ..\FSComp.txt:1377) static member keywordDescriptionLetBang() = (GetStringFunc("keywordDescriptionLetBang",",,,") ) /// Used to branch by comparing a value to a pattern. - /// (Originally from ..\FSComp.txt:1379) + /// (Originally from ..\FSComp.txt:1378) static member keywordDescriptionMatch() = (GetStringFunc("keywordDescriptionMatch",",,,") ) /// Used to declare a property or method in an object type. - /// (Originally from ..\FSComp.txt:1380) + /// (Originally from ..\FSComp.txt:1379) static member keywordDescriptionMember() = (GetStringFunc("keywordDescriptionMember",",,,") ) /// Used to associate a name with a group of related types, values, and functions, to logically separate it from other code. - /// (Originally from ..\FSComp.txt:1381) + /// (Originally from ..\FSComp.txt:1380) static member keywordDescriptionModule() = (GetStringFunc("keywordDescriptionModule",",,,") ) /// Used to declare a variable, that is, a value that can be changed. - /// (Originally from ..\FSComp.txt:1382) + /// (Originally from ..\FSComp.txt:1381) static member keywordDescriptionMutable() = (GetStringFunc("keywordDescriptionMutable",",,,") ) /// Used to associate a name with a group of related types and modules, to logically separate it from other code. - /// (Originally from ..\FSComp.txt:1383) + /// (Originally from ..\FSComp.txt:1382) static member keywordDescriptionNamespace() = (GetStringFunc("keywordDescriptionNamespace",",,,") ) /// Used to declare, define, or invoke a constructor that creates or that can create an object. Also used in generic parameter constraints to indicate that a type must have a certain constructor. - /// (Originally from ..\FSComp.txt:1384) + /// (Originally from ..\FSComp.txt:1383) static member keywordDescriptionNew() = (GetStringFunc("keywordDescriptionNew",",,,") ) /// Not actually a keyword. However, not struct in combination is used as a generic parameter constraint. - /// (Originally from ..\FSComp.txt:1385) + /// (Originally from ..\FSComp.txt:1384) static member keywordDescriptionNot() = (GetStringFunc("keywordDescriptionNot",",,,") ) /// Indicates the absence of an object. Also used in generic parameter constraints. - /// (Originally from ..\FSComp.txt:1386) + /// (Originally from ..\FSComp.txt:1385) static member keywordDescriptionNull() = (GetStringFunc("keywordDescriptionNull",",,,") ) /// Used in discriminated unions to indicate the type of categories of values, and in delegate and exception declarations. - /// (Originally from ..\FSComp.txt:1387) + /// (Originally from ..\FSComp.txt:1386) static member keywordDescriptionOf() = (GetStringFunc("keywordDescriptionOf",",,,") ) /// Used to make the contents of a namespace or module available without qualification. - /// (Originally from ..\FSComp.txt:1388) + /// (Originally from ..\FSComp.txt:1387) static member keywordDescriptionOpen() = (GetStringFunc("keywordDescriptionOpen",",,,") ) /// Used with Boolean conditions as a Boolean or operator. Equivalent to ||. Also used in member constraints. - /// (Originally from ..\FSComp.txt:1389) + /// (Originally from ..\FSComp.txt:1388) static member keywordDescriptionOr() = (GetStringFunc("keywordDescriptionOr",",,,") ) /// Used to implement a version of an abstract or virtual method that differs from the base version. - /// (Originally from ..\FSComp.txt:1390) + /// (Originally from ..\FSComp.txt:1389) static member keywordDescriptionOverride() = (GetStringFunc("keywordDescriptionOverride",",,,") ) /// Restricts access to a member to code in the same type or module. - /// (Originally from ..\FSComp.txt:1391) + /// (Originally from ..\FSComp.txt:1390) static member keywordDescriptionPrivate() = (GetStringFunc("keywordDescriptionPrivate",",,,") ) /// Allows access to a member from outside the type. - /// (Originally from ..\FSComp.txt:1392) + /// (Originally from ..\FSComp.txt:1391) static member keywordDescriptionPublic() = (GetStringFunc("keywordDescriptionPublic",",,,") ) /// Used to indicate that a function is recursive. - /// (Originally from ..\FSComp.txt:1393) + /// (Originally from ..\FSComp.txt:1392) static member keywordDescriptionRec() = (GetStringFunc("keywordDescriptionRec",",,,") ) /// Used to indicate a value to provide as the result of a computation expression. - /// (Originally from ..\FSComp.txt:1394) + /// (Originally from ..\FSComp.txt:1393) static member keywordDescriptionReturn() = (GetStringFunc("keywordDescriptionReturn",",,,") ) /// Used to indicate a computation expression that, when evaluated, provides the result of the containing computation expression. - /// (Originally from ..\FSComp.txt:1395) + /// (Originally from ..\FSComp.txt:1394) static member keywordDescriptionReturnBang() = (GetStringFunc("keywordDescriptionReturnBang",",,,") ) /// Used in query expressions to specify what fields or columns to extract. Note that this is a contextual keyword, which means that it is not actually a reserved word and it only acts like a keyword in appropriate context. - /// (Originally from ..\FSComp.txt:1396) + /// (Originally from ..\FSComp.txt:1395) static member keywordDescriptionSelect() = (GetStringFunc("keywordDescriptionSelect",",,,") ) /// Used to indicate a method or property that can be called without an instance of a type, or a value member that is shared among all instances of a type. - /// (Originally from ..\FSComp.txt:1397) + /// (Originally from ..\FSComp.txt:1396) static member keywordDescriptionStatic() = (GetStringFunc("keywordDescriptionStatic",",,,") ) /// Used to declare a structure type. Also used in generic parameter constraints. Used for OCaml compatibility in module definitions. - /// (Originally from ..\FSComp.txt:1398) + /// (Originally from ..\FSComp.txt:1397) static member keywordDescriptionStruct() = (GetStringFunc("keywordDescriptionStruct",",,,") ) /// Used in conditional expressions. Also used to perform side effects after object construction. - /// (Originally from ..\FSComp.txt:1399) + /// (Originally from ..\FSComp.txt:1398) static member keywordDescriptionThen() = (GetStringFunc("keywordDescriptionThen",",,,") ) /// Used in for loops to indicate a range. - /// (Originally from ..\FSComp.txt:1400) + /// (Originally from ..\FSComp.txt:1399) static member keywordDescriptionTo() = (GetStringFunc("keywordDescriptionTo",",,,") ) /// Used to introduce a block of code that might generate an exception. Used together with with or finally. - /// (Originally from ..\FSComp.txt:1401) + /// (Originally from ..\FSComp.txt:1400) static member keywordDescriptionTry() = (GetStringFunc("keywordDescriptionTry",",,,") ) /// Used to declare a class, record, structure, discriminated union, enumeration type, unit of measure, or type abbreviation. - /// (Originally from ..\FSComp.txt:1402) + /// (Originally from ..\FSComp.txt:1401) static member keywordDescriptionType() = (GetStringFunc("keywordDescriptionType",",,,") ) /// Used to convert to a type that is higher in the inheritance chain. - /// (Originally from ..\FSComp.txt:1403) + /// (Originally from ..\FSComp.txt:1402) static member keywordDescriptionUpcast() = (GetStringFunc("keywordDescriptionUpcast",",,,") ) /// Used instead of let for values that require Dispose to be called to free resources. - /// (Originally from ..\FSComp.txt:1404) + /// (Originally from ..\FSComp.txt:1403) static member keywordDescriptionUse() = (GetStringFunc("keywordDescriptionUse",",,,") ) /// Used instead of let! in asynchronous workflows and other computation expressions for values that require Dispose to be called to free resources. - /// (Originally from ..\FSComp.txt:1405) + /// (Originally from ..\FSComp.txt:1404) static member keywordDescriptionUseBang() = (GetStringFunc("keywordDescriptionUseBang",",,,") ) /// Used in a signature to indicate a value, or in a type to declare a member, in limited situations. - /// (Originally from ..\FSComp.txt:1406) + /// (Originally from ..\FSComp.txt:1405) static member keywordDescriptionVal() = (GetStringFunc("keywordDescriptionVal",",,,") ) /// Indicates the .NET void type. Used when interoperating with other .NET languages. - /// (Originally from ..\FSComp.txt:1407) + /// (Originally from ..\FSComp.txt:1406) static member keywordDescriptionVoid() = (GetStringFunc("keywordDescriptionVoid",",,,") ) /// Used for Boolean conditions (when guards) on pattern matches and to introduce a constraint clause for a generic type parameter. - /// (Originally from ..\FSComp.txt:1408) + /// (Originally from ..\FSComp.txt:1407) static member keywordDescriptionWhen() = (GetStringFunc("keywordDescriptionWhen",",,,") ) /// Introduces a looping construct. - /// (Originally from ..\FSComp.txt:1409) + /// (Originally from ..\FSComp.txt:1408) static member keywordDescriptionWhile() = (GetStringFunc("keywordDescriptionWhile",",,,") ) /// Used together with the match keyword in pattern matching expressions. Also used in object expressions, record copying expressions, and type extensions to introduce member definitions, and to introduce exception handlers. - /// (Originally from ..\FSComp.txt:1410) + /// (Originally from ..\FSComp.txt:1409) static member keywordDescriptionWith() = (GetStringFunc("keywordDescriptionWith",",,,") ) /// Used in a sequence expression to produce a value for a sequence. - /// (Originally from ..\FSComp.txt:1411) + /// (Originally from ..\FSComp.txt:1410) static member keywordDescriptionYield() = (GetStringFunc("keywordDescriptionYield",",,,") ) /// Used in a computation expression to append the result of a given computation expression to a collection of results for the containing computation expression. - /// (Originally from ..\FSComp.txt:1412) + /// (Originally from ..\FSComp.txt:1411) static member keywordDescriptionYieldBang() = (GetStringFunc("keywordDescriptionYieldBang",",,,") ) /// In function types, delimits arguments and return values. Yields an expression (in sequence expressions); equivalent to the yield keyword. Used in match expressions - /// (Originally from ..\FSComp.txt:1413) + /// (Originally from ..\FSComp.txt:1412) static member keywordDescriptionRightArrow() = (GetStringFunc("keywordDescriptionRightArrow",",,,") ) /// Assigns a value to a variable. - /// (Originally from ..\FSComp.txt:1414) + /// (Originally from ..\FSComp.txt:1413) static member keywordDescriptionLeftArrow() = (GetStringFunc("keywordDescriptionLeftArrow",",,,") ) /// Converts a type to type that is higher in the hierarchy. - /// (Originally from ..\FSComp.txt:1415) + /// (Originally from ..\FSComp.txt:1414) static member keywordDescriptionCast() = (GetStringFunc("keywordDescriptionCast",",,,") ) /// Converts a type to a type that is lower in the hierarchy. - /// (Originally from ..\FSComp.txt:1416) + /// (Originally from ..\FSComp.txt:1415) static member keywordDescriptionDynamicCast() = (GetStringFunc("keywordDescriptionDynamicCast",",,,") ) /// Delimits a typed code quotation. - /// (Originally from ..\FSComp.txt:1417) + /// (Originally from ..\FSComp.txt:1416) static member keywordDescriptionTypedQuotation() = (GetStringFunc("keywordDescriptionTypedQuotation",",,,") ) /// Delimits a untyped code quotation. - /// (Originally from ..\FSComp.txt:1418) + /// (Originally from ..\FSComp.txt:1417) static member keywordDescriptionUntypedQuotation() = (GetStringFunc("keywordDescriptionUntypedQuotation",",,,") ) /// %s '%s' not found in assembly '%s'. A possible cause may be a version incompatibility. You may need to explicitly reference the correct version of this assembly to allow all referenced components to use the correct version. - /// (Originally from ..\FSComp.txt:1419) + /// (Originally from ..\FSComp.txt:1418) static member itemNotFoundDuringDynamicCodeGen(a0 : System.String, a1 : System.String, a2 : System.String) = (3216, GetStringFunc("itemNotFoundDuringDynamicCodeGen",",,,%s,,,%s,,,%s,,,") a0 a1 a2) /// %s '%s' not found in type '%s' from assembly '%s'. A possible cause may be a version incompatibility. You may need to explicitly reference the correct version of this assembly to allow all referenced components to use the correct version. - /// (Originally from ..\FSComp.txt:1420) + /// (Originally from ..\FSComp.txt:1419) static member itemNotFoundInTypeDuringDynamicCodeGen(a0 : System.String, a1 : System.String, a2 : System.String, a3 : System.String) = (3216, GetStringFunc("itemNotFoundInTypeDuringDynamicCodeGen",",,,%s,,,%s,,,%s,,,%s,,,") a0 a1 a2 a3) /// is - /// (Originally from ..\FSComp.txt:1421) + /// (Originally from ..\FSComp.txt:1420) static member descriptionWordIs() = (GetStringFunc("descriptionWordIs",",,,") ) /// This value is not a function and cannot be applied. - /// (Originally from ..\FSComp.txt:1422) + /// (Originally from ..\FSComp.txt:1421) static member notAFunction() = (GetStringFunc("notAFunction",",,,") ) /// This value is not a function and cannot be applied. Did you intend to access the indexer via %s.[index] instead? - /// (Originally from ..\FSComp.txt:1423) + /// (Originally from ..\FSComp.txt:1422) static member notAFunctionButMaybeIndexerWithName(a0 : System.String) = (GetStringFunc("notAFunctionButMaybeIndexerWithName",",,,%s,,,") a0) /// This expression is not a function and cannot be applied. Did you intend to access the indexer via expr.[index] instead? - /// (Originally from ..\FSComp.txt:1424) + /// (Originally from ..\FSComp.txt:1423) static member notAFunctionButMaybeIndexer() = (GetStringFunc("notAFunctionButMaybeIndexer",",,,") ) /// - /// (Originally from ..\FSComp.txt:1425) + /// (Originally from ..\FSComp.txt:1424) static member notAFunctionButMaybeIndexerErrorCode() = (3217, GetStringFunc("notAFunctionButMaybeIndexerErrorCode",",,,") ) /// This value is not a function and cannot be applied. Did you forget to terminate a declaration? - /// (Originally from ..\FSComp.txt:1426) + /// (Originally from ..\FSComp.txt:1425) static member notAFunctionButMaybeDeclaration() = (GetStringFunc("notAFunctionButMaybeDeclaration",",,,") ) /// The argument names in the signature '%s' and implementation '%s' do not match. The argument name from the signature file will be used. This may cause problems when debugging or profiling. - /// (Originally from ..\FSComp.txt:1427) + /// (Originally from ..\FSComp.txt:1426) static member ArgumentsInSigAndImplMismatch(a0 : System.String, a1 : System.String) = (3218, GetStringFunc("ArgumentsInSigAndImplMismatch",",,,%s,,,%s,,,") a0 a1) /// An error occurred while reading the F# metadata of assembly '%s'. A reserved construct was utilized. You may need to upgrade your F# compiler or use an earlier version of the assembly that doesn't make use of a specific construct. - /// (Originally from ..\FSComp.txt:1428) + /// (Originally from ..\FSComp.txt:1427) static member pickleUnexpectedNonZero(a0 : System.String) = (3219, GetStringFunc("pickleUnexpectedNonZero",",,,%s,,,") a0) /// This method or property is not normally used from F# code, use an explicit tuple pattern for deconstruction instead. - /// (Originally from ..\FSComp.txt:1429) + /// (Originally from ..\FSComp.txt:1428) static member tcTupleMemberNotNormallyUsed() = (3220, GetStringFunc("tcTupleMemberNotNormallyUsed",",,,") ) /// This expression returns a value of type '%s' but is implicitly discarded. Consider using 'let' to bind the result to a name, e.g. 'let result = expression'. If you intended to use the expression as a value in the sequence then use an explicit 'yield'. - /// (Originally from ..\FSComp.txt:1430) + /// (Originally from ..\FSComp.txt:1429) static member implicitlyDiscardedInSequenceExpression(a0 : System.String) = (3221, GetStringFunc("implicitlyDiscardedInSequenceExpression",",,,%s,,,") a0) /// This expression returns a value of type '%s' but is implicitly discarded. Consider using 'let' to bind the result to a name, e.g. 'let result = expression'. If you intended to use the expression as a value in the sequence then use an explicit 'yield!'. - /// (Originally from ..\FSComp.txt:1431) + /// (Originally from ..\FSComp.txt:1430) static member implicitlyDiscardedSequenceInSequenceExpression(a0 : System.String) = (3222, GetStringFunc("implicitlyDiscardedSequenceInSequenceExpression",",,,%s,,,") a0) /// Invalid anonymous record expression - /// (Originally from ..\FSComp.txt:1432) + /// (Originally from ..\FSComp.txt:1431) static member parsInvalidAnonRecdExpr() = (3223, GetStringFunc("parsInvalidAnonRecdExpr",",,,") ) /// Invalid anonymous record type - /// (Originally from ..\FSComp.txt:1433) + /// (Originally from ..\FSComp.txt:1432) static member parsInvalidAnonRecdType() = (3224, GetStringFunc("parsInvalidAnonRecdType",",,,") ) + /// The input to a copy-and-update expression that creates an anonymous record must be either an anonymous record or a record + /// (Originally from ..\FSComp.txt:1433) + static member tcCopyAndUpdateNeedsRecordType() = (3225, GetStringFunc("tcCopyAndUpdateNeedsRecordType",",,,") ) /// Call this method once to validate that all known resources are valid; throws if not static member RunStartupValidation() = @@ -5730,4 +5733,5 @@ type internal SR private() = ignore(GetString("implicitlyDiscardedSequenceInSequenceExpression")) ignore(GetString("parsInvalidAnonRecdExpr")) ignore(GetString("parsInvalidAnonRecdType")) + ignore(GetString("tcCopyAndUpdateNeedsRecordType")) () diff --git a/src/buildfromsource/FSharp.Compiler.Private/FSComp.resx b/src/buildfromsource/FSharp.Compiler.Private/FSComp.resx index 2e1d0938ce4..07ea19a9a34 100644 --- a/src/buildfromsource/FSharp.Compiler.Private/FSComp.resx +++ b/src/buildfromsource/FSharp.Compiler.Private/FSComp.resx @@ -4327,4 +4327,7 @@ Invalid anonymous record type + + The input to a copy-and-update expression that creates an anonymous record must be either an anonymous record or a record + \ No newline at end of file diff --git a/src/fsharp/FSComp.txt b/src/fsharp/FSComp.txt index a212f7def0b..60d6405efaa 100644 --- a/src/fsharp/FSComp.txt +++ b/src/fsharp/FSComp.txt @@ -1430,3 +1430,4 @@ notAFunctionButMaybeDeclaration,"This value is not a function and cannot be appl 3222,implicitlyDiscardedSequenceInSequenceExpression,"This expression returns a value of type '%s' but is implicitly discarded. Consider using 'let' to bind the result to a name, e.g. 'let result = expression'. If you intended to use the expression as a value in the sequence then use an explicit 'yield!'." 3223,parsInvalidAnonRecdExpr,"Invalid anonymous record expression" 3224,parsInvalidAnonRecdType,"Invalid anonymous record type" +3225,tcCopyAndUpdateNeedsRecordType,"The input to a copy-and-update expression that creates an anonymous record must be either an anonymous record or a record" diff --git a/src/fsharp/LexFilter.fs b/src/fsharp/LexFilter.fs index 8d92b6edb64..ed229ff4e83 100755 --- a/src/fsharp/LexFilter.fs +++ b/src/fsharp/LexFilter.fs @@ -674,7 +674,6 @@ type LexFilterImpl (lightSyntaxStatus:LightSyntaxStatus, compilingFsLib, lexer, | _,(CtxtSeqBlock _ :: CtxtParen(LBRACE,_) :: CtxtVanilla _ :: CtxtSeqBlock _ :: rest) -> unindentationLimit false rest - // MAJOR PERMITTED UNDENTATION This is allowing: // if x then y else // let x = 3 + 4 @@ -768,7 +767,7 @@ type LexFilterImpl (lightSyntaxStatus:LightSyntaxStatus, compilingFsLib, lexer, // REVIEW: document these | _,(CtxtSeqBlock _ :: CtxtParen((BEGIN | LPAREN | LBRACK | LBRACK_BAR),_) :: CtxtVanilla _ :: (CtxtSeqBlock _ as limitCtxt) :: _) - | (CtxtSeqBlock _),(CtxtParen ((BEGIN | LPAREN | LBRACE | LBRACK | LBRACK_BAR) ,_) :: CtxtSeqBlock _ :: ((CtxtTypeDefns _ | CtxtLetDecl _ | CtxtMemberBody _ | CtxtWithAsLet _) as limitCtxt) :: _) + | (CtxtSeqBlock _),(CtxtParen ((BEGIN | LPAREN | LBRACE | LBRACE_BAR | LBRACK | LBRACK_BAR) ,_) :: CtxtSeqBlock _ :: ((CtxtTypeDefns _ | CtxtLetDecl _ | CtxtMemberBody _ | CtxtWithAsLet _) as limitCtxt) :: _) -> PositionWithColumn(limitCtxt.StartPos,limitCtxt.StartCol + 1) // Permitted inner-construct (e.g. "then" block and "else" block in overall @@ -998,7 +997,7 @@ type LexFilterImpl (lightSyntaxStatus:LightSyntaxStatus, compilingFsLib, lexer, // WITH balances except in the following contexts.... Phew - an overused keyword! | WITH , ( ((CtxtMatch _ | CtxtException _ | CtxtMemberHead _ | CtxtInterfaceHead _ | CtxtTry _ | CtxtTypeDefns _ | CtxtMemberBody _) :: _) // This is the nasty record/object-expression case - | (CtxtSeqBlock _ :: CtxtParen(LBRACE,_) :: _) ) + | (CtxtSeqBlock _ :: CtxtParen((LBRACE | LBRACE_BAR),_) :: _) ) | FINALLY , (CtxtTry _ :: _) -> true @@ -1796,7 +1795,7 @@ type LexFilterImpl (lightSyntaxStatus:LightSyntaxStatus, compilingFsLib, lexer, // '{ id1 = 1 // M.id2 = ... ' ~~~> CtxtSeqBlock | EQUALS, ((CtxtWithAsLet _) :: _) // This detects 'with = '. - | EQUALS, ((CtxtVanilla (_,true)) :: (CtxtSeqBlock _) :: (CtxtWithAsLet _ | CtxtParen(LBRACE,_)) :: _) -> + | EQUALS, ((CtxtVanilla (_,true)) :: (CtxtSeqBlock _) :: (CtxtWithAsLet _ | CtxtParen((LBRACE | LBRACE_BAR),_)) :: _) -> if debug then dprintf "CtxtLetDecl/CtxtWithAsLet: EQUALS, pushing CtxtSeqBlock\n" // We don't insert begin/end block tokens for single-line bindings since we can't properly distinguish single-line *) // record update expressions such as "{ t with gbuckets=Array.copy t.gbuckets; gcount=t.gcount }" *) @@ -1897,7 +1896,7 @@ type LexFilterImpl (lightSyntaxStatus:LightSyntaxStatus, compilingFsLib, lexer, returnToken tokenLexbufState token | WITH, (((CtxtException _ | CtxtTypeDefns _ | CtxtMemberHead _ | CtxtInterfaceHead _ | CtxtMemberBody _) as limCtxt) :: _) - | WITH, ((CtxtSeqBlock _) as limCtxt :: CtxtParen(LBRACE,_) :: _) -> + | WITH, ((CtxtSeqBlock _) as limCtxt :: CtxtParen((LBRACE | LBRACE_BAR),_) :: _) -> let lookaheadTokenTup = peekNextTokenTup() let lookaheadTokenStartPos = startPosOfTokenTup lookaheadTokenTup match lookaheadTokenTup.Token with diff --git a/src/fsharp/TypeChecker.fs b/src/fsharp/TypeChecker.fs index 77fbb1daaf1..8c186961e1f 100755 --- a/src/fsharp/TypeChecker.fs +++ b/src/fsharp/TypeChecker.fs @@ -5821,23 +5821,8 @@ and TcExprUndelayed cenv overallTy env tpenv (expr: SynExpr) = let expr = mkAnyTupled cenv.g m tupInfo args' argtys expr, tpenv - | SynExpr.AnonRecd (isStruct, unsortedArgs, m) -> - let unsortedIds = unsortedArgs |> List.map fst |> List.toArray - let anonInfo, sortedArgTys = UnifyAnonRecdTypeAndInferCharacteristics env.eContextInfo cenv env.DisplayEnv m overallTy isStruct unsortedIds - - // Sort into canonical order - let sortedIndexedArgs = unsortedArgs |> List.indexed |> List.sortBy (fun (i,_) -> unsortedIds.[i].idText) - let sigma = List.map fst sortedIndexedArgs |> List.toArray - let sortedArgs = List.map snd sortedIndexedArgs - sortedArgs |> List.iteri (fun j (x, _) -> - let item = Item.AnonRecdField(anonInfo, sortedArgTys, j, x.idRange) - CallNameResolutionSink cenv.tcSink (x.idRange, env.NameEnv, item, item, emptyTyparInst, ItemOccurence.Use, env.DisplayEnv, env.eAccessRights)) - let unsortedArgTys = sortedArgTys |> List.indexed |> List.sortBy (fun (j, _) -> sigma.[j]) |> List.map snd - let flexes = unsortedArgTys |> List.map (fun _ -> true) - let unsortedCheckedArgs, tpenv = TcExprs cenv env m tpenv flexes unsortedArgTys (List.map snd unsortedArgs) - let sortedCheckedArgs = unsortedCheckedArgs |> List.indexed |> List.sortBy (fun (i,_) -> unsortedIds.[i].idText) |> List.map snd - - mkAnonRecd cenv.g m anonInfo sortedCheckedArgs sortedArgTys, tpenv + | SynExpr.AnonRecd (isStruct, optOrigExpr, unsortedArgs, mWholeExpr) -> + TcAnonRecdExpr cenv overallTy env tpenv (isStruct, optOrigExpr, unsortedArgs, mWholeExpr) | SynExpr.ArrayOrList (isArray, args, m) -> CallExprHasTypeSink cenv.tcSink (m, env.NameEnv, overallTy, env.DisplayEnv, env.eAccessRights) @@ -6685,9 +6670,9 @@ and TcObjectExpr cenv overallTy env tpenv (synObjTy, argopt, binds, extraImpls, if // record construction ? isRecordTy || // object construction? - (isFSharpObjModelTy cenv.g objTy && not (isInterfaceTy cenv.g objTy) && Option.isNone argopt) then + (isFSharpObjModelTy cenv.g objTy && not (isInterfaceTy cenv.g objTy) && argopt.IsNone) then - if Option.isSome argopt then error(Error(FSComp.SR.tcNoArgumentsForRecordValue(), mWholeExpr)) + if argopt.IsSome then error(Error(FSComp.SR.tcNoArgumentsForRecordValue(), mWholeExpr)) if not (isNil extraImpls) then error(Error(FSComp.SR.tcNoInterfaceImplementationForConstructionExpression(), mNewExpr)) if isFSharpObjModelTy cenv.g objTy && GetCtorShapeCounter env <> 1 then error(Error(FSComp.SR.tcObjectConstructionCanOnlyBeUsedInClassTypes(), mNewExpr)) @@ -6894,11 +6879,6 @@ and TcAssertExpr cenv overallTy env (m:range) tpenv x = TcExpr cenv overallTy env tpenv callDiagnosticsExpr - -//------------------------------------------------------------------------- -// TcRecdExpr -//------------------------------------------------------------------------- - and TcRecdExpr cenv overallTy env tpenv (inherits, optOrigExpr, flds, mWholeExpr) = let requiresCtor = (GetCtorShapeCounter env = 1) // Get special expression forms for constructors @@ -6985,9 +6965,104 @@ and TcRecdExpr cenv overallTy env tpenv (inherits, optOrigExpr, flds, mWholeExpr expr, tpenv -//------------------------------------------------------------------------- -// TcForEachExpr -//------------------------------------------------------------------------- +// Check '{| .... |}' +and TcAnonRecdExpr cenv overallTy env tpenv (isStruct, optOrigExpr, unsortedArgs, mWholeExpr) = + + match optOrigExpr with + | None -> + let unsortedIds = unsortedArgs |> List.map fst |> List.toArray + let anonInfo, sortedArgTys = UnifyAnonRecdTypeAndInferCharacteristics env.eContextInfo cenv env.DisplayEnv mWholeExpr overallTy isStruct unsortedIds + + // Sort into canonical order + let sortedIndexedArgs = unsortedArgs |> List.indexed |> List.sortBy (fun (i,_) -> unsortedIds.[i].idText) + let sigma = List.map fst sortedIndexedArgs |> List.toArray + let sortedArgs = List.map snd sortedIndexedArgs + sortedArgs |> List.iteri (fun j (x, _) -> + let item = Item.AnonRecdField(anonInfo, sortedArgTys, j, x.idRange) + CallNameResolutionSink cenv.tcSink (x.idRange, env.NameEnv, item, item, emptyTyparInst, ItemOccurence.Use, env.DisplayEnv, env.eAccessRights)) + let unsortedArgTys = sortedArgTys |> List.indexed |> List.sortBy (fun (j, _) -> sigma.[j]) |> List.map snd + let flexes = unsortedArgTys |> List.map (fun _ -> true) + let unsortedCheckedArgs, tpenv = TcExprs cenv env mWholeExpr tpenv flexes unsortedArgTys (List.map snd unsortedArgs) + let sortedCheckedArgs = unsortedCheckedArgs |> List.indexed |> List.sortBy (fun (i,_) -> unsortedIds.[i].idText) |> List.map snd + + mkAnonRecd cenv.g mWholeExpr anonInfo sortedCheckedArgs sortedArgTys, tpenv + + | Some (origExpr, _) -> + // The fairly complex case '{| origExpr with X = 1; Y = 2 |}' + // The origExpr may be either a record or anonymous record. + // The origExpr may be either a struct or not. + // All the properties of origExpr are copied across except where they are overridden. + // The result is a field-sorted anonymous record. + // + // Unlike in the case of record type copy-and-update we do _not_ assume that the origExpr has the same type as the overall expression. + // Unlike in the case of record type copy-and-update {| a with X = 1 |} does not force a.X to exist or have had type 'int' + + let origExprTy = NewInferenceType() + let origExprChecked, tpenv = TcExpr cenv origExprTy env tpenv origExpr + let oldv, oldve = mkCompGenLocal mWholeExpr "inputRecord" origExprTy + let mOrigExpr = origExpr.Range + + if not (isAppTy cenv.g origExprTy || isAnonRecdTy cenv.g origExprTy) then + error (Error (FSComp.SR.tcCopyAndUpdateNeedsRecordType(), mOrigExpr)) + + let origExprIsStruct = + match tryDestAnonRecdTy cenv.g origExprTy with + | Some (anonInfo, _) -> evalTupInfoIsStruct anonInfo.TupInfo + | None -> + let tcref, _ = destAppTy cenv.g origExprTy + tcref.IsStructOrEnumTycon + + let wrap, oldveaddr = mkExprAddrOfExpr cenv.g origExprIsStruct false NeverMutates oldve None mOrigExpr + + // Put all the expressions in unsorted order. The new bindings come first. The origin of each is tracked using + /// - Choice1Of2 for a new binding + /// - Choice2Of2 for a binding coming from the original expression + let unsortedIdAndExprsAll = + [| for (id, e) in unsortedArgs do + yield (id, Choice1Of2 e) + match tryDestAnonRecdTy cenv.g origExprTy with + | Some (anonInfo, tinst) -> + for (i, id) in Array.indexed anonInfo.SortedIds do + yield id, Choice2Of2 (mkAnonRecdFieldGetViaExprAddr (anonInfo, oldveaddr, tinst, i, mOrigExpr)) + | None -> + if isRecdTy cenv.g origExprTy then + let tcref, tinst = destAppTy cenv.g origExprTy + let fspecs = tcref.Deref.TrueInstanceFieldsAsList + for fspec in fspecs do + yield fspec.Id, Choice2Of2 (mkRecdFieldGetViaExprAddr (oldveaddr , tcref.MakeNestedRecdFieldRef fspec, tinst, mOrigExpr)) + else + error (Error (FSComp.SR.tcCopyAndUpdateNeedsRecordType(), mOrigExpr)) |] + |> Array.distinctBy (fst >> textOfId) + + let unsortedIdsAll = Array.map fst unsortedIdAndExprsAll + let anonInfo, sortedArgTysAll = UnifyAnonRecdTypeAndInferCharacteristics env.eContextInfo cenv env.DisplayEnv mWholeExpr overallTy isStruct unsortedIdsAll + let sortedIndexedArgsAll = unsortedIdAndExprsAll |> Array.indexed |> Array.sortBy (snd >> fst >> textOfId) + let sigma = Array.map fst sortedIndexedArgsAll // map from sorted indexes to unsorted indexes + let sortedArgsAll = Array.map snd sortedIndexedArgsAll + sortedArgsAll |> Array.iteri (fun j (x, expr) -> + match expr with + | Choice1Of2 _ -> + let item = Item.AnonRecdField(anonInfo, sortedArgTysAll, j, x.idRange) + CallNameResolutionSink cenv.tcSink (x.idRange, env.NameEnv, item, item, emptyTyparInst, ItemOccurence.Use, env.DisplayEnv, env.eAccessRights) + | Choice2Of2 _ -> ()) + + let unsortedArgTysNew = sortedArgTysAll |> List.indexed |> List.sortBy (fun (j, _) -> sigma.[j]) |> List.take unsortedArgs.Length |> List.map snd + let flexes = unsortedArgTysNew |> List.map (fun _ -> true) + + let unsortedCheckedArgsNew, tpenv = TcExprs cenv env mWholeExpr tpenv flexes unsortedArgTysNew (List.map snd unsortedArgs) + let sortedArgTysAllArray = Array.ofList sortedArgTysAll + let unsortedCheckedArgsNewArray = unsortedCheckedArgsNew |> List.toArray + let sortedCheckedArgsAll = + sortedArgsAll |> Array.mapi (fun j (_, expr) -> + match expr with + | Choice1Of2 _ -> unsortedCheckedArgsNewArray.[sigma.[j]] + | Choice2Of2 subExpr -> UnifyTypes cenv env mOrigExpr (tyOfExpr cenv.g subExpr) sortedArgTysAllArray.[j]; subExpr) + + let expr = mkAnonRecd cenv.g mWholeExpr anonInfo (List.ofArray sortedCheckedArgsAll) sortedArgTysAll + let expr = wrap expr + let expr = mkCompGenLet mOrigExpr oldv origExprChecked expr + expr, tpenv + and TcForEachExpr cenv overallTy env tpenv (pat, enumSynExpr, bodySynExpr, mWholeExpr, spForLoop) = UnifyTypes cenv env mWholeExpr overallTy cenv.g.unit_ty diff --git a/src/fsharp/ast.fs b/src/fsharp/ast.fs index 3bc6214ec7c..611c0f91dd6 100644 --- a/src/fsharp/ast.fs +++ b/src/fsharp/ast.fs @@ -523,8 +523,8 @@ and | Tuple of isStruct: bool * exprs:SynExpr list * commaRanges:range list * range:range // "range list" is for interstitial commas, these only matter for parsing/design-time tooling, the typechecker may munge/discard them /// F# syntax: {| id1=e1; ...; idN=eN |} - /// F# syntax: {| new id1=e1; ...; idN=eN |} - | AnonRecd of isStruct: bool * recordFields:(Ident * SynExpr) list * range:range + /// F# syntax: struct {| id1=e1; ...; idN=eN |} + | AnonRecd of isStruct: bool * copyInfo:(SynExpr * BlockSeparator) option * recordFields:(Ident * SynExpr) list * range:range /// F# syntax: [ e1; ...; en ], [| e1; ...; en |] | ArrayOrList of isList:bool * exprs:SynExpr list * range:range @@ -2356,10 +2356,12 @@ let rec synExprContainsError inpExpr = | SynExpr.Tuple (_,es,_,_) -> walkExprs es - | SynExpr.AnonRecd (_,flds,_) -> + | SynExpr.AnonRecd (_,origExpr,flds,_) -> + (match origExpr with Some (e,_) -> walkExpr e | None -> false) || walkExprs (List.map snd flds) - | SynExpr.Record (_,_,fs,_) -> + | SynExpr.Record (_,origExpr,fs,_) -> + (match origExpr with Some (e,_) -> walkExpr e | None -> false) || let flds = fs |> List.choose (fun (_, v, _) -> v) walkExprs (flds) diff --git a/src/fsharp/pars.fsy b/src/fsharp/pars.fsy index bd6f1b12a33..b305f08eca1 100644 --- a/src/fsharp/pars.fsy +++ b/src/fsharp/pars.fsy @@ -3989,14 +3989,17 @@ recdExpr: let (_, _, inheritsSep) = List.head l let bindings = List.tail l (Some ($2,arg,rhs2 parseState 2 4, inheritsSep, rhs parseState 1), None, bindings) } + | recdExprCore + { let a,b = $1 in (None, a, b) } +recdExprCore: | appExpr EQUALS declExprBlock recdExprBindings opt_seps_recd { match $1 with | LongOrSingleIdent(false, (LongIdentWithDots(_,_) as f),None,m) -> let f = mkRecdField f let l = List.rev $4 let l = rebindRanges (f, Some $3) l $5 - (None, None, l) + (None, l) | _ -> raiseParseErrorAt (rhs parseState 2) (FSComp.SR.parsFieldBinding()) } /* @@ -4008,7 +4011,7 @@ recdExpr: reportParseErrorAt m (FSComp.SR.parsUnderscoreInvalidFieldName()) reportParseErrorAt m (FSComp.SR.parsFieldBinding()) let f = mkUnderscoreRecdField m - (None, None, [ f, None, None ]) } + (None, [ (f, None, None) ]) } | UNDERSCORE EQUALS { let m = rhs parseState 1 @@ -4017,28 +4020,28 @@ recdExpr: reportParseErrorAt (rhs2 parseState 1 2) (FSComp.SR.parsFieldBinding()) - (None, None, [f, None, None]) } + (None, [ (f, None, None) ]) } | UNDERSCORE EQUALS declExprBlock recdExprBindings opt_seps_recd { reportParseErrorAt (rhs parseState 1) (FSComp.SR.parsUnderscoreInvalidFieldName()) let f = mkUnderscoreRecdField (rhs parseState 1) let l = List.rev $4 let l = rebindRanges (f, Some $3) l $5 - (None, None, l) } + (None, l) } /* handles case like {x with} */ | appExpr WITH recdBinding recdExprBindings opt_seps_recd { let l = List.rev $4 let l = rebindRanges $3 l $5 - (None,Some ($1, (rhs parseState 2, None)), l) } + (Some ($1, (rhs parseState 2, None)), l) } | appExpr OWITH opt_seps_recd OEND - { (None,Some ($1, (rhs parseState 2, None)), []) } + { (Some ($1, (rhs parseState 2, None)), []) } | appExpr OWITH recdBinding recdExprBindings opt_seps_recd OEND { let l = List.rev $4 let l = rebindRanges $3 l $5 - (None,Some ($1, (rhs parseState 2, None)), l) } + (Some ($1, (rhs parseState 2, None)), l) } opt_seps_recd: | seps_recd { Some $1 } @@ -4166,16 +4169,26 @@ braceBarExpr: { $1 false } braceBarExprCore: - | LBRACE_BAR oneOrMoreRecdExprBindings bar_rbrace - { let flds = $2 + | LBRACE_BAR recdExprCore bar_rbrace + { let orig, flds = $2 + let flds = + flds |> List.choose (function + | ((LongIdentWithDots([id],_),_),Some e,_) -> Some (id,e) + | ((LongIdentWithDots([id],_),_),None,_) -> Some (id, arbExpr("anonField",id.idRange)) + | _ -> reportParseErrorAt (rhs parseState 1) (FSComp.SR.parsInvalidAnonRecdType()); None) let m = rhs2 parseState 1 3 - (fun isStruct -> SynExpr.AnonRecd(isStruct,flds,m)) } + (fun isStruct -> SynExpr.AnonRecd(isStruct,orig,flds,m)) } - | LBRACE_BAR oneOrMoreRecdExprBindings recover + | LBRACE_BAR recdExprCore recover { reportParseErrorAt (rhs parseState 1) (FSComp.SR.parsUnmatchedBraceBar()) - let flds = $2 + let orig, flds = $2 + let flds = + flds |> List.choose (function + | ((LongIdentWithDots([id],_),_),Some e,_) -> Some (id,e) + | ((LongIdentWithDots([id],_),_),None,_) -> Some (id, arbExpr("anonField",id.idRange)) + | _ -> reportParseErrorAt (rhs parseState 1) (FSComp.SR.parsInvalidAnonRecdType()); None) let m = rhs2 parseState 1 2 - (fun isStruct -> SynExpr.AnonRecd(isStruct,flds,m)) } + (fun isStruct -> SynExpr.AnonRecd(isStruct,orig,flds,m)) } | LBRACE_BAR error bar_rbrace { // silent recovery @@ -4185,19 +4198,11 @@ braceBarExprCore: | LBRACE_BAR recover { reportParseErrorAt (rhs parseState 1) (FSComp.SR.parsUnmatchedBraceBar()) let m = rhs2 parseState 1 1 - (fun isStruct -> SynExpr.AnonRecd(isStruct,[],m)) } + (fun isStruct -> SynExpr.AnonRecd(isStruct,None,[],m)) } | LBRACE_BAR bar_rbrace { let m = rhs2 parseState 1 2 - (fun isStruct -> SynExpr.AnonRecd(isStruct,[],m)) } - -oneOrMoreRecdExprBindings: - | recdBinding recdExprBindings - { (($1, None) :: List.rev $2) |> List.choose (function - | (((LongIdentWithDots([id],_),_),Some e),_) -> Some (id,e) - | (((LongIdentWithDots([id],_),_),None),_) -> Some (id, arbExpr("anonField",id.idRange)) - | _ -> reportParseErrorAt (rhs parseState 1) (FSComp.SR.parsInvalidAnonRecdType()); None) } - + (fun isStruct -> SynExpr.AnonRecd(isStruct,None,[],m)) } anonLambdaExpr: | FUN atomicPatterns RARROW typedSeqExprBlock diff --git a/src/fsharp/service/ServiceParseTreeWalk.fs b/src/fsharp/service/ServiceParseTreeWalk.fs index 3f1de0e7e84..eb0652c3a33 100755 --- a/src/fsharp/service/ServiceParseTreeWalk.fs +++ b/src/fsharp/service/ServiceParseTreeWalk.fs @@ -49,48 +49,63 @@ module public AstTraversal = /// traverseSynExpr(subExpr) to recurse deeper on some particular sub-expression based on your own logic /// path helps to track AST nodes that were passed during traversal abstract VisitExpr : TraversePath * (SynExpr -> 'T option) * (SynExpr -> 'T option) * SynExpr -> 'T option + /// VisitTypeAbbrev(ty,m), defaults to ignoring this leaf of the AST abstract VisitTypeAbbrev : SynType * range -> 'T option default this.VisitTypeAbbrev(_ty,_m) = None + /// VisitImplicitInherit(defaultTraverse,ty,expr,m), defaults to just visiting expr abstract VisitImplicitInherit : (SynExpr -> 'T option) * SynType * SynExpr * range -> 'T option default this.VisitImplicitInherit(defaultTraverse, _ty, expr, _m) = defaultTraverse expr + /// VisitModuleDecl allows overriding module declaration behavior abstract VisitModuleDecl : (SynModuleDecl -> 'T option) * SynModuleDecl -> 'T option default this.VisitModuleDecl(defaultTraverse, decl) = defaultTraverse decl + /// VisitBinding allows overriding binding behavior (note: by default it would defaultTraverse expression) abstract VisitBinding : (SynBinding -> 'T option) * SynBinding -> 'T option default this.VisitBinding(defaultTraverse, binding) = defaultTraverse binding + /// VisitMatchClause allows overriding clause behavior (note: by default it would defaultTraverse expression) abstract VisitMatchClause : (SynMatchClause -> 'T option) * SynMatchClause -> 'T option default this.VisitMatchClause(defaultTraverse, mc) = defaultTraverse mc + /// VisitInheritSynMemberDefn allows overriding inherit behavior (by default do nothing) abstract VisitInheritSynMemberDefn : SynComponentInfo * SynTypeDefnKind * SynType * SynMemberDefns * range -> 'T option default this.VisitInheritSynMemberDefn(_componentInfo, _typeDefnKind, _synType, _members, _range) = None + /// VisitInterfaceSynMemberDefnType allows overriding behavior for visiting interface member in types (by default - do nothing) abstract VisitInterfaceSynMemberDefnType : SynType -> 'T option default this.VisitInterfaceSynMemberDefnType(_synType) = None + /// VisitRecordField allows overriding behavior when visiting l.h.s. of constructed record instances abstract VisitRecordField : TraversePath * SynExpr option * LongIdentWithDots option -> 'T option default this.VisitRecordField (_path, _copyOpt, _recordField) = None + /// VisitHashDirective allows overriding behavior when visiting hash directives in FSX scripts, like #r, #load and #I. abstract VisitHashDirective : range -> 'T option default this.VisitHashDirective (_) = None + /// VisitModuleOrNamespace allows overriding behavior when visiting module or namespaces abstract VisitModuleOrNamespace : SynModuleOrNamespace -> 'T option default this.VisitModuleOrNamespace (_) = None + /// VisitComponentInfo allows overriding behavior when visiting type component infos abstract VisitComponentInfo : SynComponentInfo -> 'T option default this.VisitComponentInfo (_) = None + /// VisitLetOrUse allows overriding behavior when visiting module or local let or use bindings abstract VisitLetOrUse : SynBinding list * range -> 'T option default this.VisitLetOrUse (_, _) = None + /// VisitType allows overriding behavior when visiting simple pats abstract VisitSimplePats : SynSimplePat list -> 'T option default this.VisitSimplePats (_) = None + /// VisitPat allows overriding behavior when visiting patterns abstract VisitPat : (SynPat -> 'T option) * SynPat -> 'T option default this.VisitPat (defaultTraverse, pat) = defaultTraverse pat + /// VisitType allows overriding behavior when visiting type hints (x: ..., etc.) abstract VisitType : (SynType -> 'T option) * SynType -> 'T option default this.VisitType (defaultTraverse, ty) = defaultTraverse ty @@ -194,7 +209,22 @@ module public AstTraversal = | SynExpr.Tuple(_, synExprList, _, _range) | SynExpr.ArrayOrList(_, synExprList, _range) -> synExprList |> List.map (fun x -> dive x x.Range traverseSynExpr) |> pick expr - | SynExpr.AnonRecd(_isStruct, synExprList, _range) -> synExprList |> List.map snd |> List.map (fun x -> dive x x.Range traverseSynExpr) |> pick expr + | SynExpr.AnonRecd(_isStruct, copyOpt, synExprList, _range) -> + [ match copyOpt with + | Some(expr, (withRange, _)) -> + yield dive expr expr.Range traverseSynExpr + yield dive () withRange (fun () -> + if posGeq pos withRange.End then + // special case: caret is after WITH + // { x with $ } + visitor.VisitRecordField (path, Some expr, None) + else + None + ) + | _ -> () + for (_,x) in synExprList do + yield dive x x.Range traverseSynExpr + ] |> pick expr | SynExpr.Record(inheritOpt,copyOpt,fields, _range) -> [ let diveIntoSeparator offsideColumn scPosOpt copyOpt = diff --git a/src/fsharp/service/ServiceUntypedParse.fs b/src/fsharp/service/ServiceUntypedParse.fs index 5af088ff525..dc8df504330 100755 --- a/src/fsharp/service/ServiceUntypedParse.fs +++ b/src/fsharp/service/ServiceUntypedParse.fs @@ -227,7 +227,10 @@ type FSharpParseFileResults(errors: FSharpErrorInfo[], input: Ast.ParsedInput op | None -> () yield! walkExprs (fs |> List.choose p23) - | SynExpr.AnonRecd (_isStruct, fs, _) -> + | SynExpr.AnonRecd (_isStruct, copyExprOpt, fs, _) -> + match copyExprOpt with + | Some (e,_) -> yield! walkExpr true e + | None -> () yield! walkExprs (fs |> List.map snd) | SynExpr.ObjExpr (_,_,bs,is,_,_) -> diff --git a/src/fsharp/xlf/FSComp.txt.cs.xlf b/src/fsharp/xlf/FSComp.txt.cs.xlf index 13433bae31d..166376a2607 100644 --- a/src/fsharp/xlf/FSComp.txt.cs.xlf +++ b/src/fsharp/xlf/FSComp.txt.cs.xlf @@ -7012,6 +7012,11 @@ Invalid anonymous record type + + The input to a copy-and-update expression that creates an anonymous record must be either an anonymous record or a record + The input to a copy-and-update expression that creates an anonymous record must be either an anonymous record or a record + + \ No newline at end of file diff --git a/src/fsharp/xlf/FSComp.txt.de.xlf b/src/fsharp/xlf/FSComp.txt.de.xlf index 09ee764bc5a..c1bee3d6c8c 100644 --- a/src/fsharp/xlf/FSComp.txt.de.xlf +++ b/src/fsharp/xlf/FSComp.txt.de.xlf @@ -7012,6 +7012,11 @@ Invalid anonymous record type + + The input to a copy-and-update expression that creates an anonymous record must be either an anonymous record or a record + The input to a copy-and-update expression that creates an anonymous record must be either an anonymous record or a record + + \ No newline at end of file diff --git a/src/fsharp/xlf/FSComp.txt.en.xlf b/src/fsharp/xlf/FSComp.txt.en.xlf index bb3d873ab9e..0620bd3cc67 100644 --- a/src/fsharp/xlf/FSComp.txt.en.xlf +++ b/src/fsharp/xlf/FSComp.txt.en.xlf @@ -7012,6 +7012,11 @@ Invalid anonymous record type + + The input to a copy-and-update expression that creates an anonymous record must be either an anonymous record or a record + The input to a copy-and-update expression that creates an anonymous record must be either an anonymous record or a record + + \ No newline at end of file diff --git a/src/fsharp/xlf/FSComp.txt.es.xlf b/src/fsharp/xlf/FSComp.txt.es.xlf index e02d0d40831..080b0f3173b 100644 --- a/src/fsharp/xlf/FSComp.txt.es.xlf +++ b/src/fsharp/xlf/FSComp.txt.es.xlf @@ -7012,6 +7012,11 @@ Invalid anonymous record type + + The input to a copy-and-update expression that creates an anonymous record must be either an anonymous record or a record + The input to a copy-and-update expression that creates an anonymous record must be either an anonymous record or a record + + \ No newline at end of file diff --git a/src/fsharp/xlf/FSComp.txt.fr.xlf b/src/fsharp/xlf/FSComp.txt.fr.xlf index 2d00a2fbd6e..96346eb0581 100644 --- a/src/fsharp/xlf/FSComp.txt.fr.xlf +++ b/src/fsharp/xlf/FSComp.txt.fr.xlf @@ -7012,6 +7012,11 @@ Invalid anonymous record type + + The input to a copy-and-update expression that creates an anonymous record must be either an anonymous record or a record + The input to a copy-and-update expression that creates an anonymous record must be either an anonymous record or a record + + \ No newline at end of file diff --git a/src/fsharp/xlf/FSComp.txt.it.xlf b/src/fsharp/xlf/FSComp.txt.it.xlf index a9a9c35e72d..98a7b01e1d6 100644 --- a/src/fsharp/xlf/FSComp.txt.it.xlf +++ b/src/fsharp/xlf/FSComp.txt.it.xlf @@ -7012,6 +7012,11 @@ Invalid anonymous record type + + The input to a copy-and-update expression that creates an anonymous record must be either an anonymous record or a record + The input to a copy-and-update expression that creates an anonymous record must be either an anonymous record or a record + + \ No newline at end of file diff --git a/src/fsharp/xlf/FSComp.txt.ja.xlf b/src/fsharp/xlf/FSComp.txt.ja.xlf index c9dc1d8c305..4d08d1598b6 100644 --- a/src/fsharp/xlf/FSComp.txt.ja.xlf +++ b/src/fsharp/xlf/FSComp.txt.ja.xlf @@ -7012,6 +7012,11 @@ Invalid anonymous record type + + The input to a copy-and-update expression that creates an anonymous record must be either an anonymous record or a record + The input to a copy-and-update expression that creates an anonymous record must be either an anonymous record or a record + + \ No newline at end of file diff --git a/src/fsharp/xlf/FSComp.txt.ko.xlf b/src/fsharp/xlf/FSComp.txt.ko.xlf index 64d4bc3e904..13eae1e8a3b 100644 --- a/src/fsharp/xlf/FSComp.txt.ko.xlf +++ b/src/fsharp/xlf/FSComp.txt.ko.xlf @@ -7012,6 +7012,11 @@ Invalid anonymous record type + + The input to a copy-and-update expression that creates an anonymous record must be either an anonymous record or a record + The input to a copy-and-update expression that creates an anonymous record must be either an anonymous record or a record + + \ No newline at end of file diff --git a/src/fsharp/xlf/FSComp.txt.pl.xlf b/src/fsharp/xlf/FSComp.txt.pl.xlf index b956238d314..7259abdd073 100644 --- a/src/fsharp/xlf/FSComp.txt.pl.xlf +++ b/src/fsharp/xlf/FSComp.txt.pl.xlf @@ -7012,6 +7012,11 @@ Invalid anonymous record type + + The input to a copy-and-update expression that creates an anonymous record must be either an anonymous record or a record + The input to a copy-and-update expression that creates an anonymous record must be either an anonymous record or a record + + \ No newline at end of file diff --git a/src/fsharp/xlf/FSComp.txt.pt-BR.xlf b/src/fsharp/xlf/FSComp.txt.pt-BR.xlf index 9fdb7d83f8f..c0f53fb61c0 100644 --- a/src/fsharp/xlf/FSComp.txt.pt-BR.xlf +++ b/src/fsharp/xlf/FSComp.txt.pt-BR.xlf @@ -7012,6 +7012,11 @@ Invalid anonymous record type + + The input to a copy-and-update expression that creates an anonymous record must be either an anonymous record or a record + The input to a copy-and-update expression that creates an anonymous record must be either an anonymous record or a record + + \ No newline at end of file diff --git a/src/fsharp/xlf/FSComp.txt.ru.xlf b/src/fsharp/xlf/FSComp.txt.ru.xlf index 9e56782f248..9ba98b42f03 100644 --- a/src/fsharp/xlf/FSComp.txt.ru.xlf +++ b/src/fsharp/xlf/FSComp.txt.ru.xlf @@ -7012,6 +7012,11 @@ Invalid anonymous record type + + The input to a copy-and-update expression that creates an anonymous record must be either an anonymous record or a record + The input to a copy-and-update expression that creates an anonymous record must be either an anonymous record or a record + + \ No newline at end of file diff --git a/src/fsharp/xlf/FSComp.txt.tr.xlf b/src/fsharp/xlf/FSComp.txt.tr.xlf index 67e8c1965c0..e1d5e517ef1 100644 --- a/src/fsharp/xlf/FSComp.txt.tr.xlf +++ b/src/fsharp/xlf/FSComp.txt.tr.xlf @@ -7012,6 +7012,11 @@ Invalid anonymous record type + + The input to a copy-and-update expression that creates an anonymous record must be either an anonymous record or a record + The input to a copy-and-update expression that creates an anonymous record must be either an anonymous record or a record + + \ No newline at end of file diff --git a/src/fsharp/xlf/FSComp.txt.zh-Hans.xlf b/src/fsharp/xlf/FSComp.txt.zh-Hans.xlf index ca95767c04a..c8370e41d5a 100644 --- a/src/fsharp/xlf/FSComp.txt.zh-Hans.xlf +++ b/src/fsharp/xlf/FSComp.txt.zh-Hans.xlf @@ -7012,6 +7012,11 @@ Invalid anonymous record type + + The input to a copy-and-update expression that creates an anonymous record must be either an anonymous record or a record + The input to a copy-and-update expression that creates an anonymous record must be either an anonymous record or a record + + \ No newline at end of file diff --git a/src/fsharp/xlf/FSComp.txt.zh-Hant.xlf b/src/fsharp/xlf/FSComp.txt.zh-Hant.xlf index c9bdbbe4f52..19c53d6514f 100644 --- a/src/fsharp/xlf/FSComp.txt.zh-Hant.xlf +++ b/src/fsharp/xlf/FSComp.txt.zh-Hant.xlf @@ -7012,6 +7012,11 @@ Invalid anonymous record type + + The input to a copy-and-update expression that creates an anonymous record must be either an anonymous record or a record + The input to a copy-and-update expression that creates an anonymous record must be either an anonymous record or a record + + \ No newline at end of file diff --git a/tests/fsharp/core/anon/lib.fs b/tests/fsharp/core/anon/lib.fs index 23571cab8b5..0fee8e30c35 100644 --- a/tests/fsharp/core/anon/lib.fs +++ b/tests/fsharp/core/anon/lib.fs @@ -65,9 +65,6 @@ module KindB1 = check "ceoijew90ewcw6" (FSharp.Reflection.FSharpValue.GetRecordFields({| X = 1 |}).Length) 1 check "ceoijew90ewcw7" (FSharp.Reflection.FSharpValue.GetRecordFields({| X = 1 |}).[0]) (box 1) - // TODO: field reordering.... - //let test3b() = {| a = 1+1; b = 2 |} = {| b = 1; a = 2 |} - // Equality is possible check "ceijoewwekcj" {| a = 1-1 |} {| a = Unchecked.defaultof<_> |} @@ -145,10 +142,44 @@ module KindB2 = check "cew9cwo3" testConstrainedAccess2 (0, 1, 2) - // Copy-and-update may not be used, since C# doesn't allow this on anonymous objects - - // Types _can_ be used outside their assembly, but can _not_ be named in the syntax of types, nor created - +module CopyAndUpdateOfAnonRecord = + let data = {| X = 1 |} + let data2 = {| data with Y = "1" |} + let data3 = {| data with X = "3" |} + check "fewjkvwno31" data.X 1 + check "fewjkvwno32" data2.X 1 + check "fewjkvwno33" data2.Y "1" + check "fewjkvwno34" data3.X "3" + +module CopyAndUpdateOfAnonRecordStruct = + let data = struct {| X = 1 |} + let data2 = struct {| data with Y = "1" |} + let data3 = struct {| data with X = "3" |} + check "fewjkvwno311" data.X 1 + check "fewjkvwno322" data2.X 1 + check "fewjkvwno333" data2.Y "1" + check "fewjkvwno344" data3.X "3" + +module CopyAndUpdateOfAnonRecordFromRecord = + type Base = { X : int } + let data = { X = 1 } + let data2 = {| data with Y = "1" |} + let data3 = {| data with X = "3" |} + check "fewjkvwno315" data.X 1 + check "fewjkvwno326" data2.X 1 + check "fewjkvwno337" data2.Y "1" + check "fewjkvwno348" data3.X "3" + +module CopyAndUpdateOfAnonRecordFromStructRecord = + [] + type Base = { X : int } + let data = { X = 1 } + let data2 = {| data with Y = "1" |} + let data3 = {| data with X = "3" |} + check "fewjkvwno31q" data.X 1 + check "fewjkvwno32w" data2.X 1 + check "fewjkvwno33e" data2.Y "1" + check "fewjkvwno34r" data3.X "3" module QuotesNewRecord = From 4f424c23761a52871c7450663fc45d0d4f76ede3 Mon Sep 17 00:00:00 2001 From: Don Syme Date: Wed, 14 Mar 2018 17:57:26 +0000 Subject: [PATCH 005/160] more tests --- tests/fsharp/core/anon/lib.fs | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/tests/fsharp/core/anon/lib.fs b/tests/fsharp/core/anon/lib.fs index 0fee8e30c35..abeb7711ab9 100644 --- a/tests/fsharp/core/anon/lib.fs +++ b/tests/fsharp/core/anon/lib.fs @@ -146,29 +146,38 @@ module CopyAndUpdateOfAnonRecord = let data = {| X = 1 |} let data2 = {| data with Y = "1" |} let data3 = {| data with X = "3" |} + let data4 = {| data2 with X = "3" |} check "fewjkvwno31" data.X 1 check "fewjkvwno32" data2.X 1 check "fewjkvwno33" data2.Y "1" check "fewjkvwno34" data3.X "3" + check "fewjkvwno3443" data4.X "3" + check "fewjkvwno3443" data4.Y "1" module CopyAndUpdateOfAnonRecordStruct = let data = struct {| X = 1 |} let data2 = struct {| data with Y = "1" |} let data3 = struct {| data with X = "3" |} + let data4 = struct {| data2 with X = "3" |} check "fewjkvwno311" data.X 1 check "fewjkvwno322" data2.X 1 check "fewjkvwno333" data2.Y "1" check "fewjkvwno344" data3.X "3" + check "fewjkvwno3444" data4.X "3" + check "fewjkvwno3442" data4.Y "1" module CopyAndUpdateOfAnonRecordFromRecord = type Base = { X : int } let data = { X = 1 } let data2 = {| data with Y = "1" |} let data3 = {| data with X = "3" |} + let data4 = {| data2 with X = "3" |} check "fewjkvwno315" data.X 1 check "fewjkvwno326" data2.X 1 check "fewjkvwno337" data2.Y "1" check "fewjkvwno348" data3.X "3" + check "fewjkvwno344y" data4.X "3" + check "fewjkvwno344b" data4.Y "1" module CopyAndUpdateOfAnonRecordFromStructRecord = [] @@ -178,8 +187,8 @@ module CopyAndUpdateOfAnonRecordFromStructRecord = let data3 = {| data with X = "3" |} check "fewjkvwno31q" data.X 1 check "fewjkvwno32w" data2.X 1 - check "fewjkvwno33e" data2.Y "1" - check "fewjkvwno34r" data3.X "3" + check "fewjkvwno33ej" data2.Y "1" + check "fewjkvwno34rs" data3.X "3" module QuotesNewRecord = From 9b9f6bf744d0056f732bd65212180f4304b150cc Mon Sep 17 00:00:00 2001 From: Don Syme Date: Thu, 15 Mar 2018 00:05:44 +0000 Subject: [PATCH 006/160] update ilxgen --- src/fsharp/IlxGen.fs | 42 +++++++++++++++++++++--------------------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/src/fsharp/IlxGen.fs b/src/fsharp/IlxGen.fs index 410c38bd730..9b65b3c966f 100644 --- a/src/fsharp/IlxGen.fs +++ b/src/fsharp/IlxGen.fs @@ -3640,7 +3640,7 @@ and GenSlotParam m cenv eenv (TSlotParam(nm,ty,inFlag,outFlag,optionalFlag,attri IsOptional=optionalFlag || optionalFlag2 CustomAttrs= mkILCustomAttrs (GenAttrs cenv eenv attribs) } -and GenFormalSlotsig m cenv mgbuf eenv (TSlotSig(_,typ,ctps,mtps,paraml,returnTy)) = +and GenFormalSlotsig m cenv eenv (TSlotSig(_,typ,ctps,mtps,paraml,returnTy)) = let paraml = List.concat paraml let ilTy = GenType cenv m eenv.tyenv typ let eenvForSlotSig = EnvForTypars (ctps @ mtps) eenv @@ -3651,7 +3651,7 @@ and GenFormalSlotsig m cenv mgbuf eenv (TSlotSig(_,typ,ctps,mtps,paraml,returnTy and instSlotParam inst (TSlotParam(nm,ty,inFlag,fl2,fl3,attrs)) = TSlotParam(nm,instType inst ty,inFlag,fl2,fl3,attrs) -and GenActualSlotsig m cenv mgbuf eenv (TSlotSig(_,typ,ctps,mtps,ilSlotParams,ilSlotRetTy)) methTyparsOfOverridingMethod (methodParams: Val list) = +and GenActualSlotsig m cenv eenv (TSlotSig(_,typ,ctps,mtps,ilSlotParams,ilSlotRetTy)) methTyparsOfOverridingMethod (methodParams: Val list) = let ilSlotParams = List.concat ilSlotParams let instForSlotSig = mkTyparInst (ctps@mtps) (argsOfAppTy cenv.g typ @ generalizeTypars methTyparsOfOverridingMethod) let ilParams = ilSlotParams |> List.map (instSlotParam instForSlotSig >> GenSlotParam m cenv eenv) @@ -3664,8 +3664,8 @@ and GenActualSlotsig m cenv mgbuf eenv (TSlotSig(_,typ,ctps,mtps,ilSlotParams,il and GenNameOfOverridingMethod cenv (useMethodImpl,(TSlotSig(nameOfOverridenMethod,enclTypOfOverridenMethod,_,_,_,_))) = if useMethodImpl then qualifiedMangledNameOfTyconRef (tcrefOfAppTy cenv.g enclTypOfOverridenMethod) nameOfOverridenMethod else nameOfOverridenMethod -and GenMethodImpl cenv mgbuf eenv (useMethodImpl,(TSlotSig(nameOfOverridenMethod,_,_,_,_,_) as slotsig)) m = - let ilOverrideTy,ilOverrideParams,ilOverrideRet = GenFormalSlotsig m cenv mgbuf eenv slotsig +and GenMethodImpl cenv eenv (useMethodImpl,(TSlotSig(nameOfOverridenMethod,_,_,_,_,_) as slotsig)) m = + let ilOverrideTy,ilOverrideParams,ilOverrideRet = GenFormalSlotsig m cenv eenv slotsig let nameOfOverridingMethod = GenNameOfOverridingMethod cenv (useMethodImpl,slotsig) nameOfOverridingMethod, @@ -3673,7 +3673,7 @@ and GenMethodImpl cenv mgbuf eenv (useMethodImpl,(TSlotSig(nameOfOverridenMethod let ilOverrideTyRef = ilOverrideTy.TypeRef let ilOverrideMethRef = mkILMethRef(ilOverrideTyRef, ILCallingConv.Instance, nameOfOverridenMethod, List.length (DropErasedTypars methTyparsOfOverridingMethod), (typesOfILParams ilOverrideParams), ilOverrideRet.Type) let eenvForOverrideBy = AddTyparsToEnv methTyparsOfOverridingMethod eenv - let ilParamsOfOverridingMethod,ilReturnOfOverridingMethod = GenActualSlotsig m cenv mgbuf eenvForOverrideBy slotsig methTyparsOfOverridingMethod [] + let ilParamsOfOverridingMethod,ilReturnOfOverridingMethod = GenActualSlotsig m cenv eenvForOverrideBy slotsig methTyparsOfOverridingMethod [] let ilOverrideMethGenericParams = GenGenericParams cenv eenvForOverrideBy methTyparsOfOverridingMethod let ilOverrideMethGenericArgs = mkILFormalGenericArgs 0 ilOverrideMethGenericParams let ilOverrideBy = mkILInstanceMethSpecInTy(ilTyForOverriding, nameOfOverridingMethod, typesOfILParams ilParamsOfOverridingMethod, ilReturnOfOverridingMethod.Type, ilOverrideMethGenericArgs) @@ -3705,14 +3705,14 @@ and GenObjectMethod cenv eenvinner (cgbuf:CodeGenBuffer) useMethodImpl tmethod = let eenvUnderTypars = AddTyparsToEnv methTyparsOfOverridingMethod eenvinner let methodParams = List.concat methodParams let methodParamsNonSelf = match methodParams with [] -> [] | _::t -> t // drop the 'this' arg when computing better argument names for IL parameters - let ilParamsOfOverridingMethod,ilReturnOfOverridingMethod = GenActualSlotsig m cenv cgbuf.mgbuf eenvUnderTypars slotsig methTyparsOfOverridingMethod methodParamsNonSelf + let ilParamsOfOverridingMethod,ilReturnOfOverridingMethod = GenActualSlotsig m cenv eenvUnderTypars slotsig methTyparsOfOverridingMethod methodParamsNonSelf let ilAttribs = GenAttrs cenv eenvinner attribs // Args are stored starting at #1 let eenvForMeth = AddStorageForLocalVals cenv.g (methodParams |> List.mapi (fun i v -> (v,Arg i))) eenvUnderTypars let ilMethodBody = CodeGenMethodForExpr cenv cgbuf.mgbuf (SPAlways,[],nameOfOverridenMethod,eenvForMeth,0,0,methodBodyExpr,(if slotSigHasVoidReturnTy slotsig then discardAndReturnVoid else Return)) - let nameOfOverridingMethod,methodImplGenerator = GenMethodImpl cenv cgbuf.mgbuf eenvinner (useMethodImpl,slotsig) methodBodyExpr.Range + let nameOfOverridingMethod,methodImplGenerator = GenMethodImpl cenv eenvinner (useMethodImpl,slotsig) methodBodyExpr.Range let mdef = mkILGenericVirtualMethod @@ -3729,7 +3729,7 @@ and GenObjectMethod cenv eenvinner (cgbuf:CodeGenBuffer) useMethodImpl tmethod = [(useMethodImpl,methodImplGenerator,methTyparsOfOverridingMethod),mdef] and GenObjectExpr cenv cgbuf eenvouter expr (baseType,baseValOpt,basecall,overrides,interfaceImpls,m) sequel = - let cloinfo,_,eenvinner = GetIlxClosureInfo cenv cgbuf.mgbuf m false None eenvouter expr + let cloinfo,_,eenvinner = GetIlxClosureInfo cenv m false None eenvouter expr let cloAttribs = cloinfo.cloAttribs let cloFreeVars = cloinfo.cloFreeVars @@ -3787,7 +3787,7 @@ and GenSequenceExpr cenv (cgbuf:CodeGenBuffer) eenvouter (nextEnumeratorValRef:V // Get the free variables. Make a lambda to pretend that the 'nextEnumeratorValRef' is bound (it is an argument to GenerateNext) let (cloAttribs,_,_,cloFreeTyvars,cloFreeVars,ilCloTypeRef:ILTypeRef,ilCloFreeVars,eenvinner) = - GetIlxClosureFreeVars cenv cgbuf.mgbuf m None eenvouter [] (mkLambda m nextEnumeratorValRef.Deref (generateNextExpr, cenv.g.int32_ty)) + GetIlxClosureFreeVars cenv m None eenvouter [] (mkLambda m nextEnumeratorValRef.Deref (generateNextExpr, cenv.g.int32_ty)) let ilCloSeqElemTy = GenType cenv m eenvinner.tyenv seqElemTy let cloRetTy = mkSeqTy cenv.g seqElemTy @@ -3900,7 +3900,7 @@ and GenLambdaClosure cenv (cgbuf:CodeGenBuffer) eenv isLocalTypeFunc selfv expr | Expr.Lambda (_,_,_,_,_,m,_) | Expr.TyLambda(_,_,_,m,_) -> - let cloinfo,body,eenvinner = GetIlxClosureInfo cenv cgbuf.mgbuf m isLocalTypeFunc selfv eenv expr + let cloinfo,body,eenvinner = GetIlxClosureInfo cenv m isLocalTypeFunc selfv eenv expr let entryPointInfo = match selfv with @@ -3975,7 +3975,7 @@ and GenFreevar cenv m eenvouter tyenvinner (fv:Val) = #endif | _ -> GenType cenv m tyenvinner fv.Type -and GetIlxClosureFreeVars cenv mgbuf m selfv eenvouter takenNames expr = +and GetIlxClosureFreeVars cenv m selfv eenvouter takenNames expr = // Choose a base name for the closure let basename = @@ -4070,7 +4070,7 @@ and GetIlxClosureFreeVars cenv mgbuf m selfv eenvouter takenNames expr = (cloAttribs,cloInternalFreeTyvars,cloContractFreeTyvars,cloFreeTyvars,cloFreeVars,ilCloTypeRef,Array.ofList ilCloFreeVars,eenvinner) -and GetIlxClosureInfo cenv mgbuf m isLocalTypeFunc selfv eenvouter expr = +and GetIlxClosureInfo cenv m isLocalTypeFunc selfv eenvouter expr = let returnTy = match expr with | Expr.Lambda (_,_,_,_,_,_,returnTy) | Expr.TyLambda(_,_,_,_,returnTy) -> returnTy @@ -4096,7 +4096,7 @@ and GetIlxClosureInfo cenv mgbuf m isLocalTypeFunc selfv eenvouter expr = let takenNames = vs |> List.map (fun v -> v.CompiledName) // Get the free variables and the information about the closure, add the free variables to the environment - let (cloAttribs,cloInternalFreeTyvars,cloContractFreeTyvars,_,cloFreeVars,ilCloTypeRef,ilCloFreeVars,eenvinner) = GetIlxClosureFreeVars cenv mgbuf m selfv eenvouter takenNames expr + let (cloAttribs,cloInternalFreeTyvars,cloContractFreeTyvars,_,cloFreeVars,ilCloTypeRef,ilCloFreeVars,eenvinner) = GetIlxClosureFreeVars cenv m selfv eenvouter takenNames expr // Put the type and value arguments into the environment let rec getClosureArgs eenv ntmargs tvsl (vs:Val list) = @@ -4252,7 +4252,7 @@ and GenDelegateExpr cenv cgbuf eenvouter expr (TObjExprMethod((TSlotSig(_,delega // Work out the free type variables for the morphing thunk let takenNames = List.map nameOfVal tmvs - let (cloAttribs,_,_,cloFreeTyvars,cloFreeVars,ilDelegeeTypeRef,ilCloFreeVars,eenvinner) = GetIlxClosureFreeVars cenv cgbuf.mgbuf m None eenvouter takenNames expr + let (cloAttribs,_,_,cloFreeTyvars,cloFreeVars,ilDelegeeTypeRef,ilCloFreeVars,eenvinner) = GetIlxClosureFreeVars cenv m None eenvouter takenNames expr let ilDelegeeGenericParams = GenGenericParams cenv eenvinner cloFreeTyvars let ilDelegeeGenericActualsInner = mkILFormalGenericArgs 0 ilDelegeeGenericParams @@ -4267,7 +4267,7 @@ and GenDelegateExpr cenv cgbuf eenvouter expr (TObjExprMethod((TSlotSig(_,delega // The slot sig contains a formal instantiation. When creating delegates we're only // interested in the actual instantiation since we don't have to emit a method impl. - let ilDelegeeParams,ilDelegeeRet = GenActualSlotsig m cenv cgbuf.mgbuf envForDelegeeUnderTypars slotsig methTyparsOfOverridingMethod tmvs + let ilDelegeeParams,ilDelegeeRet = GenActualSlotsig m cenv envForDelegeeUnderTypars slotsig methTyparsOfOverridingMethod tmvs let envForDelegeeMeth = AddStorageForLocalVals cenv.g (List.mapi (fun i v -> (v,Arg (i+numthis))) tmvs) envForDelegeeUnderTypars let ilMethodBody = CodeGenMethodForExpr cenv cgbuf.mgbuf (SPAlways,[],delegeeMethName,envForDelegeeMeth,1,0,body,(if slotSigHasVoidReturnTy slotsig then discardAndReturnVoid else Return)) @@ -4741,7 +4741,7 @@ and GenLetRecBindings cenv (cgbuf:CodeGenBuffer) eenv (allBinds: Bindings,m) = | Expr.Lambda _ | Expr.TyLambda _ | Expr.Obj _ -> let isLocalTypeFunc = Option.isSome selfv && (IsNamedLocalTypeFuncVal cenv.g (Option.get selfv) e) let selfv = (match e with Expr.Obj _ -> None | _ when isLocalTypeFunc -> None | _ -> Option.map mkLocalValRef selfv) - let clo,_,eenvclo = GetIlxClosureInfo cenv cgbuf.mgbuf m isLocalTypeFunc selfv {eenv with letBoundVars=(mkLocalValRef boundv)::eenv.letBoundVars} e + let clo,_,eenvclo = GetIlxClosureInfo cenv m isLocalTypeFunc selfv {eenv with letBoundVars=(mkLocalValRef boundv)::eenv.letBoundVars} e clo.cloFreeVars |> List.iter (fun fv -> if Zset.contains fv forwardReferenceSet then match StorageForVal m fv eenvclo with @@ -5688,7 +5688,7 @@ and AllocLocalVal cenv cgbuf v eenv repr scopeMarks = let eenvinner = {eenv with letBoundVars=(mkLocalValRef v)::eenv.letBoundVars} - let cloinfo,_,_ = GetIlxClosureInfo cenv cgbuf.mgbuf v.Range true None eenvinner (Option.get repr) + let cloinfo,_,_ = GetIlxClosureInfo cenv v.Range true None eenvinner (Option.get repr) cloinfo let idx,eenv = AllocLocal cenv cgbuf eenv v.IsCompilerGenerated (v.CompiledName, cenv.g.ilg.typ_Object, false) scopeMarks @@ -6196,7 +6196,7 @@ and GenFieldInit m c = | ConstToILFieldInit fieldInit -> fieldInit | _ -> error(Error(FSComp.SR.ilTypeCannotBeUsedForLiteralField(),m)) -and GenAbstractBinding cenv mgbuf eenv tref (vref:ValRef) = +and GenAbstractBinding cenv eenv tref (vref:ValRef) = assert(vref.IsMember) let m = vref.Range let memberInfo = Option.get vref.MemberInfo @@ -6339,7 +6339,7 @@ and GenTypeDef cenv mgbuf lazyInitInfo eenv m (tycon:Tycon) = // REVIEW: this should be based off tcaug_adhoc_list, which is in declaration order tycon.MembersOfFSharpTyconSorted |> List.sortWith (fun v1 v2 -> rangeOrder.Compare(v1.DefinitionRange,v2.DefinitionRange)) - |> List.map (GenAbstractBinding cenv mgbuf eenv tref) + |> List.map (GenAbstractBinding cenv eenv tref) |> List.unzip3 |> mapTriple (List.concat, List.concat, List.concat) @@ -6369,7 +6369,7 @@ and GenTypeDef cenv mgbuf lazyInitInfo eenv m (tycon:Tycon) = let useMethodImpl = true let eenvUnderTypars = EnvForTypars memberParentTypars eenv - let _,methodImplGenerator = GenMethodImpl cenv mgbuf eenvUnderTypars (useMethodImpl,slotsig) m + let _,methodImplGenerator = GenMethodImpl cenv eenvUnderTypars (useMethodImpl,slotsig) m if useMethodImpl then yield methodImplGenerator (ilThisTy,memberMethodTypars) @@ -6665,7 +6665,7 @@ and GenTypeDef cenv mgbuf lazyInitInfo eenv m (tycon:Tycon) = match paraml with | [[tsp]] when isUnitTy cenv.g tsp.Type -> [] (* suppress unit arg *) | paraml -> paraml - GenActualSlotsig m cenv mgbuf eenvinner (TSlotSig(nm,typ,ctps,mtps,paraml,returnTy)) [] [] + GenActualSlotsig m cenv eenvinner (TSlotSig(nm,typ,ctps,mtps,paraml,returnTy)) [] [] yield! mkILDelegateMethods reprAccess cenv.g.ilg (cenv.g.iltyp_AsyncCallback, cenv.g.iltyp_IAsyncResult) (p,r) | _ -> () From f42054a50a02b86afb5143c453d986be7bab5cea Mon Sep 17 00:00:00 2001 From: Don Syme Date: Fri, 16 Mar 2018 12:38:39 +0000 Subject: [PATCH 007/160] adjust test --- tests/fsharp/tests.fs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/fsharp/tests.fs b/tests/fsharp/tests.fs index d3d684bc9d6..163ad8e8cc6 100644 --- a/tests/fsharp/tests.fs +++ b/tests/fsharp/tests.fs @@ -235,14 +235,14 @@ module CoreTests = let ``anon-FSC_BASIC``() = let cfg = testConfig "core/anon" - fsc cfg "%s -a -o:lib.dll -g" cfg.fsc_flags ["lib.fs"] + fsc cfg "%s -a -o:lib.dll" cfg.fsc_flags ["lib.fs"] copyFile (cfg.FSCBinPath ++ "System.ValueTuple.dll") ("." ++ "System.ValueTuple.dll") - peverify cfg "lib.dll" + //peverify cfg "lib.dll" - fsc cfg "%s -r:lib.dll -g" cfg.fsc_flags ["test.fsx"] + fsc cfg "%s -r:lib.dll" cfg.fsc_flags ["test.fsx"] - peverify cfg "test.exe" + //peverify cfg "test.exe" begin use testOkFile = fileguard cfg "test.ok" From 2b51188f7ddba2d865d22223958eb704ecebbf88 Mon Sep 17 00:00:00 2001 From: Don Syme Date: Sat, 17 Mar 2018 02:24:33 +0000 Subject: [PATCH 008/160] conflicts --- tests/scripts/compiler-perf-results.txt | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/tests/scripts/compiler-perf-results.txt b/tests/scripts/compiler-perf-results.txt index cf61efda488..19c42c41f6b 100644 --- a/tests/scripts/compiler-perf-results.txt +++ b/tests/scripts/compiler-perf-results.txt @@ -137,3 +137,8 @@ https://github.com/dsyme/visualfsharp.git range1 e49ac8a2f https://github.com/Microsoft/visualfsharp master ac9f2af4329d2ae1c4213bb1d22dc4450b319207 ac9f2af4329d2ae1c4213bb1d22dc4450b319207 251.89 11.89 30.30 46.67 58.00 59.09 https://github.com/dsyme/visualfsharp.git range1 e49ac8a2f21223e60d0d9597e52ea9e5f8705963 ac9f2af4329d2ae1c4213bb1d22dc4450b319207 252.83 11.66 31.05 47.17 58.80 58.59 https://github.com/Microsoft/visualfsharp master ac9f2af4329d2ae1c4213bb1d22dc4450b319207 ac9f2af4329d2ae1c4213bb1d22dc4450b319207 250.48 11.44 30.93 46.09 57.41 58.86 +https://github.com/dsyme/visualfsharp.git weak1 58bd2bec78f01e57fecff604146a3cc55eec4966 221224e6d20bd835c2b9e01e0a52bf45e740a8d0 MSRC-3617253 260.05 10.97 30.78 47.15 58.04 59.77 +https://github.com/dsyme/visualfsharp.git range1 e49ac8a2f21223e60d0d9597e52ea9e5f8705963 221224e6d20bd835c2b9e01e0a52bf45e740a8d0 MSRC-3617253 275.83 12.79 32.57 53.38 61.94 58.03 +https://github.com/Microsoft/visualfsharp master 221224e6d20bd835c2b9e01e0a52bf45e740a8d0 221224e6d20bd835c2b9e01e0a52bf45e740a8d0 MSRC-3617253 273.00 12.46 32.80 51.38 60.93 58.66 +https://github.com/dsyme/visualfsharp.git weak1 6be11a0290c689f2331a03fb9762592b24bdacad 95348d0aafd168064d4c2282c59d62ac95bbebdf MSRC-3617253 308.27 10.79 31.51 47.44 58.70 59.71 +https://github.com/Microsoft/visualfsharp master 95348d0aafd168064d4c2282c59d62ac95bbebdf 95348d0aafd168064d4c2282c59d62ac95bbebdf MSRC-3617253 256.40 11.22 32.40 47.49 58.47 59.82 From 7a33c0511016eaa49be8834bf1b9dc188683c8be Mon Sep 17 00:00:00 2001 From: Don Syme Date: Sat, 17 Mar 2018 02:27:34 +0000 Subject: [PATCH 009/160] fix test --- tests/fsharp/tests.fs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/fsharp/tests.fs b/tests/fsharp/tests.fs index 163ad8e8cc6..80631821e76 100644 --- a/tests/fsharp/tests.fs +++ b/tests/fsharp/tests.fs @@ -237,12 +237,12 @@ module CoreTests = fsc cfg "%s -a -o:lib.dll" cfg.fsc_flags ["lib.fs"] - copyFile (cfg.FSCBinPath ++ "System.ValueTuple.dll") ("." ++ "System.ValueTuple.dll") - //peverify cfg "lib.dll" + copy_y cfg (cfg.FSCBinPath ++ "System.ValueTuple.dll") ("." ++ "System.ValueTuple.dll") + peverify cfg "lib.dll" fsc cfg "%s -r:lib.dll" cfg.fsc_flags ["test.fsx"] - //peverify cfg "test.exe" + peverify cfg "test.exe" begin use testOkFile = fileguard cfg "test.ok" From c2b02c1d37c34db2af3bf9023aba90cabda0c9ab Mon Sep 17 00:00:00 2001 From: Don Syme Date: Wed, 21 Mar 2018 04:01:18 +0000 Subject: [PATCH 010/160] fix test --- src/fsharp/TypeChecker.fs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/fsharp/TypeChecker.fs b/src/fsharp/TypeChecker.fs index 6ddee7e0288..72429dce8d0 100755 --- a/src/fsharp/TypeChecker.fs +++ b/src/fsharp/TypeChecker.fs @@ -776,6 +776,12 @@ let UnifyTupleTypeAndInferCharacteristics contextInfo cenv denv m knownTy isExpl tupInfo, ptys else TupInfo.Const isExplicitStruct, NewInferenceTypes ps + + let contextInfo = + match contextInfo with + | ContextInfo.RecordFields -> ContextInfo.TupleInRecordFields + | _ -> contextInfo + let ty2 = TType_tuple (tupInfo, ptys) AddCxTypeEqualsType contextInfo denv cenv.css m knownTy ty2 tupInfo, ptys From cbb0d514b39ec08488a27fe85203e33f69acf958 Mon Sep 17 00:00:00 2001 From: Don Syme Date: Fri, 4 May 2018 11:32:39 +0100 Subject: [PATCH 011/160] simplify diff --- src/fsharp/IlxGen.fs | 1637 +++++++++++++++++++++--------------------- 1 file changed, 814 insertions(+), 823 deletions(-) diff --git a/src/fsharp/IlxGen.fs b/src/fsharp/IlxGen.fs index a3afe589650..02d9862530c 100644 --- a/src/fsharp/IlxGen.fs +++ b/src/fsharp/IlxGen.fs @@ -371,24 +371,26 @@ type PtrsOK = | PtrTypesNotOK let rec GenTypeArgAux amap m tyenv tyarg = - GenTypeAuxAux amap m tyenv VoidNotOK PtrTypesNotOK tyarg + GenTypeAux amap m tyenv VoidNotOK PtrTypesNotOK tyarg -and GenTypeArgsAux amap m tyenv tyargs = +and GenTypeArgs amap m tyenv tyargs = List.map (GenTypeArgAux amap m tyenv) (DropErasedTyargs tyargs) -and GenTyAppAux amap m tyenv repr tinst = +and GenTyApp amap m tyenv repr tinst = match repr with | CompiledTypeRepr.ILAsmOpen ty -> - let ilTypeInst = GenTypeArgsAux amap m tyenv tinst + let ilTypeInst = GenTypeArgs amap m tyenv tinst let ty = IL.instILType ilTypeInst ty ty | CompiledTypeRepr.ILAsmNamed (tref, boxity, ilTypeOpt) -> GenILTyAppAux amap m tyenv (tref, boxity, ilTypeOpt) tinst +and GenNamedTyApp amap m tyenv tcref tinst = GenNamedTyAppAux amap m tyenv PtrTypesNotOK tcref tinst + and GenILTyAppAux amap m tyenv (tref, boxity, ilTypeOpt) tinst = match ilTypeOpt with | None -> - let ilTypeInst = GenTypeArgsAux amap m tyenv tinst + let ilTypeInst = GenTypeArgs amap m tyenv tinst mkILTy boxity (mkILTySpec (tref,ilTypeInst)) | Some ilType -> ilType // monomorphic types include a cached ilType to avoid reallocation of an ILType node @@ -404,12 +406,12 @@ and GenNamedTyAppAux (amap:ImportMap) m tyenv ptrsOK tcref tinst = match tcref.TypeReprInfo with // Generate the base type, because that is always the representation of the erased type, unless the assembly is being injected | TProvidedTypeExtensionPoint info when info.IsErased -> - GenTypeAuxAux amap m tyenv VoidNotOK ptrsOK (info.BaseTypeForErased (m,g.obj_ty)) + GenTypeAux amap m tyenv VoidNotOK ptrsOK (info.BaseTypeForErased (m,g.obj_ty)) | _ -> #endif - GenTyAppAux amap m tyenv (GenTyconRef tcref) tinst + GenTyApp amap m tyenv (GenTyconRef tcref) tinst -and GenTypeAuxAux amap m (tyenv: TypeReprEnv) voidOK ptrsOK ty = +and GenTypeAux amap m (tyenv: TypeReprEnv) voidOK ptrsOK ty = let g = amap.g #if DEBUG voidCheck m g voidOK ty @@ -418,7 +420,7 @@ and GenTypeAuxAux amap m (tyenv: TypeReprEnv) voidOK ptrsOK ty = #endif match stripTyEqnsAndMeasureEqns g ty with | TType_app (tcref, tinst) -> GenNamedTyAppAux amap m tyenv ptrsOK tcref tinst - | TType_tuple (tupInfo, args) -> GenTypeAuxAux amap m tyenv VoidNotOK ptrsOK (mkCompiledTupleTy g (evalTupInfoIsStruct tupInfo) args) + | TType_tuple (tupInfo, args) -> GenTypeAux amap m tyenv VoidNotOK ptrsOK (mkCompiledTupleTy g (evalTupInfoIsStruct tupInfo) args) | TType_fun (dty, returnTy) -> EraseClosures.mkILFuncTy g.ilxPubCloEnv (GenTypeArgAux amap m tyenv dty) (GenTypeArgAux amap m tyenv returnTy) | TType_anon (anonInfo, tinst) -> let tref = anonInfo.ILTypeRef @@ -426,12 +428,12 @@ and GenTypeAuxAux amap m (tyenv: TypeReprEnv) voidOK ptrsOK ty = GenILTyAppAux amap m tyenv (tref, boxity, None) tinst | TType_ucase (ucref, args) -> - let cuspec,idx = GenUnionCaseSpecAux amap m tyenv ucref args + let cuspec,idx = GenUnionCaseSpec amap m tyenv ucref args EraseUnions.GetILTypeForAlternative cuspec idx | TType_forall (tps, tau) -> let tps = DropErasedTypars tps - if tps.IsEmpty then GenTypeAuxAux amap m tyenv VoidNotOK ptrsOK tau + if tps.IsEmpty then GenTypeAux amap m tyenv VoidNotOK ptrsOK tau else EraseClosures.mkILTyFuncTy g.ilxPubCloEnv | TType_var tp -> mkILTyvarTy tyenv.[tp,m] | TType_measure _ -> g.ilg.typ_Int32 @@ -443,7 +445,7 @@ and GenTypeAuxAux amap m (tyenv: TypeReprEnv) voidOK ptrsOK ty = and GenUnionCaseRef (amap: ImportMap) m tyenv i (fspecs:RecdField array) = let g = amap.g fspecs |> Array.mapi (fun j fspec -> - let ilFieldDef = IL.mkILInstanceField(fspec.Name,GenTypeAux amap m tyenv fspec.FormalType, None, ILMemberAccess.Public) + let ilFieldDef = IL.mkILInstanceField(fspec.Name,GenType amap m tyenv fspec.FormalType, None, ILMemberAccess.Public) IlxUnionField { ilFieldDef with // These properties on the "field" of an alternative end up going on a property generated by cu_erase.fs @@ -486,26 +488,26 @@ and ComputeUnionHasHelpers g (tcref : TyconRef) = | _ -> AllHelpers (* not hiddenRepr *) -and GenUnionSpecAux amap m tyenv tcref tyargs = +and GenUnionSpec amap m tyenv tcref tyargs = let curef = GenUnionRef amap m tcref - let tinst = GenTypeArgsAux amap m tyenv tyargs + let tinst = GenTypeArgs amap m tyenv tyargs IlxUnionSpec(curef,tinst) -and GenUnionCaseSpecAux amap m tyenv (ucref:UnionCaseRef) tyargs = - let cuspec = GenUnionSpecAux amap m tyenv ucref.TyconRef tyargs +and GenUnionCaseSpec amap m tyenv (ucref:UnionCaseRef) tyargs = + let cuspec = GenUnionSpec amap m tyenv ucref.TyconRef tyargs cuspec, ucref.Index /// IL void types are only generated for return types -and GenReturnTypeAux amap m tyenv returnTyOpt = +and GenReturnType amap m tyenv returnTyOpt = match returnTyOpt with | None -> ILType.Void - | Some returnTy -> GenTypeAuxAux amap m tyenv VoidNotOK(*1*) PtrTypesOK returnTy (*1: generate void from unit, but not accept void *) + | Some returnTy -> GenTypeAux amap m tyenv VoidNotOK(*1*) PtrTypesOK returnTy (*1: generate void from unit, but not accept void *) -and GenTypeAux amap m tyenv ty = GenTypeAuxAux amap m tyenv VoidNotOK PtrTypesNotOK ty -and GenTypesAux amap m tyenv tys = List.map (GenTypeAux amap m tyenv) tys -and GenParamTypeAux amap m tyenv ty = GenTypeAuxAux amap m tyenv VoidNotOK PtrTypesOK ty -and GenParamTypesAux amap m tyenv tys = tys |> List.map (GenParamTypeAux amap m tyenv) -and GenTypePermitVoidAux amap m tyenv ty = GenTypeAuxAux amap m tyenv VoidOK PtrTypesNotOK ty +and GenType amap m tyenv ty = GenTypeAux amap m tyenv VoidNotOK PtrTypesNotOK ty +and GenTypes amap m tyenv tys = List.map (GenType amap m tyenv) tys +and GenParamType amap m tyenv ty = GenTypeAux amap m tyenv VoidNotOK PtrTypesOK ty +and GenParamTypes amap m tyenv tys = tys |> List.map (GenParamType amap m tyenv) +and GenTypePermitVoidAux amap m tyenv ty = GenTypeAux amap m tyenv VoidOK PtrTypesNotOK ty // Static fields generally go in a private InitializationCodeAndBackingFields section. This is to ensure all static // fields are initialized only in their class constructors (we generate one primary @@ -532,9 +534,9 @@ let GenFieldSpecForStaticField (isInteractive, g, ilContainerTy, vspec:Val, nm, let GenRecdFieldRef m cenv tyenv (rfref:RecdFieldRef) tyargs = let tyenvinner = TypeReprEnv.ForTycon rfref.Tycon - mkILFieldSpecInTy(GenTyAppAux cenv.amap m tyenv rfref.TyconRef.CompiledRepresentation tyargs, + mkILFieldSpecInTy(GenTyApp cenv.amap m tyenv rfref.TyconRef.CompiledRepresentation tyargs, ComputeFieldName rfref.Tycon rfref.RecdField, - GenTypeAux cenv.amap m tyenvinner rfref.RecdField.FormalType) + GenType cenv.amap m tyenvinner rfref.RecdField.FormalType) //-------------------------------------------------------------------------- // Closure summaries @@ -575,827 +577,816 @@ type IlxClosureInfo = //-------------------------------------------------------------------------- -// Generate debugging marks +// Representation of term declarations = Environments for compiling expressions. //-------------------------------------------------------------------------- -let GenILSourceMarker (g: TcGlobals) (m:range) = - ILSourceMarker.Create(document=g.memoize_file m.FileIndex, - line=m.StartLine, - /// NOTE: .NET && VS measure first column as column 1 - column= m.StartColumn+1, - endLine= m.EndLine, - endColumn=m.EndColumn+1) + +[] +type ValStorage = + /// Indicates the value is always null + | Null + /// Indicates the value is stored in a static field. + | StaticField of ILFieldSpec * ValRef * (*hasLiteralAttr:*)bool * ILType * string * ILType * ILMethodRef * ILMethodRef * OptionalShadowLocal + /// Indicates the value is "stored" as a property that recomputes it each time it is referenced. Used for simple constants that do not cause initialization triggers + | StaticProperty of ILMethodSpec * OptionalShadowLocal + /// Indicates the value is "stored" as a IL static method (in a "main" class for a F# + /// compilation unit, or as a member) according to its inferred or specified arity. + | Method of ValReprInfo * ValRef * ILMethodSpec * Range.range * ArgReprInfo list * ArgReprInfo + /// Indicates the value is stored at the given position in the closure environment accessed via "ldarg 0" + | Env of ILType * int * ILFieldSpec * NamedLocalIlxClosureInfo ref option + /// Indicates that the value is an argument of a method being generated + | Arg of int + /// Indicates that the value is stored in local of the method being generated. NamedLocalIlxClosureInfo is normally empty. + /// It is non-empty for 'local type functions', see comments on definition of NamedLocalIlxClosureInfo. + | Local of int * NamedLocalIlxClosureInfo ref option -let GenPossibleILSourceMarker cenv m = - if cenv.opts.generateDebugSymbols then - Some (GenILSourceMarker cenv.g m ) - else - None +and OptionalShadowLocal = + | NoShadowLocal + | ShadowLocal of ValStorage -//-------------------------------------------------------------------------- -// Helpers for merging property definitions -//-------------------------------------------------------------------------- +/// The representation of a NamedLocalClosure is based on a cloinfo. However we can't generate a cloinfo until we've +/// decided the representations of other items in the recursive set. Hence we use two phases to decide representations in +/// a recursive set. Yuck. +and NamedLocalIlxClosureInfo = + | NamedLocalIlxClosureInfoGenerator of (IlxGenEnv -> IlxClosureInfo) + | NamedLocalIlxClosureInfoGenerated of IlxClosureInfo + +and ModuleStorage = + { Vals: Lazy> + SubModules: Lazy> } -let HashRangeSorted (ht: IDictionary<_, (int * _)>) = - [ for KeyValue(_k,v) in ht -> v ] |> List.sortBy fst |> List.map snd +/// BranchCallItems are those where a call to the value can be implemented as +/// a branch. At the moment these are only used for generating branch calls back to +/// the entry label of the method currently being generated. +and BranchCallItem = + | BranchCallClosure of ArityInfo + | BranchCallMethod of + // Argument counts for compiled form of F# method or value + ArityInfo * + // Arg infos for compiled form of F# method or value + (TType * ArgReprInfo) list list * + // Typars for F# method or value + Tast.Typars * + // Typars for F# method or value + int * + // num obj args + int + +and Mark = + | Mark of ILCodeLabel (* places we can branch to *) + member x.CodeLabel = (let (Mark(lab)) = x in lab) -let MergeOptions m o1 o2 = - match o1,o2 with - | Some x, None | None, Some x -> Some x - | None, None -> None - | Some x, Some _ -> -#if DEBUG - // This warning fires on some code that also triggers this warning: - // warning(Error("The implementation of a specified generic interface required a method implementation not fully supported by F# Interactive. In the unlikely event that the resulting class fails to load then compile the interface type into a statically-compiled DLL and reference it using '#r'",m)) - // The code is OK so we don't print this. - errorR(InternalError("MergeOptions: two values given",m)) -#else - ignore m -#endif - Some x +and IlxGenEnv = + { tyenv: TypeReprEnv + someTypeInThisAssembly: ILType + isFinalFile: bool + /// Where to place the stuff we're currently generating + cloc: CompileLocation + /// Hiding information down the signature chain, used to compute what's public to the assembly + sigToImplRemapInfo: (Remap * SignatureHidingInfo) list + /// All values in scope + valsInScope: ValMap> + /// For optimizing direct tail recursion to a loop - mark says where to branch to. Length is 0 or 1. + /// REVIEW: generalize to arbitrary nested local loops?? + innerVals: (ValRef * (BranchCallItem * Mark)) list + /// Full list of enclosing bound values. First non-compiler-generated element is used to help give nice names for closures and other expressions. + letBoundVars: ValRef list + /// The set of IL local variable indexes currently in use by lexically scoped variables, to allow reuse on different branches. + /// Really an integer set. + liveLocals: IntMap + /// Are we under the scope of a try, catch or finally? If so we can't tailcall. SEH = structured exception handling + withinSEH: bool } -let MergePropertyPair m (pd: ILPropertyDef) pdef = - {pd with GetMethod=MergeOptions m pd.GetMethod pdef.GetMethod - SetMethod=MergeOptions m pd.SetMethod pdef.SetMethod} +let ReplaceTyenv tyenv (eenv: IlxGenEnv) = {eenv with tyenv = tyenv } +let EnvForTypars tps eenv = {eenv with tyenv = TypeReprEnv.ForTypars tps } +let AddTyparsToEnv typars (eenv: IlxGenEnv) = {eenv with tyenv = eenv.tyenv.Add typars} -type PropKey = PropKey of string * ILTypes * ILThisConvention +let AddSignatureRemapInfo _msg (rpi, mhi) eenv = + { eenv with sigToImplRemapInfo = (mkRepackageRemapping rpi,mhi) :: eenv.sigToImplRemapInfo } + +//-------------------------------------------------------------------------- +// Print eenv +//-------------------------------------------------------------------------- -let AddPropertyDefToHash (m:range) (ht:Dictionary) (pdef: ILPropertyDef) = - let nm = PropKey(pdef.Name, pdef.Args, pdef.CallingConv) - if ht.ContainsKey nm then - let idx,pd = ht.[nm] - ht.[nm] <- (idx, MergePropertyPair m pd pdef) +let OutputStorage (pps: TextWriter) s = + match s with + | StaticField _ -> pps.Write "(top)" + | StaticProperty _ -> pps.Write "(top)" + | Method _ -> pps.Write "(top)" + | Local _ -> pps.Write "(local)" + | Arg _ -> pps.Write "(arg)" + | Env _ -> pps.Write "(env)" + | Null -> pps.Write "(null)" + +//-------------------------------------------------------------------------- +// Augment eenv with values +//-------------------------------------------------------------------------- + +let AddStorageForVal (g: TcGlobals) (v,s) eenv = + let eenv = { eenv with valsInScope = eenv.valsInScope.Add v s } + // If we're compiling fslib then also bind the value as a non-local path to + // allow us to resolve the compiler-non-local-references that arise from env.fs + // + // Do this by generating a fake "looking from the outside in" non-local value reference for + // v, dereferencing it to find the corresponding signature Val, and adding an entry for the signature val. + // + // A similar code path exists in ilxgen.fs for the tables of "optimization data" for values + if g.compilingFslib then + // Passing an empty remap is sufficient for FSharp.Core.dll because it turns out the remapped type signature can + // still be resolved. + match tryRescopeVal g.fslibCcu Remap.Empty v with + | None -> eenv + | Some vref -> + match vref.TryDeref with + | VNone -> + //let msg = sprintf "could not dereference external value reference to something in FSharp.Core.dll during code generation, v.MangledName = '%s', v.Range = %s" v.MangledName (stringOfRange v.Range) + //System.Diagnostics.Debug.Assert(false, msg) + eenv + | VSome gv -> + { eenv with valsInScope = eenv.valsInScope.Add gv s } else - ht.[nm] <- (ht.Count, pdef) - + eenv -/// Merge a whole group of properties all at once -let MergePropertyDefs m ilPropertyDefs = - let ht = new Dictionary<_,_>(3,HashIdentity.Structural) - ilPropertyDefs |> List.iter (AddPropertyDefToHash m ht) - HashRangeSorted ht +let AddStorageForLocalVals g vals eenv = List.foldBack (fun (v,s) acc -> AddStorageForVal g (v,notlazy s) acc) vals eenv //-------------------------------------------------------------------------- -// Buffers for compiling modules. The entire assembly gets compiled via an AssemblyBuilder +// Lookup eenv //-------------------------------------------------------------------------- + +open Microsoft.FSharp.Compiler.AbstractIL +open Microsoft.FSharp.Compiler.AbstractIL.Internal +open Microsoft.FSharp.Compiler.AbstractIL.Internal.Library -/// Information collected imperatively for each type definition -type TypeDefBuilder(tdef, tdefDiscards) = - let gmethods = new ResizeArray(0) - let gfields = new ResizeArray(0) - let gproperties : Dictionary = new Dictionary<_,_>(3,HashIdentity.Structural) - let gevents = new ResizeArray(0) - let gnested = new TypeDefsBuilder() - - member b.Close() = - { tdef with - Methods = mkILMethods (tdef.Methods.AsList @ ResizeArray.toList gmethods) - Fields = mkILFields (tdef.Fields.AsList @ ResizeArray.toList gfields) - Properties = mkILProperties (tdef.Properties.AsList @ HashRangeSorted gproperties ) - Events = mkILEvents (tdef.Events.AsList @ ResizeArray.toList gevents) - NestedTypes = mkILTypeDefs (tdef.NestedTypes.AsList @ gnested.Close()) } +let StorageForVal m v eenv = + let v = + try eenv.valsInScope.[v] + with :? KeyNotFoundException -> + assert false + errorR(Error(FSComp.SR.ilUndefinedValue(showL(vspecAtBindL v)),m)) + notlazy (Arg 668(* random value for post-hoc diagnostic analysis on generated tree *) ) + v.Force() +let StorageForValRef m (v: ValRef) eenv = StorageForVal m v.Deref eenv - member b.AddEventDef(edef) = gevents.Add edef - member b.AddFieldDef(ilFieldDef) = gfields.Add ilFieldDef - member b.AddMethodDef(ilMethodDef) = - let discard = - match tdefDiscards with - | Some (mdefDiscard, _) -> mdefDiscard ilMethodDef - | None -> false - if not discard then - gmethods.Add ilMethodDef - member b.NestedTypeDefs = gnested - member b.GetCurrentFields() = gfields |> Seq.readonly +//-------------------------------------------------------------------------- +// Imported modules and the environment +// +// How a top level value is represented depends on its type. If it's a +// function or is polymorphic, then it gets represented as a +// method (possibly and instance method). Otherwise it gets represented as a +// static field. +//-------------------------------------------------------------------------- - /// Merge Get and Set property nodes, which we generate independently for F# code - /// when we come across their corresponding methods. - member b.AddOrMergePropertyDef(pdef,m) = - let discard = - match tdefDiscards with - | Some (_, pdefDiscard) -> pdefDiscard pdef - | None -> false - if not discard then - AddPropertyDefToHash m gproperties pdef +let IsValRefIsDllImport g (vref:ValRef) = + vref.Attribs |> HasFSharpAttributeOpt g g.attrib_DllImportAttribute - member b.PrependInstructionsToSpecificMethodDef(cond,instrs,tag) = - match ResizeArray.tryFindIndex cond gmethods with - | Some idx -> gmethods.[idx] <- prependInstrsToMethod instrs gmethods.[idx] - | None -> gmethods.Add(mkILClassCtor (mkMethodBody (false,[],1,nonBranchingInstrsToCode instrs,tag))) +let GetMethodSpecForMemberVal amap g (memberInfo:ValMemberInfo) (vref:ValRef) = + let m = vref.Range + let tps,curriedArgInfos,returnTy,retInfo = + assert(vref.ValReprInfo.IsSome) + GetTopValTypeInCompiledForm g (Option.get vref.ValReprInfo) vref.Type m + let tyenvUnderTypars = TypeReprEnv.ForTypars tps + let flatArgInfos = List.concat curriedArgInfos + let isCtor = (memberInfo.MemberFlags.MemberKind = MemberKind.Constructor) + let cctor = (memberInfo.MemberFlags.MemberKind = MemberKind.ClassConstructor) + let parentTcref = vref.TopValDeclaringEntity + let parentTypars = parentTcref.TyparsNoRange + let numParentTypars = parentTypars.Length + if tps.Length < numParentTypars then error(InternalError("CodeGen check: type checking did not ensure that this method is sufficiently generic", m)) + let ctps,mtps = List.chop numParentTypars tps + let isCompiledAsInstance = ValRefIsCompiledAsInstanceMember g vref + let ilActualRetTy = + let ilRetTy = GenReturnType amap m tyenvUnderTypars returnTy + if isCtor || cctor then ILType.Void else ilRetTy -and TypeDefsBuilder() = - let tdefs : Internal.Utilities.Collections.HashMultiMap = HashMultiMap(0, HashIdentity.Structural) - let mutable countDown = System.Int32.MaxValue + let ilTy = GenType amap m tyenvUnderTypars (mkAppTy parentTcref (List.map mkTyparTy ctps)) - member b.Close() = - //The order we emit type definitions is not deterministic since it is using the reverse of a range from a hash table. We should use an approximation of source order. - // Ideally it shouldn't matter which order we use. - // However, for some tests FSI generated code appears sensitive to the order, especially for nested types. - - [ for (b, eliminateIfEmpty) in HashRangeSorted tdefs do - let tdef = b.Close() - // Skip the type if it is empty - if not eliminateIfEmpty - || not tdef.NestedTypes.AsList.IsEmpty - || not tdef.Fields.AsList.IsEmpty - || not tdef.Events.AsList.IsEmpty - || not tdef.Properties.AsList.IsEmpty - || not tdef.Methods.AsList.IsEmpty then - yield tdef ] - - member b.FindTypeDefBuilder(nm) = - try tdefs.[nm] |> snd |> fst - with :? KeyNotFoundException -> failwith ("FindTypeDefBuilder: " + nm + " not found") - - member b.FindNestedTypeDefsBuilder(path) = - List.fold (fun (acc:TypeDefsBuilder) x -> acc.FindTypeDefBuilder(x).NestedTypeDefs) b path - - member b.FindNestedTypeDefBuilder(tref:ILTypeRef) = - b.FindNestedTypeDefsBuilder(tref.Enclosing).FindTypeDefBuilder(tref.Name) - - member b.AddTypeDef(tdef:ILTypeDef, eliminateIfEmpty, addAtEnd, tdefDiscards) = - let idx = if addAtEnd then (countDown <- countDown - 1; countDown) else tdefs.Count - tdefs.Add (tdef.Name, (idx, (new TypeDefBuilder(tdef, tdefDiscards), eliminateIfEmpty))) - -type AnonTypeGenerationTable() = - let dict = Dictionary(HashIdentity.Structural) - member __.Table = dict - -/// Assembly generation buffers -type AssemblyBuilder(cenv:cenv, anonTypeTable: AnonTypeGenerationTable) as mgbuf = - // The Abstract IL table of types - let gtdefs= new TypeDefsBuilder() - // The definitions of top level values, as quotations. - let mutable reflectedDefinitions : Dictionary = Dictionary(HashIdentity.Reference) - let mutable extraBindingsToGenerate = [] - - // A memoization table for generating value types for big constant arrays - let rawDataValueTypeGenerator = - new MemoizationTable<(CompileLocation * int) , ILTypeSpec> - ((fun (cloc,size) -> - let name = CompilerGeneratedName ("T" + string(newUnique()) + "_" + string size + "Bytes") // Type names ending ...$T_37Bytes - let vtdef = mkRawDataValueTypeDef cenv.g.iltyp_ValueType (name,size,0us) - let vtref = NestedTypeRefForCompLoc cloc vtdef.Name - let vtspec = mkILTySpec(vtref,[]) - let vtdef = vtdef.WithAccess(ComputeTypeAccess vtref true) - mgbuf.AddTypeDef(vtref, vtdef, false, true, None) - vtspec), - keyComparer=HashIdentity.Structural) + if isCompiledAsInstance || isCtor then + // Find the 'this' argument type if any + let thisTy,flatArgInfos = + if isCtor then (GetFSharpViewOfReturnType g returnTy),flatArgInfos + else + match flatArgInfos with + | [] -> error(InternalError("This instance method '" + vref.LogicalName + "' has no arguments", m)) + | (h,_):: t -> h,t - let generateAnonType genToStringMethod (isStruct, ilTypeRef, nms) = + let thisTy = if isByrefTy g thisTy then destByrefTy g thisTy else thisTy + let thisArgTys = argsOfAppTy g thisTy + if ctps.Length <> thisArgTys.Length then + warning(InternalError(sprintf "CodeGen check: type checking did not quantify the correct number of type variables for this method, #parentTypars = %d, #ctps = %d, #mtps = %d, #thisArgTys = %d" numParentTypars ctps.Length mtps.Length thisArgTys.Length,m)) + else + List.iter2 + (fun gtp ty2 -> + if not (typeEquiv g (mkTyparTy gtp) ty2) then + warning(InternalError("CodeGen check: type checking did not quantify the correct type variables for this method: generalization list contained " + gtp.Name + "#" + string gtp.Stamp + " and list from 'this' pointer contained " + (showL(typeL ty2)), m))) + ctps + thisArgTys + let methodArgTys,paramInfos = List.unzip flatArgInfos + let ilMethodArgTys = GenParamTypes amap m tyenvUnderTypars methodArgTys + let ilMethodInst = GenTypeArgs amap m tyenvUnderTypars (List.map mkTyparTy mtps) + let mspec = mkILInstanceMethSpecInTy (ilTy,vref.CompiledName,ilMethodArgTys,ilActualRetTy,ilMethodInst) - let flds = [ for (i,nm) in Array.indexed nms -> (nm, nm + "@", ILType.TypeVar (uint16 i)) ] - // Note that this alternative below would give the same names as C#, but the generated - // comparison/equality doesn't know about these names. - //let flds = [ for (i,nm) in Array.indexed nms -> (nm, "<" + nm + ">" + "i__Field", ILType.TypeVar (uint16 i)) ] - - let ilGenericParams = - [ for nm in nms -> - { Name = sprintf "<%s>j__TPar" nm - Constraints = [] - Variance=NonVariant - CustomAttrs = emptyILCustomAttrs - HasReferenceTypeConstraint=false - HasNotNullableValueTypeConstraint=false - HasDefaultConstructorConstraint= false } ] - - let ilTy = mkILFormalNamedTy (if isStruct then ILBoxity.AsValue else ILBoxity.AsObject) ilTypeRef ilGenericParams - - // Generate the IL fields - let ilFieldDefs = - mkILFields - [ for (_, fldName, fldTy) in flds -> - let fdef = mkILInstanceField (fldName, fldTy, None, ILMemberAccess.Private) - { fdef with CustomAttrs = mkILCustomAttrs [ cenv.g.DebuggerBrowsableNeverAttribute ] } ] - - // Generate property definitions for the fields compiled as properties - let ilProperties = - mkILProperties - [ for (i,(propName, _fldName, fldTy)) in List.indexed flds -> - { Name = propName - Attributes = PropertyAttributes.None - SetMethod = None - GetMethod = Some(mkILMethRef(ilTypeRef,ILCallingConv.Instance,"get_" + propName,0,[],fldTy )) - CallingConv = ILCallingConv.Instance.ThisConv - Type = fldTy - Init = None - Args = [] - CustomAttrs = mkILCustomAttrs [ mkCompilationMappingAttrWithSeqNum cenv.g (int SourceConstructFlags.Field) i ] } ] - - let ilMethods = - [ for (propName, fldName, fldTy) in flds -> - mkLdfldMethodDef ("get_" + propName,ILMemberAccess.Public,false,ilTy,fldName,fldTy) - yield! genToStringMethod ilTy ] + mspec,ctps,mtps,paramInfos,retInfo + else + let methodArgTys,paramInfos = List.unzip flatArgInfos + let ilMethodArgTys = GenParamTypes amap m tyenvUnderTypars methodArgTys + let ilMethodInst = GenTypeArgs amap m tyenvUnderTypars (List.map mkTyparTy mtps) + let mspec = mkILStaticMethSpecInTy (ilTy,vref.CompiledName,ilMethodArgTys,ilActualRetTy,ilMethodInst) + + mspec,ctps,mtps,paramInfos,retInfo - let ilBaseTy = (if isStruct then cenv.g.iltyp_ValueType else cenv.g.ilg.typ_Object) - - let ilCtorDef = mkILSimpleStorageCtorWithParamNames(None, (if isStruct then None else Some ilBaseTy.TypeSpec), ilTy, [], flds, ILMemberAccess.Public) - let ilCtorRef = mkRefToILMethod(ilTypeRef, ilCtorDef) - let ilMethodRefs = [| for mdef in ilMethods -> mkRefToILMethod(ilTypeRef, mdef) |] +// Generate the ILFieldSpec for a top-level value - if ilTypeRef.Scope.IsLocalRef then +let ComputeFieldSpecForVal(optIntraAssemblyInfo:IlxGenIntraAssemblyInfo option, isInteractive, g, ilTyForProperty, vspec:Val, nm, m, cloc, ilTy, ilGetterMethRef) = + assert vspec.IsCompiledAsTopLevel + let generate() = GenFieldSpecForStaticField (isInteractive, g, ilTyForProperty, vspec, nm, m, cloc, ilTy) + match optIntraAssemblyInfo with + | None -> generate() + | Some intraAssemblyInfo -> + if vspec.IsMutable && vspec.IsCompiledAsTopLevel && isStructTy g vspec.Type then + let ok, res = intraAssemblyInfo.StaticFieldInfo.TryGetValue ilGetterMethRef + if ok then + res + else + let res = generate() + intraAssemblyInfo.StaticFieldInfo.[ilGetterMethRef] <- res + res + else + generate() - // Create a tycon that looks exactly like a record definition, to help drive the generation of equality/comparison code - let m = range0 - let tps = - [ for nm in nms -> - let stp = Typar(mkSynId m ("T"+nm),TyparStaticReq.NoStaticReq,true) - NewTypar (TyparKind.Type, TyparRigidity.WarnIfNotRigid,stp,false,TyparDynamicReq.Yes,[],true,true) ] +let IsValCompiledAsMethod g (v:Val) = + match v.ValReprInfo with + | None -> false + | Some topValInfo -> + not (isUnitTy g v.Type && not v.IsMemberOrModuleBinding && not v.IsMutable) && + not v.IsCompiledAsStaticPropertyWithoutField && + match GetTopValTypeInFSharpForm g topValInfo v.Type v.Range with + | [],[],_,_ when not v.IsMember -> false + | _ -> true - let tycon = - let lmtyp = MaybeLazy.Strict (NewEmptyModuleOrNamespaceType ModuleOrType) - let cpath = CompPath(ilTypeRef.Scope,[]) - NewTycon(Some cpath, ilTypeRef.Name, m, taccessPublic, taccessPublic, TyparKind.Type, LazyWithContext.NotLazy tps, XmlDoc.Empty, false, false, false, lmtyp) +// This called via 2 routes. +// (a) ComputeAndAddStorageForLocalTopVal +// (b) ComputeStorageForNonLocalTopVal +// +/// This function decides the storage for the val. +/// The decision is based on arityInfo. +let ComputeStorageForTopVal (amap, g, optIntraAssemblyInfo:IlxGenIntraAssemblyInfo option, isInteractive, optShadowLocal, vref:ValRef, cloc) = - if isStruct then - tycon.SetIsStructRecordOrUnion(true) + if isUnitTy g vref.Type && not vref.IsMemberOrModuleBinding && not vref.IsMutable then + Null + else + let topValInfo = + match vref.ValReprInfo with + | None -> error(InternalError("ComputeStorageForTopVal: no arity found for " + showL(valRefL vref),vref.Range)) + | Some a -> a + + let m = vref.Range + let nm = vref.CompiledName - tycon.entity_tycon_repr <- - TRecdRepr (MakeRecdFieldsTable - [ for (tp, (propName, _fldName, _fldTy)) in (List.zip tps flds) -> - NewRecdField false None (mkSynId m propName) false (mkTyparTy tp) true false [] [] XmlDoc.Empty taccessPublic false ]) + if vref.Deref.IsCompiledAsStaticPropertyWithoutField then + let nm = "get_"+nm + let tyenvUnderTypars = TypeReprEnv.ForTypars [] + let ilRetTy = GenType amap m tyenvUnderTypars vref.Type + let typ = mkILTyForCompLoc cloc + let mspec = mkILStaticMethSpecInTy (typ, nm, [], ilRetTy, []) + + StaticProperty (mspec, optShadowLocal) + else - let tcref = mkLocalTyconRef tycon - let _,typ = generalizeTyconRef tcref - let tcaug = tcref.TypeContents - - tcaug.tcaug_interfaces <- - [ (cenv.g.mk_IStructuralComparable_ty,true,m) - (cenv.g.mk_IComparable_ty,true,m) - (mkAppTy cenv.g.system_GenericIComparable_tcref [typ],true,m) - (cenv.g.mk_IStructuralEquatable_ty,true,m) - (mkAppTy cenv.g.system_GenericIEquatable_tcref [typ],true,m) ] + // Determine when a static field is required. + // + // REVIEW: This call to GetTopValTypeInFSharpForm is only needed to determine if this is a (type) function or a value + // We should just look at the arity + match GetTopValTypeInFSharpForm g topValInfo vref.Type vref.Range with + | [],[], returnTy,_ when not vref.IsMember -> + // Mutable and literal static fields must have stable names and live in the "public" location + // See notes on GenFieldSpecForStaticField above. + let vspec = vref.Deref + let ilTy = GenType amap m TypeReprEnv.Empty returnTy (* TypeReprEnv.Empty ok: not a field in a generic class *) + let ilTyForProperty = mkILTyForCompLoc cloc + let attribs = vspec.Attribs + let hasLiteralAttr = HasFSharpAttribute g g.attrib_LiteralAttribute attribs - let vspec1,vspec2 = AugmentWithHashCompare.MakeValsForEqualsAugmentation cenv.g tcref - let evspec1,evspec2,evspec3 = AugmentWithHashCompare.MakeValsForEqualityWithComparerAugmentation cenv.g tcref - let cvspec1,cvspec2 = AugmentWithHashCompare.MakeValsForCompareAugmentation cenv.g tcref - let cvspec3 = AugmentWithHashCompare.MakeValsForCompareWithComparerAugmentation cenv.g tcref + let ilTypeRefForProperty = ilTyForProperty.TypeRef + let ilGetterMethRef = mkILMethRef (ilTypeRefForProperty, ILCallingConv.Static, "get_"+nm, 0, [], ilTy) + let ilSetterMethRef = mkILMethRef (ilTypeRefForProperty, ILCallingConv.Static, "set_"+nm, 0, [ilTy], ILType.Void) - tcaug.SetCompare (mkLocalValRef cvspec1, mkLocalValRef cvspec2) - tcaug.SetCompareWith (mkLocalValRef cvspec3) - tcaug.SetEquals (mkLocalValRef vspec1, mkLocalValRef vspec2) - tcaug.SetHashAndEqualsWith (mkLocalValRef evspec1, mkLocalValRef evspec2, mkLocalValRef evspec3) + let fspec = ComputeFieldSpecForVal(optIntraAssemblyInfo, isInteractive, g, ilTyForProperty, vspec, nm, m, cloc, ilTy, ilGetterMethRef) - // Build the ILTypeDef. We don't rely on the normal record generation process because we want very specific field names + StaticField (fspec, vref, hasLiteralAttr, ilTyForProperty, nm, ilTy, ilGetterMethRef, ilSetterMethRef, optShadowLocal) + + | _ -> + match vref.MemberInfo with + | Some memberInfo when not vref.IsExtensionMember -> + let mspec,_,_,paramInfos,retInfo = GetMethodSpecForMemberVal amap g memberInfo vref + Method (topValInfo, vref, mspec, m, paramInfos, retInfo) + | _ -> + let (tps, curriedArgInfos, returnTy, retInfo) = GetTopValTypeInCompiledForm g topValInfo vref.Type m + let tyenvUnderTypars = TypeReprEnv.ForTypars tps + let (methodArgTys,paramInfos) = curriedArgInfos |> List.concat |> List.unzip + let ilMethodArgTys = GenParamTypes amap m tyenvUnderTypars methodArgTys + let ilRetTy = GenReturnType amap m tyenvUnderTypars returnTy + let ilLocTy = mkILTyForCompLoc cloc + let ilMethodInst = GenTypeArgs amap m tyenvUnderTypars (List.map mkTyparTy tps) + let mspec = mkILStaticMethSpecInTy (ilLocTy, nm, ilMethodArgTys, ilRetTy, ilMethodInst) + Method (topValInfo, vref, mspec, m, paramInfos, retInfo) - let ilTypeDefAttribs = mkILCustomAttrs [ cenv.g.CompilerGeneratedAttribute; mkCompilationMappingAttr cenv.g (int SourceConstructFlags.RecordType) ] +let ComputeAndAddStorageForLocalTopVal (amap, g, intraAssemblyFieldTable, isInteractive, optShadowLocal) cloc (v:Val) eenv = + let storage = ComputeStorageForTopVal (amap, g, Some intraAssemblyFieldTable, isInteractive, optShadowLocal, mkLocalValRef v, cloc) + AddStorageForVal g (v,notlazy storage) eenv - let ilInterfaceTys = [ for (ity,_,_) in tcaug.tcaug_interfaces -> GenTypeAux cenv.amap m (TypeReprEnv.ForTypars tps) ity ] +let ComputeStorageForNonLocalTopVal amap g cloc modref (v:Val) = + match v.ValReprInfo with + | None -> error(InternalError("ComputeStorageForNonLocalTopVal, expected an arity for " + v.LogicalName,v.Range)) + | Some _ -> ComputeStorageForTopVal (amap, g, None, false, NoShadowLocal, mkNestedValRef modref v, cloc) - let ilTypeDef = - mkILGenericClass (ilTypeRef.Name, ILTypeDefAccess.Public, ilGenericParams, ilBaseTy, ilInterfaceTys, - mkILMethods (ilCtorDef :: ilMethods), ilFieldDefs, emptyILTypeDefs, - ilProperties, mkILEvents [], ilTypeDefAttribs, - ILTypeInit.BeforeField) - +let rec ComputeStorageForNonLocalModuleOrNamespaceRef amap g cloc acc (modref:ModuleOrNamespaceRef) (modul:ModuleOrNamespace) = + let acc = + (acc, modul.ModuleOrNamespaceType.ModuleAndNamespaceDefinitions) ||> List.fold (fun acc smodul -> + ComputeStorageForNonLocalModuleOrNamespaceRef amap g (CompLocForSubModuleOrNamespace cloc smodul) acc (modref.NestedTyconRef smodul) smodul) - let ilTypeDef = ilTypeDef.WithSealed(true).WithSerializable(true) + let acc = + (acc, modul.ModuleOrNamespaceType.AllValsAndMembers) ||> Seq.fold (fun acc v -> + AddStorageForVal g (v, lazy (ComputeStorageForNonLocalTopVal amap g cloc modref v)) acc) + acc - let ilTypeDef = { ilTypeDef with MethodImpls=mkILMethodImpls [] } - - mgbuf.AddTypeDef(ilTypeRef, ilTypeDef, false, true, None) - - let extraBindings = - [ yield! AugmentWithHashCompare.MakeBindingsForCompareAugmentation cenv.g tycon - yield! AugmentWithHashCompare.MakeBindingsForCompareWithComparerAugmentation cenv.g tycon - yield! AugmentWithHashCompare.MakeBindingsForEqualityWithComparerAugmentation cenv.g tycon - yield! AugmentWithHashCompare.MakeBindingsForEqualsAugmentation cenv.g tycon ] +let ComputeStorageForExternalCcu amap g eenv (ccu:CcuThunk) = + if not ccu.IsFSharp then eenv else + let cloc = CompLocForCcu ccu + let eenv = + List.foldBack + (fun smodul acc -> + let cloc = CompLocForSubModuleOrNamespace cloc smodul + let modref = mkNonLocalCcuRootEntityRef ccu smodul + ComputeStorageForNonLocalModuleOrNamespaceRef amap g cloc acc modref smodul) + ccu.RootModulesAndNamespaces + eenv + let eenv = + let eref = ERefNonLocalPreResolved ccu.Contents (mkNonLocalEntityRef ccu [| |]) + (eenv, ccu.Contents.ModuleOrNamespaceType.AllValsAndMembers) ||> Seq.fold (fun acc v -> + AddStorageForVal g (v, lazy (ComputeStorageForNonLocalTopVal amap g cloc eref v)) acc) + eenv + +let rec AddBindingsForLocalModuleType allocVal cloc eenv (mty:ModuleOrNamespaceType) = + let eenv = List.fold (fun eenv submodul -> AddBindingsForLocalModuleType allocVal (CompLocForSubModuleOrNamespace cloc submodul) eenv submodul.ModuleOrNamespaceType) eenv mty.ModuleAndNamespaceDefinitions + let eenv = Seq.fold (fun eenv v -> allocVal cloc v eenv) eenv mty.AllValsAndMembers + eenv - let optimizedExtraBindings = extraBindings |> List.map (fun (TBind(a,b,c)) -> TBind(a,cenv.optimizeDuringCodeGen b,c)) +let AddExternalCcusToIlxGenEnv amap g eenv ccus = List.fold (ComputeStorageForExternalCcu amap g) eenv ccus - extraBindingsToGenerate <- optimizedExtraBindings @ extraBindingsToGenerate +let AddBindingsForTycon allocVal (cloc:CompileLocation) (tycon:Tycon) eenv = + let unrealizedSlots = + if tycon.IsFSharpObjectModelTycon + then tycon.FSharpObjectModelTypeInfo.fsobjmodel_vslots + else [] + (eenv,unrealizedSlots) ||> List.fold (fun eenv vref -> allocVal cloc vref.Deref eenv) - (ilCtorRef,ilMethodRefs,ilTy) +let rec AddBindingsForModuleDefs allocVal (cloc:CompileLocation) eenv mdefs = + List.fold (AddBindingsForModuleDef allocVal cloc) eenv mdefs - let mutable explicitEntryPointInfo : ILTypeRef option = None +and AddBindingsForModuleDef allocVal cloc eenv x = + match x with + | TMDefRec(_isRec,tycons,mbinds,_) -> + (* Virtual don't have 'let' bindings and must be added to the environment *) + let eenv = List.foldBack (AddBindingsForTycon allocVal cloc) tycons eenv + let eenv = List.foldBack (AddBindingsForModule allocVal cloc) mbinds eenv + eenv + | TMDefLet(bind,_) -> + allocVal cloc bind.Var eenv + | TMDefDo _ -> + eenv + | TMAbstract(ModuleOrNamespaceExprWithSig(mtyp,_,_)) -> + AddBindingsForLocalModuleType allocVal cloc eenv mtyp + | TMDefs(mdefs) -> + AddBindingsForModuleDefs allocVal cloc eenv mdefs - /// static init fields on script modules. - let mutable scriptInitFspecs : (ILFieldSpec * range) list = [] - - member mgbuf.AddScriptInitFieldSpec(fieldSpec,range) = - scriptInitFspecs <- (fieldSpec,range) :: scriptInitFspecs +and AddBindingsForModule allocVal cloc x eenv = + match x with + | ModuleOrNamespaceBinding.Binding bind -> + allocVal cloc bind.Var eenv + | ModuleOrNamespaceBinding.Module (mspec, mdef) -> + let cloc = + if mspec.IsNamespace then cloc + else CompLocForFixedModule cloc.clocQualifiedNameOfFile cloc.clocTopImplQualifiedName mspec - /// This initializes the script in #load and fsc command-line order causing their - /// sideeffects to be executed. - member mgbuf.AddInitializeScriptsInOrderToEntryPoint() = - // Get the entry point and initialized any scripts in order. - match explicitEntryPointInfo with - | Some tref -> - let IntializeCompiledScript(fspec,m) = - mgbuf.AddExplicitInitToSpecificMethodDef((fun md -> md.IsEntryPoint), tref, fspec, GenPossibleILSourceMarker cenv m, [], []) - scriptInitFspecs |> List.iter IntializeCompiledScript - | None -> () + AddBindingsForModuleDef allocVal cloc eenv mdef - member mgbuf.GenerateRawDataValueType(cloc,size) = - // Byte array literals require a ValueType of size the required number of bytes. - // With fsi.exe, S.R.Emit TypeBuilder CreateType has restrictions when a ValueType VT is nested inside a type T, and T has a field of type VT. - // To avoid this situation, these ValueTypes are generated under the private implementation rather than in the current cloc. [was bug 1532]. - let cloc = CompLocForPrivateImplementationDetails cloc - rawDataValueTypeGenerator.Apply((cloc,size)) +and AddBindingsForModuleTopVals _g allocVal _cloc eenv vs = + List.foldBack allocVal vs eenv - member mgbuf.GenerateAnonType(genToStringMethod, anonInfo:AnonRecdTypeInfo) = - let isStruct = evalAnonInfoIsStruct anonInfo - let key = anonInfo.Stamp - match anonTypeTable.Table.TryGetValue key with - | true, res -> res - | _ -> - let info = generateAnonType genToStringMethod (isStruct,anonInfo.ILTypeRef,anonInfo.SortedNames) - anonTypeTable.Table.[key] <- info - info - member mgbuf.LookupAnonType(anonInfo:AnonRecdTypeInfo) = - match anonTypeTable.Table.TryGetValue anonInfo.Stamp with - | true, res -> res - | _ -> failwithf "the anonymous record %A has not been generated in the pre-phase of generating this module" anonInfo.ILTypeRef +// Put the partial results for a generated fragment (i.e. a part of a CCU generated by FSI) +// into the stored results for the whole CCU. +// isIncrementalFragment = true --> "typed input" +// isIncrementalFragment = false --> "#load" +let AddIncrementalLocalAssemblyFragmentToIlxGenEnv (amap:ImportMap, isIncrementalFragment, g, ccu, fragName, intraAssemblyInfo, eenv, typedImplFiles) = + let cloc = CompLocForFragment fragName ccu + let allocVal = ComputeAndAddStorageForLocalTopVal (amap, g, intraAssemblyInfo, true, NoShadowLocal) + (eenv, typedImplFiles) ||> List.fold (fun eenv (TImplFile(qname, _, mexpr, _, _, _)) -> + let cloc = { cloc with clocTopImplQualifiedName = qname.Text } + if isIncrementalFragment then + match mexpr with + | ModuleOrNamespaceExprWithSig(_,mdef,_) -> AddBindingsForModuleDef allocVal cloc eenv mdef + (* | ModuleOrNamespaceExprWithSig(mtyp,_,m) -> error(Error("don't expect inner defs to have a constraint",m)) *) + else + AddBindingsForLocalModuleType allocVal cloc eenv mexpr.Type) - member mgbuf.GrabExtraBindingsToGenerate() = - let result = extraBindingsToGenerate - extraBindingsToGenerate <- [] - result +//-------------------------------------------------------------------------- +// Generate debugging marks +//-------------------------------------------------------------------------- - member mgbuf.AddTypeDef(tref:ILTypeRef, tdef, eliminateIfEmpty, addAtEnd, tdefDiscards) = - gtdefs.FindNestedTypeDefsBuilder(tref.Enclosing).AddTypeDef(tdef, eliminateIfEmpty, addAtEnd, tdefDiscards) +let GenILSourceMarker (g: TcGlobals) (m:range) = + ILSourceMarker.Create(document=g.memoize_file m.FileIndex, + line=m.StartLine, + /// NOTE: .NET && VS measure first column as column 1 + column= m.StartColumn+1, + endLine= m.EndLine, + endColumn=m.EndColumn+1) - member mgbuf.GetCurrentFields(tref:ILTypeRef) = - gtdefs.FindNestedTypeDefBuilder(tref).GetCurrentFields() +let GenPossibleILSourceMarker cenv m = + if cenv.opts.generateDebugSymbols then + Some (GenILSourceMarker cenv.g m ) + else + None - member mgbuf.AddReflectedDefinition(vspec : Tast.Val,expr) = - // preserve order by storing index of item - let n = reflectedDefinitions.Count - reflectedDefinitions.Add(vspec, (vspec.CompiledName, n, expr)) - - member mgbuf.ReplaceNameOfReflectedDefinition(vspec, newName) = - match reflectedDefinitions.TryGetValue vspec with - | true, (name, n, expr) when name <> newName -> reflectedDefinitions.[vspec] <- (newName, n, expr) - | _ -> () +//-------------------------------------------------------------------------- +// Helpers for merging property definitions +//-------------------------------------------------------------------------- - member mgbuf.AddMethodDef(tref:ILTypeRef,ilMethodDef) = - gtdefs.FindNestedTypeDefBuilder(tref).AddMethodDef(ilMethodDef) - if ilMethodDef.IsEntryPoint then - explicitEntryPointInfo <- Some(tref) +let HashRangeSorted (ht: IDictionary<_, (int * _)>) = + [ for KeyValue(_k,v) in ht -> v ] |> List.sortBy fst |> List.map snd - member mgbuf.AddExplicitInitToSpecificMethodDef(cond,tref,fspec,sourceOpt,feefee,seqpt) = - // Authoring a .cctor with effects forces the cctor for the 'initialization' module by doing a dummy store & load of a field - // Doing both a store and load keeps FxCop happier because it thinks the field is useful - let instrs = - [ yield! (if condition "NO_ADD_FEEFEE_TO_CCTORS" then [] elif condition "ADD_SEQPT_TO_CCTORS" then seqpt else feefee) // mark start of hidden code - yield mkLdcInt32 0 - yield mkNormalStsfld fspec - yield mkNormalLdsfld fspec - yield AI_pop] - gtdefs.FindNestedTypeDefBuilder(tref).PrependInstructionsToSpecificMethodDef(cond,instrs,sourceOpt) +let MergeOptions m o1 o2 = + match o1,o2 with + | Some x, None | None, Some x -> Some x + | None, None -> None + | Some x, Some _ -> +#if DEBUG + // This warning fires on some code that also triggers this warning: + // warning(Error("The implementation of a specified generic interface required a method implementation not fully supported by F# Interactive. In the unlikely event that the resulting class fails to load then compile the interface type into a statically-compiled DLL and reference it using '#r'",m)) + // The code is OK so we don't print this. + errorR(InternalError("MergeOptions: two values given",m)) +#else + ignore m +#endif + Some x - member mgbuf.AddEventDef(tref,edef) = - gtdefs.FindNestedTypeDefBuilder(tref).AddEventDef(edef) +let MergePropertyPair m (pd: ILPropertyDef) pdef = + {pd with GetMethod=MergeOptions m pd.GetMethod pdef.GetMethod + SetMethod=MergeOptions m pd.SetMethod pdef.SetMethod} - member mgbuf.AddFieldDef(tref,ilFieldDef) = - gtdefs.FindNestedTypeDefBuilder(tref).AddFieldDef(ilFieldDef) +type PropKey = PropKey of string * ILTypes * ILThisConvention - member mgbuf.AddOrMergePropertyDef(tref,pdef,m) = - gtdefs.FindNestedTypeDefBuilder(tref).AddOrMergePropertyDef(pdef,m) +let AddPropertyDefToHash (m:range) (ht:Dictionary) (pdef: ILPropertyDef) = + let nm = PropKey(pdef.Name, pdef.Args, pdef.CallingConv) + if ht.ContainsKey nm then + let idx,pd = ht.[nm] + ht.[nm] <- (idx, MergePropertyPair m pd pdef) + else + ht.[nm] <- (ht.Count, pdef) + - member mgbuf.Close() = - // old implementation adds new element to the head of list so result was accumulated in reversed order - let orderedReflectedDefinitions = - [for (KeyValue(vspec, (name, n, expr))) in reflectedDefinitions -> n, ((name,vspec), expr)] - |> List.sortBy (fst >> (~-)) // invert the result to get 'order-by-descending' behavior (items in list are 0..* so we don't need to worry about int.MinValue) - |> List.map snd - gtdefs.Close(), orderedReflectedDefinitions - member mgbuf.cenv = cenv - member mgbuf.GetExplicitEntryPointInfo() = explicitEntryPointInfo +/// Merge a whole group of properties all at once +let MergePropertyDefs m ilPropertyDefs = + let ht = new Dictionary<_,_>(3,HashIdentity.Structural) + ilPropertyDefs |> List.iter (AddPropertyDefToHash m ht) + HashRangeSorted ht -/// Type generators which walk the types first to make sure all anonymous types are generated -let GenType cenv m tyenv ty = GenTypeAux cenv.amap m tyenv ty -let GenTypes cenv m tyenv tys = GenTypesAux cenv.amap m tyenv tys -let GenUnionCaseSpec cenv m tyenv c tyargs = GenUnionCaseSpecAux cenv.amap m tyenv c tyargs -let GenUnionSpec cenv m tyenv tcref tyargs = GenUnionSpecAux cenv.amap m tyenv tcref tyargs -let GenTypePermitVoid cenv m tyenv ty = GenTypeAuxAux cenv.amap m tyenv VoidOK PtrTypesNotOK ty -let GenTypesPermitVoid cenv m tyenv tys = List.map (GenTypePermitVoid cenv m tyenv) tys -let GenTyApp cenv m tyenv repr tyargs = GenTyAppAux cenv.amap m tyenv repr tyargs -let GenNamedTyApp cenv m tyenv tcref tinst = GenNamedTyAppAux cenv.amap m tyenv PtrTypesNotOK tcref tinst -let GenReturnType cenv m tyenv returnTyOpt = GenReturnTypeAux cenv.amap m tyenv returnTyOpt -let GenParamType cenv m tyenv ty = GenParamTypeAux cenv.amap m tyenv ty -let GenParamTypes cenv m tyenv tys = GenParamTypesAux cenv.amap m tyenv tys -let GenTypeArgs cenv m tyenv tyargs = GenTypeArgsAux cenv.amap m tyenv tyargs -let GenExnType amap m tyenv (ecref:TyconRef) = GenTyAppAux amap m tyenv ecref.CompiledRepresentation [] - //-------------------------------------------------------------------------- -// Representation of term declarations = Environments for compiling expressions. +// Buffers for compiling modules. The entire assembly gets compiled via an AssemblyBuilder //-------------------------------------------------------------------------- - -[] -type ValStorage = - /// Indicates the value is always null - | Null - /// Indicates the value is stored in a static field. - | StaticField of ILFieldSpec * ValRef * (*hasLiteralAttr:*)bool * ILType * string * ILType * ILMethodRef * ILMethodRef * OptionalShadowLocal - /// Indicates the value is "stored" as a property that recomputes it each time it is referenced. Used for simple constants that do not cause initialization triggers - | StaticProperty of ILMethodSpec * OptionalShadowLocal - /// Indicates the value is "stored" as a IL static method (in a "main" class for a F# - /// compilation unit, or as a member) according to its inferred or specified arity. - | Method of ValReprInfo * ValRef * ILMethodSpec * Range.range * ArgReprInfo list * ArgReprInfo - /// Indicates the value is stored at the given position in the closure environment accessed via "ldarg 0" - | Env of ILType * int * ILFieldSpec * NamedLocalIlxClosureInfo ref option - /// Indicates that the value is an argument of a method being generated - | Arg of int - /// Indicates that the value is stored in local of the method being generated. NamedLocalIlxClosureInfo is normally empty. - /// It is non-empty for 'local type functions', see comments on definition of NamedLocalIlxClosureInfo. - | Local of int * NamedLocalIlxClosureInfo ref option +/// Information collected imperatively for each type definition +type TypeDefBuilder(tdef, tdefDiscards) = + let gmethods = new ResizeArray(0) + let gfields = new ResizeArray(0) + let gproperties : Dictionary = new Dictionary<_,_>(3,HashIdentity.Structural) + let gevents = new ResizeArray(0) + let gnested = new TypeDefsBuilder() + + member b.Close() = + { tdef with + Methods = mkILMethods (tdef.Methods.AsList @ ResizeArray.toList gmethods) + Fields = mkILFields (tdef.Fields.AsList @ ResizeArray.toList gfields) + Properties = mkILProperties (tdef.Properties.AsList @ HashRangeSorted gproperties ) + Events = mkILEvents (tdef.Events.AsList @ ResizeArray.toList gevents) + NestedTypes = mkILTypeDefs (tdef.NestedTypes.AsList @ gnested.Close()) } -and OptionalShadowLocal = - | NoShadowLocal - | ShadowLocal of ValStorage -/// The representation of a NamedLocalClosure is based on a cloinfo. However we can't generate a cloinfo until we've -/// decided the representations of other items in the recursive set. Hence we use two phases to decide representations in -/// a recursive set. Yuck. -and NamedLocalIlxClosureInfo = - | NamedLocalIlxClosureInfoGenerator of (IlxGenEnv -> IlxClosureInfo) - | NamedLocalIlxClosureInfoGenerated of IlxClosureInfo - -and ModuleStorage = - { Vals: Lazy> - SubModules: Lazy> } + member b.AddEventDef(edef) = gevents.Add edef + member b.AddFieldDef(ilFieldDef) = gfields.Add ilFieldDef + member b.AddMethodDef(ilMethodDef) = + let discard = + match tdefDiscards with + | Some (mdefDiscard, _) -> mdefDiscard ilMethodDef + | None -> false + if not discard then + gmethods.Add ilMethodDef + member b.NestedTypeDefs = gnested + member b.GetCurrentFields() = gfields |> Seq.readonly -/// BranchCallItems are those where a call to the value can be implemented as -/// a branch. At the moment these are only used for generating branch calls back to -/// the entry label of the method currently being generated. -and BranchCallItem = - | BranchCallClosure of ArityInfo - | BranchCallMethod of - // Argument counts for compiled form of F# method or value - ArityInfo * - // Arg infos for compiled form of F# method or value - (TType * ArgReprInfo) list list * - // Typars for F# method or value - Tast.Typars * - // Typars for F# method or value - int * - // num obj args - int - -and Mark = - | Mark of ILCodeLabel (* places we can branch to *) - member x.CodeLabel = (let (Mark(lab)) = x in lab) + /// Merge Get and Set property nodes, which we generate independently for F# code + /// when we come across their corresponding methods. + member b.AddOrMergePropertyDef(pdef,m) = + let discard = + match tdefDiscards with + | Some (_, pdefDiscard) -> pdefDiscard pdef + | None -> false + if not discard then + AddPropertyDefToHash m gproperties pdef -and IlxGenEnv = - { tyenv: TypeReprEnv - someTypeInThisAssembly: ILType - isFinalFile: bool - /// Where to place the stuff we're currently generating - cloc: CompileLocation - /// Hiding information down the signature chain, used to compute what's public to the assembly - sigToImplRemapInfo: (Remap * SignatureHidingInfo) list - /// All values in scope - valsInScope: ValMap> - /// For optimizing direct tail recursion to a loop - mark says where to branch to. Length is 0 or 1. - /// REVIEW: generalize to arbitrary nested local loops?? - innerVals: (ValRef * (BranchCallItem * Mark)) list - /// Full list of enclosing bound values. First non-compiler-generated element is used to help give nice names for closures and other expressions. - letBoundVars: ValRef list - /// The set of IL local variable indexes currently in use by lexically scoped variables, to allow reuse on different branches. - /// Really an integer set. - liveLocals: IntMap - /// Are we under the scope of a try, catch or finally? If so we can't tailcall. SEH = structured exception handling - withinSEH: bool } + member b.PrependInstructionsToSpecificMethodDef(cond,instrs,tag) = + match ResizeArray.tryFindIndex cond gmethods with + | Some idx -> gmethods.[idx] <- prependInstrsToMethod instrs gmethods.[idx] + | None -> gmethods.Add(mkILClassCtor (mkMethodBody (false,[],1,nonBranchingInstrsToCode instrs,tag))) + + +and TypeDefsBuilder() = + let tdefs : Internal.Utilities.Collections.HashMultiMap = HashMultiMap(0, HashIdentity.Structural) + let mutable countDown = System.Int32.MaxValue + + member b.Close() = + //The order we emit type definitions is not deterministic since it is using the reverse of a range from a hash table. We should use an approximation of source order. + // Ideally it shouldn't matter which order we use. + // However, for some tests FSI generated code appears sensitive to the order, especially for nested types. + + [ for (b, eliminateIfEmpty) in HashRangeSorted tdefs do + let tdef = b.Close() + // Skip the type if it is empty + if not eliminateIfEmpty + || not tdef.NestedTypes.AsList.IsEmpty + || not tdef.Fields.AsList.IsEmpty + || not tdef.Events.AsList.IsEmpty + || not tdef.Properties.AsList.IsEmpty + || not tdef.Methods.AsList.IsEmpty then + yield tdef ] -let ReplaceTyenv tyenv (eenv: IlxGenEnv) = {eenv with tyenv = tyenv } -let EnvForTypars tps eenv = {eenv with tyenv = TypeReprEnv.ForTypars tps } -let AddTyparsToEnv typars (eenv: IlxGenEnv) = {eenv with tyenv = eenv.tyenv.Add typars} + member b.FindTypeDefBuilder(nm) = + try tdefs.[nm] |> snd |> fst + with :? KeyNotFoundException -> failwith ("FindTypeDefBuilder: " + nm + " not found") -let AddSignatureRemapInfo _msg (rpi, mhi) eenv = - { eenv with sigToImplRemapInfo = (mkRepackageRemapping rpi,mhi) :: eenv.sigToImplRemapInfo } - -//-------------------------------------------------------------------------- -// Print eenv -//-------------------------------------------------------------------------- + member b.FindNestedTypeDefsBuilder(path) = + List.fold (fun (acc:TypeDefsBuilder) x -> acc.FindTypeDefBuilder(x).NestedTypeDefs) b path -let OutputStorage (pps: TextWriter) s = - match s with - | StaticField _ -> pps.Write "(top)" - | StaticProperty _ -> pps.Write "(top)" - | Method _ -> pps.Write "(top)" - | Local _ -> pps.Write "(local)" - | Arg _ -> pps.Write "(arg)" - | Env _ -> pps.Write "(env)" - | Null -> pps.Write "(null)" + member b.FindNestedTypeDefBuilder(tref:ILTypeRef) = + b.FindNestedTypeDefsBuilder(tref.Enclosing).FindTypeDefBuilder(tref.Name) -//-------------------------------------------------------------------------- -// Augment eenv with values -//-------------------------------------------------------------------------- + member b.AddTypeDef(tdef:ILTypeDef, eliminateIfEmpty, addAtEnd, tdefDiscards) = + let idx = if addAtEnd then (countDown <- countDown - 1; countDown) else tdefs.Count + tdefs.Add (tdef.Name, (idx, (new TypeDefBuilder(tdef, tdefDiscards), eliminateIfEmpty))) -let AddStorageForVal (g: TcGlobals) (v,s) eenv = - let eenv = { eenv with valsInScope = eenv.valsInScope.Add v s } - // If we're compiling fslib then also bind the value as a non-local path to - // allow us to resolve the compiler-non-local-references that arise from env.fs - // - // Do this by generating a fake "looking from the outside in" non-local value reference for - // v, dereferencing it to find the corresponding signature Val, and adding an entry for the signature val. - // - // A similar code path exists in ilxgen.fs for the tables of "optimization data" for values - if g.compilingFslib then - // Passing an empty remap is sufficient for FSharp.Core.dll because it turns out the remapped type signature can - // still be resolved. - match tryRescopeVal g.fslibCcu Remap.Empty v with - | None -> eenv - | Some vref -> - match vref.TryDeref with - | VNone -> - //let msg = sprintf "could not dereference external value reference to something in FSharp.Core.dll during code generation, v.MangledName = '%s', v.Range = %s" v.MangledName (stringOfRange v.Range) - //System.Diagnostics.Debug.Assert(false, msg) - eenv - | VSome gv -> - { eenv with valsInScope = eenv.valsInScope.Add gv s } - else - eenv +type AnonTypeGenerationTable() = + let dict = Dictionary(HashIdentity.Structural) + member __.Table = dict -let AddStorageForLocalVals g vals eenv = List.foldBack (fun (v,s) acc -> AddStorageForVal g (v,notlazy s) acc) vals eenv +/// Assembly generation buffers +type AssemblyBuilder(cenv:cenv, anonTypeTable: AnonTypeGenerationTable) as mgbuf = + // The Abstract IL table of types + let gtdefs= new TypeDefsBuilder() + // The definitions of top level values, as quotations. + let mutable reflectedDefinitions : Dictionary = Dictionary(HashIdentity.Reference) + let mutable extraBindingsToGenerate = [] -//-------------------------------------------------------------------------- -// Lookup eenv -//-------------------------------------------------------------------------- - -open Microsoft.FSharp.Compiler.AbstractIL -open Microsoft.FSharp.Compiler.AbstractIL.Internal -open Microsoft.FSharp.Compiler.AbstractIL.Internal.Library + // A memoization table for generating value types for big constant arrays + let rawDataValueTypeGenerator = + new MemoizationTable<(CompileLocation * int) , ILTypeSpec> + ((fun (cloc,size) -> + let name = CompilerGeneratedName ("T" + string(newUnique()) + "_" + string size + "Bytes") // Type names ending ...$T_37Bytes + let vtdef = mkRawDataValueTypeDef cenv.g.iltyp_ValueType (name,size,0us) + let vtref = NestedTypeRefForCompLoc cloc vtdef.Name + let vtspec = mkILTySpec(vtref,[]) + let vtdef = vtdef.WithAccess(ComputeTypeAccess vtref true) + mgbuf.AddTypeDef(vtref, vtdef, false, true, None) + vtspec), + keyComparer=HashIdentity.Structural) -let StorageForVal m v eenv = - let v = - try eenv.valsInScope.[v] - with :? KeyNotFoundException -> - assert false - errorR(Error(FSComp.SR.ilUndefinedValue(showL(vspecAtBindL v)),m)) - notlazy (Arg 668(* random value for post-hoc diagnostic analysis on generated tree *) ) - v.Force() + let generateAnonType genToStringMethod (isStruct, ilTypeRef, nms) = + + let flds = [ for (i,nm) in Array.indexed nms -> (nm, nm + "@", ILType.TypeVar (uint16 i)) ] + // Note that this alternative below would give the same names as C#, but the generated + // comparison/equality doesn't know about these names. + //let flds = [ for (i,nm) in Array.indexed nms -> (nm, "<" + nm + ">" + "i__Field", ILType.TypeVar (uint16 i)) ] -let StorageForValRef m (v: ValRef) eenv = StorageForVal m v.Deref eenv + let ilGenericParams = + [ for nm in nms -> + { Name = sprintf "<%s>j__TPar" nm + Constraints = [] + Variance=NonVariant + CustomAttrs = emptyILCustomAttrs + HasReferenceTypeConstraint=false + HasNotNullableValueTypeConstraint=false + HasDefaultConstructorConstraint= false } ] -//-------------------------------------------------------------------------- -// Imported modules and the environment -// -// How a top level value is represented depends on its type. If it's a -// function or is polymorphic, then it gets represented as a -// method (possibly and instance method). Otherwise it gets represented as a -// static field. -//-------------------------------------------------------------------------- + let ilTy = mkILFormalNamedTy (if isStruct then ILBoxity.AsValue else ILBoxity.AsObject) ilTypeRef ilGenericParams -let IsValRefIsDllImport g (vref:ValRef) = - vref.Attribs |> HasFSharpAttributeOpt g g.attrib_DllImportAttribute + // Generate the IL fields + let ilFieldDefs = + mkILFields + [ for (_, fldName, fldTy) in flds -> + let fdef = mkILInstanceField (fldName, fldTy, None, ILMemberAccess.Private) + { fdef with CustomAttrs = mkILCustomAttrs [ cenv.g.DebuggerBrowsableNeverAttribute ] } ] + + // Generate property definitions for the fields compiled as properties + let ilProperties = + mkILProperties + [ for (i,(propName, _fldName, fldTy)) in List.indexed flds -> + { Name = propName + Attributes = PropertyAttributes.None + SetMethod = None + GetMethod = Some(mkILMethRef(ilTypeRef,ILCallingConv.Instance,"get_" + propName,0,[],fldTy )) + CallingConv = ILCallingConv.Instance.ThisConv + Type = fldTy + Init = None + Args = [] + CustomAttrs = mkILCustomAttrs [ mkCompilationMappingAttrWithSeqNum cenv.g (int SourceConstructFlags.Field) i ] } ] + + let ilMethods = + [ for (propName, fldName, fldTy) in flds -> + mkLdfldMethodDef ("get_" + propName,ILMemberAccess.Public,false,ilTy,fldName,fldTy) + yield! genToStringMethod ilTy ] -let GetMethodSpecForMemberVal amap g (memberInfo:ValMemberInfo) (vref:ValRef) = - let m = vref.Range - let tps,curriedArgInfos,returnTy,retInfo = - assert(vref.ValReprInfo.IsSome) - GetTopValTypeInCompiledForm g (Option.get vref.ValReprInfo) vref.Type m - let tyenvUnderTypars = TypeReprEnv.ForTypars tps - let flatArgInfos = List.concat curriedArgInfos - let isCtor = (memberInfo.MemberFlags.MemberKind = MemberKind.Constructor) - let cctor = (memberInfo.MemberFlags.MemberKind = MemberKind.ClassConstructor) - let parentTcref = vref.TopValDeclaringEntity - let parentTypars = parentTcref.TyparsNoRange - let numParentTypars = parentTypars.Length - if tps.Length < numParentTypars then error(InternalError("CodeGen check: type checking did not ensure that this method is sufficiently generic", m)) - let ctps,mtps = List.chop numParentTypars tps - let isCompiledAsInstance = ValRefIsCompiledAsInstanceMember g vref + let ilBaseTy = (if isStruct then cenv.g.iltyp_ValueType else cenv.g.ilg.typ_Object) + + let ilCtorDef = mkILSimpleStorageCtorWithParamNames(None, (if isStruct then None else Some ilBaseTy.TypeSpec), ilTy, [], flds, ILMemberAccess.Public) + let ilCtorRef = mkRefToILMethod(ilTypeRef, ilCtorDef) + let ilMethodRefs = [| for mdef in ilMethods -> mkRefToILMethod(ilTypeRef, mdef) |] - let ilActualRetTy = - let ilRetTy = GenReturnTypeAux amap m tyenvUnderTypars returnTy - if isCtor || cctor then ILType.Void else ilRetTy + if ilTypeRef.Scope.IsLocalRef then - let ilTy = GenTypeAux amap m tyenvUnderTypars (mkAppTy parentTcref (List.map mkTyparTy ctps)) + // Create a tycon that looks exactly like a record definition, to help drive the generation of equality/comparison code + let m = range0 + let tps = + [ for nm in nms -> + let stp = Typar(mkSynId m ("T"+nm),TyparStaticReq.NoStaticReq,true) + NewTypar (TyparKind.Type, TyparRigidity.WarnIfNotRigid,stp,false,TyparDynamicReq.Yes,[],true,true) ] - if isCompiledAsInstance || isCtor then - // Find the 'this' argument type if any - let thisTy,flatArgInfos = - if isCtor then (GetFSharpViewOfReturnType g returnTy),flatArgInfos - else - match flatArgInfos with - | [] -> error(InternalError("This instance method '" + vref.LogicalName + "' has no arguments", m)) - | (h,_):: t -> h,t + let tycon = + let lmtyp = MaybeLazy.Strict (NewEmptyModuleOrNamespaceType ModuleOrType) + let cpath = CompPath(ilTypeRef.Scope,[]) + NewTycon(Some cpath, ilTypeRef.Name, m, taccessPublic, taccessPublic, TyparKind.Type, LazyWithContext.NotLazy tps, XmlDoc.Empty, false, false, false, lmtyp) - let thisTy = if isByrefTy g thisTy then destByrefTy g thisTy else thisTy - let thisArgTys = argsOfAppTy g thisTy - if ctps.Length <> thisArgTys.Length then - warning(InternalError(sprintf "CodeGen check: type checking did not quantify the correct number of type variables for this method, #parentTypars = %d, #ctps = %d, #mtps = %d, #thisArgTys = %d" numParentTypars ctps.Length mtps.Length thisArgTys.Length,m)) - else - List.iter2 - (fun gtp ty2 -> - if not (typeEquiv g (mkTyparTy gtp) ty2) then - warning(InternalError("CodeGen check: type checking did not quantify the correct type variables for this method: generalization list contained " + gtp.Name + "#" + string gtp.Stamp + " and list from 'this' pointer contained " + (showL(typeL ty2)), m))) - ctps - thisArgTys - let methodArgTys,paramInfos = List.unzip flatArgInfos - let ilMethodArgTys = GenParamTypesAux amap m tyenvUnderTypars methodArgTys - let ilMethodInst = GenTypeArgsAux amap m tyenvUnderTypars (List.map mkTyparTy mtps) - let mspec = mkILInstanceMethSpecInTy (ilTy,vref.CompiledName,ilMethodArgTys,ilActualRetTy,ilMethodInst) - - mspec,ctps,mtps,paramInfos,retInfo - else - let methodArgTys,paramInfos = List.unzip flatArgInfos - let ilMethodArgTys = GenParamTypesAux amap m tyenvUnderTypars methodArgTys - let ilMethodInst = GenTypeArgsAux amap m tyenvUnderTypars (List.map mkTyparTy mtps) - let mspec = mkILStaticMethSpecInTy (ilTy,vref.CompiledName,ilMethodArgTys,ilActualRetTy,ilMethodInst) - - mspec,ctps,mtps,paramInfos,retInfo + if isStruct then + tycon.SetIsStructRecordOrUnion(true) -// Generate the ILFieldSpec for a top-level value + tycon.entity_tycon_repr <- + TRecdRepr (MakeRecdFieldsTable + [ for (tp, (propName, _fldName, _fldTy)) in (List.zip tps flds) -> + NewRecdField false None (mkSynId m propName) false (mkTyparTy tp) true false [] [] XmlDoc.Empty taccessPublic false ]) -let ComputeFieldSpecForVal(optIntraAssemblyInfo:IlxGenIntraAssemblyInfo option, isInteractive, g, ilTyForProperty, vspec:Val, nm, m, cloc, ilTy, ilGetterMethRef) = - assert vspec.IsCompiledAsTopLevel - let generate() = GenFieldSpecForStaticField (isInteractive, g, ilTyForProperty, vspec, nm, m, cloc, ilTy) - match optIntraAssemblyInfo with - | None -> generate() - | Some intraAssemblyInfo -> - if vspec.IsMutable && vspec.IsCompiledAsTopLevel && isStructTy g vspec.Type then - let ok, res = intraAssemblyInfo.StaticFieldInfo.TryGetValue ilGetterMethRef - if ok then - res - else - let res = generate() - intraAssemblyInfo.StaticFieldInfo.[ilGetterMethRef] <- res - res - else - generate() + let tcref = mkLocalTyconRef tycon + let _,typ = generalizeTyconRef tcref + let tcaug = tcref.TypeContents + + tcaug.tcaug_interfaces <- + [ (cenv.g.mk_IStructuralComparable_ty,true,m) + (cenv.g.mk_IComparable_ty,true,m) + (mkAppTy cenv.g.system_GenericIComparable_tcref [typ],true,m) + (cenv.g.mk_IStructuralEquatable_ty,true,m) + (mkAppTy cenv.g.system_GenericIEquatable_tcref [typ],true,m) ] -let IsValCompiledAsMethod g (v:Val) = - match v.ValReprInfo with - | None -> false - | Some topValInfo -> - not (isUnitTy g v.Type && not v.IsMemberOrModuleBinding && not v.IsMutable) && - not v.IsCompiledAsStaticPropertyWithoutField && - match GetTopValTypeInFSharpForm g topValInfo v.Type v.Range with - | [],[],_,_ when not v.IsMember -> false - | _ -> true + let vspec1,vspec2 = AugmentWithHashCompare.MakeValsForEqualsAugmentation cenv.g tcref + let evspec1,evspec2,evspec3 = AugmentWithHashCompare.MakeValsForEqualityWithComparerAugmentation cenv.g tcref + let cvspec1,cvspec2 = AugmentWithHashCompare.MakeValsForCompareAugmentation cenv.g tcref + let cvspec3 = AugmentWithHashCompare.MakeValsForCompareWithComparerAugmentation cenv.g tcref -// This called via 2 routes. -// (a) ComputeAndAddStorageForLocalTopVal -// (b) ComputeStorageForNonLocalTopVal -// -/// This function decides the storage for the val. -/// The decision is based on arityInfo. -let ComputeStorageForTopVal (amap, g, optIntraAssemblyInfo:IlxGenIntraAssemblyInfo option, isInteractive, optShadowLocal, vref:ValRef, cloc) = + tcaug.SetCompare (mkLocalValRef cvspec1, mkLocalValRef cvspec2) + tcaug.SetCompareWith (mkLocalValRef cvspec3) + tcaug.SetEquals (mkLocalValRef vspec1, mkLocalValRef vspec2) + tcaug.SetHashAndEqualsWith (mkLocalValRef evspec1, mkLocalValRef evspec2, mkLocalValRef evspec3) - if isUnitTy g vref.Type && not vref.IsMemberOrModuleBinding && not vref.IsMutable then - Null - else - let topValInfo = - match vref.ValReprInfo with - | None -> error(InternalError("ComputeStorageForTopVal: no arity found for " + showL(valRefL vref),vref.Range)) - | Some a -> a - - let m = vref.Range - let nm = vref.CompiledName + // Build the ILTypeDef. We don't rely on the normal record generation process because we want very specific field names - if vref.Deref.IsCompiledAsStaticPropertyWithoutField then - let nm = "get_"+nm - let tyenvUnderTypars = TypeReprEnv.ForTypars [] - let ilRetTy = GenTypeAux amap m tyenvUnderTypars vref.Type - let typ = mkILTyForCompLoc cloc - let mspec = mkILStaticMethSpecInTy (typ, nm, [], ilRetTy, []) - - StaticProperty (mspec, optShadowLocal) - else + let ilTypeDefAttribs = mkILCustomAttrs [ cenv.g.CompilerGeneratedAttribute; mkCompilationMappingAttr cenv.g (int SourceConstructFlags.RecordType) ] - // Determine when a static field is required. - // - // REVIEW: This call to GetTopValTypeInFSharpForm is only needed to determine if this is a (type) function or a value - // We should just look at the arity - match GetTopValTypeInFSharpForm g topValInfo vref.Type vref.Range with - | [],[], returnTy,_ when not vref.IsMember -> - // Mutable and literal static fields must have stable names and live in the "public" location - // See notes on GenFieldSpecForStaticField above. - let vspec = vref.Deref - let ilTy = GenTypeAux amap m TypeReprEnv.Empty returnTy (* TypeReprEnv.Empty ok: not a field in a generic class *) - let ilTyForProperty = mkILTyForCompLoc cloc - let attribs = vspec.Attribs - let hasLiteralAttr = HasFSharpAttribute g g.attrib_LiteralAttribute attribs + let ilInterfaceTys = [ for (ity,_,_) in tcaug.tcaug_interfaces -> GenType cenv.amap m (TypeReprEnv.ForTypars tps) ity ] - let ilTypeRefForProperty = ilTyForProperty.TypeRef - let ilGetterMethRef = mkILMethRef (ilTypeRefForProperty, ILCallingConv.Static, "get_"+nm, 0, [], ilTy) - let ilSetterMethRef = mkILMethRef (ilTypeRefForProperty, ILCallingConv.Static, "set_"+nm, 0, [ilTy], ILType.Void) + let ilTypeDef = + mkILGenericClass (ilTypeRef.Name, ILTypeDefAccess.Public, ilGenericParams, ilBaseTy, ilInterfaceTys, + mkILMethods (ilCtorDef :: ilMethods), ilFieldDefs, emptyILTypeDefs, + ilProperties, mkILEvents [], ilTypeDefAttribs, + ILTypeInit.BeforeField) + - let fspec = ComputeFieldSpecForVal(optIntraAssemblyInfo, isInteractive, g, ilTyForProperty, vspec, nm, m, cloc, ilTy, ilGetterMethRef) + let ilTypeDef = ilTypeDef.WithSealed(true).WithSerializable(true) - StaticField (fspec, vref, hasLiteralAttr, ilTyForProperty, nm, ilTy, ilGetterMethRef, ilSetterMethRef, optShadowLocal) - - | _ -> - match vref.MemberInfo with - | Some memberInfo when not vref.IsExtensionMember -> - let mspec,_,_,paramInfos,retInfo = GetMethodSpecForMemberVal amap g memberInfo vref - Method (topValInfo, vref, mspec, m, paramInfos, retInfo) - | _ -> - let (tps, curriedArgInfos, returnTy, retInfo) = GetTopValTypeInCompiledForm g topValInfo vref.Type m - let tyenvUnderTypars = TypeReprEnv.ForTypars tps - let (methodArgTys,paramInfos) = curriedArgInfos |> List.concat |> List.unzip - let ilMethodArgTys = GenParamTypesAux amap m tyenvUnderTypars methodArgTys - let ilRetTy = GenReturnTypeAux amap m tyenvUnderTypars returnTy - let ilLocTy = mkILTyForCompLoc cloc - let ilMethodInst = GenTypeArgsAux amap m tyenvUnderTypars (List.map mkTyparTy tps) - let mspec = mkILStaticMethSpecInTy (ilLocTy, nm, ilMethodArgTys, ilRetTy, ilMethodInst) - Method (topValInfo, vref, mspec, m, paramInfos, retInfo) + let ilTypeDef = { ilTypeDef with MethodImpls=mkILMethodImpls [] } + + mgbuf.AddTypeDef(ilTypeRef, ilTypeDef, false, true, None) + + let extraBindings = + [ yield! AugmentWithHashCompare.MakeBindingsForCompareAugmentation cenv.g tycon + yield! AugmentWithHashCompare.MakeBindingsForCompareWithComparerAugmentation cenv.g tycon + yield! AugmentWithHashCompare.MakeBindingsForEqualityWithComparerAugmentation cenv.g tycon + yield! AugmentWithHashCompare.MakeBindingsForEqualsAugmentation cenv.g tycon ] -let ComputeAndAddStorageForLocalTopVal (amap, g, intraAssemblyFieldTable, isInteractive, optShadowLocal) cloc (v:Val) eenv = - let storage = ComputeStorageForTopVal (amap, g, Some intraAssemblyFieldTable, isInteractive, optShadowLocal, mkLocalValRef v, cloc) - AddStorageForVal g (v,notlazy storage) eenv + let optimizedExtraBindings = extraBindings |> List.map (fun (TBind(a,b,c)) -> TBind(a,cenv.optimizeDuringCodeGen b,c)) -let ComputeStorageForNonLocalTopVal amap g cloc modref (v:Val) = - match v.ValReprInfo with - | None -> error(InternalError("ComputeStorageForNonLocalTopVal, expected an arity for " + v.LogicalName,v.Range)) - | Some _ -> ComputeStorageForTopVal (amap, g, None, false, NoShadowLocal, mkNestedValRef modref v, cloc) + extraBindingsToGenerate <- optimizedExtraBindings @ extraBindingsToGenerate -let rec ComputeStorageForNonLocalModuleOrNamespaceRef amap g cloc acc (modref:ModuleOrNamespaceRef) (modul:ModuleOrNamespace) = - let acc = - (acc, modul.ModuleOrNamespaceType.ModuleAndNamespaceDefinitions) ||> List.fold (fun acc smodul -> - ComputeStorageForNonLocalModuleOrNamespaceRef amap g (CompLocForSubModuleOrNamespace cloc smodul) acc (modref.NestedTyconRef smodul) smodul) + (ilCtorRef,ilMethodRefs,ilTy) - let acc = - (acc, modul.ModuleOrNamespaceType.AllValsAndMembers) ||> Seq.fold (fun acc v -> - AddStorageForVal g (v, lazy (ComputeStorageForNonLocalTopVal amap g cloc modref v)) acc) - acc + let mutable explicitEntryPointInfo : ILTypeRef option = None -let ComputeStorageForExternalCcu amap g eenv (ccu:CcuThunk) = - if not ccu.IsFSharp then eenv else - let cloc = CompLocForCcu ccu - let eenv = - List.foldBack - (fun smodul acc -> - let cloc = CompLocForSubModuleOrNamespace cloc smodul - let modref = mkNonLocalCcuRootEntityRef ccu smodul - ComputeStorageForNonLocalModuleOrNamespaceRef amap g cloc acc modref smodul) - ccu.RootModulesAndNamespaces - eenv - let eenv = - let eref = ERefNonLocalPreResolved ccu.Contents (mkNonLocalEntityRef ccu [| |]) - (eenv, ccu.Contents.ModuleOrNamespaceType.AllValsAndMembers) ||> Seq.fold (fun acc v -> - AddStorageForVal g (v, lazy (ComputeStorageForNonLocalTopVal amap g cloc eref v)) acc) - eenv + /// static init fields on script modules. + let mutable scriptInitFspecs : (ILFieldSpec * range) list = [] -let rec AddBindingsForLocalModuleType allocVal cloc eenv (mty:ModuleOrNamespaceType) = - let eenv = List.fold (fun eenv submodul -> AddBindingsForLocalModuleType allocVal (CompLocForSubModuleOrNamespace cloc submodul) eenv submodul.ModuleOrNamespaceType) eenv mty.ModuleAndNamespaceDefinitions - let eenv = Seq.fold (fun eenv v -> allocVal cloc v eenv) eenv mty.AllValsAndMembers - eenv + member mgbuf.AddScriptInitFieldSpec(fieldSpec,range) = + scriptInitFspecs <- (fieldSpec,range) :: scriptInitFspecs + + /// This initializes the script in #load and fsc command-line order causing their + /// sideeffects to be executed. + member mgbuf.AddInitializeScriptsInOrderToEntryPoint() = + // Get the entry point and initialized any scripts in order. + match explicitEntryPointInfo with + | Some tref -> + let IntializeCompiledScript(fspec,m) = + mgbuf.AddExplicitInitToSpecificMethodDef((fun md -> md.IsEntryPoint), tref, fspec, GenPossibleILSourceMarker cenv m, [], []) + scriptInitFspecs |> List.iter IntializeCompiledScript + | None -> () -let AddExternalCcusToIlxGenEnv amap g eenv ccus = List.fold (ComputeStorageForExternalCcu amap g) eenv ccus + member mgbuf.GenerateRawDataValueType(cloc,size) = + // Byte array literals require a ValueType of size the required number of bytes. + // With fsi.exe, S.R.Emit TypeBuilder CreateType has restrictions when a ValueType VT is nested inside a type T, and T has a field of type VT. + // To avoid this situation, these ValueTypes are generated under the private implementation rather than in the current cloc. [was bug 1532]. + let cloc = CompLocForPrivateImplementationDetails cloc + rawDataValueTypeGenerator.Apply((cloc,size)) -let AddBindingsForTycon allocVal (cloc:CompileLocation) (tycon:Tycon) eenv = - let unrealizedSlots = - if tycon.IsFSharpObjectModelTycon - then tycon.FSharpObjectModelTypeInfo.fsobjmodel_vslots - else [] - (eenv,unrealizedSlots) ||> List.fold (fun eenv vref -> allocVal cloc vref.Deref eenv) + member mgbuf.GenerateAnonType(genToStringMethod, anonInfo:AnonRecdTypeInfo) = + let isStruct = evalAnonInfoIsStruct anonInfo + let key = anonInfo.Stamp + match anonTypeTable.Table.TryGetValue key with + | true, res -> res + | _ -> + let info = generateAnonType genToStringMethod (isStruct,anonInfo.ILTypeRef,anonInfo.SortedNames) + anonTypeTable.Table.[key] <- info + info -let rec AddBindingsForModuleDefs allocVal (cloc:CompileLocation) eenv mdefs = - List.fold (AddBindingsForModuleDef allocVal cloc) eenv mdefs + member mgbuf.LookupAnonType(anonInfo:AnonRecdTypeInfo) = + match anonTypeTable.Table.TryGetValue anonInfo.Stamp with + | true, res -> res + | _ -> failwithf "the anonymous record %A has not been generated in the pre-phase of generating this module" anonInfo.ILTypeRef -and AddBindingsForModuleDef allocVal cloc eenv x = - match x with - | TMDefRec(_isRec,tycons,mbinds,_) -> - (* Virtual don't have 'let' bindings and must be added to the environment *) - let eenv = List.foldBack (AddBindingsForTycon allocVal cloc) tycons eenv - let eenv = List.foldBack (AddBindingsForModule allocVal cloc) mbinds eenv - eenv - | TMDefLet(bind,_) -> - allocVal cloc bind.Var eenv - | TMDefDo _ -> - eenv - | TMAbstract(ModuleOrNamespaceExprWithSig(mtyp,_,_)) -> - AddBindingsForLocalModuleType allocVal cloc eenv mtyp - | TMDefs(mdefs) -> - AddBindingsForModuleDefs allocVal cloc eenv mdefs + member mgbuf.GrabExtraBindingsToGenerate() = + let result = extraBindingsToGenerate + extraBindingsToGenerate <- [] + result -and AddBindingsForModule allocVal cloc x eenv = - match x with - | ModuleOrNamespaceBinding.Binding bind -> - allocVal cloc bind.Var eenv - | ModuleOrNamespaceBinding.Module (mspec, mdef) -> - let cloc = - if mspec.IsNamespace then cloc - else CompLocForFixedModule cloc.clocQualifiedNameOfFile cloc.clocTopImplQualifiedName mspec - - AddBindingsForModuleDef allocVal cloc eenv mdef + member mgbuf.AddTypeDef(tref:ILTypeRef, tdef, eliminateIfEmpty, addAtEnd, tdefDiscards) = + gtdefs.FindNestedTypeDefsBuilder(tref.Enclosing).AddTypeDef(tdef, eliminateIfEmpty, addAtEnd, tdefDiscards) -and AddBindingsForModuleTopVals _g allocVal _cloc eenv vs = - List.foldBack allocVal vs eenv + member mgbuf.GetCurrentFields(tref:ILTypeRef) = + gtdefs.FindNestedTypeDefBuilder(tref).GetCurrentFields() + member mgbuf.AddReflectedDefinition(vspec : Tast.Val,expr) = + // preserve order by storing index of item + let n = reflectedDefinitions.Count + reflectedDefinitions.Add(vspec, (vspec.CompiledName, n, expr)) + + member mgbuf.ReplaceNameOfReflectedDefinition(vspec, newName) = + match reflectedDefinitions.TryGetValue vspec with + | true, (name, n, expr) when name <> newName -> reflectedDefinitions.[vspec] <- (newName, n, expr) + | _ -> () -// Put the partial results for a generated fragment (i.e. a part of a CCU generated by FSI) -// into the stored results for the whole CCU. -// isIncrementalFragment = true --> "typed input" -// isIncrementalFragment = false --> "#load" -let AddIncrementalLocalAssemblyFragmentToIlxGenEnv (amap:ImportMap, isIncrementalFragment, g, ccu, fragName, intraAssemblyInfo, eenv, typedImplFiles) = - let cloc = CompLocForFragment fragName ccu - let allocVal = ComputeAndAddStorageForLocalTopVal (amap, g, intraAssemblyInfo, true, NoShadowLocal) - (eenv, typedImplFiles) ||> List.fold (fun eenv (TImplFile(qname, _, mexpr, _, _, _)) -> - let cloc = { cloc with clocTopImplQualifiedName = qname.Text } - if isIncrementalFragment then - match mexpr with - | ModuleOrNamespaceExprWithSig(_,mdef,_) -> AddBindingsForModuleDef allocVal cloc eenv mdef - (* | ModuleOrNamespaceExprWithSig(mtyp,_,m) -> error(Error("don't expect inner defs to have a constraint",m)) *) - else - AddBindingsForLocalModuleType allocVal cloc eenv mexpr.Type) + member mgbuf.AddMethodDef(tref:ILTypeRef,ilMethodDef) = + gtdefs.FindNestedTypeDefBuilder(tref).AddMethodDef(ilMethodDef) + if ilMethodDef.IsEntryPoint then + explicitEntryPointInfo <- Some(tref) + member mgbuf.AddExplicitInitToSpecificMethodDef(cond,tref,fspec,sourceOpt,feefee,seqpt) = + // Authoring a .cctor with effects forces the cctor for the 'initialization' module by doing a dummy store & load of a field + // Doing both a store and load keeps FxCop happier because it thinks the field is useful + let instrs = + [ yield! (if condition "NO_ADD_FEEFEE_TO_CCTORS" then [] elif condition "ADD_SEQPT_TO_CCTORS" then seqpt else feefee) // mark start of hidden code + yield mkLdcInt32 0 + yield mkNormalStsfld fspec + yield mkNormalLdsfld fspec + yield AI_pop] + gtdefs.FindNestedTypeDefBuilder(tref).PrependInstructionsToSpecificMethodDef(cond,instrs,sourceOpt) + + member mgbuf.AddEventDef(tref,edef) = + gtdefs.FindNestedTypeDefBuilder(tref).AddEventDef(edef) + + member mgbuf.AddFieldDef(tref,ilFieldDef) = + gtdefs.FindNestedTypeDefBuilder(tref).AddFieldDef(ilFieldDef) + + member mgbuf.AddOrMergePropertyDef(tref,pdef,m) = + gtdefs.FindNestedTypeDefBuilder(tref).AddOrMergePropertyDef(pdef,m) + + member mgbuf.Close() = + // old implementation adds new element to the head of list so result was accumulated in reversed order + let orderedReflectedDefinitions = + [for (KeyValue(vspec, (name, n, expr))) in reflectedDefinitions -> n, ((name,vspec), expr)] + |> List.sortBy (fst >> (~-)) // invert the result to get 'order-by-descending' behavior (items in list are 0..* so we don't need to worry about int.MinValue) + |> List.map snd + gtdefs.Close(), orderedReflectedDefinitions + member mgbuf.cenv = cenv + member mgbuf.GetExplicitEntryPointInfo() = explicitEntryPointInfo + +let GenTypePermitVoid cenv m tyenv ty = GenTypeAux cenv.amap m tyenv VoidOK PtrTypesNotOK ty +let GenTypesPermitVoid cenv m tyenv tys = List.map (GenTypePermitVoid cenv m tyenv) tys +let GenExnType amap m tyenv (ecref:TyconRef) = GenTyApp amap m tyenv ecref.CompiledRepresentation [] + /// Record the types of the things on the evaluation stack. /// Used for the few times we have to flush the IL evaluation stack and to compute maxStack. @@ -2202,7 +2193,7 @@ and GenSequel cenv cloc cgbuf sequel = //-------------------------------------------------------------------------- and GenConstant cenv cgbuf eenv (c,m,ty) sequel = - let ilTy = GenType cenv m eenv.tyenv ty + let ilTy = GenType cenv.amap m eenv.tyenv ty // Check if we need to generate the value at all match sequelAfterDiscard sequel with | None -> @@ -2244,7 +2235,7 @@ and GenConstant cenv cgbuf eenv (c,m,ty) sequel = and GenUnitTy cenv eenv m = match cenv.ilUnitTy with | None -> - let res = GenType cenv m eenv.tyenv cenv.g.unit_ty + let res = GenType cenv.amap m eenv.tyenv cenv.g.unit_ty cenv.ilUnitTy <- Some res res | Some res -> res @@ -2266,7 +2257,7 @@ and GenAllocTuple cenv cgbuf eenv (tupInfo, args,argtys,m) sequel = let tupInfo = evalTupInfoIsStruct tupInfo let tcref, tys, args, newm = mkCompiledTuple cenv.g tupInfo (argtys,args,m) - let typ = GenNamedTyApp cenv newm eenv.tyenv tcref tys + let typ = GenNamedTyApp cenv.amap newm eenv.tyenv tcref tys let ntyvars = if (tys.Length - 1) < goodTupleFields then (tys.Length - 1) else goodTupleFields let formalTyvars = [ for n in 0 .. ntyvars do yield mkILTyvarTy (uint16 n) ] @@ -2284,14 +2275,14 @@ and GenGetTupleField cenv cgbuf eenv (tupInfo,e,tys,n,m) sequel = if ar <= 0 then failwith "getCompiledTupleItem" elif ar < maxTuple then let tcr' = mkCompiledTupleTyconRef g tupInfo ar - let typ = GenNamedTyApp cenv m eenv.tyenv tcr' tys + let typ = GenNamedTyApp cenv.amap m eenv.tyenv tcr' tys mkGetTupleItemN g m n typ tupInfo e tys.[n] else let tysA,tysB = List.splitAfter (goodTupleFields) tys let tyB = mkCompiledTupleTy g tupInfo tysB let tys' = tysA@[tyB] let tcr' = mkCompiledTupleTyconRef g tupInfo (List.length tys') - let typ' = GenNamedTyApp cenv m eenv.tyenv tcr' tys' + let typ' = GenNamedTyApp cenv.amap m eenv.tyenv tcr' tys' let n' = (min n goodTupleFields) let elast = mkGetTupleItemN g m n' typ' tupInfo e tys'.[n'] if n < goodTupleFields then @@ -2304,7 +2295,7 @@ and GenAllocExn cenv cgbuf eenv (c,args,m) sequel = GenExprs cenv cgbuf eenv args let typ = GenExnType cenv.amap m eenv.tyenv c let flds = recdFieldsOfExnDefRef c - let argtys = flds |> List.map (fun rfld -> GenType cenv m eenv.tyenv rfld.FormalType) + let argtys = flds |> List.map (fun rfld -> GenType cenv.amap m eenv.tyenv rfld.FormalType) let mspec = mkILCtorMethSpecForTy (typ, argtys) CG.EmitInstr cgbuf (pop args.Length) (Push [typ]) @@ -2313,12 +2304,12 @@ and GenAllocExn cenv cgbuf eenv (c,args,m) sequel = and GenAllocUnionCase cenv cgbuf eenv (c,tyargs,args,m) sequel = GenExprs cenv cgbuf eenv args - let cuspec,idx = GenUnionCaseSpec cenv m eenv.tyenv c tyargs + let cuspec,idx = GenUnionCaseSpec cenv.amap m eenv.tyenv c tyargs CG.EmitInstrs cgbuf (pop args.Length) (Push [cuspec.DeclaringType]) (EraseUnions.mkNewData cenv.g.ilg (cuspec, idx)) GenSequel cenv eenv.cloc cgbuf sequel and GenAllocRecd cenv cgbuf eenv ctorInfo (tcref,argtys,args,m) sequel = - let typ = GenNamedTyApp cenv m eenv.tyenv tcref argtys + let typ = GenNamedTyApp cenv.amap m eenv.tyenv tcref argtys // Filter out fields with default initialization let relevantFields = @@ -2341,14 +2332,14 @@ and GenAllocRecd cenv cgbuf eenv ctorInfo (tcref,argtys,args,m) sequel = let tyenvinner = TypeReprEnv.ForTyconRef tcref CG.EmitInstr cgbuf (pop args.Length) (Push [typ]) (mkNormalNewobj - (mkILCtorMethSpecForTy (typ,relevantFields |> List.map (fun f -> GenType cenv m tyenvinner f.FormalType) ))) + (mkILCtorMethSpecForTy (typ,relevantFields |> List.map (fun f -> GenType cenv.amap m tyenvinner f.FormalType) ))) GenSequel cenv eenv.cloc cgbuf sequel and GenAllocAnonRecd cenv cgbuf eenv (anonInfo: AnonRecdTypeInfo, tyargs, args, m) sequel = let anonCtor, _anonMethods, anonType = cgbuf.mgbuf.LookupAnonType(anonInfo) let boxity = anonType.Boxity GenExprs cenv cgbuf eenv args - let ilTypeArgs = GenTypeArgs cenv m eenv.tyenv tyargs + let ilTypeArgs = GenTypeArgs cenv.amap m eenv.tyenv tyargs let anonTypeWithInst = mkILTy boxity (mkILTySpec(anonType.TypeSpec.TypeRef,ilTypeArgs)) CG.EmitInstr cgbuf (pop args.Length) (Push [anonTypeWithInst]) (mkNormalNewobj (mkILMethSpec(anonCtor,boxity,ilTypeArgs,[]))) GenSequel cenv eenv.cloc cgbuf sequel @@ -2356,7 +2347,7 @@ and GenAllocAnonRecd cenv cgbuf eenv (anonInfo: AnonRecdTypeInfo, tyargs, args, and GenGetAnonRecdField cenv cgbuf eenv (anonInfo: AnonRecdTypeInfo, e, tyargs, n, m) sequel = let _anonCtor, anonMethods, anonType = cgbuf.mgbuf.LookupAnonType(anonInfo) let boxity = anonType.Boxity - let ilTypeArgs = GenTypeArgs cenv m eenv.tyenv tyargs + let ilTypeArgs = GenTypeArgs cenv.amap m eenv.tyenv tyargs let anonMethod = anonMethods.[n] let anonFieldType = ilTypeArgs.[n] GenExpr cenv cgbuf eenv SPSuppress e Continue @@ -2364,7 +2355,7 @@ and GenGetAnonRecdField cenv cgbuf eenv (anonInfo: AnonRecdTypeInfo, e, tyargs, GenSequel cenv eenv.cloc cgbuf sequel and GenNewArraySimple cenv cgbuf eenv (elems,elemTy,m) sequel = - let ilElemTy = GenType cenv m eenv.tyenv elemTy + let ilElemTy = GenType cenv.amap m eenv.tyenv elemTy let ilArrTy = mkILArr1DTy ilElemTy CG.EmitInstrs cgbuf (pop 0) (Push [ilArrTy]) [ (AI_ldc (DT_I4,ILConst.I4 (elems.Length))); I_newarr (ILArrayShape.SingleDimensional,ilElemTy) ] @@ -2401,7 +2392,7 @@ and GenNewArray cenv cgbuf eenv (elems: Expr list,elemTy,m) sequel = | _ -> (function _ -> false), (fun _ _ -> failwith "unreachable") if elems' |> Array.forall (function Expr.Const(c,_,_) -> test c | _ -> false) then - let ilElemTy = GenType cenv m eenv.tyenv elemTy + let ilElemTy = GenType cenv.amap m eenv.tyenv elemTy GenConstArray cenv cgbuf eenv ilElemTy elems' (fun buf -> function Expr.Const(c,_,_) -> write buf c | _ -> failwith "unreachable") GenSequel cenv eenv.cloc cgbuf sequel @@ -2416,7 +2407,7 @@ and GenCoerce cenv cgbuf eenv (e,tgty,m,srcty) sequel = begin if (isInterfaceTy cenv.g tgty) then ( GenExpr cenv cgbuf eenv SPSuppress e Continue - let ilToTy = GenType cenv m eenv.tyenv tgty + let ilToTy = GenType cenv.amap m eenv.tyenv tgty // Section "III.1.8.1.3 Merging stack states" of ECMA-335 implies that no unboxing // is required, but we still push the coerce'd type on to the code gen buffer. CG.EmitInstrs cgbuf (pop 1) (Push [ilToTy]) [] @@ -2428,15 +2419,15 @@ and GenCoerce cenv cgbuf eenv (e,tgty,m,srcty) sequel = else GenExpr cenv cgbuf eenv SPSuppress e Continue if not (isObjTy cenv.g srcty) then - let ilFromTy = GenType cenv m eenv.tyenv srcty + let ilFromTy = GenType cenv.amap m eenv.tyenv srcty CG.EmitInstrs cgbuf (pop 1) (Push [cenv.g.ilg.typ_Object]) [ I_box ilFromTy ] if not (isObjTy cenv.g tgty) then - let ilToTy = GenType cenv m eenv.tyenv tgty + let ilToTy = GenType cenv.amap m eenv.tyenv tgty CG.EmitInstrs cgbuf (pop 1) (Push [ilToTy]) [ I_unbox_any ilToTy ] GenSequel cenv eenv.cloc cgbuf sequel and GenReraise cenv cgbuf eenv (rtnty,m) sequel = - let ilReturnTy = GenType cenv m eenv.tyenv rtnty + let ilReturnTy = GenType cenv.amap m eenv.tyenv rtnty CG.EmitInstrs cgbuf (pop 0) Push0 [I_rethrow] // [See comment related to I_throw]. // Rethrow does not return. Required to push dummy value on the stack. @@ -2451,7 +2442,7 @@ and GenGetExnField cenv cgbuf eenv (e,ecref,fieldNum,m) sequel = CG.EmitInstrs cgbuf (pop 0) Push0 [ I_castclass typ] let fld = List.item fieldNum exnc.TrueInstanceFieldsAsList - let ftyp = GenType cenv m eenv.tyenv fld.FormalType + let ftyp = GenType cenv.amap m eenv.tyenv fld.FormalType let mspec = mkILNonGenericInstanceMethSpecInTy (typ,"get_" + fld.Name, [], ftyp) CG.EmitInstr cgbuf (pop 1) (Push [ftyp]) (mkNormalCall mspec) @@ -2464,7 +2455,7 @@ and GenSetExnField cenv cgbuf eenv (e,ecref,fieldNum,e2,m) sequel = let typ = GenExnType cenv.amap m eenv.tyenv ecref CG.EmitInstrs cgbuf (pop 0) Push0 [ I_castclass typ ] let fld = List.item fieldNum exnc.TrueInstanceFieldsAsList - let ftyp = GenType cenv m eenv.tyenv fld.FormalType + let ftyp = GenType cenv.amap m eenv.tyenv fld.FormalType let ilFieldName = ComputeFieldName exnc fld GenExpr cenv cgbuf eenv SPSuppress e2 Continue CG.EmitInstr cgbuf (pop 2) Push0 (mkNormalStfld(mkILFieldSpecInTy (typ,ilFieldName,ftyp))) @@ -2482,7 +2473,7 @@ and UnionCodeGen (cgbuf: CodeGenBuffer) = and GenUnionCaseProof cenv cgbuf eenv (e,ucref,tyargs,m) sequel = GenExpr cenv cgbuf eenv SPSuppress e Continue - let cuspec,idx = GenUnionCaseSpec cenv m eenv.tyenv ucref tyargs + let cuspec,idx = GenUnionCaseSpec cenv.amap m eenv.tyenv ucref tyargs let fty = EraseUnions.GetILTypeForAlternative cuspec idx let avoidHelpers = entityRefInThisAssembly cenv.g.compilingFslib ucref.TyconRef EraseUnions.emitCastData cenv.g.ilg (UnionCodeGen cgbuf) (false,avoidHelpers,cuspec,idx) @@ -2493,7 +2484,7 @@ and GenGetUnionCaseField cenv cgbuf eenv (e,ucref,tyargs,n,m) sequel = assert (ucref.Tycon.IsStructOrEnumTycon || isProvenUnionCaseTy (tyOfExpr cenv.g e)) GenExpr cenv cgbuf eenv SPSuppress e Continue - let cuspec,idx = GenUnionCaseSpec cenv m eenv.tyenv ucref tyargs + let cuspec,idx = GenUnionCaseSpec cenv.amap m eenv.tyenv ucref tyargs let fty = actualTypOfIlxUnionField cuspec idx n let avoidHelpers = entityRefInThisAssembly cenv.g.compilingFslib ucref.TyconRef CG.EmitInstrs cgbuf (pop 1) (Push [fty]) (EraseUnions.mkLdData (avoidHelpers, cuspec, idx, n)) @@ -2503,7 +2494,7 @@ and GenGetUnionCaseFieldAddr cenv cgbuf eenv (e,ucref,tyargs,n,m) sequel = assert (ucref.Tycon.IsStructOrEnumTycon || isProvenUnionCaseTy (tyOfExpr cenv.g e)) GenExpr cenv cgbuf eenv SPSuppress e Continue - let cuspec,idx = GenUnionCaseSpec cenv m eenv.tyenv ucref tyargs + let cuspec,idx = GenUnionCaseSpec cenv.amap m eenv.tyenv ucref tyargs let fty = actualTypOfIlxUnionField cuspec idx n let avoidHelpers = entityRefInThisAssembly cenv.g.compilingFslib ucref.TyconRef CG.EmitInstrs cgbuf (pop 1) (Push [ILType.Byref fty]) (EraseUnions.mkLdDataAddr (avoidHelpers, cuspec, idx, n)) @@ -2511,7 +2502,7 @@ and GenGetUnionCaseFieldAddr cenv cgbuf eenv (e,ucref,tyargs,n,m) sequel = and GenGetUnionCaseTag cenv cgbuf eenv (e,tcref,tyargs,m) sequel = GenExpr cenv cgbuf eenv SPSuppress e Continue - let cuspec = GenUnionSpec cenv m eenv.tyenv tcref tyargs + let cuspec = GenUnionSpec cenv.amap m eenv.tyenv tcref tyargs let avoidHelpers = entityRefInThisAssembly cenv.g.compilingFslib tcref EraseUnions.emitLdDataTag cenv.g.ilg (UnionCodeGen cgbuf) (avoidHelpers, cuspec) CG.EmitInstrs cgbuf (pop 1) (Push [cenv.g.ilg.typ_Int32]) [ ] // push/pop to match the line above @@ -2519,7 +2510,7 @@ and GenGetUnionCaseTag cenv cgbuf eenv (e,tcref,tyargs,m) sequel = and GenSetUnionCaseField cenv cgbuf eenv (e,ucref,tyargs,n,e2,m) sequel = GenExpr cenv cgbuf eenv SPSuppress e Continue - let cuspec,idx = GenUnionCaseSpec cenv m eenv.tyenv ucref tyargs + let cuspec,idx = GenUnionCaseSpec cenv.amap m eenv.tyenv ucref tyargs let avoidHelpers = entityRefInThisAssembly cenv.g.compilingFslib ucref.TyconRef EraseUnions.emitCastData cenv.g.ilg (UnionCodeGen cgbuf) (false,avoidHelpers,cuspec,idx) CG.EmitInstrs cgbuf (pop 1) (Push [cuspec.DeclaringType]) [ ] // push/pop to match the line above @@ -2752,7 +2743,7 @@ and GenApp cenv cgbuf eenv (f,fty,tyargs,args,m) sequel = let actualRetTy = applyTys cenv.g vref.Type (tyargs,nowArgs) let _,curriedArgInfos,returnTy,_ = GetTopValTypeInCompiledForm cenv.g topValInfo vref.Type m - let ilTyArgs = GenTypeArgs cenv m eenv.tyenv tyargs + let ilTyArgs = GenTypeArgs cenv.amap m eenv.tyenv tyargs // For instance method calls chop off some type arguments, which are already @@ -2797,7 +2788,7 @@ and GenApp cenv cgbuf eenv (f,fty,tyargs,args,m) sequel = let callInstr = match valUseFlags with | PossibleConstrainedCall ty -> - let ilThisTy = GenType cenv m eenv.tyenv ty + let ilThisTy = GenType cenv.amap m eenv.tyenv ty I_callconstraint ( isTailCall, ilThisTy,mspec,None) | _ -> if newobj then I_newobj (mspec, None) @@ -2816,7 +2807,7 @@ and GenApp cenv cgbuf eenv (f,fty,tyargs,args,m) sequel = (eenv,laterArgs) ||> List.mapFold (fun eenv laterArg -> // Only save arguments that have effects if Optimizer.ExprHasEffect cenv.g laterArg then - let ilTy = laterArg |> tyOfExpr cenv.g |> GenType cenv m eenv.tyenv + let ilTy = laterArg |> tyOfExpr cenv.g |> GenType cenv.amap m eenv.tyenv let loc,eenv = AllocLocal cenv cgbuf eenv true (ilxgenGlobalNng.FreshCompilerGeneratedName ("arg",m), ilTy, false) scopeMarks GenExpr cenv cgbuf eenv SPSuppress laterArg Continue EmitSetLocal cgbuf loc @@ -2826,7 +2817,7 @@ and GenApp cenv cgbuf eenv (f,fty,tyargs,args,m) sequel = let nargs = mspec.FormalArgTypes.Length CG.EmitInstr cgbuf (pop (nargs + (if mspec.CallingConv.IsStatic || newobj then 0 else 1))) - (if mustGenerateUnitAfterCall || isSuperInit || isSelfInit then Push0 else (Push [(GenType cenv m eenv.tyenv actualRetTy)])) callInstr + (if mustGenerateUnitAfterCall || isSuperInit || isSelfInit then Push0 else (Push [(GenType cenv.amap m eenv.tyenv actualRetTy)])) callInstr // For isSuperInit, load the 'this' pointer as the pretend 'result' of the operation. It will be popped again in most cases if isSuperInit then CG.EmitInstrs cgbuf (pop 0) (Push [mspec.DeclaringType]) [ mkLdarg0 ] @@ -2879,9 +2870,9 @@ and GenNamedLocalTyFuncCall cenv (cgbuf: CodeGenBuffer) eenv typ cloinfo tyargs let ilContractClassTyargs = cloinfo.localTypeFuncContractFreeTypars |> List.map mkTyparTy - |> GenTypeArgs cenv m eenv.tyenv + |> GenTypeArgs cenv.amap m eenv.tyenv - let ilTyArgs = tyargs |> GenTypeArgs cenv m eenv.tyenv + let ilTyArgs = tyargs |> GenTypeArgs cenv.amap m eenv.tyenv let _,(ilContractMethTyargs: ILGenericParameterDefs),(ilContractCloTySpec:ILTypeSpec),ilContractFormalRetTy = GenNamedLocalTypeFuncContractInfo cenv eenv m cloinfo @@ -2896,7 +2887,7 @@ and GenNamedLocalTyFuncCall cenv (cgbuf: CodeGenBuffer) eenv typ cloinfo tyargs let actualRetTy = applyTys cenv.g typ (tyargs,[]) let ilDirectInvokeMethSpec = mkILInstanceMethSpecInTy(ilContractTy, "DirectInvoke", [], ilContractFormalRetTy, ilTyArgs) - let ilActualRetTy = GenType cenv m eenv.tyenv actualRetTy + let ilActualRetTy = GenType cenv.amap m eenv.tyenv actualRetTy CountCallFuncInstructions() CG.EmitInstr cgbuf (pop 1) (Push [ilActualRetTy]) (mkNormalCallvirt ilDirectInvokeMethSpec) actualRetTy @@ -2926,16 +2917,16 @@ and GenIndirectCall cenv cgbuf eenv (functy,tyargs,args,m) sequel = List.fold (fun (formalFuncTyp,sofar) _ -> let dty,rty = destFunTy cenv.g formalFuncTyp - (rty,(fun acc -> sofar (Apps_app(GenType cenv m feenv dty,acc))))) + (rty,(fun acc -> sofar (Apps_app(GenType cenv.amap m feenv dty,acc))))) (formalFuncTyp,id) args - let ilxRetApps = Apps_done (GenType cenv m feenv formalRetTy) + let ilxRetApps = Apps_done (GenType cenv.amap m feenv formalRetTy) - List.foldBack (fun tyarg acc -> Apps_tyapp(GenType cenv m eenv.tyenv tyarg,acc)) tyargs (appBuilder ilxRetApps) + List.foldBack (fun tyarg acc -> Apps_tyapp(GenType cenv.amap m eenv.tyenv tyarg,acc)) tyargs (appBuilder ilxRetApps) let actualRetTy = applyTys cenv.g functy (tyargs, args) - let ilActualRetTy = GenType cenv m eenv.tyenv actualRetTy + let ilActualRetTy = GenType cenv.amap m eenv.tyenv actualRetTy // Check if any byrefs are involved to make sure we don't tailcall let hasByrefArg = @@ -2972,7 +2963,7 @@ and GenTry cenv cgbuf eenv scopeMarks (e1,m,resty,spTry) = let endTryMark = CG.GenerateDelayMark cgbuf "endTryMark" let afterHandler = CG.GenerateDelayMark cgbuf "afterHandler" let eenvinner = {eenvinner with withinSEH = true} - let ilResultTy = GenType cenv m eenvinner.tyenv resty + let ilResultTy = GenType cenv.amap m eenvinner.tyenv resty let whereToSave,eenvinner = AllocLocal cenv cgbuf eenvinner true (ilxgenGlobalNng.FreshCompilerGeneratedName ("tryres",m),ilResultTy, false) (startTryMark,endTryMark) // Generate the body of the try. In the normal case (SequencePointAtTry) we generate a sequence point @@ -3417,7 +3408,7 @@ and GenQuotation cenv cgbuf eenv (ast,conv,m,ety) sequel = let someTypeInModuleExpr = mkTypeOfExpr cenv m eenv.someTypeInThisAssembly let rawTy = mkRawQuotedExprTy cenv.g - let spliceTypeExprs = List.map (GenType cenv m eenv.tyenv >> (mkTypeOfExpr cenv m)) spliceTypes + let spliceTypeExprs = List.map (GenType cenv.amap m eenv.tyenv >> (mkTypeOfExpr cenv m)) spliceTypes let bytesExpr = Expr.Op(TOp.Bytes(astSerializedBytes),[],[],m) @@ -3459,9 +3450,9 @@ and GenILCall cenv cgbuf eenv (virt,valu,newobj,valUseFlags,isDllImport,ilMethRe let makesNoCriticalTailcalls = (newobj || not virt) // Don't tailcall for 'newobj', or 'call' to IL code let tail = CanTailcall(valu,ccallInfo,eenv.withinSEH,hasByrefArg,mustGenerateUnitAfterCall,isDllImport,false,makesNoCriticalTailcalls,sequel) - let ilEnclArgTys = GenTypeArgs cenv m eenv.tyenv enclArgTys - let ilMethArgTys = GenTypeArgs cenv m eenv.tyenv methArgTys - let ilReturnTys = GenTypes cenv m eenv.tyenv returnTys + let ilEnclArgTys = GenTypeArgs cenv.amap m eenv.tyenv enclArgTys + let ilMethArgTys = GenTypeArgs cenv.amap m eenv.tyenv methArgTys + let ilReturnTys = GenTypes cenv.amap m eenv.tyenv returnTys let ilMethSpec = mkILMethSpec (ilMethRef,boxity,ilEnclArgTys,ilMethArgTys) let useICallVirt = virt || useCallVirt cenv boxity ilMethSpec isBaseCall @@ -3474,7 +3465,7 @@ and GenILCall cenv cgbuf eenv (virt,valu,newobj,valUseFlags,isDllImport,ilMethRe else match ccallInfo with | Some objArgTy -> - let ilObjArgTy = GenType cenv m eenv.tyenv objArgTy + let ilObjArgTy = GenType cenv.amap m eenv.tyenv objArgTy [ I_callconstraint(tail,ilObjArgTy,ilMethSpec,None) ] | None -> if useICallVirt then [ I_callvirt(tail,ilMethSpec,None) ] @@ -3538,19 +3529,19 @@ and GenGetValAddr cenv cgbuf eenv (v: ValRef, m) sequel = and GenGetByref cenv cgbuf eenv (v:ValRef,m) sequel = GenGetLocalVRef cenv cgbuf eenv m v None - let ilty = GenType cenv m eenv.tyenv (destByrefTy cenv.g v.Type) + let ilty = GenType cenv.amap m eenv.tyenv (destByrefTy cenv.g v.Type) CG.EmitInstrs cgbuf (pop 1) (Push [ilty]) [ mkNormalLdobj ilty ] GenSequel cenv eenv.cloc cgbuf sequel and GenSetByref cenv cgbuf eenv (v:ValRef,e,m) sequel = GenGetLocalVRef cenv cgbuf eenv m v None GenExpr cenv cgbuf eenv SPSuppress e Continue - let ilty = GenType cenv m eenv.tyenv (destByrefTy cenv.g v.Type) + let ilty = GenType cenv.amap m eenv.tyenv (destByrefTy cenv.g v.Type) CG.EmitInstrs cgbuf (pop 2) Push0 [ mkNormalStobj ilty ] GenUnitThenSequel cenv eenv m eenv.cloc cgbuf sequel and GenDefaultValue cenv cgbuf eenv (ty,m) = - let ilTy = GenType cenv m eenv.tyenv ty + let ilTy = GenType cenv.amap m eenv.tyenv ty if isRefTy cenv.g ty then CG.EmitInstr cgbuf (pop 0) (Push [ilTy]) AI_ldnull else @@ -3572,7 +3563,7 @@ and GenDefaultValue cenv cgbuf eenv (ty,m) = | Some tcref when (tyconRefEq cenv.g cenv.g.system_Double_tcref tcref) -> CG.EmitInstr cgbuf (pop 0) (Push [ilTy]) (iLdcDouble 0.0) | _ -> - let ilTy = GenType cenv m eenv.tyenv ty + let ilTy = GenType cenv.amap m eenv.tyenv ty LocalScope "ilzero" cgbuf (fun scopeMarks -> let locIdx, _ = AllocLocal cenv cgbuf eenv true (ilxgenGlobalNng.FreshCompilerGeneratedName ("default",m), ilTy, false) scopeMarks // "initobj" (Generated by EmitInitLocal) doesn't work on byref types @@ -3589,7 +3580,7 @@ and GenDefaultValue cenv cgbuf eenv (ty,m) = //-------------------------------------------------------------------------- and GenGenericParam cenv eenv (tp:Typar) = - let subTypeConstraints = tp.Constraints |> List.choose (function | TyparConstraint.CoercesTo(ty,_) -> Some(ty) | _ -> None) |> List.map (GenTypeAuxAux cenv.amap tp.Range eenv.tyenv VoidNotOK PtrTypesNotOK) + let subTypeConstraints = tp.Constraints |> List.choose (function | TyparConstraint.CoercesTo(ty,_) -> Some(ty) | _ -> None) |> List.map (GenTypeAux cenv.amap tp.Range eenv.tyenv VoidNotOK PtrTypesNotOK) let refTypeConstraint = tp.Constraints |> List.exists (function TyparConstraint.IsReferenceType _ -> true | TyparConstraint.SupportsNull _ -> true | _ -> false) let notNullableValueTypeConstraint = tp.Constraints |> List.exists (function TyparConstraint.IsNonNullableStruct _ -> true | _ -> false) let defaultConstructorConstraint = tp.Constraints |> List.exists (function TyparConstraint.RequiresDefaultConstructor _ -> true | _ -> false) @@ -3630,7 +3621,7 @@ and GenSlotParam m cenv eenv (TSlotParam(nm,ty,inFlag,outFlag,optionalFlag,attri let inFlag2,outFlag2,optionalFlag2,defaultParamValue,paramMarshal2,attribs = GenParamAttribs cenv attribs { Name=nm - Type= GenParamType cenv m eenv.tyenv ty + Type= GenParamType cenv.amap m eenv.tyenv ty Default=defaultParamValue Marshal=paramMarshal2 IsIn=inFlag || inFlag2 @@ -3640,10 +3631,10 @@ and GenSlotParam m cenv eenv (TSlotParam(nm,ty,inFlag,outFlag,optionalFlag,attri and GenFormalSlotsig m cenv eenv (TSlotSig(_,typ,ctps,mtps,paraml,returnTy)) = let paraml = List.concat paraml - let ilTy = GenType cenv m eenv.tyenv typ + let ilTy = GenType cenv.amap m eenv.tyenv typ let eenvForSlotSig = EnvForTypars (ctps @ mtps) eenv let ilParams = paraml |> List.map (GenSlotParam m cenv eenvForSlotSig) - let ilRetTy = GenReturnType cenv m eenvForSlotSig.tyenv returnTy + let ilRetTy = GenReturnType cenv.amap m eenvForSlotSig.tyenv returnTy let ilRet = mkILReturn ilRetTy ilTy, ilParams, ilRet @@ -3655,7 +3646,7 @@ and GenActualSlotsig m cenv eenv (TSlotSig(_,typ,ctps,mtps,ilSlotParams,ilSlotRe let ilParams = ilSlotParams |> List.map (instSlotParam instForSlotSig >> GenSlotParam m cenv eenv) // Use the better names if available let ilParams = if ilParams.Length = methodParams.Length then (ilParams, methodParams) ||> List.map2 (fun p pv -> { p with Name = Some (nameOfVal pv) }) else ilParams - let ilRetTy = GenReturnType cenv m eenv.tyenv (Option.map (instType instForSlotSig) ilSlotRetTy) + let ilRetTy = GenReturnType cenv.amap m eenv.tyenv (Option.map (instType instForSlotSig) ilSlotRetTy) let iLRet = mkILReturn ilRetTy ilParams,iLRet @@ -3761,7 +3752,7 @@ and GenObjectExpr cenv cgbuf eenvouter expr (baseType,baseValOpt,basecall,overri let mimpls = mimpls |> List.choose id // choose the ones that actually have method impls - let interfaceTys = interfaceImpls |> List.map (fst >> GenType cenv m eenvinner.tyenv) + let interfaceTys = interfaceImpls |> List.map (fst >> GenType cenv.amap m eenvinner.tyenv) let attrs = GenAttrs cenv eenvinner cloAttribs let super = (if isInterfaceTy cenv.g baseType then cenv.g.ilg.typ_Object else ilCloRetTy) @@ -3787,13 +3778,13 @@ and GenSequenceExpr cenv (cgbuf:CodeGenBuffer) eenvouter (nextEnumeratorValRef:V let (cloAttribs,_,_,cloFreeTyvars,cloFreeVars,ilCloTypeRef:ILTypeRef,ilCloFreeVars,eenvinner) = GetIlxClosureFreeVars cenv m None eenvouter [] (mkLambda m nextEnumeratorValRef.Deref (generateNextExpr, cenv.g.int32_ty)) - let ilCloSeqElemTy = GenType cenv m eenvinner.tyenv seqElemTy + let ilCloSeqElemTy = GenType cenv.amap m eenvinner.tyenv seqElemTy let cloRetTy = mkSeqTy cenv.g seqElemTy - let ilCloRetTyInner = GenType cenv m eenvinner.tyenv cloRetTy - let ilCloRetTyOuter = GenType cenv m eenvouter.tyenv cloRetTy - let ilCloEnumeratorTy = GenType cenv m eenvinner.tyenv (mkIEnumeratorTy cenv.g seqElemTy) - let ilCloEnumerableTy = GenType cenv m eenvinner.tyenv (mkSeqTy cenv.g seqElemTy) - let ilCloBaseTy = GenType cenv m eenvinner.tyenv (mkAppTy cenv.g.seq_base_tcr [seqElemTy]) + let ilCloRetTyInner = GenType cenv.amap m eenvinner.tyenv cloRetTy + let ilCloRetTyOuter = GenType cenv.amap m eenvouter.tyenv cloRetTy + let ilCloEnumeratorTy = GenType cenv.amap m eenvinner.tyenv (mkIEnumeratorTy cenv.g seqElemTy) + let ilCloEnumerableTy = GenType cenv.amap m eenvinner.tyenv (mkSeqTy cenv.g seqElemTy) + let ilCloBaseTy = GenType cenv.amap m eenvinner.tyenv (mkAppTy cenv.g.seq_base_tcr [seqElemTy]) let ilCloGenericParams = GenGenericParams cenv eenvinner cloFreeTyvars // Create a new closure class with a single "MoveNext" method that implements the iterator. @@ -3961,7 +3952,7 @@ and GenLambda cenv cgbuf eenv isLocalTypeFunc selfv expr sequel = GenSequel cenv eenv.cloc cgbuf sequel and GenTypeOfVal cenv eenv (v:Val) = - GenType cenv v.Range eenv.tyenv v.Type + GenType cenv.amap v.Range eenv.tyenv v.Type and GenFreevar cenv m eenvouter tyenvinner (fv:Val) = match StorageForVal m fv eenvouter with @@ -3971,7 +3962,7 @@ and GenFreevar cenv m eenvouter tyenvinner (fv:Val) = // Check for things that should never make it into the free variable set. Only do this in debug for performance reasons | (StaticField _ | StaticProperty _ | Method _ | Null) -> error(InternalError("GenFreevar: compiler error: unexpected unrealized value",fv.Range)) #endif - | _ -> GenType cenv m tyenvinner fv.Type + | _ -> GenType cenv.amap m tyenvinner fv.Type and GetIlxClosureFreeVars cenv m selfv eenvouter takenNames expr = @@ -4112,7 +4103,7 @@ and GetIlxClosureInfo cenv m isLocalTypeFunc selfv eenvouter expr = let lambdas = Lambdas_lambda (mkILParamNamed(nm,GenTypeOfVal cenv eenv v),l) lambdas,eenv | _ -> - let returnTy' = GenType cenv m eenv.tyenv returnTy + let returnTy' = GenType cenv.amap m eenv.tyenv returnTy Lambdas_return returnTy', eenv // start at arg number 1 as "this" pointer holds the current closure @@ -4122,7 +4113,7 @@ and GetIlxClosureInfo cenv m isLocalTypeFunc selfv eenvouter expr = let narginfo = vs |> List.map (fun _ -> 1) // Generate the ILX view of the lambdas - let ilReturnTy = GenType cenv m eenvinner.tyenv returnTy + let ilReturnTy = GenType cenv.amap m eenvinner.tyenv returnTy // The general shape is: // {LAM . expr }[free-typars] : overall-type[contract-typars] @@ -4221,14 +4212,14 @@ and GenNamedLocalTypeFuncContractInfo cenv eenv m cloinfo = | e -> [], tyOfExpr cenv.g e let eenvForContract = AddTyparsToEnv tvs eenvForContract let ilContractMethTyargs = GenGenericParams cenv eenvForContract tvs - let ilContractFormalRetTy = GenType cenv m eenvForContract.tyenv contractRetTy + let ilContractFormalRetTy = GenType cenv.amap m eenvForContract.tyenv contractRetTy ilContractGenericParams,ilContractMethTyargs,mkILTySpec(ilContractTypeRef,cloinfo.localTypeFuncILGenericArgs),ilContractFormalRetTy /// Generate a new delegate construction including a closure class if necessary. This is a lot like generating function closures /// and object expression closures, and most of the code is shared. and GenDelegateExpr cenv cgbuf eenvouter expr (TObjExprMethod((TSlotSig(_,delegateTy, _,_,_, _) as slotsig),_attribs,methTyparsOfOverridingMethod,tmvs,body,_),m) sequel = // Get the instantiation of the delegate type - let ilCtxtDelTy = GenType cenv m eenvouter.tyenv delegateTy + let ilCtxtDelTy = GenType cenv.amap m eenvouter.tyenv delegateTy let tmvs = List.concat tmvs // Yuck. TLBIMP.EXE generated APIs use UIntPtr for the delegate ctor. @@ -4345,7 +4336,7 @@ and GenJoinPoint cenv cgbuf pos eenv ty m sequel = // The others (e.g. Continue, LeaveFilter and CmpThenBrOrContinue) can't be done at the end of each branch. We must create a join point. | _ -> - let pushed = GenType cenv m eenv.tyenv ty + let pushed = GenType cenv.amap m eenv.tyenv ty let stackAfterJoin = (pushed :: (cgbuf.GetCurrentStack())) let afterJoin = CG.GenerateDelayMark cgbuf (pos + "_join") // go to the join point @@ -4547,7 +4538,7 @@ and GenDecisionTreeSwitch cenv cgbuf inplabOpt stackAtTargets eenv e cases defau match defaultTargetOpt with | None -> rest.Head.CaseTree | Some tg -> tg - let cuspec = GenUnionSpec cenv m eenv.tyenv c.TyconRef tyargs + let cuspec = GenUnionSpec cenv.amap m eenv.tyenv c.TyconRef tyargs let idx = c.Index let avoidHelpers = entityRefInThisAssembly cenv.g.compilingFslib c.TyconRef GenDecisionTreeTest cenv eenv.cloc cgbuf stackAtTargets e (Some (pop 1, Push [cenv.g.ilg.typ_Bool], Choice1Of2 (avoidHelpers, cuspec, idx))) eenv successTree failureTree targets repeatSP targetInfos sequel @@ -4572,7 +4563,7 @@ and GenDecisionTreeSwitch cenv cgbuf inplabOpt stackAtTargets eenv e cases defau GenExpr cenv cgbuf eenv SPSuppress e Continue let srcTy = tyOfExpr cenv.g e if isTyparTy cenv.g srcTy then - let ilFromTy = GenType cenv m eenv.tyenv srcTy + let ilFromTy = GenType cenv.amap m eenv.tyenv srcTy CG.EmitInstr cgbuf (pop 1) (Push [cenv.g.ilg.typ_Object]) (I_box ilFromTy) BI_brfalse | DecisionTreeTest.IsInst (_srcty,tgty) -> @@ -4586,7 +4577,7 @@ and GenDecisionTreeSwitch cenv cgbuf inplabOpt stackAtTargets eenv e cases defau | DecisionTreeTest.ActivePatternCase _ -> error(InternalError("internal error in codegen: DecisionTreeTest.ActivePatternCase",switchm)) | DecisionTreeTest.UnionCase (hdc,tyargs) -> GenExpr cenv cgbuf eenv SPSuppress e Continue - let cuspec = GenUnionSpec cenv m eenv.tyenv hdc.TyconRef tyargs + let cuspec = GenUnionSpec cenv.amap m eenv.tyenv hdc.TyconRef tyargs let dests = if cases.Length <> caseLabels.Length then failwith "internal error: DecisionTreeTest.UnionCase" (cases , caseLabels) ||> List.map2 (fun case label -> @@ -5184,7 +5175,7 @@ and GenPropertyForMethodDef compileAsInstance tref mdef (v:Val) (memberInfo:ValM and GenEventForProperty cenv eenvForMeth (mspec:ILMethodSpec) (v:Val) ilAttrsThatGoOnPrimaryItem m returnTy = let evname = v.PropertyName let delegateTy = Infos.FindDelegateTypeOfPropertyEvent cenv.g cenv.amap evname m returnTy - let ilDelegateTy = GenType cenv m eenvForMeth.tyenv delegateTy + let ilDelegateTy = GenType cenv.amap m eenvForMeth.tyenv delegateTy let ilThisTy = mspec.DeclaringType let addMethRef = mkILMethRef (ilThisTy.TypeRef,mspec.CallingConv,"add_" + evname,0,[ilDelegateTy],ILType.Void) let removeMethRef = mkILMethRef (ilThisTy.TypeRef,mspec.CallingConv,"remove_" + evname,0,[ilDelegateTy],ILType.Void) @@ -5451,8 +5442,8 @@ and GenMethodForBinding // Emit the property, but not if its a private method impl if mdef.Access <> ILMemberAccess.Private then let vtyp = ReturnTypeOfPropertyVal cenv.g v - let ilPropTy = GenType cenv m eenvUnderMethTypeTypars.tyenv vtyp - let ilArgTys = v |> ArgInfosOfPropertyVal cenv.g |> List.map fst |> GenTypes cenv m eenvUnderMethTypeTypars.tyenv + let ilPropTy = GenType cenv.amap m eenvUnderMethTypeTypars.tyenv vtyp + let ilArgTys = v |> ArgInfosOfPropertyVal cenv.g |> List.map fst |> GenTypes cenv.amap m eenvUnderMethTypeTypars.tyenv let ilPropDef = GenPropertyForMethodDef compileAsInstance tref mdef v memberInfo ilArgTys ilPropTy (mkILCustomAttrs ilAttrsThatGoOnPrimaryItem) compiledName mgbuf.AddOrMergePropertyDef(tref,ilPropDef,m) @@ -5529,7 +5520,7 @@ and GenSetVal cenv cgbuf eenv (vref,e,m) sequel = and GenGetValRefAndSequel cenv cgbuf eenv m (v:ValRef) fetchSequel = let ty = v.Type - GenGetStorageAndSequel cenv cgbuf eenv m (ty, GenType cenv m eenv.tyenv ty) (StorageForValRef m v eenv) fetchSequel + GenGetStorageAndSequel cenv cgbuf eenv m (ty, GenType cenv.amap m eenv.tyenv ty) (StorageForValRef m v eenv) fetchSequel and GenGetVal cenv cgbuf eenv (v:ValRef,m) sequel = GenGetValRefAndSequel cenv cgbuf eenv m v None @@ -5818,16 +5809,16 @@ and GenAttribArg cenv eenv x (ilArgTy:ILType) = // Detect '[| ... |]' nodes | Expr.Op(TOp.Array,[elemTy],args,m),_ -> - let ilElemTy = GenType cenv m eenv.tyenv elemTy + let ilElemTy = GenType cenv.amap m eenv.tyenv elemTy ILAttribElem.Array (ilElemTy, List.map (fun arg -> GenAttribArg cenv eenv arg ilElemTy) args) // Detect 'typeof' calls | TypeOfExpr g ty, _ -> - ILAttribElem.Type (Some (GenType cenv x.Range eenv.tyenv ty)) + ILAttribElem.Type (Some (GenType cenv.amap x.Range eenv.tyenv ty)) // Detect 'typedefof' calls | TypeDefOfExpr g ty, _ -> - ILAttribElem.TypeRef (Some (GenType cenv x.Range eenv.tyenv ty).TypeRef) + ILAttribElem.TypeRef (Some (GenType cenv.amap x.Range eenv.tyenv ty).TypeRef) // Ignore upcasts | Expr.Op(TOp.Coerce,_,[arg2],_),_ -> @@ -5864,7 +5855,7 @@ and GenAttr cenv eenv (Attrib(_,k,args,props,_,_,_)) = let props = props |> List.map (fun (AttribNamedArg(s,ty,fld,AttribExpr(_,expr))) -> let m = expr.Range - let ilTy = GenType cenv m eenv.tyenv ty + let ilTy = GenType cenv.amap m eenv.tyenv ty let cval = GenAttribArg cenv eenv expr ilTy (s,ilTy,fld,cval)) let mspec = @@ -6237,8 +6228,8 @@ and GenAbstractBinding cenv eenv tref (vref:ValRef) = [],[],[edef] else let ilPropDef = - let ilPropTy = GenType cenv m eenvForMeth.tyenv vtyp - let ilArgTys = v |> ArgInfosOfPropertyVal cenv.g |> List.map fst |> GenTypes cenv m eenvForMeth.tyenv + let ilPropTy = GenType cenv.amap m eenvForMeth.tyenv vtyp + let ilArgTys = v |> ArgInfosOfPropertyVal cenv.g |> List.map fst |> GenTypes cenv.amap m eenvForMeth.tyenv GenPropertyForMethodDef compileAsInstance tref mdef v memberInfo ilArgTys ilPropTy (mkILCustomAttrs ilAttrs) None let mdef = mdef.WithSpecialName [mdef], [ilPropDef],[] @@ -6299,10 +6290,10 @@ and GenTypeDef cenv mgbuf lazyInitInfo eenv m (tycon:Tycon) = let eenvinner = ReplaceTyenv (TypeReprEnv.ForTycon tycon) eenv let thisTy = generalizedTyconRef tcref - let ilThisTy = GenType cenv m eenvinner.tyenv thisTy + let ilThisTy = GenType cenv.amap m eenvinner.tyenv thisTy let tref = ilThisTy.TypeRef let ilGenParams = GenGenericParams cenv eenvinner tycon.TyparsNoRange - let ilIntfTys = tycon.ImmediateInterfaceTypesOfFSharpTycon |> List.map (GenType cenv m eenvinner.tyenv) + let ilIntfTys = tycon.ImmediateInterfaceTypesOfFSharpTycon |> List.map (GenType cenv.amap m eenvinner.tyenv) let ilTypeName = tref.Name let hidden = IsHiddenTycon eenv.sigToImplRemapInfo tycon @@ -6453,7 +6444,7 @@ and GenTypeDef cenv mgbuf lazyInitInfo eenv m (tycon:Tycon) = ((fspec.IsCompilerGenerated && not tycon.IsEnumTycon) || hiddenRepr || IsHiddenRecdField eenv.sigToImplRemapInfo (tcref.MakeNestedRecdFieldRef fspec)) - let ilType = GenType cenv m eenvinner.tyenv fspec.FormalType + let ilType = GenType cenv.amap m eenvinner.tyenv fspec.FormalType let ilFieldName = ComputeFieldName tycon fspec yield (useGenuineField, ilFieldName, fspec.IsMutable, fspec.IsStatic, fspec.PropertyAttribs, ilType, isPropHidden, fspec) ] @@ -6687,7 +6678,7 @@ and GenTypeDef cenv mgbuf lazyInitInfo eenv m (tycon:Tycon) = | TRecdRepr _ | TFSharpObjectRepr _ as tyconRepr -> let super = superOfTycon cenv.g tycon - let ilBaseTy = GenType cenv m eenvinner.tyenv super + let ilBaseTy = GenType cenv.amap m eenvinner.tyenv super // Build a basic type definition let isObjectType = (match tyconRepr with TFSharpObjectRepr _ -> true | _ -> false) @@ -6890,7 +6881,7 @@ and GenExnDef cenv mgbuf eenv m (exnc:Tycon) = let ilMethodDefsForProperties,ilFieldDefs,ilPropertyDefs,fieldNamesAndTypes = [ for i,fld in markup fspecs do let ilPropName = fld.Name - let ilPropType = GenType cenv m eenv.tyenv fld.FormalType + let ilPropType = GenType cenv.amap m eenv.tyenv fld.FormalType let ilMethName = "get_" + fld.Name let ilFieldName = ComputeFieldName exnc fld let ilMethodDef = mkLdfldMethodDef (ilMethName,reprAccess,false,ilThisTy,ilFieldName,ilPropType) @@ -6969,7 +6960,7 @@ and GenExnDef cenv mgbuf eenv m (exnc:Tycon) = let ilTypeName = tref.Name - let interfaces = exnc.ImmediateInterfaceTypesOfFSharpTycon |> List.map (GenType cenv m eenv.tyenv) + let interfaces = exnc.ImmediateInterfaceTypesOfFSharpTycon |> List.map (GenType cenv.amap m eenv.tyenv) let tdef = mkILGenericClass (ilTypeName,access,[],cenv.g.iltyp_Exception, @@ -7141,7 +7132,7 @@ let LookupGeneratedValue (amap:ImportMap) (ctxt: ExecutionContext) eenv (v:Val) try // Convert the v.Type into a System.Type according to ilxgen and ilreflect. let objTyp = - let ilTy = GenTypeAux amap v.Range TypeReprEnv.Empty v.Type (* TypeReprEnv.Empty ok, not expecting typars *) + let ilTy = GenType amap v.Range TypeReprEnv.Empty v.Type (* TypeReprEnv.Empty ok, not expecting typars *) ctxt.LookupType ilTy // Lookup the compiled v value (as an object). match StorageForVal v.Range v eenv with From 05ceacad426799fe3e4c42c790a6ee064b68fe02 Mon Sep 17 00:00:00 2001 From: Don Syme Date: Fri, 4 May 2018 11:36:15 +0100 Subject: [PATCH 012/160] simplify diff --- src/fsharp/IlxGen.fs | 26 ++++++++++++++++---------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/src/fsharp/IlxGen.fs b/src/fsharp/IlxGen.fs index 02d9862530c..c890093fa1c 100644 --- a/src/fsharp/IlxGen.fs +++ b/src/fsharp/IlxGen.fs @@ -373,24 +373,22 @@ type PtrsOK = let rec GenTypeArgAux amap m tyenv tyarg = GenTypeAux amap m tyenv VoidNotOK PtrTypesNotOK tyarg -and GenTypeArgs amap m tyenv tyargs = +and GenTypeArgsAux amap m tyenv tyargs = List.map (GenTypeArgAux amap m tyenv) (DropErasedTyargs tyargs) -and GenTyApp amap m tyenv repr tinst = +and GenTyAppAux amap m tyenv repr tinst = match repr with | CompiledTypeRepr.ILAsmOpen ty -> - let ilTypeInst = GenTypeArgs amap m tyenv tinst + let ilTypeInst = GenTypeArgsAux amap m tyenv tinst let ty = IL.instILType ilTypeInst ty ty | CompiledTypeRepr.ILAsmNamed (tref, boxity, ilTypeOpt) -> GenILTyAppAux amap m tyenv (tref, boxity, ilTypeOpt) tinst -and GenNamedTyApp amap m tyenv tcref tinst = GenNamedTyAppAux amap m tyenv PtrTypesNotOK tcref tinst - and GenILTyAppAux amap m tyenv (tref, boxity, ilTypeOpt) tinst = match ilTypeOpt with | None -> - let ilTypeInst = GenTypeArgs amap m tyenv tinst + let ilTypeInst = GenTypeArgsAux amap m tyenv tinst mkILTy boxity (mkILTySpec (tref,ilTypeInst)) | Some ilType -> ilType // monomorphic types include a cached ilType to avoid reallocation of an ILType node @@ -409,7 +407,7 @@ and GenNamedTyAppAux (amap:ImportMap) m tyenv ptrsOK tcref tinst = GenTypeAux amap m tyenv VoidNotOK ptrsOK (info.BaseTypeForErased (m,g.obj_ty)) | _ -> #endif - GenTyApp amap m tyenv (GenTyconRef tcref) tinst + GenTyAppAux amap m tyenv (GenTyconRef tcref) tinst and GenTypeAux amap m (tyenv: TypeReprEnv) voidOK ptrsOK ty = let g = amap.g @@ -490,21 +488,29 @@ and ComputeUnionHasHelpers g (tcref : TyconRef) = and GenUnionSpec amap m tyenv tcref tyargs = let curef = GenUnionRef amap m tcref - let tinst = GenTypeArgs amap m tyenv tyargs + let tinst = GenTypeArgsAux amap m tyenv tyargs IlxUnionSpec(curef,tinst) and GenUnionCaseSpec amap m tyenv (ucref:UnionCaseRef) tyargs = let cuspec = GenUnionSpec amap m tyenv ucref.TyconRef tyargs cuspec, ucref.Index +and GenType amap m tyenv ty = + GenTypeAux amap m tyenv VoidNotOK PtrTypesNotOK ty + + +and GenTypes amap m tyenv tys = List.map (GenType amap m tyenv) tys + +and GenTyApp amap m tyenv repr tyargs = GenTyAppAux amap m tyenv repr tyargs +and GenNamedTyApp amap m tyenv tcref tinst = GenNamedTyAppAux amap m tyenv PtrTypesNotOK tcref tinst + /// IL void types are only generated for return types and GenReturnType amap m tyenv returnTyOpt = match returnTyOpt with | None -> ILType.Void | Some returnTy -> GenTypeAux amap m tyenv VoidNotOK(*1*) PtrTypesOK returnTy (*1: generate void from unit, but not accept void *) -and GenType amap m tyenv ty = GenTypeAux amap m tyenv VoidNotOK PtrTypesNotOK ty -and GenTypes amap m tyenv tys = List.map (GenType amap m tyenv) tys +and GenTypeArgs amap m tyenv tyargs = GenTypeArgsAux amap m tyenv tyargs and GenParamType amap m tyenv ty = GenTypeAux amap m tyenv VoidNotOK PtrTypesOK ty and GenParamTypes amap m tyenv tys = tys |> List.map (GenParamType amap m tyenv) and GenTypePermitVoidAux amap m tyenv ty = GenTypeAux amap m tyenv VoidOK PtrTypesNotOK ty From 91a969c89c626162ca778d3f689282ae1c70c5a5 Mon Sep 17 00:00:00 2001 From: Don Syme Date: Fri, 4 May 2018 11:44:38 +0100 Subject: [PATCH 013/160] simplify diff --- src/fsharp/IlxGen.fs | 56 +++++++++++++++++++++++--------------------- 1 file changed, 29 insertions(+), 27 deletions(-) diff --git a/src/fsharp/IlxGen.fs b/src/fsharp/IlxGen.fs index c890093fa1c..00d763c6978 100644 --- a/src/fsharp/IlxGen.fs +++ b/src/fsharp/IlxGen.fs @@ -488,7 +488,7 @@ and ComputeUnionHasHelpers g (tcref : TyconRef) = and GenUnionSpec amap m tyenv tcref tyargs = let curef = GenUnionRef amap m tcref - let tinst = GenTypeArgsAux amap m tyenv tyargs + let tinst = GenTypeArgs amap m tyenv tyargs IlxUnionSpec(curef,tinst) and GenUnionCaseSpec amap m tyenv (ucref:UnionCaseRef) tyargs = @@ -500,6 +500,8 @@ and GenType amap m tyenv ty = and GenTypes amap m tyenv tys = List.map (GenType amap m tyenv) tys +and GenTypePermitVoid amap m tyenv ty = (GenTypeAux amap m tyenv VoidOK PtrTypesNotOK ty) +and GenTypesPermitVoid amap m tyenv tys = List.map (GenTypePermitVoid amap m tyenv) tys and GenTyApp amap m tyenv repr tyargs = GenTyAppAux amap m tyenv repr tyargs and GenNamedTyApp amap m tyenv tcref tinst = GenNamedTyAppAux amap m tyenv PtrTypesNotOK tcref tinst @@ -510,9 +512,13 @@ and GenReturnType amap m tyenv returnTyOpt = | None -> ILType.Void | Some returnTy -> GenTypeAux amap m tyenv VoidNotOK(*1*) PtrTypesOK returnTy (*1: generate void from unit, but not accept void *) +and GenParamType amap m tyenv ty = + ty |> GenTypeAux amap m tyenv VoidNotOK PtrTypesOK + +and GenParamTypes amap m tyenv tys = + tys |> List.map (GenTypeAux amap m tyenv VoidNotOK PtrTypesOK) + and GenTypeArgs amap m tyenv tyargs = GenTypeArgsAux amap m tyenv tyargs -and GenParamType amap m tyenv ty = GenTypeAux amap m tyenv VoidNotOK PtrTypesOK ty -and GenParamTypes amap m tyenv tys = tys |> List.map (GenParamType amap m tyenv) and GenTypePermitVoidAux amap m tyenv ty = GenTypeAux amap m tyenv VoidOK PtrTypesNotOK ty // Static fields generally go in a private InitializationCodeAndBackingFields section. This is to ensure all static @@ -544,6 +550,8 @@ let GenRecdFieldRef m cenv tyenv (rfref:RecdFieldRef) tyargs = ComputeFieldName rfref.Tycon rfref.RecdField, GenType cenv.amap m tyenvinner rfref.RecdField.FormalType) +let GenExnType amap m tyenv (ecref:TyconRef) = GenTyApp amap m tyenv ecref.CompiledRepresentation [] + //-------------------------------------------------------------------------- // Closure summaries //-------------------------------------------------------------------------- @@ -1389,10 +1397,6 @@ type AssemblyBuilder(cenv:cenv, anonTypeTable: AnonTypeGenerationTable) as mgbuf member mgbuf.cenv = cenv member mgbuf.GetExplicitEntryPointInfo() = explicitEntryPointInfo -let GenTypePermitVoid cenv m tyenv ty = GenTypeAux cenv.amap m tyenv VoidOK PtrTypesNotOK ty -let GenTypesPermitVoid cenv m tyenv tys = List.map (GenTypePermitVoid cenv m tyenv) tys -let GenExnType amap m tyenv (ecref:TyconRef) = GenTyApp amap m tyenv ecref.CompiledRepresentation [] - /// Record the types of the things on the evaluation stack. /// Used for the few times we have to flush the IL evaluation stack and to compute maxStack. @@ -3244,8 +3248,8 @@ and GenSequential cenv cgbuf eenv spIn (e1,e2,specialSeqFlag,spSeq,_m) sequel = //-------------------------------------------------------------------------- and GenAsmCode cenv cgbuf eenv (il,tyargs,args,returnTys,m) sequel = - let ilTyArgs = GenTypesPermitVoid cenv m eenv.tyenv tyargs - let ilReturnTys = GenTypesPermitVoid cenv m eenv.tyenv returnTys + let ilTyArgs = GenTypesPermitVoid cenv.amap m eenv.tyenv tyargs + let ilReturnTys = GenTypesPermitVoid cenv.amap m eenv.tyenv returnTys let ilAfterInst = il |> List.filter (function AI_nop -> false | _ -> true) |> List.map (fun i -> @@ -5773,8 +5777,7 @@ and EmitRestoreStack cgbuf (savedStack,savedStackLocals) = //GenAttr: custom attribute generation //------------------------------------------------------------------------- -and GenAttribArg cenv eenv x (ilArgTy:ILType) = - let g = cenv.g +and GenAttribArg amap g eenv x (ilArgTy:ILType) = match x,ilArgTy with @@ -5815,31 +5818,31 @@ and GenAttribArg cenv eenv x (ilArgTy:ILType) = // Detect '[| ... |]' nodes | Expr.Op(TOp.Array,[elemTy],args,m),_ -> - let ilElemTy = GenType cenv.amap m eenv.tyenv elemTy - ILAttribElem.Array (ilElemTy, List.map (fun arg -> GenAttribArg cenv eenv arg ilElemTy) args) + let ilElemTy = GenType amap m eenv.tyenv elemTy + ILAttribElem.Array (ilElemTy, List.map (fun arg -> GenAttribArg amap g eenv arg ilElemTy) args) // Detect 'typeof' calls | TypeOfExpr g ty, _ -> - ILAttribElem.Type (Some (GenType cenv.amap x.Range eenv.tyenv ty)) + ILAttribElem.Type (Some (GenType amap x.Range eenv.tyenv ty)) // Detect 'typedefof' calls | TypeDefOfExpr g ty, _ -> - ILAttribElem.TypeRef (Some (GenType cenv.amap x.Range eenv.tyenv ty).TypeRef) + ILAttribElem.TypeRef (Some (GenType amap x.Range eenv.tyenv ty).TypeRef) // Ignore upcasts | Expr.Op(TOp.Coerce,_,[arg2],_),_ -> - GenAttribArg cenv eenv arg2 ilArgTy + GenAttribArg amap g eenv arg2 ilArgTy // Detect explicit enum values | EnumExpr g arg1, _ -> - GenAttribArg cenv eenv arg1 ilArgTy + GenAttribArg amap g eenv arg1 ilArgTy // Detect bitwise or of attribute flags: one case of constant folding (a more general treatment is needed) | AttribBitwiseOrExpr g (arg1,arg2),_ -> - let v1 = GenAttribArg cenv eenv arg1 ilArgTy - let v2 = GenAttribArg cenv eenv arg2 ilArgTy + let v1 = GenAttribArg amap g eenv arg1 ilArgTy + let v2 = GenAttribArg amap g eenv arg2 ilArgTy match v1,v2 with | ILAttribElem.SByte i1, ILAttribElem.SByte i2 -> ILAttribElem.SByte (i1 ||| i2) | ILAttribElem.Int16 i1, ILAttribElem.Int16 i2-> ILAttribElem.Int16 (i1 ||| i2) @@ -5856,25 +5859,24 @@ and GenAttribArg cenv eenv x (ilArgTy:ILType) = error (InternalError ("invalid custom attribute value (not a constant): " + showL (exprL x),x.Range)) -and GenAttr cenv eenv (Attrib(_,k,args,props,_,_,_)) = - let g = cenv.g +and GenAttr (amap: ImportMap) g eenv (Attrib(_,k,args,props,_,_,_)) = let props = props |> List.map (fun (AttribNamedArg(s,ty,fld,AttribExpr(_,expr))) -> let m = expr.Range - let ilTy = GenType cenv.amap m eenv.tyenv ty - let cval = GenAttribArg cenv eenv expr ilTy + let ilTy = GenType amap m eenv.tyenv ty + let cval = GenAttribArg amap g eenv expr ilTy (s,ilTy,fld,cval)) let mspec = match k with | ILAttrib(mref) -> mkILMethSpec(mref,AsObject,[],[]) | FSAttrib(vref) -> assert(vref.IsMember) - let mspec,_,_,_,_ = GetMethodSpecForMemberVal cenv.amap g (Option.get vref.MemberInfo) vref + let mspec,_,_,_,_ = GetMethodSpecForMemberVal amap g (Option.get vref.MemberInfo) vref mspec - let ilArgs = List.map2 (fun (AttribExpr(_,vexpr)) ty -> GenAttribArg cenv eenv vexpr ty) args mspec.FormalArgTypes + let ilArgs = List.map2 (fun (AttribExpr(_,vexpr)) ty -> GenAttribArg amap g eenv vexpr ty) args mspec.FormalArgTypes mkILCustomAttribMethRef g.ilg (mspec,ilArgs, props) -and GenAttrs cenv eenv attrs = List.map (GenAttr cenv eenv) attrs +and GenAttrs cenv eenv attrs = List.map (GenAttr cenv.amap cenv.g eenv) attrs and GenCompilationArgumentCountsAttr cenv (v:Val) = [ match v.ValReprInfo with @@ -5891,7 +5893,7 @@ and CreatePermissionSets cenv eenv (securityAttributes : Attrib list) = let action = match actions with | [AttribInt32Arg act] -> act | _ -> failwith "internal error: unrecognized security action" let secaction = (List.assoc action (Lazy.force ILSecurityActionRevMap)) let tref = tcref.CompiledRepresentationForNamedType - let ilattr = GenAttr cenv eenv attr + let ilattr = GenAttr cenv.amap cenv.g eenv attr let _, ilNamedArgs = match TryDecodeILAttribute cenv.g tref (mkILCustomAttrs [ilattr]) with | Some(ae,na) -> ae, na From 22918570fb6f4cc05a87e71e38336b911d3be79d Mon Sep 17 00:00:00 2001 From: Don Syme Date: Fri, 4 May 2018 11:52:58 +0100 Subject: [PATCH 014/160] simplify diff --- src/fsharp/IlxGen.fs | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/fsharp/IlxGen.fs b/src/fsharp/IlxGen.fs index 00d763c6978..c9cd2726d1f 100644 --- a/src/fsharp/IlxGen.fs +++ b/src/fsharp/IlxGen.fs @@ -4851,7 +4851,7 @@ and GenBindingAfterSequencePoint cenv cgbuf eenv sp (TBind(vspec,rhsExpr,_)) sta let tps,ctorThisValOpt,baseValOpt,vsl,body',bodyty = IteratedAdjustArityOfLambda cenv.g cenv.amap topValInfo rhsExpr let methodVars = List.concat vsl CommitStartScope cgbuf startScopeMarkOpt - GenMethodForBinding cenv cgbuf.mgbuf eenv (vspec,mspec,access,paramInfos,retInfo) (topValInfo,ctorThisValOpt,baseValOpt,tps,methodVars, body', bodyty) + GenMethodForBinding cenv cgbuf eenv (vspec,mspec,access,paramInfos,retInfo) (topValInfo,ctorThisValOpt,baseValOpt,tps,methodVars, body', bodyty) | StaticProperty (ilGetterMethSpec, optShadowLocal) -> @@ -5256,7 +5256,7 @@ and ComputeMethodImplAttribs cenv (_v:Val) attrs = hasPreserveSigImplFlag, hasSynchronizedImplFlag, hasNoInliningImplFlag, hasAggressiveInliningImplFlag, attrs and GenMethodForBinding - cenv mgbuf eenv + cenv cgbuf eenv (v:Val,mspec,access,paramInfos,retInfo) (topValInfo,ctorThisValOpt,baseValOpt,tps,methodVars, body, returnTy) = @@ -5320,7 +5320,7 @@ and GenMethodForBinding // This is the main code generation for most methods false, - MethodBody.IL(CodeGenMethodForExpr cenv mgbuf (SPAlways,tailCallInfo, mspec.Name, eenvForMeth, 0, 0, bodyExpr, sequel)), + MethodBody.IL(CodeGenMethodForExpr cenv cgbuf.mgbuf (SPAlways,tailCallInfo, mspec.Name, eenvForMeth, 0, 0, bodyExpr, sequel)), false // Do not generate DllImport attributes into the code - they are implicit from the P/Invoke @@ -5381,7 +5381,7 @@ and GenMethodForBinding else mdef CountMethodDef() - mgbuf.AddMethodDef(tref,mdef) + cgbuf.mgbuf.AddMethodDef(tref,mdef) match v.MemberInfo with @@ -5418,7 +5418,7 @@ and GenMethodForBinding let mdef = List.fold (fun mdef f -> f mdef) mdef flagFixups // fixup can potentially change name of reflected definition that was already recorded - patch it if necessary - mgbuf.ReplaceNameOfReflectedDefinition(v, mdef.Name) + cgbuf.mgbuf.ReplaceNameOfReflectedDefinition(v, mdef.Name) mdef else mkILGenericNonVirtualMethod (v.CompiledName,access,ilMethTypars,ilParams,ilReturn,ilMethodBody) @@ -5445,7 +5445,7 @@ and GenMethodForBinding // Emit the pseudo-property as an event, but not if its a private method impl if mdef.Access <> ILMemberAccess.Private then let edef = GenEventForProperty cenv eenvForMeth mspec v ilAttrsThatGoOnPrimaryItem m returnTy - mgbuf.AddEventDef(tref,edef) + cgbuf.mgbuf.AddEventDef(tref,edef) // The method def is dropped on the floor here else @@ -5455,7 +5455,7 @@ and GenMethodForBinding let ilPropTy = GenType cenv.amap m eenvUnderMethTypeTypars.tyenv vtyp let ilArgTys = v |> ArgInfosOfPropertyVal cenv.g |> List.map fst |> GenTypes cenv.amap m eenvUnderMethTypeTypars.tyenv let ilPropDef = GenPropertyForMethodDef compileAsInstance tref mdef v memberInfo ilArgTys ilPropTy (mkILCustomAttrs ilAttrsThatGoOnPrimaryItem) compiledName - mgbuf.AddOrMergePropertyDef(tref,ilPropDef,m) + cgbuf.mgbuf.AddOrMergePropertyDef(tref,ilPropDef,m) // Add the special name flag for all properties let mdef = { mdef.WithSpecialName with CustomAttrs= mkILCustomAttrs ((GenAttrs cenv eenv attrsAppliedToGetterOrSetter) @ sourceNameAttribs @ ilAttrsCompilerGenerated) } From a0f54ce1d7fdd2f55a6a7a1525f9abb926005b3c Mon Sep 17 00:00:00 2001 From: Don Syme Date: Fri, 4 May 2018 11:54:30 +0100 Subject: [PATCH 015/160] simplify diff --- src/fsharp/IlxGen.fs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/fsharp/IlxGen.fs b/src/fsharp/IlxGen.fs index c9cd2726d1f..865b3c2d535 100644 --- a/src/fsharp/IlxGen.fs +++ b/src/fsharp/IlxGen.fs @@ -5859,7 +5859,7 @@ and GenAttribArg amap g eenv x (ilArgTy:ILType) = error (InternalError ("invalid custom attribute value (not a constant): " + showL (exprL x),x.Range)) -and GenAttr (amap: ImportMap) g eenv (Attrib(_,k,args,props,_,_,_)) = +and GenAttr amap g eenv (Attrib(_,k,args,props,_,_,_)) = let props = props |> List.map (fun (AttribNamedArg(s,ty,fld,AttribExpr(_,expr))) -> let m = expr.Range From 1f5a26bcd757220a80618e1353c867bef0f9379e Mon Sep 17 00:00:00 2001 From: Don Syme Date: Fri, 4 May 2018 12:12:12 +0100 Subject: [PATCH 016/160] integrate dev15.8 --- src/fsharp/xlf/FSComp.txt.en.xlf | 5 ++--- src/fsharp/xlf/FSComp.txt.es.xlf | 5 ++--- src/fsharp/xlf/FSComp.txt.fr.xlf | 5 ++--- 3 files changed, 6 insertions(+), 9 deletions(-) diff --git a/src/fsharp/xlf/FSComp.txt.en.xlf b/src/fsharp/xlf/FSComp.txt.en.xlf index 7104be610f2..c0ce7e314fb 100644 --- a/src/fsharp/xlf/FSComp.txt.en.xlf +++ b/src/fsharp/xlf/FSComp.txt.en.xlf @@ -6982,7 +6982,6 @@ This expression returns a value of type '{0}' but is implicitly discarded. Consider using 'let' to bind the result to a name, e.g. 'let result = expression'. If you intended to use the expression as a value in the sequence then use an explicit 'yield!'. -<<<<<<< HEAD Unmatched '{{|' Unmatched '{{|' @@ -7016,11 +7015,11 @@ The input to a copy-and-update expression that creates an anonymous record must be either an anonymous record or a record The input to a copy-and-update expression that creates an anonymous record must be either an anonymous record or a record -======= + + The file '{0}' changed on disk unexpectedly, please reload. The file '{0}' changed on disk unexpectedly, please reload. ->>>>>>> c5d58714cc945bc489e860acfbd7056fd05cc622 diff --git a/src/fsharp/xlf/FSComp.txt.es.xlf b/src/fsharp/xlf/FSComp.txt.es.xlf index e247d1155de..99e40f18118 100644 --- a/src/fsharp/xlf/FSComp.txt.es.xlf +++ b/src/fsharp/xlf/FSComp.txt.es.xlf @@ -6982,7 +6982,6 @@ Esta expresión devuelve un valor de tipo “{0}”, pero se descarta de forma implícita. Considere el uso de “let” para enlazar el resultado a un nombre; por ejemplo, “let result = expression”. Si su intención es utilizar la expresión como un valor en la secuencia, utilice “yield” de forma explícita. -<<<<<<< HEAD Unmatched '{{|' Unmatched '{{|' @@ -7016,11 +7015,11 @@ The input to a copy-and-update expression that creates an anonymous record must be either an anonymous record or a record The input to a copy-and-update expression that creates an anonymous record must be either an anonymous record or a record -======= + + The file '{0}' changed on disk unexpectedly, please reload. El archivo "{0}" cambió en el disco de manera inesperada; cárguelo de nuevo. ->>>>>>> c5d58714cc945bc489e860acfbd7056fd05cc622 diff --git a/src/fsharp/xlf/FSComp.txt.fr.xlf b/src/fsharp/xlf/FSComp.txt.fr.xlf index e9f64c00051..9d8396cc6db 100644 --- a/src/fsharp/xlf/FSComp.txt.fr.xlf +++ b/src/fsharp/xlf/FSComp.txt.fr.xlf @@ -6982,7 +6982,6 @@ Cette expression retourne une valeur de type '{0}', mais est implicitement ignorée. Utilisez 'let' pour lier le résultat à un nom, par ex. 'let result = expression'. Si vous voulez utiliser l'expression comme valeur dans la séquence, utilisez un 'yield!' explicite. -<<<<<<< HEAD Unmatched '{{|' Unmatched '{{|' @@ -7016,11 +7015,11 @@ The input to a copy-and-update expression that creates an anonymous record must be either an anonymous record or a record The input to a copy-and-update expression that creates an anonymous record must be either an anonymous record or a record -======= + + The file '{0}' changed on disk unexpectedly, please reload. Changement inattendu du fichier '{0}' sur le disque. Rechargez le fichier. ->>>>>>> c5d58714cc945bc489e860acfbd7056fd05cc622 From ddb3ca87ec8fe91557db0e7d37342687b3dd8f64 Mon Sep 17 00:00:00 2001 From: Don Syme Date: Fri, 4 May 2018 12:29:31 +0100 Subject: [PATCH 017/160] integrate dev15.8 --- .../FSharp.Compiler.Private/FSComp.resx | 1 + src/fsharp/IlxGen.fs | 30 +++++++++---------- src/fsharp/IlxGen.fsi | 2 +- src/fsharp/symbols/Symbols.fs | 2 +- 4 files changed, 17 insertions(+), 18 deletions(-) diff --git a/src/buildfromsource/FSharp.Compiler.Private/FSComp.resx b/src/buildfromsource/FSharp.Compiler.Private/FSComp.resx index 45f72cf0bfc..2c7b2115d04 100644 --- a/src/buildfromsource/FSharp.Compiler.Private/FSComp.resx +++ b/src/buildfromsource/FSharp.Compiler.Private/FSComp.resx @@ -4323,6 +4323,7 @@ The file '{0}' changed on disk unexpectedly, please reload. + Invalid anonymous record expression diff --git a/src/fsharp/IlxGen.fs b/src/fsharp/IlxGen.fs index ce1c424b9d3..04bf2352b49 100644 --- a/src/fsharp/IlxGen.fs +++ b/src/fsharp/IlxGen.fs @@ -1187,10 +1187,11 @@ type AssemblyBuilder(cenv:cenv, anonTypeTable: AnonTypeGenerationTable) as mgbuf { Name = sprintf "<%s>j__TPar" nm Constraints = [] Variance=NonVariant - CustomAttrs = emptyILCustomAttrs + CustomAttrsStored = storeILCustomAttrs emptyILCustomAttrs HasReferenceTypeConstraint=false HasNotNullableValueTypeConstraint=false - HasDefaultConstructorConstraint= false } ] + HasDefaultConstructorConstraint= false + MetadataIndex = NoMetadataIdx } ] let ilTy = mkILFormalNamedTy (if isStruct then ILBoxity.AsValue else ILBoxity.AsObject) ilTypeRef ilGenericParams @@ -1199,21 +1200,21 @@ type AssemblyBuilder(cenv:cenv, anonTypeTable: AnonTypeGenerationTable) as mgbuf mkILFields [ for (_, fldName, fldTy) in flds -> let fdef = mkILInstanceField (fldName, fldTy, None, ILMemberAccess.Private) - { fdef with CustomAttrs = mkILCustomAttrs [ cenv.g.DebuggerBrowsableNeverAttribute ] } ] + fdef.With(customAttrs = mkILCustomAttrs [ cenv.g.DebuggerBrowsableNeverAttribute ]) ] // Generate property definitions for the fields compiled as properties let ilProperties = mkILProperties [ for (i,(propName, _fldName, fldTy)) in List.indexed flds -> - { Name = propName - Attributes = PropertyAttributes.None - SetMethod = None - GetMethod = Some(mkILMethRef(ilTypeRef,ILCallingConv.Instance,"get_" + propName,0,[],fldTy )) - CallingConv = ILCallingConv.Instance.ThisConv - Type = fldTy - Init = None - Args = [] - CustomAttrs = mkILCustomAttrs [ mkCompilationMappingAttrWithSeqNum cenv.g (int SourceConstructFlags.Field) i ] } ] + ILPropertyDef(name=propName, + attributes=PropertyAttributes.None, + setMethod=None, + getMethod=Some(mkILMethRef(ilTypeRef,ILCallingConv.Instance,"get_" + propName,0,[],fldTy )), + callingConv=ILCallingConv.Instance.ThisConv, + propertyType=fldTy, + init= None, + args=[], + customAttrs=mkILCustomAttrs [ mkCompilationMappingAttrWithSeqNum cenv.g (int SourceConstructFlags.Field) i ]) ] let ilMethods = [ for (propName, fldName, fldTy) in flds -> @@ -1281,11 +1282,8 @@ type AssemblyBuilder(cenv:cenv, anonTypeTable: AnonTypeGenerationTable) as mgbuf ilProperties, mkILEvents [], ilTypeDefAttribs, ILTypeInit.BeforeField) - let ilTypeDef = ilTypeDef.WithSealed(true).WithSerializable(true) - let ilTypeDef = { ilTypeDef with MethodImpls=mkILMethodImpls [] } - mgbuf.AddTypeDef(ilTypeRef, ilTypeDef, false, true, None) let extraBindings = @@ -7048,7 +7046,7 @@ type IlxGenResults = ilAssemAttrs : ILAttribute list ilNetModuleAttrs: ILAttribute list topAssemblyAttrs : Attribs - permissionSets : ILPermission list + permissionSets : ILSecurityDecl list quotationResourceInfo: (ILTypeRef list * byte[]) list } diff --git a/src/fsharp/IlxGen.fsi b/src/fsharp/IlxGen.fsi index b0333585751..6d50da1bfd3 100644 --- a/src/fsharp/IlxGen.fsi +++ b/src/fsharp/IlxGen.fsi @@ -65,7 +65,7 @@ type public IlxGenResults = /// The attributes for the assembly in F# form topAssemblyAttrs : Attribs /// The security attributes to attach to the assembly - permissionSets : ILPermission list + permissionSets : ILSecurityDecl list /// The generated IL/ILX resources associated with F# quotations quotationResourceInfo : (ILTypeRef list * byte[]) list } diff --git a/src/fsharp/symbols/Symbols.fs b/src/fsharp/symbols/Symbols.fs index f202280c400..cd7ee0dfbfa 100644 --- a/src/fsharp/symbols/Symbols.fs +++ b/src/fsharp/symbols/Symbols.fs @@ -831,7 +831,7 @@ and FSharpFieldData = | Union (v, _) -> Some v.TyconRef | ILField f -> Some f.DeclaringTyconRef -and FSharpAnonRecordTypeDetails(cenv: cenv, anonInfo: AnonRecdTypeInfo) = +and FSharpAnonRecordTypeDetails(cenv: SymbolEnv, anonInfo: AnonRecdTypeInfo) = member __.Assembly = FSharpAssembly (cenv, anonInfo.Assembly) /// Names of any enclosing types of the compiled form of the anonymous type (if the anonymous type was defined as a nested type) From f05a399437aac5c4d552a75420e323ce30558c10 Mon Sep 17 00:00:00 2001 From: Don Syme Date: Fri, 1 Jun 2018 19:03:50 +0100 Subject: [PATCH 018/160] integrate dev15.8 --- src/fsharp/IlxGen.fs | 2 +- src/fsharp/TypeChecker.fs | 2 +- src/fsharp/xlf/FSComp.txt.cs.xlf | 35 +++++++++++++++++++++++++++ src/fsharp/xlf/FSComp.txt.de.xlf | 35 +++++++++++++++++++++++++++ src/fsharp/xlf/FSComp.txt.en.xlf | 35 +++++++++++++++++++++++++++ src/fsharp/xlf/FSComp.txt.es.xlf | 35 +++++++++++++++++++++++++++ src/fsharp/xlf/FSComp.txt.fr.xlf | 35 +++++++++++++++++++++++++++ src/fsharp/xlf/FSComp.txt.it.xlf | 35 +++++++++++++++++++++++++++ src/fsharp/xlf/FSComp.txt.ja.xlf | 35 +++++++++++++++++++++++++++ src/fsharp/xlf/FSComp.txt.ko.xlf | 35 +++++++++++++++++++++++++++ src/fsharp/xlf/FSComp.txt.pl.xlf | 35 +++++++++++++++++++++++++++ src/fsharp/xlf/FSComp.txt.pt-BR.xlf | 35 +++++++++++++++++++++++++++ src/fsharp/xlf/FSComp.txt.ru.xlf | 35 +++++++++++++++++++++++++++ src/fsharp/xlf/FSComp.txt.tr.xlf | 35 +++++++++++++++++++++++++++ src/fsharp/xlf/FSComp.txt.zh-Hans.xlf | 35 +++++++++++++++++++++++++++ src/fsharp/xlf/FSComp.txt.zh-Hant.xlf | 35 +++++++++++++++++++++++++++ 16 files changed, 492 insertions(+), 2 deletions(-) diff --git a/src/fsharp/IlxGen.fs b/src/fsharp/IlxGen.fs index e9ff12f4995..21919af855c 100644 --- a/src/fsharp/IlxGen.fs +++ b/src/fsharp/IlxGen.fs @@ -7114,7 +7114,7 @@ let GenerateCode (cenv, anonTypeTable, eenv, TypedAssemblyAfterOptimization file let ilNetModuleAttrs = GenAttrs cenv eenv moduleAttribs let casApplied = new Dictionary() - let securityAttrs, topAssemblyAttrs = assemAttribs |> List.partition (fun a -> TypeChecker.IsSecurityAttribute cenv.g cenv.amap casApplied a rangeStartup) + let securityAttrs, topAssemblyAttrs = assemAttribs |> List.partition (fun a -> IsSecurityAttribute cenv.g cenv.amap casApplied a rangeStartup) // remove any security attributes from the top-level assembly attribute list let permissionSets = CreatePermissionSets cenv eenv securityAttrs diff --git a/src/fsharp/TypeChecker.fs b/src/fsharp/TypeChecker.fs index 1a89e9df94a..b611f96764e 100755 --- a/src/fsharp/TypeChecker.fs +++ b/src/fsharp/TypeChecker.fs @@ -9264,7 +9264,7 @@ and TcLookupThen cenv overallTy env tpenv mObjExpr objExpr objExprTy longId dela | _ -> // Instance F# Anonymous Record let objExpr' = mkAnonRecdFieldGet cenv.g (anonInfo,objExpr,tinst,n,mExprAndItem) - PropagateThenTcDelayed cenv overallTy env tpenv mExprAndItem (MakeApplicableExprWithFlex cenv env objExpr') fieldTy ExprAtomicFlag.Atomic delayed + PropagateThenTcDelayed cenv overallTy env tpenv mExprAndItem (MakeApplicableExprWithFlex cenv env false objExpr') fieldTy ExprAtomicFlag.Atomic delayed | Item.ILField finfo -> // Get or set instance IL field diff --git a/src/fsharp/xlf/FSComp.txt.cs.xlf b/src/fsharp/xlf/FSComp.txt.cs.xlf index dbf10a3bfbe..257dd5f5915 100644 --- a/src/fsharp/xlf/FSComp.txt.cs.xlf +++ b/src/fsharp/xlf/FSComp.txt.cs.xlf @@ -6992,6 +6992,41 @@ Soubor {0} se na disku neočekávaně změnil, opakujte prosím načtení. + + Unmatched '{{|' + Unmatched '{{|' + + + + anonymous record field + anonymous record field + + + + Two anonymous record types are from different assemblies '{0}' and '{1}' + Two anonymous record types are from different assemblies '{0}' and '{1}' + + + + Two anonymous record types have mismatched sets of field names '{0}' and '{1}' + Two anonymous record types have mismatched sets of field names '{0}' and '{1}' + + + + Invalid anonymous record expression + Invalid anonymous record expression + + + + Invalid anonymous record type + Invalid anonymous record type + + + + The input to a copy-and-update expression that creates an anonymous record must be either an anonymous record or a record + The input to a copy-and-update expression that creates an anonymous record must be either an anonymous record or a record + + \ No newline at end of file diff --git a/src/fsharp/xlf/FSComp.txt.de.xlf b/src/fsharp/xlf/FSComp.txt.de.xlf index 2b2f389f8c0..4109cd68690 100644 --- a/src/fsharp/xlf/FSComp.txt.de.xlf +++ b/src/fsharp/xlf/FSComp.txt.de.xlf @@ -6992,6 +6992,41 @@ Die Datei "{0}" wurde auf dem Datenträger unerwartet geändert. Laden Sie sie erneut. + + Unmatched '{{|' + Unmatched '{{|' + + + + anonymous record field + anonymous record field + + + + Two anonymous record types are from different assemblies '{0}' and '{1}' + Two anonymous record types are from different assemblies '{0}' and '{1}' + + + + Two anonymous record types have mismatched sets of field names '{0}' and '{1}' + Two anonymous record types have mismatched sets of field names '{0}' and '{1}' + + + + Invalid anonymous record expression + Invalid anonymous record expression + + + + Invalid anonymous record type + Invalid anonymous record type + + + + The input to a copy-and-update expression that creates an anonymous record must be either an anonymous record or a record + The input to a copy-and-update expression that creates an anonymous record must be either an anonymous record or a record + + \ No newline at end of file diff --git a/src/fsharp/xlf/FSComp.txt.en.xlf b/src/fsharp/xlf/FSComp.txt.en.xlf index a6d5886d83e..6771f09a02c 100644 --- a/src/fsharp/xlf/FSComp.txt.en.xlf +++ b/src/fsharp/xlf/FSComp.txt.en.xlf @@ -6992,6 +6992,41 @@ The file '{0}' changed on disk unexpectedly, please reload. + + Unmatched '{{|' + Unmatched '{{|' + + + + anonymous record field + anonymous record field + + + + Two anonymous record types are from different assemblies '{0}' and '{1}' + Two anonymous record types are from different assemblies '{0}' and '{1}' + + + + Two anonymous record types have mismatched sets of field names '{0}' and '{1}' + Two anonymous record types have mismatched sets of field names '{0}' and '{1}' + + + + Invalid anonymous record expression + Invalid anonymous record expression + + + + Invalid anonymous record type + Invalid anonymous record type + + + + The input to a copy-and-update expression that creates an anonymous record must be either an anonymous record or a record + The input to a copy-and-update expression that creates an anonymous record must be either an anonymous record or a record + + \ No newline at end of file diff --git a/src/fsharp/xlf/FSComp.txt.es.xlf b/src/fsharp/xlf/FSComp.txt.es.xlf index 8b9e9460757..3853cbc815e 100644 --- a/src/fsharp/xlf/FSComp.txt.es.xlf +++ b/src/fsharp/xlf/FSComp.txt.es.xlf @@ -6992,6 +6992,41 @@ El archivo "{0}" cambió en el disco de manera inesperada; cárguelo de nuevo. + + Unmatched '{{|' + Unmatched '{{|' + + + + anonymous record field + anonymous record field + + + + Two anonymous record types are from different assemblies '{0}' and '{1}' + Two anonymous record types are from different assemblies '{0}' and '{1}' + + + + Two anonymous record types have mismatched sets of field names '{0}' and '{1}' + Two anonymous record types have mismatched sets of field names '{0}' and '{1}' + + + + Invalid anonymous record expression + Invalid anonymous record expression + + + + Invalid anonymous record type + Invalid anonymous record type + + + + The input to a copy-and-update expression that creates an anonymous record must be either an anonymous record or a record + The input to a copy-and-update expression that creates an anonymous record must be either an anonymous record or a record + + \ No newline at end of file diff --git a/src/fsharp/xlf/FSComp.txt.fr.xlf b/src/fsharp/xlf/FSComp.txt.fr.xlf index 02c238295c2..41f7f38ed36 100644 --- a/src/fsharp/xlf/FSComp.txt.fr.xlf +++ b/src/fsharp/xlf/FSComp.txt.fr.xlf @@ -6992,6 +6992,41 @@ Changement inattendu du fichier '{0}' sur le disque. Rechargez le fichier. + + Unmatched '{{|' + Unmatched '{{|' + + + + anonymous record field + anonymous record field + + + + Two anonymous record types are from different assemblies '{0}' and '{1}' + Two anonymous record types are from different assemblies '{0}' and '{1}' + + + + Two anonymous record types have mismatched sets of field names '{0}' and '{1}' + Two anonymous record types have mismatched sets of field names '{0}' and '{1}' + + + + Invalid anonymous record expression + Invalid anonymous record expression + + + + Invalid anonymous record type + Invalid anonymous record type + + + + The input to a copy-and-update expression that creates an anonymous record must be either an anonymous record or a record + The input to a copy-and-update expression that creates an anonymous record must be either an anonymous record or a record + + \ No newline at end of file diff --git a/src/fsharp/xlf/FSComp.txt.it.xlf b/src/fsharp/xlf/FSComp.txt.it.xlf index 5234a47fed1..4048e90c2b0 100644 --- a/src/fsharp/xlf/FSComp.txt.it.xlf +++ b/src/fsharp/xlf/FSComp.txt.it.xlf @@ -6992,6 +6992,41 @@ Il file '{0}' è stato modificato su disco in modo imprevisto. Ricaricare. + + Unmatched '{{|' + Unmatched '{{|' + + + + anonymous record field + anonymous record field + + + + Two anonymous record types are from different assemblies '{0}' and '{1}' + Two anonymous record types are from different assemblies '{0}' and '{1}' + + + + Two anonymous record types have mismatched sets of field names '{0}' and '{1}' + Two anonymous record types have mismatched sets of field names '{0}' and '{1}' + + + + Invalid anonymous record expression + Invalid anonymous record expression + + + + Invalid anonymous record type + Invalid anonymous record type + + + + The input to a copy-and-update expression that creates an anonymous record must be either an anonymous record or a record + The input to a copy-and-update expression that creates an anonymous record must be either an anonymous record or a record + + \ No newline at end of file diff --git a/src/fsharp/xlf/FSComp.txt.ja.xlf b/src/fsharp/xlf/FSComp.txt.ja.xlf index f2897a4d7b7..c37f1342174 100644 --- a/src/fsharp/xlf/FSComp.txt.ja.xlf +++ b/src/fsharp/xlf/FSComp.txt.ja.xlf @@ -6992,6 +6992,41 @@ ファイル '{0}' がディスク上で予期せず変更されました。再度読み込んでください。 + + Unmatched '{{|' + Unmatched '{{|' + + + + anonymous record field + anonymous record field + + + + Two anonymous record types are from different assemblies '{0}' and '{1}' + Two anonymous record types are from different assemblies '{0}' and '{1}' + + + + Two anonymous record types have mismatched sets of field names '{0}' and '{1}' + Two anonymous record types have mismatched sets of field names '{0}' and '{1}' + + + + Invalid anonymous record expression + Invalid anonymous record expression + + + + Invalid anonymous record type + Invalid anonymous record type + + + + The input to a copy-and-update expression that creates an anonymous record must be either an anonymous record or a record + The input to a copy-and-update expression that creates an anonymous record must be either an anonymous record or a record + + \ No newline at end of file diff --git a/src/fsharp/xlf/FSComp.txt.ko.xlf b/src/fsharp/xlf/FSComp.txt.ko.xlf index d13f1ff6080..af5289589e9 100644 --- a/src/fsharp/xlf/FSComp.txt.ko.xlf +++ b/src/fsharp/xlf/FSComp.txt.ko.xlf @@ -6992,6 +6992,41 @@ '{0}' 파일이 디스크에서 예기치 않게 변경되었습니다. 다시 로드하세요. + + Unmatched '{{|' + Unmatched '{{|' + + + + anonymous record field + anonymous record field + + + + Two anonymous record types are from different assemblies '{0}' and '{1}' + Two anonymous record types are from different assemblies '{0}' and '{1}' + + + + Two anonymous record types have mismatched sets of field names '{0}' and '{1}' + Two anonymous record types have mismatched sets of field names '{0}' and '{1}' + + + + Invalid anonymous record expression + Invalid anonymous record expression + + + + Invalid anonymous record type + Invalid anonymous record type + + + + The input to a copy-and-update expression that creates an anonymous record must be either an anonymous record or a record + The input to a copy-and-update expression that creates an anonymous record must be either an anonymous record or a record + + \ No newline at end of file diff --git a/src/fsharp/xlf/FSComp.txt.pl.xlf b/src/fsharp/xlf/FSComp.txt.pl.xlf index 78155117999..4d5d5def87e 100644 --- a/src/fsharp/xlf/FSComp.txt.pl.xlf +++ b/src/fsharp/xlf/FSComp.txt.pl.xlf @@ -6992,6 +6992,41 @@ Plik „{0}” nieoczekiwanie uległ zmianie na dysku. Załaduj go ponownie. + + Unmatched '{{|' + Unmatched '{{|' + + + + anonymous record field + anonymous record field + + + + Two anonymous record types are from different assemblies '{0}' and '{1}' + Two anonymous record types are from different assemblies '{0}' and '{1}' + + + + Two anonymous record types have mismatched sets of field names '{0}' and '{1}' + Two anonymous record types have mismatched sets of field names '{0}' and '{1}' + + + + Invalid anonymous record expression + Invalid anonymous record expression + + + + Invalid anonymous record type + Invalid anonymous record type + + + + The input to a copy-and-update expression that creates an anonymous record must be either an anonymous record or a record + The input to a copy-and-update expression that creates an anonymous record must be either an anonymous record or a record + + \ No newline at end of file diff --git a/src/fsharp/xlf/FSComp.txt.pt-BR.xlf b/src/fsharp/xlf/FSComp.txt.pt-BR.xlf index 6098e8f2323..654a8aade8d 100644 --- a/src/fsharp/xlf/FSComp.txt.pt-BR.xlf +++ b/src/fsharp/xlf/FSComp.txt.pt-BR.xlf @@ -6992,6 +6992,41 @@ O arquivo '{0}' foi alterado no disco inesperadamente. Recarregue-o. + + Unmatched '{{|' + Unmatched '{{|' + + + + anonymous record field + anonymous record field + + + + Two anonymous record types are from different assemblies '{0}' and '{1}' + Two anonymous record types are from different assemblies '{0}' and '{1}' + + + + Two anonymous record types have mismatched sets of field names '{0}' and '{1}' + Two anonymous record types have mismatched sets of field names '{0}' and '{1}' + + + + Invalid anonymous record expression + Invalid anonymous record expression + + + + Invalid anonymous record type + Invalid anonymous record type + + + + The input to a copy-and-update expression that creates an anonymous record must be either an anonymous record or a record + The input to a copy-and-update expression that creates an anonymous record must be either an anonymous record or a record + + \ No newline at end of file diff --git a/src/fsharp/xlf/FSComp.txt.ru.xlf b/src/fsharp/xlf/FSComp.txt.ru.xlf index 5ea6fd8115f..5ab24a0abac 100644 --- a/src/fsharp/xlf/FSComp.txt.ru.xlf +++ b/src/fsharp/xlf/FSComp.txt.ru.xlf @@ -6992,6 +6992,41 @@ Файл "{0}" был неожиданно изменен на диске, повторите загрузку. + + Unmatched '{{|' + Unmatched '{{|' + + + + anonymous record field + anonymous record field + + + + Two anonymous record types are from different assemblies '{0}' and '{1}' + Two anonymous record types are from different assemblies '{0}' and '{1}' + + + + Two anonymous record types have mismatched sets of field names '{0}' and '{1}' + Two anonymous record types have mismatched sets of field names '{0}' and '{1}' + + + + Invalid anonymous record expression + Invalid anonymous record expression + + + + Invalid anonymous record type + Invalid anonymous record type + + + + The input to a copy-and-update expression that creates an anonymous record must be either an anonymous record or a record + The input to a copy-and-update expression that creates an anonymous record must be either an anonymous record or a record + + \ No newline at end of file diff --git a/src/fsharp/xlf/FSComp.txt.tr.xlf b/src/fsharp/xlf/FSComp.txt.tr.xlf index e83e67cdaee..5a87859f3ab 100644 --- a/src/fsharp/xlf/FSComp.txt.tr.xlf +++ b/src/fsharp/xlf/FSComp.txt.tr.xlf @@ -6992,6 +6992,41 @@ Diskte '{0}' dosyası beklenmedik şekilde değiştirildi. Lütfen yeniden yükleyin. + + Unmatched '{{|' + Unmatched '{{|' + + + + anonymous record field + anonymous record field + + + + Two anonymous record types are from different assemblies '{0}' and '{1}' + Two anonymous record types are from different assemblies '{0}' and '{1}' + + + + Two anonymous record types have mismatched sets of field names '{0}' and '{1}' + Two anonymous record types have mismatched sets of field names '{0}' and '{1}' + + + + Invalid anonymous record expression + Invalid anonymous record expression + + + + Invalid anonymous record type + Invalid anonymous record type + + + + The input to a copy-and-update expression that creates an anonymous record must be either an anonymous record or a record + The input to a copy-and-update expression that creates an anonymous record must be either an anonymous record or a record + + \ No newline at end of file diff --git a/src/fsharp/xlf/FSComp.txt.zh-Hans.xlf b/src/fsharp/xlf/FSComp.txt.zh-Hans.xlf index 51c322df89e..87d6fb2f11e 100644 --- a/src/fsharp/xlf/FSComp.txt.zh-Hans.xlf +++ b/src/fsharp/xlf/FSComp.txt.zh-Hans.xlf @@ -6992,6 +6992,41 @@ 文件“{0}”在磁盘上意外更改,请重新加载。 + + Unmatched '{{|' + Unmatched '{{|' + + + + anonymous record field + anonymous record field + + + + Two anonymous record types are from different assemblies '{0}' and '{1}' + Two anonymous record types are from different assemblies '{0}' and '{1}' + + + + Two anonymous record types have mismatched sets of field names '{0}' and '{1}' + Two anonymous record types have mismatched sets of field names '{0}' and '{1}' + + + + Invalid anonymous record expression + Invalid anonymous record expression + + + + Invalid anonymous record type + Invalid anonymous record type + + + + The input to a copy-and-update expression that creates an anonymous record must be either an anonymous record or a record + The input to a copy-and-update expression that creates an anonymous record must be either an anonymous record or a record + + \ No newline at end of file diff --git a/src/fsharp/xlf/FSComp.txt.zh-Hant.xlf b/src/fsharp/xlf/FSComp.txt.zh-Hant.xlf index a3db27ef514..6463fe001b1 100644 --- a/src/fsharp/xlf/FSComp.txt.zh-Hant.xlf +++ b/src/fsharp/xlf/FSComp.txt.zh-Hant.xlf @@ -6992,6 +6992,41 @@ 檔案 '{0}' 在磁碟上意外變更,請重新載入。 + + Unmatched '{{|' + Unmatched '{{|' + + + + anonymous record field + anonymous record field + + + + Two anonymous record types are from different assemblies '{0}' and '{1}' + Two anonymous record types are from different assemblies '{0}' and '{1}' + + + + Two anonymous record types have mismatched sets of field names '{0}' and '{1}' + Two anonymous record types have mismatched sets of field names '{0}' and '{1}' + + + + Invalid anonymous record expression + Invalid anonymous record expression + + + + Invalid anonymous record type + Invalid anonymous record type + + + + The input to a copy-and-update expression that creates an anonymous record must be either an anonymous record or a record + The input to a copy-and-update expression that creates an anonymous record must be either an anonymous record or a record + + \ No newline at end of file From 579f31b4685fa3b71cb4c34dacaaa9aed1bae6a8 Mon Sep 17 00:00:00 2001 From: Don Syme Date: Fri, 1 Jun 2018 19:10:39 +0100 Subject: [PATCH 019/160] update FSComp --- .../FSharp.Compiler.Private/FSComp.fs | 2809 +++++++++-------- .../FSharp.Compiler.Private/FSComp.resx | 2 +- 2 files changed, 1407 insertions(+), 1404 deletions(-) diff --git a/src/buildfromsource/FSharp.Compiler.Private/FSComp.fs b/src/buildfromsource/FSharp.Compiler.Private/FSComp.fs index 0095154b289..d0b3bf9e4e1 100644 --- a/src/buildfromsource/FSharp.Compiler.Private/FSComp.fs +++ b/src/buildfromsource/FSharp.Compiler.Private/FSComp.fs @@ -1,4 +1,4 @@ -// This is a generated file; the original input is '../FSComp.txt' +// This is a generated file; the original input is '..\FSComp.txt' namespace FSComp open Microsoft.FSharp.Core.LanguagePrimitives.IntrinsicOperators @@ -116,3940 +116,3943 @@ type internal SR private() = // END BOILERPLATE /// The namespace '%s' is not defined. - /// (Originally from ../FSComp.txt:4) + /// (Originally from ..\FSComp.txt:4) static member undefinedNameNamespace(a0 : System.String) = (GetStringFunc("undefinedNameNamespace",",,,%s,,,") a0) /// The namespace or module '%s' is not defined. - /// (Originally from ../FSComp.txt:5) + /// (Originally from ..\FSComp.txt:5) static member undefinedNameNamespaceOrModule(a0 : System.String) = (GetStringFunc("undefinedNameNamespaceOrModule",",,,%s,,,") a0) /// The field, constructor or member '%s' is not defined. - /// (Originally from ../FSComp.txt:6) + /// (Originally from ..\FSComp.txt:6) static member undefinedNameFieldConstructorOrMember(a0 : System.String) = (GetStringFunc("undefinedNameFieldConstructorOrMember",",,,%s,,,") a0) /// The value, constructor, namespace or type '%s' is not defined. - /// (Originally from ../FSComp.txt:7) + /// (Originally from ..\FSComp.txt:7) static member undefinedNameValueConstructorNamespaceOrType(a0 : System.String) = (GetStringFunc("undefinedNameValueConstructorNamespaceOrType",",,,%s,,,") a0) /// The value or constructor '%s' is not defined. - /// (Originally from ../FSComp.txt:8) + /// (Originally from ..\FSComp.txt:8) static member undefinedNameValueOfConstructor(a0 : System.String) = (GetStringFunc("undefinedNameValueOfConstructor",",,,%s,,,") a0) /// The value, namespace, type or module '%s' is not defined. - /// (Originally from ../FSComp.txt:9) + /// (Originally from ..\FSComp.txt:9) static member undefinedNameValueNamespaceTypeOrModule(a0 : System.String) = (GetStringFunc("undefinedNameValueNamespaceTypeOrModule",",,,%s,,,") a0) /// The constructor, module or namespace '%s' is not defined. - /// (Originally from ../FSComp.txt:10) + /// (Originally from ..\FSComp.txt:10) static member undefinedNameConstructorModuleOrNamespace(a0 : System.String) = (GetStringFunc("undefinedNameConstructorModuleOrNamespace",",,,%s,,,") a0) /// The type '%s' is not defined. - /// (Originally from ../FSComp.txt:11) + /// (Originally from ..\FSComp.txt:11) static member undefinedNameType(a0 : System.String) = (GetStringFunc("undefinedNameType",",,,%s,,,") a0) /// The type '%s' is not defined in '%s'. - /// (Originally from ../FSComp.txt:12) + /// (Originally from ..\FSComp.txt:12) static member undefinedNameTypeIn(a0 : System.String, a1 : System.String) = (GetStringFunc("undefinedNameTypeIn",",,,%s,,,%s,,,") a0 a1) /// The record label or namespace '%s' is not defined. - /// (Originally from ../FSComp.txt:13) + /// (Originally from ..\FSComp.txt:13) static member undefinedNameRecordLabelOrNamespace(a0 : System.String) = (GetStringFunc("undefinedNameRecordLabelOrNamespace",",,,%s,,,") a0) /// The record label '%s' is not defined. - /// (Originally from ../FSComp.txt:14) + /// (Originally from ..\FSComp.txt:14) static member undefinedNameRecordLabel(a0 : System.String) = (GetStringFunc("undefinedNameRecordLabel",",,,%s,,,") a0) /// Maybe you want one of the following: - /// (Originally from ../FSComp.txt:15) + /// (Originally from ..\FSComp.txt:15) static member undefinedNameSuggestionsIntro() = (GetStringFunc("undefinedNameSuggestionsIntro",",,,") ) /// The type parameter %s is not defined. - /// (Originally from ../FSComp.txt:16) + /// (Originally from ..\FSComp.txt:16) static member undefinedNameTypeParameter(a0 : System.String) = (GetStringFunc("undefinedNameTypeParameter",",,,%s,,,") a0) /// The pattern discriminator '%s' is not defined. - /// (Originally from ../FSComp.txt:17) + /// (Originally from ..\FSComp.txt:17) static member undefinedNamePatternDiscriminator(a0 : System.String) = (GetStringFunc("undefinedNamePatternDiscriminator",",,,%s,,,") a0) /// Replace with '%s' - /// (Originally from ../FSComp.txt:18) + /// (Originally from ..\FSComp.txt:18) static member replaceWithSuggestion(a0 : System.String) = (GetStringFunc("replaceWithSuggestion",",,,%s,,,") a0) /// Add . for indexer access. - /// (Originally from ../FSComp.txt:19) + /// (Originally from ..\FSComp.txt:19) static member addIndexerDot() = (GetStringFunc("addIndexerDot",",,,") ) /// All elements of a list constructor expression must have the same type. This expression was expected to have type '%s', but here has type '%s'. - /// (Originally from ../FSComp.txt:20) + /// (Originally from ..\FSComp.txt:20) static member listElementHasWrongType(a0 : System.String, a1 : System.String) = (GetStringFunc("listElementHasWrongType",",,,%s,,,%s,,,") a0 a1) /// All elements of an array constructor expression must have the same type. This expression was expected to have type '%s', but here has type '%s'. - /// (Originally from ../FSComp.txt:21) + /// (Originally from ..\FSComp.txt:21) static member arrayElementHasWrongType(a0 : System.String, a1 : System.String) = (GetStringFunc("arrayElementHasWrongType",",,,%s,,,%s,,,") a0 a1) /// The 'if' expression is missing an 'else' branch. The 'then' branch has type '%s'. Because 'if' is an expression, and not a statement, add an 'else' branch which returns a value of the same type. - /// (Originally from ../FSComp.txt:22) + /// (Originally from ..\FSComp.txt:22) static member missingElseBranch(a0 : System.String) = (GetStringFunc("missingElseBranch",",,,%s,,,") a0) /// The 'if' expression needs to have type '%s' to satisfy context type requirements. It currently has type '%s'. - /// (Originally from ../FSComp.txt:23) + /// (Originally from ..\FSComp.txt:23) static member ifExpression(a0 : System.String, a1 : System.String) = (GetStringFunc("ifExpression",",,,%s,,,%s,,,") a0 a1) /// All branches of an 'if' expression must have the same type. This expression was expected to have type '%s', but here has type '%s'. - /// (Originally from ../FSComp.txt:24) + /// (Originally from ..\FSComp.txt:24) static member elseBranchHasWrongType(a0 : System.String, a1 : System.String) = (GetStringFunc("elseBranchHasWrongType",",,,%s,,,%s,,,") a0 a1) /// All branches of a pattern match expression must return values of the same type. The first branch returned a value of type '%s', but this branch returned a value of type '%s'. - /// (Originally from ../FSComp.txt:25) + /// (Originally from ..\FSComp.txt:25) static member followingPatternMatchClauseHasWrongType(a0 : System.String, a1 : System.String) = (GetStringFunc("followingPatternMatchClauseHasWrongType",",,,%s,,,%s,,,") a0 a1) /// A pattern match guard must be of type 'bool', but this 'when' expression is of type '%s'. - /// (Originally from ../FSComp.txt:26) + /// (Originally from ..\FSComp.txt:26) static member patternMatchGuardIsNotBool(a0 : System.String) = (GetStringFunc("patternMatchGuardIsNotBool",",,,%s,,,") a0) /// A ';' is used to separate field values in records. Consider replacing ',' with ';'. - /// (Originally from ../FSComp.txt:27) + /// (Originally from ..\FSComp.txt:27) static member commaInsteadOfSemicolonInRecord() = (GetStringFunc("commaInsteadOfSemicolonInRecord",",,,") ) /// The '!' operator is used to dereference a ref cell. Consider using 'not expr' here. - /// (Originally from ../FSComp.txt:28) + /// (Originally from ..\FSComp.txt:28) static member derefInsteadOfNot() = (GetStringFunc("derefInsteadOfNot",",,,") ) /// The non-generic type '%s' does not expect any type arguments, but here is given %d type argument(s) - /// (Originally from ../FSComp.txt:29) + /// (Originally from ..\FSComp.txt:29) static member buildUnexpectedTypeArgs(a0 : System.String, a1 : System.Int32) = (GetStringFunc("buildUnexpectedTypeArgs",",,,%s,,,%d,,,") a0 a1) /// Consider using 'return!' instead of 'return'. - /// (Originally from ../FSComp.txt:30) + /// (Originally from ..\FSComp.txt:30) static member returnUsedInsteadOfReturnBang() = (GetStringFunc("returnUsedInsteadOfReturnBang",",,,") ) /// Consider using 'yield!' instead of 'yield'. - /// (Originally from ../FSComp.txt:31) + /// (Originally from ..\FSComp.txt:31) static member yieldUsedInsteadOfYieldBang() = (GetStringFunc("yieldUsedInsteadOfYieldBang",",,,") ) /// \nA tuple type is required for one or more arguments. Consider wrapping the given arguments in additional parentheses or review the definition of the interface. - /// (Originally from ../FSComp.txt:32) + /// (Originally from ..\FSComp.txt:32) static member tupleRequiredInAbstractMethod() = (GetStringFunc("tupleRequiredInAbstractMethod",",,,") ) /// Invalid warning number '%s' - /// (Originally from ../FSComp.txt:33) + /// (Originally from ..\FSComp.txt:33) static member buildInvalidWarningNumber(a0 : System.String) = (203, GetStringFunc("buildInvalidWarningNumber",",,,%s,,,") a0) /// Invalid version string '%s' - /// (Originally from ../FSComp.txt:34) + /// (Originally from ..\FSComp.txt:34) static member buildInvalidVersionString(a0 : System.String) = (204, GetStringFunc("buildInvalidVersionString",",,,%s,,,") a0) /// Invalid version file '%s' - /// (Originally from ../FSComp.txt:35) + /// (Originally from ..\FSComp.txt:35) static member buildInvalidVersionFile(a0 : System.String) = (205, GetStringFunc("buildInvalidVersionFile",",,,%s,,,") a0) /// Microsoft (R) F# Compiler version %s - /// (Originally from ../FSComp.txt:36) + /// (Originally from ..\FSComp.txt:36) static member buildProductName(a0 : System.String) = (GetStringFunc("buildProductName",",,,%s,,,") a0) /// F# Compiler for F# %s - /// (Originally from ../FSComp.txt:37) + /// (Originally from ..\FSComp.txt:37) static member buildProductNameCommunity(a0 : System.String) = (GetStringFunc("buildProductNameCommunity",",,,%s,,,") a0) /// Problem with filename '%s': %s - /// (Originally from ../FSComp.txt:38) + /// (Originally from ..\FSComp.txt:38) static member buildProblemWithFilename(a0 : System.String, a1 : System.String) = (206, GetStringFunc("buildProblemWithFilename",",,,%s,,,%s,,,") a0 a1) /// No inputs specified - /// (Originally from ../FSComp.txt:39) + /// (Originally from ..\FSComp.txt:39) static member buildNoInputsSpecified() = (207, GetStringFunc("buildNoInputsSpecified",",,,") ) /// The '--pdb' option requires the '--debug' option to be used - /// (Originally from ../FSComp.txt:40) + /// (Originally from ..\FSComp.txt:40) static member buildPdbRequiresDebug() = (209, GetStringFunc("buildPdbRequiresDebug",",,,") ) /// The search directory '%s' is invalid - /// (Originally from ../FSComp.txt:41) + /// (Originally from ..\FSComp.txt:41) static member buildInvalidSearchDirectory(a0 : System.String) = (210, GetStringFunc("buildInvalidSearchDirectory",",,,%s,,,") a0) /// The search directory '%s' could not be found - /// (Originally from ../FSComp.txt:42) + /// (Originally from ..\FSComp.txt:42) static member buildSearchDirectoryNotFound(a0 : System.String) = (211, GetStringFunc("buildSearchDirectoryNotFound",",,,%s,,,") a0) /// '%s' is not a valid filename - /// (Originally from ../FSComp.txt:43) + /// (Originally from ..\FSComp.txt:43) static member buildInvalidFilename(a0 : System.String) = (212, GetStringFunc("buildInvalidFilename",",,,%s,,,") a0) /// '%s' is not a valid assembly name - /// (Originally from ../FSComp.txt:44) + /// (Originally from ..\FSComp.txt:44) static member buildInvalidAssemblyName(a0 : System.String) = (213, GetStringFunc("buildInvalidAssemblyName",",,,%s,,,") a0) /// Unrecognized privacy setting '%s' for managed resource, valid options are 'public' and 'private' - /// (Originally from ../FSComp.txt:45) + /// (Originally from ..\FSComp.txt:45) static member buildInvalidPrivacy(a0 : System.String) = (214, GetStringFunc("buildInvalidPrivacy",",,,%s,,,") a0) /// Multiple references to '%s.dll' are not permitted - /// (Originally from ../FSComp.txt:46) + /// (Originally from ..\FSComp.txt:46) static member buildMultipleReferencesNotAllowed(a0 : System.String) = (215, GetStringFunc("buildMultipleReferencesNotAllowed",",,,%s,,,") a0) /// Could not read version from mscorlib.dll - /// (Originally from ../FSComp.txt:47) + /// (Originally from ..\FSComp.txt:47) static member buildCouldNotReadVersionInfoFromMscorlib() = (GetStringFunc("buildCouldNotReadVersionInfoFromMscorlib",",,,") ) /// Unable to read assembly '%s' - /// (Originally from ../FSComp.txt:48) + /// (Originally from ..\FSComp.txt:48) static member buildCannotReadAssembly(a0 : System.String) = (218, GetStringFunc("buildCannotReadAssembly",",,,%s,,,") a0) /// Assembly resolution failure at or near this location - /// (Originally from ../FSComp.txt:49) + /// (Originally from ..\FSComp.txt:49) static member buildAssemblyResolutionFailed() = (220, GetStringFunc("buildAssemblyResolutionFailed",",,,") ) /// The declarations in this file will be placed in an implicit module '%s' based on the file name '%s'. However this is not a valid F# identifier, so the contents will not be accessible from other files. Consider renaming the file or adding a 'module' or 'namespace' declaration at the top of the file. - /// (Originally from ../FSComp.txt:50) + /// (Originally from ..\FSComp.txt:50) static member buildImplicitModuleIsNotLegalIdentifier(a0 : System.String, a1 : System.String) = (221, GetStringFunc("buildImplicitModuleIsNotLegalIdentifier",",,,%s,,,%s,,,") a0 a1) /// Files in libraries or multiple-file applications must begin with a namespace or module declaration, e.g. 'namespace SomeNamespace.SubNamespace' or 'module SomeNamespace.SomeModule'. Only the last source file of an application may omit such a declaration. - /// (Originally from ../FSComp.txt:51) + /// (Originally from ..\FSComp.txt:51) static member buildMultiFileRequiresNamespaceOrModule() = (222, GetStringFunc("buildMultiFileRequiresNamespaceOrModule",",,,") ) /// Files in libraries or multiple-file applications must begin with a namespace or module declaration. When using a module declaration at the start of a file the '=' sign is not allowed. If this is a top-level module, consider removing the = to resolve this error. - /// (Originally from ../FSComp.txt:52) + /// (Originally from ..\FSComp.txt:52) static member noEqualSignAfterModule() = (222, GetStringFunc("noEqualSignAfterModule",",,,") ) /// This file contains multiple declarations of the form 'module SomeNamespace.SomeModule'. Only one declaration of this form is permitted in a file. Change your file to use an initial namespace declaration and/or use 'module ModuleName = ...' to define your modules. - /// (Originally from ../FSComp.txt:53) + /// (Originally from ..\FSComp.txt:53) static member buildMultipleToplevelModules() = (223, GetStringFunc("buildMultipleToplevelModules",",,,") ) /// Option requires parameter: %s - /// (Originally from ../FSComp.txt:54) + /// (Originally from ..\FSComp.txt:54) static member buildOptionRequiresParameter(a0 : System.String) = (224, GetStringFunc("buildOptionRequiresParameter",",,,%s,,,") a0) /// Source file '%s' could not be found - /// (Originally from ../FSComp.txt:55) + /// (Originally from ..\FSComp.txt:55) static member buildCouldNotFindSourceFile(a0 : System.String) = (225, GetStringFunc("buildCouldNotFindSourceFile",",,,%s,,,") a0) /// The file extension of '%s' is not recognized. Source files must have extension .fs, .fsi, .fsx, .fsscript, .ml or .mli. - /// (Originally from ../FSComp.txt:56) + /// (Originally from ..\FSComp.txt:56) static member buildInvalidSourceFileExtension(a0 : System.String) = (226, GetStringFunc("buildInvalidSourceFileExtension",",,,%s,,,") a0) /// Could not resolve assembly '%s' - /// (Originally from ../FSComp.txt:57) + /// (Originally from ..\FSComp.txt:57) static member buildCouldNotResolveAssembly(a0 : System.String) = (227, GetStringFunc("buildCouldNotResolveAssembly",",,,%s,,,") a0) /// Could not resolve assembly '%s' required by '%s' - /// (Originally from ../FSComp.txt:58) + /// (Originally from ..\FSComp.txt:58) static member buildCouldNotResolveAssemblyRequiredByFile(a0 : System.String, a1 : System.String) = (228, GetStringFunc("buildCouldNotResolveAssemblyRequiredByFile",",,,%s,,,%s,,,") a0 a1) /// Error opening binary file '%s': %s - /// (Originally from ../FSComp.txt:59) + /// (Originally from ..\FSComp.txt:59) static member buildErrorOpeningBinaryFile(a0 : System.String, a1 : System.String) = (229, GetStringFunc("buildErrorOpeningBinaryFile",",,,%s,,,%s,,,") a0 a1) /// The F#-compiled DLL '%s' needs to be recompiled to be used with this version of F# - /// (Originally from ../FSComp.txt:60) + /// (Originally from ..\FSComp.txt:60) static member buildDifferentVersionMustRecompile(a0 : System.String) = (231, GetStringFunc("buildDifferentVersionMustRecompile",",,,%s,,,") a0) /// Invalid directive. Expected '#I \"\"'. - /// (Originally from ../FSComp.txt:61) + /// (Originally from ..\FSComp.txt:61) static member buildInvalidHashIDirective() = (232, GetStringFunc("buildInvalidHashIDirective",",,,") ) /// Invalid directive. Expected '#r \"\"'. - /// (Originally from ../FSComp.txt:62) + /// (Originally from ..\FSComp.txt:62) static member buildInvalidHashrDirective() = (233, GetStringFunc("buildInvalidHashrDirective",",,,") ) /// Invalid directive. Expected '#load \"\" ... \"\"'. - /// (Originally from ../FSComp.txt:63) + /// (Originally from ..\FSComp.txt:63) static member buildInvalidHashloadDirective() = (234, GetStringFunc("buildInvalidHashloadDirective",",,,") ) /// Invalid directive. Expected '#time', '#time \"on\"' or '#time \"off\"'. - /// (Originally from ../FSComp.txt:64) + /// (Originally from ..\FSComp.txt:64) static member buildInvalidHashtimeDirective() = (235, GetStringFunc("buildInvalidHashtimeDirective",",,,") ) /// Directives inside modules are ignored - /// (Originally from ../FSComp.txt:65) + /// (Originally from ..\FSComp.txt:65) static member buildDirectivesInModulesAreIgnored() = (236, GetStringFunc("buildDirectivesInModulesAreIgnored",",,,") ) /// A signature for the file or module '%s' has already been specified - /// (Originally from ../FSComp.txt:66) + /// (Originally from ..\FSComp.txt:66) static member buildSignatureAlreadySpecified(a0 : System.String) = (237, GetStringFunc("buildSignatureAlreadySpecified",",,,%s,,,") a0) /// An implementation of file or module '%s' has already been given. Compilation order is significant in F# because of type inference. You may need to adjust the order of your files to place the signature file before the implementation. In Visual Studio files are type-checked in the order they appear in the project file, which can be edited manually or adjusted using the solution explorer. - /// (Originally from ../FSComp.txt:67) + /// (Originally from ..\FSComp.txt:67) static member buildImplementationAlreadyGivenDetail(a0 : System.String) = (238, GetStringFunc("buildImplementationAlreadyGivenDetail",",,,%s,,,") a0) /// An implementation of the file or module '%s' has already been given - /// (Originally from ../FSComp.txt:68) + /// (Originally from ..\FSComp.txt:68) static member buildImplementationAlreadyGiven(a0 : System.String) = (239, GetStringFunc("buildImplementationAlreadyGiven",",,,%s,,,") a0) /// The signature file '%s' does not have a corresponding implementation file. If an implementation file exists then check the 'module' and 'namespace' declarations in the signature and implementation files match. - /// (Originally from ../FSComp.txt:69) + /// (Originally from ..\FSComp.txt:69) static member buildSignatureWithoutImplementation(a0 : System.String) = (240, GetStringFunc("buildSignatureWithoutImplementation",",,,%s,,,") a0) /// '%s' is not a valid integer argument - /// (Originally from ../FSComp.txt:70) + /// (Originally from ..\FSComp.txt:70) static member buildArgInvalidInt(a0 : System.String) = (241, GetStringFunc("buildArgInvalidInt",",,,%s,,,") a0) /// '%s' is not a valid floating point argument - /// (Originally from ../FSComp.txt:71) + /// (Originally from ..\FSComp.txt:71) static member buildArgInvalidFloat(a0 : System.String) = (242, GetStringFunc("buildArgInvalidFloat",",,,%s,,,") a0) /// Unrecognized option: '%s' - /// (Originally from ../FSComp.txt:72) + /// (Originally from ..\FSComp.txt:72) static member buildUnrecognizedOption(a0 : System.String) = (243, GetStringFunc("buildUnrecognizedOption",",,,%s,,,") a0) /// Invalid module or namespace name - /// (Originally from ../FSComp.txt:73) + /// (Originally from ..\FSComp.txt:73) static member buildInvalidModuleOrNamespaceName() = (244, GetStringFunc("buildInvalidModuleOrNamespaceName",",,,") ) /// Error reading/writing metadata for the F# compiled DLL '%s'. Was the DLL compiled with an earlier version of the F# compiler? (error: '%s'). - /// (Originally from ../FSComp.txt:74) + /// (Originally from ..\FSComp.txt:74) static member pickleErrorReadingWritingMetadata(a0 : System.String, a1 : System.String) = (GetStringFunc("pickleErrorReadingWritingMetadata",",,,%s,,,%s,,,") a0 a1) /// The type/module '%s' is not a concrete module or type - /// (Originally from ../FSComp.txt:75) + /// (Originally from ..\FSComp.txt:75) static member tastTypeOrModuleNotConcrete(a0 : System.String) = (245, GetStringFunc("tastTypeOrModuleNotConcrete",",,,%s,,,") a0) /// The type '%s' has an inline assembly code representation - /// (Originally from ../FSComp.txt:76) + /// (Originally from ..\FSComp.txt:76) static member tastTypeHasAssemblyCodeRepresentation(a0 : System.String) = (GetStringFunc("tastTypeHasAssemblyCodeRepresentation",",,,%s,,,") a0) /// A namespace and a module named '%s' both occur in two parts of this assembly - /// (Originally from ../FSComp.txt:77) + /// (Originally from ..\FSComp.txt:77) static member tastNamespaceAndModuleWithSameNameInAssembly(a0 : System.String) = (247, GetStringFunc("tastNamespaceAndModuleWithSameNameInAssembly",",,,%s,,,") a0) /// Two modules named '%s' occur in two parts of this assembly - /// (Originally from ../FSComp.txt:78) + /// (Originally from ..\FSComp.txt:78) static member tastTwoModulesWithSameNameInAssembly(a0 : System.String) = (248, GetStringFunc("tastTwoModulesWithSameNameInAssembly",",,,%s,,,") a0) /// Two type definitions named '%s' occur in namespace '%s' in two parts of this assembly - /// (Originally from ../FSComp.txt:79) + /// (Originally from ..\FSComp.txt:79) static member tastDuplicateTypeDefinitionInAssembly(a0 : System.String, a1 : System.String) = (249, GetStringFunc("tastDuplicateTypeDefinitionInAssembly",",,,%s,,,%s,,,") a0 a1) /// A module and a type definition named '%s' occur in namespace '%s' in two parts of this assembly - /// (Originally from ../FSComp.txt:80) + /// (Originally from ..\FSComp.txt:80) static member tastConflictingModuleAndTypeDefinitionInAssembly(a0 : System.String, a1 : System.String) = (250, GetStringFunc("tastConflictingModuleAndTypeDefinitionInAssembly",",,,%s,,,%s,,,") a0 a1) /// Invalid member signature encountered because of an earlier error - /// (Originally from ../FSComp.txt:81) + /// (Originally from ..\FSComp.txt:81) static member tastInvalidMemberSignature() = (251, GetStringFunc("tastInvalidMemberSignature",",,,") ) /// This value does not have a valid property setter type - /// (Originally from ../FSComp.txt:82) + /// (Originally from ..\FSComp.txt:82) static member tastValueDoesNotHaveSetterType() = (252, GetStringFunc("tastValueDoesNotHaveSetterType",",,,") ) /// Invalid form for a property getter. At least one '()' argument is required when using the explicit syntax. - /// (Originally from ../FSComp.txt:83) + /// (Originally from ..\FSComp.txt:83) static member tastInvalidFormForPropertyGetter() = (253, GetStringFunc("tastInvalidFormForPropertyGetter",",,,") ) /// Invalid form for a property setter. At least one argument is required. - /// (Originally from ../FSComp.txt:84) + /// (Originally from ..\FSComp.txt:84) static member tastInvalidFormForPropertySetter() = (254, GetStringFunc("tastInvalidFormForPropertySetter",",,,") ) /// Unexpected use of a byref-typed variable - /// (Originally from ../FSComp.txt:85) + /// (Originally from ..\FSComp.txt:85) static member tastUnexpectedByRef() = (255, GetStringFunc("tastUnexpectedByRef",",,,") ) /// A value must be mutable in order to mutate the contents or take the address of a value type, e.g. 'let mutable x = ...' /// (Originally from ..\FSComp.txt:86) static member tastValueMustBeMutable() = (256, GetStringFunc("tastValueMustBeMutable",",,,") ) /// Invalid mutation of a constant expression. Consider copying the expression to a mutable local, e.g. 'let mutable x = ...'. - /// (Originally from ../FSComp.txt:87) + /// (Originally from ..\FSComp.txt:87) static member tastInvalidMutationOfConstant() = (257, GetStringFunc("tastInvalidMutationOfConstant",",,,") ) /// The value has been copied to ensure the original is not mutated by this operation or because the copy is implicit when returning a struct from a member and another member is then accessed - /// (Originally from ../FSComp.txt:88) + /// (Originally from ..\FSComp.txt:88) static member tastValueHasBeenCopied() = (GetStringFunc("tastValueHasBeenCopied",",,,") ) /// Recursively defined values cannot appear directly as part of the construction of a tuple value within a recursive binding - /// (Originally from ../FSComp.txt:89) + /// (Originally from ..\FSComp.txt:89) static member tastRecursiveValuesMayNotBeInConstructionOfTuple() = (259, GetStringFunc("tastRecursiveValuesMayNotBeInConstructionOfTuple",",,,") ) /// Recursive values cannot appear directly as a construction of the type '%s' within a recursive binding. This feature has been removed from the F# language. Consider using a record instead. - /// (Originally from ../FSComp.txt:90) + /// (Originally from ..\FSComp.txt:90) static member tastRecursiveValuesMayNotAppearInConstructionOfType(a0 : System.String) = (260, GetStringFunc("tastRecursiveValuesMayNotAppearInConstructionOfType",",,,%s,,,") a0) /// Recursive values cannot be directly assigned to the non-mutable field '%s' of the type '%s' within a recursive binding. Consider using a mutable field instead. - /// (Originally from ../FSComp.txt:91) + /// (Originally from ..\FSComp.txt:91) static member tastRecursiveValuesMayNotBeAssignedToNonMutableField(a0 : System.String, a1 : System.String) = (261, GetStringFunc("tastRecursiveValuesMayNotBeAssignedToNonMutableField",",,,%s,,,%s,,,") a0 a1) /// Unexpected decode of AutoOpenAttribute - /// (Originally from ../FSComp.txt:92) + /// (Originally from ..\FSComp.txt:92) static member tastUnexpectedDecodeOfAutoOpenAttribute() = (GetStringFunc("tastUnexpectedDecodeOfAutoOpenAttribute",",,,") ) /// Unexpected decode of InternalsVisibleToAttribute - /// (Originally from ../FSComp.txt:93) + /// (Originally from ..\FSComp.txt:93) static member tastUnexpectedDecodeOfInternalsVisibleToAttribute() = (GetStringFunc("tastUnexpectedDecodeOfInternalsVisibleToAttribute",",,,") ) /// Unexpected decode of InterfaceDataVersionAttribute - /// (Originally from ../FSComp.txt:94) + /// (Originally from ..\FSComp.txt:94) static member tastUnexpectedDecodeOfInterfaceDataVersionAttribute() = (GetStringFunc("tastUnexpectedDecodeOfInterfaceDataVersionAttribute",",,,") ) /// Active patterns cannot return more than 7 possibilities - /// (Originally from ../FSComp.txt:95) + /// (Originally from ..\FSComp.txt:95) static member tastActivePatternsLimitedToSeven() = (265, GetStringFunc("tastActivePatternsLimitedToSeven",",,,") ) /// This is not a valid constant expression or custom attribute value - /// (Originally from ../FSComp.txt:96) + /// (Originally from ..\FSComp.txt:96) static member tastNotAConstantExpression() = (267, GetStringFunc("tastNotAConstantExpression",",,,") ) /// Module '%s' contains\n %s \nbut its signature specifies\n %s \nThe mutability attributes differ - /// (Originally from ../FSComp.txt:97) + /// (Originally from ..\FSComp.txt:97) static member ValueNotContainedMutabilityAttributesDiffer(a0 : System.String, a1 : System.String, a2 : System.String) = (GetStringFunc("ValueNotContainedMutabilityAttributesDiffer",",,,%s,,,%s,,,%s,,,") a0 a1 a2) /// Module '%s' contains\n %s \nbut its signature specifies\n %s \nThe names differ - /// (Originally from ../FSComp.txt:98) + /// (Originally from ..\FSComp.txt:98) static member ValueNotContainedMutabilityNamesDiffer(a0 : System.String, a1 : System.String, a2 : System.String) = (GetStringFunc("ValueNotContainedMutabilityNamesDiffer",",,,%s,,,%s,,,%s,,,") a0 a1 a2) /// Module '%s' contains\n %s \nbut its signature specifies\n %s \nThe compiled names differ - /// (Originally from ../FSComp.txt:99) + /// (Originally from ..\FSComp.txt:99) static member ValueNotContainedMutabilityCompiledNamesDiffer(a0 : System.String, a1 : System.String, a2 : System.String) = (GetStringFunc("ValueNotContainedMutabilityCompiledNamesDiffer",",,,%s,,,%s,,,%s,,,") a0 a1 a2) /// Module '%s' contains\n %s \nbut its signature specifies\n %s \nThe display names differ - /// (Originally from ../FSComp.txt:100) + /// (Originally from ..\FSComp.txt:100) static member ValueNotContainedMutabilityDisplayNamesDiffer(a0 : System.String, a1 : System.String, a2 : System.String) = (GetStringFunc("ValueNotContainedMutabilityDisplayNamesDiffer",",,,%s,,,%s,,,%s,,,") a0 a1 a2) /// Module '%s' contains\n %s \nbut its signature specifies\n %s \nThe accessibility specified in the signature is more than that specified in the implementation - /// (Originally from ../FSComp.txt:101) + /// (Originally from ..\FSComp.txt:101) static member ValueNotContainedMutabilityAccessibilityMore(a0 : System.String, a1 : System.String, a2 : System.String) = (GetStringFunc("ValueNotContainedMutabilityAccessibilityMore",",,,%s,,,%s,,,%s,,,") a0 a1 a2) /// Module '%s' contains\n %s \nbut its signature specifies\n %s \nThe inline flags differ - /// (Originally from ../FSComp.txt:102) + /// (Originally from ..\FSComp.txt:102) static member ValueNotContainedMutabilityInlineFlagsDiffer(a0 : System.String, a1 : System.String, a2 : System.String) = (GetStringFunc("ValueNotContainedMutabilityInlineFlagsDiffer",",,,%s,,,%s,,,%s,,,") a0 a1 a2) /// Module '%s' contains\n %s \nbut its signature specifies\n %s \nThe literal constant values and/or attributes differ - /// (Originally from ../FSComp.txt:103) + /// (Originally from ..\FSComp.txt:103) static member ValueNotContainedMutabilityLiteralConstantValuesDiffer(a0 : System.String, a1 : System.String, a2 : System.String) = (GetStringFunc("ValueNotContainedMutabilityLiteralConstantValuesDiffer",",,,%s,,,%s,,,%s,,,") a0 a1 a2) /// Module '%s' contains\n %s \nbut its signature specifies\n %s \nOne is a type function and the other is not. The signature requires explicit type parameters if they are present in the implementation. - /// (Originally from ../FSComp.txt:104) + /// (Originally from ..\FSComp.txt:104) static member ValueNotContainedMutabilityOneIsTypeFunction(a0 : System.String, a1 : System.String, a2 : System.String) = (GetStringFunc("ValueNotContainedMutabilityOneIsTypeFunction",",,,%s,,,%s,,,%s,,,") a0 a1 a2) /// Module '%s' contains\n %s \nbut its signature specifies\n %s \nThe respective type parameter counts differ - /// (Originally from ../FSComp.txt:105) + /// (Originally from ..\FSComp.txt:105) static member ValueNotContainedMutabilityParameterCountsDiffer(a0 : System.String, a1 : System.String, a2 : System.String) = (GetStringFunc("ValueNotContainedMutabilityParameterCountsDiffer",",,,%s,,,%s,,,%s,,,") a0 a1 a2) /// Module '%s' contains\n %s \nbut its signature specifies\n %s \nThe types differ - /// (Originally from ../FSComp.txt:106) + /// (Originally from ..\FSComp.txt:106) static member ValueNotContainedMutabilityTypesDiffer(a0 : System.String, a1 : System.String, a2 : System.String) = (GetStringFunc("ValueNotContainedMutabilityTypesDiffer",",,,%s,,,%s,,,%s,,,") a0 a1 a2) /// Module '%s' contains\n %s \nbut its signature specifies\n %s \nOne is an extension member and the other is not - /// (Originally from ../FSComp.txt:107) + /// (Originally from ..\FSComp.txt:107) static member ValueNotContainedMutabilityExtensionsDiffer(a0 : System.String, a1 : System.String, a2 : System.String) = (GetStringFunc("ValueNotContainedMutabilityExtensionsDiffer",",,,%s,,,%s,,,%s,,,") a0 a1 a2) /// Module '%s' contains\n %s \nbut its signature specifies\n %s \nAn arity was not inferred for this value - /// (Originally from ../FSComp.txt:108) + /// (Originally from ..\FSComp.txt:108) static member ValueNotContainedMutabilityArityNotInferred(a0 : System.String, a1 : System.String, a2 : System.String) = (GetStringFunc("ValueNotContainedMutabilityArityNotInferred",",,,%s,,,%s,,,%s,,,") a0 a1 a2) /// Module '%s' contains\n %s \nbut its signature specifies\n %s \nThe number of generic parameters in the signature and implementation differ (the signature declares %s but the implementation declares %s - /// (Originally from ../FSComp.txt:109) + /// (Originally from ..\FSComp.txt:109) static member ValueNotContainedMutabilityGenericParametersDiffer(a0 : System.String, a1 : System.String, a2 : System.String, a3 : System.String, a4 : System.String) = (GetStringFunc("ValueNotContainedMutabilityGenericParametersDiffer",",,,%s,,,%s,,,%s,,,%s,,,%s,,,") a0 a1 a2 a3 a4) /// Module '%s' contains\n %s \nbut its signature specifies\n %s \nThe generic parameters in the signature and implementation have different kinds. Perhaps there is a missing [] attribute. - /// (Originally from ../FSComp.txt:110) + /// (Originally from ..\FSComp.txt:110) static member ValueNotContainedMutabilityGenericParametersAreDifferentKinds(a0 : System.String, a1 : System.String, a2 : System.String) = (GetStringFunc("ValueNotContainedMutabilityGenericParametersAreDifferentKinds",",,,%s,,,%s,,,%s,,,") a0 a1 a2) /// Module '%s' contains\n %s \nbut its signature specifies\n %s \nThe arities in the signature and implementation differ. The signature specifies that '%s' is function definition or lambda expression accepting at least %s argument(s), but the implementation is a computed function value. To declare that a computed function value is a permitted implementation simply parenthesize its type in the signature, e.g.\n\tval %s: int -> (int -> int)\ninstead of\n\tval %s: int -> int -> int. - /// (Originally from ../FSComp.txt:111) + /// (Originally from ..\FSComp.txt:111) static member ValueNotContainedMutabilityAritiesDiffer(a0 : System.String, a1 : System.String, a2 : System.String, a3 : System.String, a4 : System.String, a5 : System.String, a6 : System.String) = (GetStringFunc("ValueNotContainedMutabilityAritiesDiffer",",,,%s,,,%s,,,%s,,,%s,,,%s,,,%s,,,%s,,,") a0 a1 a2 a3 a4 a5 a6) /// Module '%s' contains\n %s \nbut its signature specifies\n %s \nThe CLI member names differ - /// (Originally from ../FSComp.txt:112) + /// (Originally from ..\FSComp.txt:112) static member ValueNotContainedMutabilityDotNetNamesDiffer(a0 : System.String, a1 : System.String, a2 : System.String) = (GetStringFunc("ValueNotContainedMutabilityDotNetNamesDiffer",",,,%s,,,%s,,,%s,,,") a0 a1 a2) /// Module '%s' contains\n %s \nbut its signature specifies\n %s \nOne is static and the other isn't - /// (Originally from ../FSComp.txt:113) + /// (Originally from ..\FSComp.txt:113) static member ValueNotContainedMutabilityStaticsDiffer(a0 : System.String, a1 : System.String, a2 : System.String) = (GetStringFunc("ValueNotContainedMutabilityStaticsDiffer",",,,%s,,,%s,,,%s,,,") a0 a1 a2) /// Module '%s' contains\n %s \nbut its signature specifies\n %s \nOne is virtual and the other isn't - /// (Originally from ../FSComp.txt:114) + /// (Originally from ..\FSComp.txt:114) static member ValueNotContainedMutabilityVirtualsDiffer(a0 : System.String, a1 : System.String, a2 : System.String) = (GetStringFunc("ValueNotContainedMutabilityVirtualsDiffer",",,,%s,,,%s,,,%s,,,") a0 a1 a2) /// Module '%s' contains\n %s \nbut its signature specifies\n %s \nOne is abstract and the other isn't - /// (Originally from ../FSComp.txt:115) + /// (Originally from ..\FSComp.txt:115) static member ValueNotContainedMutabilityAbstractsDiffer(a0 : System.String, a1 : System.String, a2 : System.String) = (GetStringFunc("ValueNotContainedMutabilityAbstractsDiffer",",,,%s,,,%s,,,%s,,,") a0 a1 a2) /// Module '%s' contains\n %s \nbut its signature specifies\n %s \nOne is final and the other isn't - /// (Originally from ../FSComp.txt:116) + /// (Originally from ..\FSComp.txt:116) static member ValueNotContainedMutabilityFinalsDiffer(a0 : System.String, a1 : System.String, a2 : System.String) = (GetStringFunc("ValueNotContainedMutabilityFinalsDiffer",",,,%s,,,%s,,,%s,,,") a0 a1 a2) /// Module '%s' contains\n %s \nbut its signature specifies\n %s \nOne is marked as an override and the other isn't - /// (Originally from ../FSComp.txt:117) + /// (Originally from ..\FSComp.txt:117) static member ValueNotContainedMutabilityOverridesDiffer(a0 : System.String, a1 : System.String, a2 : System.String) = (GetStringFunc("ValueNotContainedMutabilityOverridesDiffer",",,,%s,,,%s,,,%s,,,") a0 a1 a2) /// Module '%s' contains\n %s \nbut its signature specifies\n %s \nOne is a constructor/property and the other is not - /// (Originally from ../FSComp.txt:118) + /// (Originally from ..\FSComp.txt:118) static member ValueNotContainedMutabilityOneIsConstructor(a0 : System.String, a1 : System.String, a2 : System.String) = (GetStringFunc("ValueNotContainedMutabilityOneIsConstructor",",,,%s,,,%s,,,%s,,,") a0 a1 a2) /// Module '%s' contains\n %s \nbut its signature specifies\n %s \nThe compiled representation of this method is as a static member but the signature indicates its compiled representation is as an instance member - /// (Originally from ../FSComp.txt:119) + /// (Originally from ..\FSComp.txt:119) static member ValueNotContainedMutabilityStaticButInstance(a0 : System.String, a1 : System.String, a2 : System.String) = (GetStringFunc("ValueNotContainedMutabilityStaticButInstance",",,,%s,,,%s,,,%s,,,") a0 a1 a2) /// Module '%s' contains\n %s \nbut its signature specifies\n %s \nThe compiled representation of this method is as an instance member, but the signature indicates its compiled representation is as a static member - /// (Originally from ../FSComp.txt:120) + /// (Originally from ..\FSComp.txt:120) static member ValueNotContainedMutabilityInstanceButStatic(a0 : System.String, a1 : System.String, a2 : System.String) = (GetStringFunc("ValueNotContainedMutabilityInstanceButStatic",",,,%s,,,%s,,,%s,,,") a0 a1 a2) /// The %s definitions in the signature and implementation are not compatible because the names differ. The type is called '%s' in the signature file but '%s' in implementation. - /// (Originally from ../FSComp.txt:121) + /// (Originally from ..\FSComp.txt:121) static member DefinitionsInSigAndImplNotCompatibleNamesDiffer(a0 : System.String, a1 : System.String, a2 : System.String) = (290, GetStringFunc("DefinitionsInSigAndImplNotCompatibleNamesDiffer",",,,%s,,,%s,,,%s,,,") a0 a1 a2) /// The %s definitions for type '%s' in the signature and implementation are not compatible because the respective type parameter counts differ - /// (Originally from ../FSComp.txt:122) + /// (Originally from ..\FSComp.txt:122) static member DefinitionsInSigAndImplNotCompatibleParameterCountsDiffer(a0 : System.String, a1 : System.String) = (291, GetStringFunc("DefinitionsInSigAndImplNotCompatibleParameterCountsDiffer",",,,%s,,,%s,,,") a0 a1) /// The %s definitions for type '%s' in the signature and implementation are not compatible because the accessibility specified in the signature is more than that specified in the implementation - /// (Originally from ../FSComp.txt:123) + /// (Originally from ..\FSComp.txt:123) static member DefinitionsInSigAndImplNotCompatibleAccessibilityDiffer(a0 : System.String, a1 : System.String) = (292, GetStringFunc("DefinitionsInSigAndImplNotCompatibleAccessibilityDiffer",",,,%s,,,%s,,,") a0 a1) /// The %s definitions for type '%s' in the signature and implementation are not compatible because the signature requires that the type supports the interface %s but the interface has not been implemented - /// (Originally from ../FSComp.txt:124) + /// (Originally from ..\FSComp.txt:124) static member DefinitionsInSigAndImplNotCompatibleMissingInterface(a0 : System.String, a1 : System.String, a2 : System.String) = (293, GetStringFunc("DefinitionsInSigAndImplNotCompatibleMissingInterface",",,,%s,,,%s,,,%s,,,") a0 a1 a2) /// The %s definitions for type '%s' in the signature and implementation are not compatible because the implementation says this type may use nulls as a representation but the signature does not - /// (Originally from ../FSComp.txt:125) + /// (Originally from ..\FSComp.txt:125) static member DefinitionsInSigAndImplNotCompatibleImplementationSaysNull(a0 : System.String, a1 : System.String) = (294, GetStringFunc("DefinitionsInSigAndImplNotCompatibleImplementationSaysNull",",,,%s,,,%s,,,") a0 a1) /// The %s definitions for type '%s' in the signature and implementation are not compatible because the implementation says this type may use nulls as an extra value but the signature does not - /// (Originally from ../FSComp.txt:126) + /// (Originally from ..\FSComp.txt:126) static member DefinitionsInSigAndImplNotCompatibleImplementationSaysNull2(a0 : System.String, a1 : System.String) = (294, GetStringFunc("DefinitionsInSigAndImplNotCompatibleImplementationSaysNull2",",,,%s,,,%s,,,") a0 a1) /// The %s definitions for type '%s' in the signature and implementation are not compatible because the signature says this type may use nulls as a representation but the implementation does not - /// (Originally from ../FSComp.txt:127) + /// (Originally from ..\FSComp.txt:127) static member DefinitionsInSigAndImplNotCompatibleSignatureSaysNull(a0 : System.String, a1 : System.String) = (295, GetStringFunc("DefinitionsInSigAndImplNotCompatibleSignatureSaysNull",",,,%s,,,%s,,,") a0 a1) /// The %s definitions for type '%s' in the signature and implementation are not compatible because the signature says this type may use nulls as an extra value but the implementation does not - /// (Originally from ../FSComp.txt:128) + /// (Originally from ..\FSComp.txt:128) static member DefinitionsInSigAndImplNotCompatibleSignatureSaysNull2(a0 : System.String, a1 : System.String) = (295, GetStringFunc("DefinitionsInSigAndImplNotCompatibleSignatureSaysNull2",",,,%s,,,%s,,,") a0 a1) /// The %s definitions for type '%s' in the signature and implementation are not compatible because the implementation type is sealed but the signature implies it is not. Consider adding the [] attribute to the signature. - /// (Originally from ../FSComp.txt:129) + /// (Originally from ..\FSComp.txt:129) static member DefinitionsInSigAndImplNotCompatibleImplementationSealed(a0 : System.String, a1 : System.String) = (296, GetStringFunc("DefinitionsInSigAndImplNotCompatibleImplementationSealed",",,,%s,,,%s,,,") a0 a1) /// The %s definitions for type '%s' in the signature and implementation are not compatible because the implementation type is not sealed but signature implies it is. Consider adding the [] attribute to the implementation. - /// (Originally from ../FSComp.txt:130) + /// (Originally from ..\FSComp.txt:130) static member DefinitionsInSigAndImplNotCompatibleImplementationIsNotSealed(a0 : System.String, a1 : System.String) = (297, GetStringFunc("DefinitionsInSigAndImplNotCompatibleImplementationIsNotSealed",",,,%s,,,%s,,,") a0 a1) /// The %s definitions for type '%s' in the signature and implementation are not compatible because the implementation is an abstract class but the signature is not. Consider adding the [] attribute to the signature. - /// (Originally from ../FSComp.txt:131) + /// (Originally from ..\FSComp.txt:131) static member DefinitionsInSigAndImplNotCompatibleImplementationIsAbstract(a0 : System.String, a1 : System.String) = (298, GetStringFunc("DefinitionsInSigAndImplNotCompatibleImplementationIsAbstract",",,,%s,,,%s,,,") a0 a1) /// The %s definitions for type '%s' in the signature and implementation are not compatible because the signature is an abstract class but the implementation is not. Consider adding the [] attribute to the implementation. - /// (Originally from ../FSComp.txt:132) + /// (Originally from ..\FSComp.txt:132) static member DefinitionsInSigAndImplNotCompatibleSignatureIsAbstract(a0 : System.String, a1 : System.String) = (299, GetStringFunc("DefinitionsInSigAndImplNotCompatibleSignatureIsAbstract",",,,%s,,,%s,,,") a0 a1) /// The %s definitions for type '%s' in the signature and implementation are not compatible because the types have different base types - /// (Originally from ../FSComp.txt:133) + /// (Originally from ..\FSComp.txt:133) static member DefinitionsInSigAndImplNotCompatibleTypesHaveDifferentBaseTypes(a0 : System.String, a1 : System.String) = (300, GetStringFunc("DefinitionsInSigAndImplNotCompatibleTypesHaveDifferentBaseTypes",",,,%s,,,%s,,,") a0 a1) /// The %s definitions for type '%s' in the signature and implementation are not compatible because the number of %ss differ - /// (Originally from ../FSComp.txt:134) + /// (Originally from ..\FSComp.txt:134) static member DefinitionsInSigAndImplNotCompatibleNumbersDiffer(a0 : System.String, a1 : System.String, a2 : System.String) = (301, GetStringFunc("DefinitionsInSigAndImplNotCompatibleNumbersDiffer",",,,%s,,,%s,,,%s,,,") a0 a1 a2) /// The %s definitions for type '%s' in the signature and implementation are not compatible because the signature defines the %s '%s' but the implementation does not (or does, but not in the same order) - /// (Originally from ../FSComp.txt:135) + /// (Originally from ..\FSComp.txt:135) static member DefinitionsInSigAndImplNotCompatibleSignatureDefinesButImplDoesNot(a0 : System.String, a1 : System.String, a2 : System.String, a3 : System.String) = (302, GetStringFunc("DefinitionsInSigAndImplNotCompatibleSignatureDefinesButImplDoesNot",",,,%s,,,%s,,,%s,,,%s,,,") a0 a1 a2 a3) /// The %s definitions for type '%s' in the signature and implementation are not compatible because the implementation defines the %s '%s' but the signature does not (or does, but not in the same order) - /// (Originally from ../FSComp.txt:136) + /// (Originally from ..\FSComp.txt:136) static member DefinitionsInSigAndImplNotCompatibleImplDefinesButSignatureDoesNot(a0 : System.String, a1 : System.String, a2 : System.String, a3 : System.String) = (303, GetStringFunc("DefinitionsInSigAndImplNotCompatibleImplDefinesButSignatureDoesNot",",,,%s,,,%s,,,%s,,,%s,,,") a0 a1 a2 a3) /// The %s definitions for type '%s' in the signature and implementation are not compatible because the implementation defines a struct but the signature defines a type with a hidden representation - /// (Originally from ../FSComp.txt:137) + /// (Originally from ..\FSComp.txt:137) static member DefinitionsInSigAndImplNotCompatibleImplDefinesStruct(a0 : System.String, a1 : System.String) = (304, GetStringFunc("DefinitionsInSigAndImplNotCompatibleImplDefinesStruct",",,,%s,,,%s,,,") a0 a1) /// The %s definitions for type '%s' in the signature and implementation are not compatible because a CLI type representation is being hidden by a signature - /// (Originally from ../FSComp.txt:138) + /// (Originally from ..\FSComp.txt:138) static member DefinitionsInSigAndImplNotCompatibleDotNetTypeRepresentationIsHidden(a0 : System.String, a1 : System.String) = (305, GetStringFunc("DefinitionsInSigAndImplNotCompatibleDotNetTypeRepresentationIsHidden",",,,%s,,,%s,,,") a0 a1) /// The %s definitions for type '%s' in the signature and implementation are not compatible because a type representation is being hidden by a signature - /// (Originally from ../FSComp.txt:139) + /// (Originally from ..\FSComp.txt:139) static member DefinitionsInSigAndImplNotCompatibleTypeIsHidden(a0 : System.String, a1 : System.String) = (306, GetStringFunc("DefinitionsInSigAndImplNotCompatibleTypeIsHidden",",,,%s,,,%s,,,") a0 a1) /// The %s definitions for type '%s' in the signature and implementation are not compatible because the types are of different kinds - /// (Originally from ../FSComp.txt:140) + /// (Originally from ..\FSComp.txt:140) static member DefinitionsInSigAndImplNotCompatibleTypeIsDifferentKind(a0 : System.String, a1 : System.String) = (307, GetStringFunc("DefinitionsInSigAndImplNotCompatibleTypeIsDifferentKind",",,,%s,,,%s,,,") a0 a1) /// The %s definitions for type '%s' in the signature and implementation are not compatible because the IL representations differ - /// (Originally from ../FSComp.txt:141) + /// (Originally from ..\FSComp.txt:141) static member DefinitionsInSigAndImplNotCompatibleILDiffer(a0 : System.String, a1 : System.String) = (308, GetStringFunc("DefinitionsInSigAndImplNotCompatibleILDiffer",",,,%s,,,%s,,,") a0 a1) /// The %s definitions for type '%s' in the signature and implementation are not compatible because the representations differ - /// (Originally from ../FSComp.txt:142) + /// (Originally from ..\FSComp.txt:142) static member DefinitionsInSigAndImplNotCompatibleRepresentationsDiffer(a0 : System.String, a1 : System.String) = (309, GetStringFunc("DefinitionsInSigAndImplNotCompatibleRepresentationsDiffer",",,,%s,,,%s,,,") a0 a1) /// The %s definitions for type '%s' in the signature and implementation are not compatible because the field %s was present in the implementation but not in the signature - /// (Originally from ../FSComp.txt:143) + /// (Originally from ..\FSComp.txt:143) static member DefinitionsInSigAndImplNotCompatibleFieldWasPresent(a0 : System.String, a1 : System.String, a2 : System.String) = (311, GetStringFunc("DefinitionsInSigAndImplNotCompatibleFieldWasPresent",",,,%s,,,%s,,,%s,,,") a0 a1 a2) /// The %s definitions for type '%s' in the signature and implementation are not compatible because the order of the fields is different in the signature and implementation - /// (Originally from ../FSComp.txt:144) + /// (Originally from ..\FSComp.txt:144) static member DefinitionsInSigAndImplNotCompatibleFieldOrderDiffer(a0 : System.String, a1 : System.String) = (312, GetStringFunc("DefinitionsInSigAndImplNotCompatibleFieldOrderDiffer",",,,%s,,,%s,,,") a0 a1) /// The %s definitions for type '%s' in the signature and implementation are not compatible because the field %s was required by the signature but was not specified by the implementation - /// (Originally from ../FSComp.txt:145) + /// (Originally from ..\FSComp.txt:145) static member DefinitionsInSigAndImplNotCompatibleFieldRequiredButNotSpecified(a0 : System.String, a1 : System.String, a2 : System.String) = (313, GetStringFunc("DefinitionsInSigAndImplNotCompatibleFieldRequiredButNotSpecified",",,,%s,,,%s,,,%s,,,") a0 a1 a2) /// The %s definitions for type '%s' in the signature and implementation are not compatible because the field '%s' was present in the implementation but not in the signature. Struct types must now reveal their fields in the signature for the type, though the fields may still be labelled 'private' or 'internal'. - /// (Originally from ../FSComp.txt:146) + /// (Originally from ..\FSComp.txt:146) static member DefinitionsInSigAndImplNotCompatibleFieldIsInImplButNotSig(a0 : System.String, a1 : System.String, a2 : System.String) = (314, GetStringFunc("DefinitionsInSigAndImplNotCompatibleFieldIsInImplButNotSig",",,,%s,,,%s,,,%s,,,") a0 a1 a2) /// The %s definitions for type '%s' in the signature and implementation are not compatible because the abstract member '%s' was required by the signature but was not specified by the implementation - /// (Originally from ../FSComp.txt:147) + /// (Originally from ..\FSComp.txt:147) static member DefinitionsInSigAndImplNotCompatibleAbstractMemberMissingInImpl(a0 : System.String, a1 : System.String, a2 : System.String) = (315, GetStringFunc("DefinitionsInSigAndImplNotCompatibleAbstractMemberMissingInImpl",",,,%s,,,%s,,,%s,,,") a0 a1 a2) /// The %s definitions for type '%s' in the signature and implementation are not compatible because the abstract member '%s' was present in the implementation but not in the signature - /// (Originally from ../FSComp.txt:148) + /// (Originally from ..\FSComp.txt:148) static member DefinitionsInSigAndImplNotCompatibleAbstractMemberMissingInSig(a0 : System.String, a1 : System.String, a2 : System.String) = (316, GetStringFunc("DefinitionsInSigAndImplNotCompatibleAbstractMemberMissingInSig",",,,%s,,,%s,,,%s,,,") a0 a1 a2) /// The %s definitions for type '%s' in the signature and implementation are not compatible because the signature declares a %s while the implementation declares a %s - /// (Originally from ../FSComp.txt:149) + /// (Originally from ..\FSComp.txt:149) static member DefinitionsInSigAndImplNotCompatibleSignatureDeclaresDiffer(a0 : System.String, a1 : System.String, a2 : System.String, a3 : System.String) = (317, GetStringFunc("DefinitionsInSigAndImplNotCompatibleSignatureDeclaresDiffer",",,,%s,,,%s,,,%s,,,%s,,,") a0 a1 a2 a3) /// The %s definitions for type '%s' in the signature and implementation are not compatible because the abbreviations differ: %s versus %s - /// (Originally from ../FSComp.txt:150) + /// (Originally from ..\FSComp.txt:150) static member DefinitionsInSigAndImplNotCompatibleAbbreviationsDiffer(a0 : System.String, a1 : System.String, a2 : System.String, a3 : System.String) = (318, GetStringFunc("DefinitionsInSigAndImplNotCompatibleAbbreviationsDiffer",",,,%s,,,%s,,,%s,,,%s,,,") a0 a1 a2 a3) /// The %s definitions for type '%s' in the signature and implementation are not compatible because an abbreviation is being hidden by a signature. The abbreviation must be visible to other CLI languages. Consider making the abbreviation visible in the signature. - /// (Originally from ../FSComp.txt:151) + /// (Originally from ..\FSComp.txt:151) static member DefinitionsInSigAndImplNotCompatibleAbbreviationHiddenBySig(a0 : System.String, a1 : System.String) = (319, GetStringFunc("DefinitionsInSigAndImplNotCompatibleAbbreviationHiddenBySig",",,,%s,,,%s,,,") a0 a1) /// The %s definitions for type '%s' in the signature and implementation are not compatible because the signature has an abbreviation while the implementation does not - /// (Originally from ../FSComp.txt:152) + /// (Originally from ..\FSComp.txt:152) static member DefinitionsInSigAndImplNotCompatibleSigHasAbbreviation(a0 : System.String, a1 : System.String) = (320, GetStringFunc("DefinitionsInSigAndImplNotCompatibleSigHasAbbreviation",",,,%s,,,%s,,,") a0 a1) /// The module contains the constructor\n %s \nbut its signature specifies\n %s \nThe names differ - /// (Originally from ../FSComp.txt:153) + /// (Originally from ..\FSComp.txt:153) static member ModuleContainsConstructorButNamesDiffer(a0 : System.String, a1 : System.String) = (GetStringFunc("ModuleContainsConstructorButNamesDiffer",",,,%s,,,%s,,,") a0 a1) /// The module contains the constructor\n %s \nbut its signature specifies\n %s \nThe respective number of data fields differ - /// (Originally from ../FSComp.txt:154) + /// (Originally from ..\FSComp.txt:154) static member ModuleContainsConstructorButDataFieldsDiffer(a0 : System.String, a1 : System.String) = (GetStringFunc("ModuleContainsConstructorButDataFieldsDiffer",",,,%s,,,%s,,,") a0 a1) /// The module contains the constructor\n %s \nbut its signature specifies\n %s \nThe types of the fields differ - /// (Originally from ../FSComp.txt:155) + /// (Originally from ..\FSComp.txt:155) static member ModuleContainsConstructorButTypesOfFieldsDiffer(a0 : System.String, a1 : System.String) = (GetStringFunc("ModuleContainsConstructorButTypesOfFieldsDiffer",",,,%s,,,%s,,,") a0 a1) /// The module contains the constructor\n %s \nbut its signature specifies\n %s \nthe accessibility specified in the signature is more than that specified in the implementation - /// (Originally from ../FSComp.txt:156) + /// (Originally from ..\FSComp.txt:156) static member ModuleContainsConstructorButAccessibilityDiffers(a0 : System.String, a1 : System.String) = (GetStringFunc("ModuleContainsConstructorButAccessibilityDiffers",",,,%s,,,%s,,,") a0 a1) /// The module contains the field\n %s \nbut its signature specifies\n %s \nThe names differ - /// (Originally from ../FSComp.txt:157) + /// (Originally from ..\FSComp.txt:157) static member FieldNotContainedNamesDiffer(a0 : System.String, a1 : System.String) = (GetStringFunc("FieldNotContainedNamesDiffer",",,,%s,,,%s,,,") a0 a1) /// The module contains the field\n %s \nbut its signature specifies\n %s \nthe accessibility specified in the signature is more than that specified in the implementation - /// (Originally from ../FSComp.txt:158) + /// (Originally from ..\FSComp.txt:158) static member FieldNotContainedAccessibilitiesDiffer(a0 : System.String, a1 : System.String) = (GetStringFunc("FieldNotContainedAccessibilitiesDiffer",",,,%s,,,%s,,,") a0 a1) /// The module contains the field\n %s \nbut its signature specifies\n %s \nThe 'static' modifiers differ - /// (Originally from ../FSComp.txt:159) + /// (Originally from ..\FSComp.txt:159) static member FieldNotContainedStaticsDiffer(a0 : System.String, a1 : System.String) = (GetStringFunc("FieldNotContainedStaticsDiffer",",,,%s,,,%s,,,") a0 a1) /// The module contains the field\n %s \nbut its signature specifies\n %s \nThe 'mutable' modifiers differ - /// (Originally from ../FSComp.txt:160) + /// (Originally from ..\FSComp.txt:160) static member FieldNotContainedMutablesDiffer(a0 : System.String, a1 : System.String) = (GetStringFunc("FieldNotContainedMutablesDiffer",",,,%s,,,%s,,,") a0 a1) /// The module contains the field\n %s \nbut its signature specifies\n %s \nThe 'literal' modifiers differ - /// (Originally from ../FSComp.txt:161) + /// (Originally from ..\FSComp.txt:161) static member FieldNotContainedLiteralsDiffer(a0 : System.String, a1 : System.String) = (GetStringFunc("FieldNotContainedLiteralsDiffer",",,,%s,,,%s,,,") a0 a1) /// The module contains the field\n %s \nbut its signature specifies\n %s \nThe types differ - /// (Originally from ../FSComp.txt:162) + /// (Originally from ..\FSComp.txt:162) static member FieldNotContainedTypesDiffer(a0 : System.String, a1 : System.String) = (GetStringFunc("FieldNotContainedTypesDiffer",",,,%s,,,%s,,,") a0 a1) /// The implicit instantiation of a generic construct at or near this point could not be resolved because it could resolve to multiple unrelated types, e.g. '%s' and '%s'. Consider using type annotations to resolve the ambiguity - /// (Originally from ../FSComp.txt:163) + /// (Originally from ..\FSComp.txt:163) static member typrelCannotResolveImplicitGenericInstantiation(a0 : System.String, a1 : System.String) = (331, GetStringFunc("typrelCannotResolveImplicitGenericInstantiation",",,,%s,,,%s,,,") a0 a1) /// Could not resolve the ambiguity inherent in the use of a 'printf'-style format string - /// (Originally from ../FSComp.txt:164) + /// (Originally from ..\FSComp.txt:164) static member typrelCannotResolveAmbiguityInPrintf() = (333, GetStringFunc("typrelCannotResolveAmbiguityInPrintf",",,,") ) /// Could not resolve the ambiguity in the use of a generic construct with an 'enum' constraint at or near this position - /// (Originally from ../FSComp.txt:165) + /// (Originally from ..\FSComp.txt:165) static member typrelCannotResolveAmbiguityInEnum() = (334, GetStringFunc("typrelCannotResolveAmbiguityInEnum",",,,") ) /// Could not resolve the ambiguity in the use of a generic construct with a 'delegate' constraint at or near this position - /// (Originally from ../FSComp.txt:166) + /// (Originally from ..\FSComp.txt:166) static member typrelCannotResolveAmbiguityInDelegate() = (335, GetStringFunc("typrelCannotResolveAmbiguityInDelegate",",,,") ) /// Invalid value - /// (Originally from ../FSComp.txt:167) + /// (Originally from ..\FSComp.txt:167) static member typrelInvalidValue() = (337, GetStringFunc("typrelInvalidValue",",,,") ) /// The signature and implementation are not compatible because the respective type parameter counts differ - /// (Originally from ../FSComp.txt:168) + /// (Originally from ..\FSComp.txt:168) static member typrelSigImplNotCompatibleParamCountsDiffer() = (338, GetStringFunc("typrelSigImplNotCompatibleParamCountsDiffer",",,,") ) /// The signature and implementation are not compatible because the type parameter in the class/signature has a different compile-time requirement to the one in the member/implementation - /// (Originally from ../FSComp.txt:169) + /// (Originally from ..\FSComp.txt:169) static member typrelSigImplNotCompatibleCompileTimeRequirementsDiffer() = (339, GetStringFunc("typrelSigImplNotCompatibleCompileTimeRequirementsDiffer",",,,") ) /// The signature and implementation are not compatible because the declaration of the type parameter '%s' requires a constraint of the form %s - /// (Originally from ../FSComp.txt:170) + /// (Originally from ..\FSComp.txt:170) static member typrelSigImplNotCompatibleConstraintsDiffer(a0 : System.String, a1 : System.String) = (340, GetStringFunc("typrelSigImplNotCompatibleConstraintsDiffer",",,,%s,,,%s,,,") a0 a1) /// The signature and implementation are not compatible because the type parameter '%s' has a constraint of the form %s but the implementation does not. Either remove this constraint from the signature or add it to the implementation. - /// (Originally from ../FSComp.txt:171) + /// (Originally from ..\FSComp.txt:171) static member typrelSigImplNotCompatibleConstraintsDifferRemove(a0 : System.String, a1 : System.String) = (341, GetStringFunc("typrelSigImplNotCompatibleConstraintsDifferRemove",",,,%s,,,%s,,,") a0 a1) /// The type '%s' implements 'System.IComparable'. Consider also adding an explicit override for 'Object.Equals' - /// (Originally from ../FSComp.txt:172) + /// (Originally from ..\FSComp.txt:172) static member typrelTypeImplementsIComparableShouldOverrideObjectEquals(a0 : System.String) = (342, GetStringFunc("typrelTypeImplementsIComparableShouldOverrideObjectEquals",",,,%s,,,") a0) /// The type '%s' implements 'System.IComparable' explicitly but provides no corresponding override for 'Object.Equals'. An implementation of 'Object.Equals' has been automatically provided, implemented via 'System.IComparable'. Consider implementing the override 'Object.Equals' explicitly - /// (Originally from ../FSComp.txt:173) + /// (Originally from ..\FSComp.txt:173) static member typrelTypeImplementsIComparableDefaultObjectEqualsProvided(a0 : System.String) = (343, GetStringFunc("typrelTypeImplementsIComparableDefaultObjectEqualsProvided",",,,%s,,,") a0) /// The struct, record or union type '%s' has an explicit implementation of 'Object.GetHashCode' or 'Object.Equals'. You must apply the 'CustomEquality' attribute to the type - /// (Originally from ../FSComp.txt:174) + /// (Originally from ..\FSComp.txt:174) static member typrelExplicitImplementationOfGetHashCodeOrEquals(a0 : System.String) = (344, GetStringFunc("typrelExplicitImplementationOfGetHashCodeOrEquals",",,,%s,,,") a0) /// The struct, record or union type '%s' has an explicit implementation of 'Object.GetHashCode'. Consider implementing a matching override for 'Object.Equals(obj)' - /// (Originally from ../FSComp.txt:175) + /// (Originally from ..\FSComp.txt:175) static member typrelExplicitImplementationOfGetHashCode(a0 : System.String) = (345, GetStringFunc("typrelExplicitImplementationOfGetHashCode",",,,%s,,,") a0) /// The struct, record or union type '%s' has an explicit implementation of 'Object.Equals'. Consider implementing a matching override for 'Object.GetHashCode()' - /// (Originally from ../FSComp.txt:176) + /// (Originally from ..\FSComp.txt:176) static member typrelExplicitImplementationOfEquals(a0 : System.String) = (346, GetStringFunc("typrelExplicitImplementationOfEquals",",,,%s,,,") a0) /// The exception definitions are not compatible because a CLI exception mapping is being hidden by a signature. The exception mapping must be visible to other modules. The module contains the exception definition\n %s \nbut its signature specifies\n\t%s - /// (Originally from ../FSComp.txt:177) + /// (Originally from ..\FSComp.txt:177) static member ExceptionDefsNotCompatibleHiddenBySignature(a0 : System.String, a1 : System.String) = (GetStringFunc("ExceptionDefsNotCompatibleHiddenBySignature",",,,%s,,,%s,,,") a0 a1) /// The exception definitions are not compatible because the CLI representations differ. The module contains the exception definition\n %s \nbut its signature specifies\n\t%s - /// (Originally from ../FSComp.txt:178) + /// (Originally from ..\FSComp.txt:178) static member ExceptionDefsNotCompatibleDotNetRepresentationsDiffer(a0 : System.String, a1 : System.String) = (GetStringFunc("ExceptionDefsNotCompatibleDotNetRepresentationsDiffer",",,,%s,,,%s,,,") a0 a1) /// The exception definitions are not compatible because the exception abbreviation is being hidden by the signature. The abbreviation must be visible to other CLI languages. Consider making the abbreviation visible in the signature. The module contains the exception definition\n %s \nbut its signature specifies\n\t%s. - /// (Originally from ../FSComp.txt:179) + /// (Originally from ..\FSComp.txt:179) static member ExceptionDefsNotCompatibleAbbreviationHiddenBySignature(a0 : System.String, a1 : System.String) = (GetStringFunc("ExceptionDefsNotCompatibleAbbreviationHiddenBySignature",",,,%s,,,%s,,,") a0 a1) /// The exception definitions are not compatible because the exception abbreviations in the signature and implementation differ. The module contains the exception definition\n %s \nbut its signature specifies\n\t%s. - /// (Originally from ../FSComp.txt:180) + /// (Originally from ..\FSComp.txt:180) static member ExceptionDefsNotCompatibleSignaturesDiffer(a0 : System.String, a1 : System.String) = (GetStringFunc("ExceptionDefsNotCompatibleSignaturesDiffer",",,,%s,,,%s,,,") a0 a1) /// The exception definitions are not compatible because the exception declarations differ. The module contains the exception definition\n %s \nbut its signature specifies\n\t%s. - /// (Originally from ../FSComp.txt:181) + /// (Originally from ..\FSComp.txt:181) static member ExceptionDefsNotCompatibleExceptionDeclarationsDiffer(a0 : System.String, a1 : System.String) = (GetStringFunc("ExceptionDefsNotCompatibleExceptionDeclarationsDiffer",",,,%s,,,%s,,,") a0 a1) /// The exception definitions are not compatible because the field '%s' was required by the signature but was not specified by the implementation. The module contains the exception definition\n %s \nbut its signature specifies\n\t%s. - /// (Originally from ../FSComp.txt:182) + /// (Originally from ..\FSComp.txt:182) static member ExceptionDefsNotCompatibleFieldInSigButNotImpl(a0 : System.String, a1 : System.String, a2 : System.String) = (GetStringFunc("ExceptionDefsNotCompatibleFieldInSigButNotImpl",",,,%s,,,%s,,,%s,,,") a0 a1 a2) /// The exception definitions are not compatible because the field '%s' was present in the implementation but not in the signature. The module contains the exception definition\n %s \nbut its signature specifies\n\t%s. - /// (Originally from ../FSComp.txt:183) + /// (Originally from ..\FSComp.txt:183) static member ExceptionDefsNotCompatibleFieldInImplButNotSig(a0 : System.String, a1 : System.String, a2 : System.String) = (GetStringFunc("ExceptionDefsNotCompatibleFieldInImplButNotSig",",,,%s,,,%s,,,%s,,,") a0 a1 a2) /// The exception definitions are not compatible because the order of the fields is different in the signature and implementation. The module contains the exception definition\n %s \nbut its signature specifies\n\t%s. - /// (Originally from ../FSComp.txt:184) + /// (Originally from ..\FSComp.txt:184) static member ExceptionDefsNotCompatibleFieldOrderDiffers(a0 : System.String, a1 : System.String) = (GetStringFunc("ExceptionDefsNotCompatibleFieldOrderDiffers",",,,%s,,,%s,,,") a0 a1) /// The namespace or module attributes differ between signature and implementation - /// (Originally from ../FSComp.txt:185) + /// (Originally from ..\FSComp.txt:185) static member typrelModuleNamespaceAttributesDifferInSigAndImpl() = (355, GetStringFunc("typrelModuleNamespaceAttributesDifferInSigAndImpl",",,,") ) /// This method is over-constrained in its type parameters - /// (Originally from ../FSComp.txt:186) + /// (Originally from ..\FSComp.txt:186) static member typrelMethodIsOverconstrained() = (356, GetStringFunc("typrelMethodIsOverconstrained",",,,") ) /// No implementations of '%s' had the correct number of arguments and type parameters. The required signature is '%s'. - /// (Originally from ../FSComp.txt:187) + /// (Originally from ..\FSComp.txt:187) static member typrelOverloadNotFound(a0 : System.String, a1 : System.String) = (357, GetStringFunc("typrelOverloadNotFound",",,,%s,,,%s,,,") a0 a1) /// The override for '%s' was ambiguous - /// (Originally from ../FSComp.txt:188) + /// (Originally from ..\FSComp.txt:188) static member typrelOverrideWasAmbiguous(a0 : System.String) = (358, GetStringFunc("typrelOverrideWasAmbiguous",",,,%s,,,") a0) /// More than one override implements '%s' - /// (Originally from ../FSComp.txt:189) + /// (Originally from ..\FSComp.txt:189) static member typrelMoreThenOneOverride(a0 : System.String) = (359, GetStringFunc("typrelMoreThenOneOverride",",,,%s,,,") a0) /// The method '%s' is sealed and cannot be overridden - /// (Originally from ../FSComp.txt:190) + /// (Originally from ..\FSComp.txt:190) static member typrelMethodIsSealed(a0 : System.String) = (360, GetStringFunc("typrelMethodIsSealed",",,,%s,,,") a0) /// The override '%s' implements more than one abstract slot, e.g. '%s' and '%s' - /// (Originally from ../FSComp.txt:191) + /// (Originally from ..\FSComp.txt:191) static member typrelOverrideImplementsMoreThenOneSlot(a0 : System.String, a1 : System.String, a2 : System.String) = (361, GetStringFunc("typrelOverrideImplementsMoreThenOneSlot",",,,%s,,,%s,,,%s,,,") a0 a1 a2) /// Duplicate or redundant interface - /// (Originally from ../FSComp.txt:192) + /// (Originally from ..\FSComp.txt:192) static member typrelDuplicateInterface() = (362, GetStringFunc("typrelDuplicateInterface",",,,") ) /// The interface '%s' is included in multiple explicitly implemented interface types. Add an explicit implementation of this interface. - /// (Originally from ../FSComp.txt:193) + /// (Originally from ..\FSComp.txt:193) static member typrelNeedExplicitImplementation(a0 : System.String) = (363, GetStringFunc("typrelNeedExplicitImplementation",",,,%s,,,") a0) /// A named argument has been assigned more than one value - /// (Originally from ../FSComp.txt:194) + /// (Originally from ..\FSComp.txt:194) static member typrelNamedArgumentHasBeenAssignedMoreThenOnce() = (364, GetStringFunc("typrelNamedArgumentHasBeenAssignedMoreThenOnce",",,,") ) /// No implementation was given for '%s' - /// (Originally from ../FSComp.txt:195) + /// (Originally from ..\FSComp.txt:195) static member typrelNoImplementationGiven(a0 : System.String) = (365, GetStringFunc("typrelNoImplementationGiven",",,,%s,,,") a0) /// No implementation was given for '%s'. Note that all interface members must be implemented and listed under an appropriate 'interface' declaration, e.g. 'interface ... with member ...'. - /// (Originally from ../FSComp.txt:196) + /// (Originally from ..\FSComp.txt:196) static member typrelNoImplementationGivenWithSuggestion(a0 : System.String) = (366, GetStringFunc("typrelNoImplementationGivenWithSuggestion",",,,%s,,,") a0) /// The member '%s' does not have the correct number of arguments. The required signature is '%s'. - /// (Originally from ../FSComp.txt:197) + /// (Originally from ..\FSComp.txt:197) static member typrelMemberDoesNotHaveCorrectNumberOfArguments(a0 : System.String, a1 : System.String) = (367, GetStringFunc("typrelMemberDoesNotHaveCorrectNumberOfArguments",",,,%s,,,%s,,,") a0 a1) /// The member '%s' does not have the correct number of method type parameters. The required signature is '%s'. - /// (Originally from ../FSComp.txt:198) + /// (Originally from ..\FSComp.txt:198) static member typrelMemberDoesNotHaveCorrectNumberOfTypeParameters(a0 : System.String, a1 : System.String) = (368, GetStringFunc("typrelMemberDoesNotHaveCorrectNumberOfTypeParameters",",,,%s,,,%s,,,") a0 a1) /// The member '%s' does not have the correct kinds of generic parameters. The required signature is '%s'. - /// (Originally from ../FSComp.txt:199) + /// (Originally from ..\FSComp.txt:199) static member typrelMemberDoesNotHaveCorrectKindsOfGenericParameters(a0 : System.String, a1 : System.String) = (369, GetStringFunc("typrelMemberDoesNotHaveCorrectKindsOfGenericParameters",",,,%s,,,%s,,,") a0 a1) /// The member '%s' cannot be used to implement '%s'. The required signature is '%s'. - /// (Originally from ../FSComp.txt:200) + /// (Originally from ..\FSComp.txt:200) static member typrelMemberCannotImplement(a0 : System.String, a1 : System.String, a2 : System.String) = (370, GetStringFunc("typrelMemberCannotImplement",",,,%s,,,%s,,,%s,,,") a0 a1 a2) /// Error while parsing embedded IL - /// (Originally from ../FSComp.txt:201) + /// (Originally from ..\FSComp.txt:201) static member astParseEmbeddedILError() = (371, GetStringFunc("astParseEmbeddedILError",",,,") ) /// Error while parsing embedded IL type - /// (Originally from ../FSComp.txt:202) + /// (Originally from ..\FSComp.txt:202) static member astParseEmbeddedILTypeError() = (372, GetStringFunc("astParseEmbeddedILTypeError",",,,") ) /// This indexer notation has been removed from the F# language - /// (Originally from ../FSComp.txt:203) + /// (Originally from ..\FSComp.txt:203) static member astDeprecatedIndexerNotation() = (GetStringFunc("astDeprecatedIndexerNotation",",,,") ) /// Invalid expression on left of assignment - /// (Originally from ../FSComp.txt:204) + /// (Originally from ..\FSComp.txt:204) static member astInvalidExprLeftHandOfAssignment() = (374, GetStringFunc("astInvalidExprLeftHandOfAssignment",",,,") ) /// The 'ReferenceEquality' attribute cannot be used on structs. Consider using the 'StructuralEquality' attribute instead, or implement an override for 'System.Object.Equals(obj)'. - /// (Originally from ../FSComp.txt:205) + /// (Originally from ..\FSComp.txt:205) static member augNoRefEqualsOnStruct() = (376, GetStringFunc("augNoRefEqualsOnStruct",",,,") ) /// This type uses an invalid mix of the attributes 'NoEquality', 'ReferenceEquality', 'StructuralEquality', 'NoComparison' and 'StructuralComparison' - /// (Originally from ../FSComp.txt:206) + /// (Originally from ..\FSComp.txt:206) static member augInvalidAttrs() = (377, GetStringFunc("augInvalidAttrs",",,,") ) /// The 'NoEquality' attribute must be used in conjunction with the 'NoComparison' attribute - /// (Originally from ../FSComp.txt:207) + /// (Originally from ..\FSComp.txt:207) static member augNoEqualityNeedsNoComparison() = (378, GetStringFunc("augNoEqualityNeedsNoComparison",",,,") ) /// The 'StructuralComparison' attribute must be used in conjunction with the 'StructuralEquality' attribute - /// (Originally from ../FSComp.txt:208) + /// (Originally from ..\FSComp.txt:208) static member augStructCompNeedsStructEquality() = (379, GetStringFunc("augStructCompNeedsStructEquality",",,,") ) /// The 'StructuralEquality' attribute must be used in conjunction with the 'NoComparison' or 'StructuralComparison' attributes - /// (Originally from ../FSComp.txt:209) + /// (Originally from ..\FSComp.txt:209) static member augStructEqNeedsNoCompOrStructComp() = (380, GetStringFunc("augStructEqNeedsNoCompOrStructComp",",,,") ) /// A type cannot have both the 'ReferenceEquality' and 'StructuralEquality' or 'StructuralComparison' attributes - /// (Originally from ../FSComp.txt:210) + /// (Originally from ..\FSComp.txt:210) static member augTypeCantHaveRefEqAndStructAttrs() = (381, GetStringFunc("augTypeCantHaveRefEqAndStructAttrs",",,,") ) /// Only record, union, exception and struct types may be augmented with the 'ReferenceEquality', 'StructuralEquality' and 'StructuralComparison' attributes - /// (Originally from ../FSComp.txt:211) + /// (Originally from ..\FSComp.txt:211) static member augOnlyCertainTypesCanHaveAttrs() = (382, GetStringFunc("augOnlyCertainTypesCanHaveAttrs",",,,") ) /// A type with attribute 'ReferenceEquality' cannot have an explicit implementation of 'Object.Equals(obj)', 'System.IEquatable<_>' or 'System.Collections.IStructuralEquatable' - /// (Originally from ../FSComp.txt:212) + /// (Originally from ..\FSComp.txt:212) static member augRefEqCantHaveObjEquals() = (383, GetStringFunc("augRefEqCantHaveObjEquals",",,,") ) /// A type with attribute 'CustomEquality' must have an explicit implementation of at least one of 'Object.Equals(obj)', 'System.IEquatable<_>' or 'System.Collections.IStructuralEquatable' - /// (Originally from ../FSComp.txt:213) + /// (Originally from ..\FSComp.txt:213) static member augCustomEqNeedsObjEquals() = (384, GetStringFunc("augCustomEqNeedsObjEquals",",,,") ) /// A type with attribute 'CustomComparison' must have an explicit implementation of at least one of 'System.IComparable' or 'System.Collections.IStructuralComparable' - /// (Originally from ../FSComp.txt:214) + /// (Originally from ..\FSComp.txt:214) static member augCustomCompareNeedsIComp() = (385, GetStringFunc("augCustomCompareNeedsIComp",",,,") ) /// A type with attribute 'NoEquality' should not usually have an explicit implementation of 'Object.Equals(obj)'. Disable this warning if this is intentional for interoperability purposes - /// (Originally from ../FSComp.txt:215) + /// (Originally from ..\FSComp.txt:215) static member augNoEqNeedsNoObjEquals() = (386, GetStringFunc("augNoEqNeedsNoObjEquals",",,,") ) /// A type with attribute 'NoComparison' should not usually have an explicit implementation of 'System.IComparable', 'System.IComparable<_>' or 'System.Collections.IStructuralComparable'. Disable this warning if this is intentional for interoperability purposes - /// (Originally from ../FSComp.txt:216) + /// (Originally from ..\FSComp.txt:216) static member augNoCompCantImpIComp() = (386, GetStringFunc("augNoCompCantImpIComp",",,,") ) /// The 'CustomEquality' attribute must be used in conjunction with the 'NoComparison' or 'CustomComparison' attributes - /// (Originally from ../FSComp.txt:217) + /// (Originally from ..\FSComp.txt:217) static member augCustomEqNeedsNoCompOrCustomComp() = (387, GetStringFunc("augCustomEqNeedsNoCompOrCustomComp",",,,") ) /// Positional specifiers are not permitted in format strings - /// (Originally from ../FSComp.txt:218) + /// (Originally from ..\FSComp.txt:218) static member forPositionalSpecifiersNotPermitted() = (GetStringFunc("forPositionalSpecifiersNotPermitted",",,,") ) /// Missing format specifier - /// (Originally from ../FSComp.txt:219) + /// (Originally from ..\FSComp.txt:219) static member forMissingFormatSpecifier() = (GetStringFunc("forMissingFormatSpecifier",",,,") ) /// '%s' flag set twice - /// (Originally from ../FSComp.txt:220) + /// (Originally from ..\FSComp.txt:220) static member forFlagSetTwice(a0 : System.String) = (GetStringFunc("forFlagSetTwice",",,,%s,,,") a0) /// Prefix flag (' ' or '+') set twice - /// (Originally from ../FSComp.txt:221) + /// (Originally from ..\FSComp.txt:221) static member forPrefixFlagSpacePlusSetTwice() = (GetStringFunc("forPrefixFlagSpacePlusSetTwice",",,,") ) /// The # formatting modifier is invalid in F# - /// (Originally from ../FSComp.txt:222) + /// (Originally from ..\FSComp.txt:222) static member forHashSpecifierIsInvalid() = (GetStringFunc("forHashSpecifierIsInvalid",",,,") ) /// Bad precision in format specifier - /// (Originally from ../FSComp.txt:223) + /// (Originally from ..\FSComp.txt:223) static member forBadPrecision() = (GetStringFunc("forBadPrecision",",,,") ) /// Bad width in format specifier - /// (Originally from ../FSComp.txt:224) + /// (Originally from ..\FSComp.txt:224) static member forBadWidth() = (GetStringFunc("forBadWidth",",,,") ) /// '%s' format does not support '0' flag - /// (Originally from ../FSComp.txt:225) + /// (Originally from ..\FSComp.txt:225) static member forDoesNotSupportZeroFlag(a0 : System.String) = (GetStringFunc("forDoesNotSupportZeroFlag",",,,%s,,,") a0) /// Precision missing after the '.' - /// (Originally from ../FSComp.txt:226) + /// (Originally from ..\FSComp.txt:226) static member forPrecisionMissingAfterDot() = (GetStringFunc("forPrecisionMissingAfterDot",",,,") ) /// '%s' format does not support precision - /// (Originally from ../FSComp.txt:227) + /// (Originally from ..\FSComp.txt:227) static member forFormatDoesntSupportPrecision(a0 : System.String) = (GetStringFunc("forFormatDoesntSupportPrecision",",,,%s,,,") a0) /// Bad format specifier (after l or L): Expected ld,li,lo,lu,lx or lX. In F# code you can use %%d, %%x, %%o or %%u instead, which are overloaded to work with all basic integer types. - /// (Originally from ../FSComp.txt:228) + /// (Originally from ..\FSComp.txt:228) static member forBadFormatSpecifier() = (GetStringFunc("forBadFormatSpecifier",",,,") ) /// The 'l' or 'L' in this format specifier is unnecessary. In F# code you can use %%d, %%x, %%o or %%u instead, which are overloaded to work with all basic integer types. - /// (Originally from ../FSComp.txt:229) + /// (Originally from ..\FSComp.txt:229) static member forLIsUnnecessary() = (GetStringFunc("forLIsUnnecessary",",,,") ) /// The 'h' or 'H' in this format specifier is unnecessary. You can use %%d, %%x, %%o or %%u instead, which are overloaded to work with all basic integer types. - /// (Originally from ../FSComp.txt:230) + /// (Originally from ..\FSComp.txt:230) static member forHIsUnnecessary() = (GetStringFunc("forHIsUnnecessary",",,,") ) /// '%s' does not support prefix '%s' flag - /// (Originally from ../FSComp.txt:231) + /// (Originally from ..\FSComp.txt:231) static member forDoesNotSupportPrefixFlag(a0 : System.String, a1 : System.String) = (GetStringFunc("forDoesNotSupportPrefixFlag",",,,%s,,,%s,,,") a0 a1) /// Bad format specifier: '%s' - /// (Originally from ../FSComp.txt:232) + /// (Originally from ..\FSComp.txt:232) static member forBadFormatSpecifierGeneral(a0 : System.String) = (GetStringFunc("forBadFormatSpecifierGeneral",",,,%s,,,") a0) /// System.Environment.Exit did not exit - /// (Originally from ../FSComp.txt:233) + /// (Originally from ..\FSComp.txt:233) static member elSysEnvExitDidntExit() = (GetStringFunc("elSysEnvExitDidntExit",",,,") ) /// The treatment of this operator is now handled directly by the F# compiler and its meaning cannot be redefined - /// (Originally from ../FSComp.txt:234) + /// (Originally from ..\FSComp.txt:234) static member elDeprecatedOperator() = (GetStringFunc("elDeprecatedOperator",",,,") ) /// A protected member is called or 'base' is being used. This is only allowed in the direct implementation of members since they could escape their object scope. - /// (Originally from ../FSComp.txt:235) + /// (Originally from ..\FSComp.txt:235) static member chkProtectedOrBaseCalled() = (405, GetStringFunc("chkProtectedOrBaseCalled",",,,") ) /// The byref-typed variable '%s' is used in an invalid way. Byrefs cannot be captured by closures or passed to inner functions. - /// (Originally from ../FSComp.txt:236) + /// (Originally from ..\FSComp.txt:236) static member chkByrefUsedInInvalidWay(a0 : System.String) = (406, GetStringFunc("chkByrefUsedInInvalidWay",",,,%s,,,") a0) /// The 'base' keyword is used in an invalid way. Base calls cannot be used in closures. Consider using a private member to make base calls. - /// (Originally from ../FSComp.txt:237) + /// (Originally from ..\FSComp.txt:237) static member chkBaseUsedInInvalidWay() = (408, GetStringFunc("chkBaseUsedInInvalidWay",",,,") ) /// The variable '%s' is used in an invalid way - /// (Originally from ../FSComp.txt:238) + /// (Originally from ..\FSComp.txt:238) static member chkVariableUsedInInvalidWay(a0 : System.String) = (GetStringFunc("chkVariableUsedInInvalidWay",",,,%s,,,") a0) /// The type '%s' is less accessible than the value, member or type '%s' it is used in. - /// (Originally from ../FSComp.txt:239) + /// (Originally from ..\FSComp.txt:239) static member chkTypeLessAccessibleThanType(a0 : System.String, a1 : System.String) = (410, GetStringFunc("chkTypeLessAccessibleThanType",",,,%s,,,%s,,,") a0 a1) /// 'System.Void' can only be used as 'typeof' in F# - /// (Originally from ../FSComp.txt:240) + /// (Originally from ..\FSComp.txt:240) static member chkSystemVoidOnlyInTypeof() = (411, GetStringFunc("chkSystemVoidOnlyInTypeof",",,,") ) /// A type instantiation involves a byref type. This is not permitted by the rules of Common IL. - /// (Originally from ../FSComp.txt:241) + /// (Originally from ..\FSComp.txt:241) static member chkErrorUseOfByref() = (412, GetStringFunc("chkErrorUseOfByref",",,,") ) /// Calls to 'reraise' may only occur directly in a handler of a try-with - /// (Originally from ../FSComp.txt:242) + /// (Originally from ..\FSComp.txt:242) static member chkErrorContainsCallToRethrow() = (413, GetStringFunc("chkErrorContainsCallToRethrow",",,,") ) /// Expression-splicing operators may only be used within quotations - /// (Originally from ../FSComp.txt:243) + /// (Originally from ..\FSComp.txt:243) static member chkSplicingOnlyInQuotations() = (414, GetStringFunc("chkSplicingOnlyInQuotations",",,,") ) /// First-class uses of the expression-splicing operator are not permitted - /// (Originally from ../FSComp.txt:244) + /// (Originally from ..\FSComp.txt:244) static member chkNoFirstClassSplicing() = (415, GetStringFunc("chkNoFirstClassSplicing",",,,") ) /// First-class uses of the address-of operators are not permitted - /// (Originally from ../FSComp.txt:245) + /// (Originally from ..\FSComp.txt:245) static member chkNoFirstClassAddressOf() = (416, GetStringFunc("chkNoFirstClassAddressOf",",,,") ) /// First-class uses of the 'reraise' function is not permitted - /// (Originally from ../FSComp.txt:246) + /// (Originally from ..\FSComp.txt:246) static member chkNoFirstClassRethrow() = (417, GetStringFunc("chkNoFirstClassRethrow",",,,") ) /// The byref typed value '%s' cannot be used at this point - /// (Originally from ../FSComp.txt:247) + /// (Originally from ..\FSComp.txt:247) static member chkNoByrefAtThisPoint(a0 : System.String) = (418, GetStringFunc("chkNoByrefAtThisPoint",",,,%s,,,") a0) /// 'base' values may only be used to make direct calls to the base implementations of overridden members - /// (Originally from ../FSComp.txt:248) + /// (Originally from ..\FSComp.txt:248) static member chkLimitationsOfBaseKeyword() = (419, GetStringFunc("chkLimitationsOfBaseKeyword",",,,") ) /// Object constructors cannot directly use try/with and try/finally prior to the initialization of the object. This includes constructs such as 'for x in ...' that may elaborate to uses of these constructs. This is a limitation imposed by Common IL. - /// (Originally from ../FSComp.txt:249) + /// (Originally from ..\FSComp.txt:249) static member chkObjCtorsCantUseExceptionHandling() = (420, GetStringFunc("chkObjCtorsCantUseExceptionHandling",",,,") ) /// The address of the variable '%s' cannot be used at this point - /// (Originally from ../FSComp.txt:250) + /// (Originally from ..\FSComp.txt:250) static member chkNoAddressOfAtThisPoint(a0 : System.String) = (421, GetStringFunc("chkNoAddressOfAtThisPoint",",,,%s,,,") a0) /// The address of the static field '%s' cannot be used at this point - /// (Originally from ../FSComp.txt:251) + /// (Originally from ..\FSComp.txt:251) static member chkNoAddressStaticFieldAtThisPoint(a0 : System.String) = (422, GetStringFunc("chkNoAddressStaticFieldAtThisPoint",",,,%s,,,") a0) /// The address of the field '%s' cannot be used at this point - /// (Originally from ../FSComp.txt:252) + /// (Originally from ..\FSComp.txt:252) static member chkNoAddressFieldAtThisPoint(a0 : System.String) = (423, GetStringFunc("chkNoAddressFieldAtThisPoint",",,,%s,,,") a0) /// The address of an array element cannot be used at this point - /// (Originally from ../FSComp.txt:253) + /// (Originally from ..\FSComp.txt:253) static member chkNoAddressOfArrayElementAtThisPoint() = (424, GetStringFunc("chkNoAddressOfArrayElementAtThisPoint",",,,") ) /// The type of a first-class function cannot contain byrefs - /// (Originally from ../FSComp.txt:254) + /// (Originally from ..\FSComp.txt:254) static member chkFirstClassFuncNoByref() = (425, GetStringFunc("chkFirstClassFuncNoByref",",,,") ) /// A method return type would contain byrefs which is not permitted - /// (Originally from ../FSComp.txt:255) + /// (Originally from ..\FSComp.txt:255) static member chkReturnTypeNoByref() = (426, GetStringFunc("chkReturnTypeNoByref",",,,") ) /// Invalid custom attribute value (not a constant or literal) - /// (Originally from ../FSComp.txt:256) + /// (Originally from ..\FSComp.txt:256) static member chkInvalidCustAttrVal() = (428, GetStringFunc("chkInvalidCustAttrVal",",,,") ) /// The attribute type '%s' has 'AllowMultiple=false'. Multiple instances of this attribute cannot be attached to a single language element. - /// (Originally from ../FSComp.txt:257) + /// (Originally from ..\FSComp.txt:257) static member chkAttrHasAllowMultiFalse(a0 : System.String) = (429, GetStringFunc("chkAttrHasAllowMultiFalse",",,,%s,,,") a0) /// The member '%s' is used in an invalid way. A use of '%s' has been inferred prior to its definition at or near '%s'. This is an invalid forward reference. - /// (Originally from ../FSComp.txt:258) + /// (Originally from ..\FSComp.txt:258) static member chkMemberUsedInInvalidWay(a0 : System.String, a1 : System.String, a2 : System.String) = (430, GetStringFunc("chkMemberUsedInInvalidWay",",,,%s,,,%s,,,%s,,,") a0 a1 a2) /// A byref typed value would be stored here. Top-level let-bound byref values are not permitted. - /// (Originally from ../FSComp.txt:259) + /// (Originally from ..\FSComp.txt:259) static member chkNoByrefAsTopValue() = (431, GetStringFunc("chkNoByrefAsTopValue",",,,") ) /// [] terms cannot contain uses of the prefix splice operator '%%' - /// (Originally from ../FSComp.txt:260) + /// (Originally from ..\FSComp.txt:260) static member chkReflectedDefCantSplice() = (432, GetStringFunc("chkReflectedDefCantSplice",",,,") ) /// A function labeled with the 'EntryPointAttribute' attribute must be the last declaration in the last file in the compilation sequence. - /// (Originally from ../FSComp.txt:261) + /// (Originally from ..\FSComp.txt:261) static member chkEntryPointUsage() = (433, GetStringFunc("chkEntryPointUsage",",,,") ) /// compiled form of the union case - /// (Originally from ../FSComp.txt:262) + /// (Originally from ..\FSComp.txt:262) static member chkUnionCaseCompiledForm() = (GetStringFunc("chkUnionCaseCompiledForm",",,,") ) /// default augmentation of the union case - /// (Originally from ../FSComp.txt:263) + /// (Originally from ..\FSComp.txt:263) static member chkUnionCaseDefaultAugmentation() = (GetStringFunc("chkUnionCaseDefaultAugmentation",",,,") ) /// The property '%s' has the same name as a method in type '%s'. - /// (Originally from ../FSComp.txt:264) + /// (Originally from ..\FSComp.txt:264) static member chkPropertySameNameMethod(a0 : System.String, a1 : System.String) = (434, GetStringFunc("chkPropertySameNameMethod",",,,%s,,,%s,,,") a0 a1) /// The property '%s' of type '%s' has a getter and a setter that do not match. If one is abstract then the other must be as well. - /// (Originally from ../FSComp.txt:265) + /// (Originally from ..\FSComp.txt:265) static member chkGetterSetterDoNotMatchAbstract(a0 : System.String, a1 : System.String) = (435, GetStringFunc("chkGetterSetterDoNotMatchAbstract",",,,%s,,,%s,,,") a0 a1) /// The property '%s' has the same name as another property in type '%s', but one takes indexer arguments and the other does not. You may be missing an indexer argument to one of your properties. - /// (Originally from ../FSComp.txt:266) + /// (Originally from ..\FSComp.txt:266) static member chkPropertySameNameIndexer(a0 : System.String, a1 : System.String) = (436, GetStringFunc("chkPropertySameNameIndexer",",,,%s,,,%s,,,") a0 a1) /// A type would store a byref typed value. This is not permitted by Common IL. - /// (Originally from ../FSComp.txt:267) + /// (Originally from ..\FSComp.txt:267) static member chkCantStoreByrefValue() = (437, GetStringFunc("chkCantStoreByrefValue",",,,") ) /// Duplicate method. The method '%s' has the same name and signature as another method in type '%s'. - /// (Originally from ../FSComp.txt:269) + /// (Originally from ..\FSComp.txt:269) static member chkDuplicateMethod(a0 : System.String, a1 : System.String) = (438, GetStringFunc("chkDuplicateMethod",",,,%s,,,%s,,,") a0 a1) /// Duplicate method. The method '%s' has the same name and signature as another method in type '%s' once tuples, functions, units of measure and/or provided types are erased. - /// (Originally from ../FSComp.txt:270) + /// (Originally from ..\FSComp.txt:270) static member chkDuplicateMethodWithSuffix(a0 : System.String, a1 : System.String) = (438, GetStringFunc("chkDuplicateMethodWithSuffix",",,,%s,,,%s,,,") a0 a1) /// The method '%s' has curried arguments but has the same name as another method in type '%s'. Methods with curried arguments cannot be overloaded. Consider using a method taking tupled arguments. - /// (Originally from ../FSComp.txt:271) + /// (Originally from ..\FSComp.txt:271) static member chkDuplicateMethodCurried(a0 : System.String, a1 : System.String) = (439, GetStringFunc("chkDuplicateMethodCurried",",,,%s,,,%s,,,") a0 a1) /// Methods with curried arguments cannot declare 'out', 'ParamArray', 'optional', 'ReflectedDefinition', 'byref', 'CallerLineNumber', 'CallerMemberName', or 'CallerFilePath' arguments - /// (Originally from ../FSComp.txt:272) + /// (Originally from ..\FSComp.txt:272) static member chkCurriedMethodsCantHaveOutParams() = (440, GetStringFunc("chkCurriedMethodsCantHaveOutParams",",,,") ) /// Duplicate property. The property '%s' has the same name and signature as another property in type '%s'. - /// (Originally from ../FSComp.txt:273) + /// (Originally from ..\FSComp.txt:273) static member chkDuplicateProperty(a0 : System.String, a1 : System.String) = (441, GetStringFunc("chkDuplicateProperty",",,,%s,,,%s,,,") a0 a1) /// Duplicate property. The property '%s' has the same name and signature as another property in type '%s' once tuples, functions, units of measure and/or provided types are erased. - /// (Originally from ../FSComp.txt:274) + /// (Originally from ..\FSComp.txt:274) static member chkDuplicatePropertyWithSuffix(a0 : System.String, a1 : System.String) = (441, GetStringFunc("chkDuplicatePropertyWithSuffix",",,,%s,,,%s,,,") a0 a1) /// Duplicate method. The abstract method '%s' has the same name and signature as an abstract method in an inherited type. - /// (Originally from ../FSComp.txt:275) + /// (Originally from ..\FSComp.txt:275) static member chkDuplicateMethodInheritedType(a0 : System.String) = (442, GetStringFunc("chkDuplicateMethodInheritedType",",,,%s,,,") a0) /// Duplicate method. The abstract method '%s' has the same name and signature as an abstract method in an inherited type once tuples, functions, units of measure and/or provided types are erased. - /// (Originally from ../FSComp.txt:276) + /// (Originally from ..\FSComp.txt:276) static member chkDuplicateMethodInheritedTypeWithSuffix(a0 : System.String) = (442, GetStringFunc("chkDuplicateMethodInheritedTypeWithSuffix",",,,%s,,,") a0) /// This type implements the same interface at different generic instantiations '%s' and '%s'. This is not permitted in this version of F#. - /// (Originally from ../FSComp.txt:277) + /// (Originally from ..\FSComp.txt:277) static member chkMultipleGenericInterfaceInstantiations(a0 : System.String, a1 : System.String) = (443, GetStringFunc("chkMultipleGenericInterfaceInstantiations",",,,%s,,,%s,,,") a0 a1) /// The type of a field using the 'DefaultValue' attribute must admit default initialization, i.e. have 'null' as a proper value or be a struct type whose fields all admit default initialization. You can use 'DefaultValue(false)' to disable this check - /// (Originally from ../FSComp.txt:278) + /// (Originally from ..\FSComp.txt:278) static member chkValueWithDefaultValueMustHaveDefaultValue() = (444, GetStringFunc("chkValueWithDefaultValueMustHaveDefaultValue",",,,") ) /// The type abbreviation contains byrefs. This is not permitted by F#. - /// (Originally from ../FSComp.txt:279) + /// (Originally from ..\FSComp.txt:279) static member chkNoByrefInTypeAbbrev() = (445, GetStringFunc("chkNoByrefInTypeAbbrev",",,,") ) /// The variable '%s' is bound in a quotation but is used as part of a spliced expression. This is not permitted since it may escape its scope. - /// (Originally from ../FSComp.txt:280) + /// (Originally from ..\FSComp.txt:280) static member crefBoundVarUsedInSplice(a0 : System.String) = (446, GetStringFunc("crefBoundVarUsedInSplice",",,,%s,,,") a0) /// Quotations cannot contain uses of generic expressions - /// (Originally from ../FSComp.txt:281) + /// (Originally from ..\FSComp.txt:281) static member crefQuotationsCantContainGenericExprs() = (447, GetStringFunc("crefQuotationsCantContainGenericExprs",",,,") ) /// Quotations cannot contain function definitions that are inferred or declared to be generic. Consider adding some type constraints to make this a valid quoted expression. - /// (Originally from ../FSComp.txt:282) + /// (Originally from ..\FSComp.txt:282) static member crefQuotationsCantContainGenericFunctions() = (448, GetStringFunc("crefQuotationsCantContainGenericFunctions",",,,") ) /// Quotations cannot contain object expressions - /// (Originally from ../FSComp.txt:283) + /// (Originally from ..\FSComp.txt:283) static member crefQuotationsCantContainObjExprs() = (449, GetStringFunc("crefQuotationsCantContainObjExprs",",,,") ) /// Quotations cannot contain expressions that take the address of a field - /// (Originally from ../FSComp.txt:284) + /// (Originally from ..\FSComp.txt:284) static member crefQuotationsCantContainAddressOf() = (450, GetStringFunc("crefQuotationsCantContainAddressOf",",,,") ) /// Quotations cannot contain expressions that fetch static fields - /// (Originally from ../FSComp.txt:285) + /// (Originally from ..\FSComp.txt:285) static member crefQuotationsCantContainStaticFieldRef() = (451, GetStringFunc("crefQuotationsCantContainStaticFieldRef",",,,") ) /// Quotations cannot contain inline assembly code or pattern matching on arrays - /// (Originally from ../FSComp.txt:286) + /// (Originally from ..\FSComp.txt:286) static member crefQuotationsCantContainInlineIL() = (452, GetStringFunc("crefQuotationsCantContainInlineIL",",,,") ) /// Quotations cannot contain descending for loops - /// (Originally from ../FSComp.txt:287) + /// (Originally from ..\FSComp.txt:287) static member crefQuotationsCantContainDescendingForLoops() = (453, GetStringFunc("crefQuotationsCantContainDescendingForLoops",",,,") ) /// Quotations cannot contain expressions that fetch union case indexes - /// (Originally from ../FSComp.txt:288) + /// (Originally from ..\FSComp.txt:288) static member crefQuotationsCantFetchUnionIndexes() = (454, GetStringFunc("crefQuotationsCantFetchUnionIndexes",",,,") ) /// Quotations cannot contain expressions that set union case fields - /// (Originally from ../FSComp.txt:289) + /// (Originally from ..\FSComp.txt:289) static member crefQuotationsCantSetUnionFields() = (455, GetStringFunc("crefQuotationsCantSetUnionFields",",,,") ) /// Quotations cannot contain expressions that set fields in exception values - /// (Originally from ../FSComp.txt:290) + /// (Originally from ..\FSComp.txt:290) static member crefQuotationsCantSetExceptionFields() = (456, GetStringFunc("crefQuotationsCantSetExceptionFields",",,,") ) /// Quotations cannot contain expressions that require byref pointers - /// (Originally from ../FSComp.txt:291) + /// (Originally from ..\FSComp.txt:291) static member crefQuotationsCantRequireByref() = (457, GetStringFunc("crefQuotationsCantRequireByref",",,,") ) /// Quotations cannot contain expressions that make member constraint calls, or uses of operators that implicitly resolve to a member constraint call - /// (Originally from ../FSComp.txt:292) + /// (Originally from ..\FSComp.txt:292) static member crefQuotationsCantCallTraitMembers() = (458, GetStringFunc("crefQuotationsCantCallTraitMembers",",,,") ) /// Quotations cannot contain this kind of constant - /// (Originally from ../FSComp.txt:293) + /// (Originally from ..\FSComp.txt:293) static member crefQuotationsCantContainThisConstant() = (459, GetStringFunc("crefQuotationsCantContainThisConstant",",,,") ) /// Quotations cannot contain this kind of pattern match - /// (Originally from ../FSComp.txt:294) + /// (Originally from ..\FSComp.txt:294) static member crefQuotationsCantContainThisPatternMatch() = (460, GetStringFunc("crefQuotationsCantContainThisPatternMatch",",,,") ) /// Quotations cannot contain array pattern matching - /// (Originally from ../FSComp.txt:295) + /// (Originally from ..\FSComp.txt:295) static member crefQuotationsCantContainArrayPatternMatching() = (461, GetStringFunc("crefQuotationsCantContainArrayPatternMatching",",,,") ) /// Quotations cannot contain this kind of type - /// (Originally from ../FSComp.txt:296) + /// (Originally from ..\FSComp.txt:296) static member crefQuotationsCantContainThisType() = (462, GetStringFunc("crefQuotationsCantContainThisType",",,,") ) /// The declared type parameter '%s' cannot be used here since the type parameter cannot be resolved at compile time - /// (Originally from ../FSComp.txt:297) + /// (Originally from ..\FSComp.txt:297) static member csTypeCannotBeResolvedAtCompileTime(a0 : System.String) = (GetStringFunc("csTypeCannotBeResolvedAtCompileTime",",,,%s,,,") a0) /// This code is less generic than indicated by its annotations. A unit-of-measure specified using '_' has been determined to be '1', i.e. dimensionless. Consider making the code generic, or removing the use of '_'. - /// (Originally from ../FSComp.txt:298) + /// (Originally from ..\FSComp.txt:298) static member csCodeLessGeneric() = (464, GetStringFunc("csCodeLessGeneric",",,,") ) /// Type inference problem too complicated (maximum iteration depth reached). Consider adding further type annotations. - /// (Originally from ../FSComp.txt:299) + /// (Originally from ..\FSComp.txt:299) static member csTypeInferenceMaxDepth() = (465, GetStringFunc("csTypeInferenceMaxDepth",",,,") ) /// Expected arguments to an instance member - /// (Originally from ../FSComp.txt:300) + /// (Originally from ..\FSComp.txt:300) static member csExpectedArguments() = (GetStringFunc("csExpectedArguments",",,,") ) /// This indexer expects %d arguments but is here given %d - /// (Originally from ../FSComp.txt:301) + /// (Originally from ..\FSComp.txt:301) static member csIndexArgumentMismatch(a0 : System.Int32, a1 : System.Int32) = (GetStringFunc("csIndexArgumentMismatch",",,,%d,,,%d,,,") a0 a1) /// Expecting a type supporting the operator '%s' but given a function type. You may be missing an argument to a function. - /// (Originally from ../FSComp.txt:302) + /// (Originally from ..\FSComp.txt:302) static member csExpectTypeWithOperatorButGivenFunction(a0 : System.String) = (GetStringFunc("csExpectTypeWithOperatorButGivenFunction",",,,%s,,,") a0) /// Expecting a type supporting the operator '%s' but given a tuple type - /// (Originally from ../FSComp.txt:303) + /// (Originally from ..\FSComp.txt:303) static member csExpectTypeWithOperatorButGivenTuple(a0 : System.String) = (GetStringFunc("csExpectTypeWithOperatorButGivenTuple",",,,%s,,,") a0) /// None of the types '%s' support the operator '%s' - /// (Originally from ../FSComp.txt:304) + /// (Originally from ..\FSComp.txt:304) static member csTypesDoNotSupportOperator(a0 : System.String, a1 : System.String) = (GetStringFunc("csTypesDoNotSupportOperator",",,,%s,,,%s,,,") a0 a1) /// The type '%s' does not support the operator '%s' - /// (Originally from ../FSComp.txt:305) + /// (Originally from ..\FSComp.txt:305) static member csTypeDoesNotSupportOperator(a0 : System.String, a1 : System.String) = (GetStringFunc("csTypeDoesNotSupportOperator",",,,%s,,,%s,,,") a0 a1) /// None of the types '%s' support the operator '%s'. Consider opening the module 'Microsoft.FSharp.Linq.NullableOperators'. - /// (Originally from ../FSComp.txt:306) + /// (Originally from ..\FSComp.txt:306) static member csTypesDoNotSupportOperatorNullable(a0 : System.String, a1 : System.String) = (GetStringFunc("csTypesDoNotSupportOperatorNullable",",,,%s,,,%s,,,") a0 a1) /// The type '%s' does not support the operator '%s'. Consider opening the module 'Microsoft.FSharp.Linq.NullableOperators'. - /// (Originally from ../FSComp.txt:307) + /// (Originally from ..\FSComp.txt:307) static member csTypeDoesNotSupportOperatorNullable(a0 : System.String, a1 : System.String) = (GetStringFunc("csTypeDoesNotSupportOperatorNullable",",,,%s,,,%s,,,") a0 a1) /// The type '%s' does not support a conversion to the type '%s' - /// (Originally from ../FSComp.txt:308) + /// (Originally from ..\FSComp.txt:308) static member csTypeDoesNotSupportConversion(a0 : System.String, a1 : System.String) = (GetStringFunc("csTypeDoesNotSupportConversion",",,,%s,,,%s,,,") a0 a1) /// The type '%s' has a method '%s' (full name '%s'), but the method is static - /// (Originally from ../FSComp.txt:309) + /// (Originally from ..\FSComp.txt:309) static member csMethodFoundButIsStatic(a0 : System.String, a1 : System.String, a2 : System.String) = (GetStringFunc("csMethodFoundButIsStatic",",,,%s,,,%s,,,%s,,,") a0 a1 a2) /// The type '%s' has a method '%s' (full name '%s'), but the method is not static - /// (Originally from ../FSComp.txt:310) + /// (Originally from ..\FSComp.txt:310) static member csMethodFoundButIsNotStatic(a0 : System.String, a1 : System.String, a2 : System.String) = (GetStringFunc("csMethodFoundButIsNotStatic",",,,%s,,,%s,,,%s,,,") a0 a1 a2) /// The constraints 'struct' and 'not struct' are inconsistent - /// (Originally from ../FSComp.txt:311) + /// (Originally from ..\FSComp.txt:311) static member csStructConstraintInconsistent() = (472, GetStringFunc("csStructConstraintInconsistent",",,,") ) /// The type '%s' does not have 'null' as a proper value - /// (Originally from ../FSComp.txt:312) + /// (Originally from ..\FSComp.txt:312) static member csTypeDoesNotHaveNull(a0 : System.String) = (GetStringFunc("csTypeDoesNotHaveNull",",,,%s,,,") a0) /// The type '%s' does not have 'null' as a proper value. To create a null value for a Nullable type use 'System.Nullable()'. - /// (Originally from ../FSComp.txt:313) + /// (Originally from ..\FSComp.txt:313) static member csNullableTypeDoesNotHaveNull(a0 : System.String) = (GetStringFunc("csNullableTypeDoesNotHaveNull",",,,%s,,,") a0) /// The type '%s' does not support the 'comparison' constraint because it has the 'NoComparison' attribute - /// (Originally from ../FSComp.txt:314) + /// (Originally from ..\FSComp.txt:314) static member csTypeDoesNotSupportComparison1(a0 : System.String) = (GetStringFunc("csTypeDoesNotSupportComparison1",",,,%s,,,") a0) /// The type '%s' does not support the 'comparison' constraint. For example, it does not support the 'System.IComparable' interface - /// (Originally from ../FSComp.txt:315) + /// (Originally from ..\FSComp.txt:315) static member csTypeDoesNotSupportComparison2(a0 : System.String) = (GetStringFunc("csTypeDoesNotSupportComparison2",",,,%s,,,") a0) /// The type '%s' does not support the 'comparison' constraint because it is a record, union or struct with one or more structural element types which do not support the 'comparison' constraint. Either avoid the use of comparison with this type, or add the 'StructuralComparison' attribute to the type to determine which field type does not support comparison - /// (Originally from ../FSComp.txt:316) + /// (Originally from ..\FSComp.txt:316) static member csTypeDoesNotSupportComparison3(a0 : System.String) = (GetStringFunc("csTypeDoesNotSupportComparison3",",,,%s,,,") a0) /// The type '%s' does not support the 'equality' constraint because it has the 'NoEquality' attribute - /// (Originally from ../FSComp.txt:317) + /// (Originally from ..\FSComp.txt:317) static member csTypeDoesNotSupportEquality1(a0 : System.String) = (GetStringFunc("csTypeDoesNotSupportEquality1",",,,%s,,,") a0) /// The type '%s' does not support the 'equality' constraint because it is a function type - /// (Originally from ../FSComp.txt:318) + /// (Originally from ..\FSComp.txt:318) static member csTypeDoesNotSupportEquality2(a0 : System.String) = (GetStringFunc("csTypeDoesNotSupportEquality2",",,,%s,,,") a0) /// The type '%s' does not support the 'equality' constraint because it is a record, union or struct with one or more structural element types which do not support the 'equality' constraint. Either avoid the use of equality with this type, or add the 'StructuralEquality' attribute to the type to determine which field type does not support equality - /// (Originally from ../FSComp.txt:319) + /// (Originally from ..\FSComp.txt:319) static member csTypeDoesNotSupportEquality3(a0 : System.String) = (GetStringFunc("csTypeDoesNotSupportEquality3",",,,%s,,,") a0) /// The type '%s' is not a CLI enum type - /// (Originally from ../FSComp.txt:320) + /// (Originally from ..\FSComp.txt:320) static member csTypeIsNotEnumType(a0 : System.String) = (GetStringFunc("csTypeIsNotEnumType",",,,%s,,,") a0) /// The type '%s' has a non-standard delegate type - /// (Originally from ../FSComp.txt:321) + /// (Originally from ..\FSComp.txt:321) static member csTypeHasNonStandardDelegateType(a0 : System.String) = (GetStringFunc("csTypeHasNonStandardDelegateType",",,,%s,,,") a0) /// The type '%s' is not a CLI delegate type - /// (Originally from ../FSComp.txt:322) + /// (Originally from ..\FSComp.txt:322) static member csTypeIsNotDelegateType(a0 : System.String) = (GetStringFunc("csTypeIsNotDelegateType",",,,%s,,,") a0) /// This type parameter cannot be instantiated to 'Nullable'. This is a restriction imposed in order to ensure the meaning of 'null' in some CLI languages is not confusing when used in conjunction with 'Nullable' values. - /// (Originally from ../FSComp.txt:323) + /// (Originally from ..\FSComp.txt:323) static member csTypeParameterCannotBeNullable() = (GetStringFunc("csTypeParameterCannotBeNullable",",,,") ) /// A generic construct requires that the type '%s' is a CLI or F# struct type - /// (Originally from ../FSComp.txt:324) + /// (Originally from ..\FSComp.txt:324) static member csGenericConstructRequiresStructType(a0 : System.String) = (GetStringFunc("csGenericConstructRequiresStructType",",,,%s,,,") a0) /// A generic construct requires that the type '%s' is an unmanaged type - /// (Originally from ../FSComp.txt:325) + /// (Originally from ..\FSComp.txt:325) static member csGenericConstructRequiresUnmanagedType(a0 : System.String) = (GetStringFunc("csGenericConstructRequiresUnmanagedType",",,,%s,,,") a0) /// The type '%s' is not compatible with any of the types %s, arising from the use of a printf-style format string - /// (Originally from ../FSComp.txt:326) + /// (Originally from ..\FSComp.txt:326) static member csTypeNotCompatibleBecauseOfPrintf(a0 : System.String, a1 : System.String) = (GetStringFunc("csTypeNotCompatibleBecauseOfPrintf",",,,%s,,,%s,,,") a0 a1) /// A generic construct requires that the type '%s' have reference semantics, but it does not, i.e. it is a struct - /// (Originally from ../FSComp.txt:327) + /// (Originally from ..\FSComp.txt:327) static member csGenericConstructRequiresReferenceSemantics(a0 : System.String) = (GetStringFunc("csGenericConstructRequiresReferenceSemantics",",,,%s,,,") a0) /// A generic construct requires that the type '%s' be non-abstract - /// (Originally from ../FSComp.txt:328) + /// (Originally from ..\FSComp.txt:328) static member csGenericConstructRequiresNonAbstract(a0 : System.String) = (GetStringFunc("csGenericConstructRequiresNonAbstract",",,,%s,,,") a0) /// A generic construct requires that the type '%s' have a public default constructor - /// (Originally from ../FSComp.txt:329) + /// (Originally from ..\FSComp.txt:329) static member csGenericConstructRequiresPublicDefaultConstructor(a0 : System.String) = (GetStringFunc("csGenericConstructRequiresPublicDefaultConstructor",",,,%s,,,") a0) /// Type instantiation length mismatch - /// (Originally from ../FSComp.txt:330) + /// (Originally from ..\FSComp.txt:330) static member csTypeInstantiationLengthMismatch() = (483, GetStringFunc("csTypeInstantiationLengthMismatch",",,,") ) /// Optional arguments not permitted here - /// (Originally from ../FSComp.txt:331) + /// (Originally from ..\FSComp.txt:331) static member csOptionalArgumentNotPermittedHere() = (484, GetStringFunc("csOptionalArgumentNotPermittedHere",",,,") ) /// %s is not a static member - /// (Originally from ../FSComp.txt:332) + /// (Originally from ..\FSComp.txt:332) static member csMemberIsNotStatic(a0 : System.String) = (485, GetStringFunc("csMemberIsNotStatic",",,,%s,,,") a0) /// %s is not an instance member - /// (Originally from ../FSComp.txt:333) + /// (Originally from ..\FSComp.txt:333) static member csMemberIsNotInstance(a0 : System.String) = (486, GetStringFunc("csMemberIsNotInstance",",,,%s,,,") a0) /// Argument length mismatch - /// (Originally from ../FSComp.txt:334) + /// (Originally from ..\FSComp.txt:334) static member csArgumentLengthMismatch() = (487, GetStringFunc("csArgumentLengthMismatch",",,,") ) /// The argument types don't match - /// (Originally from ../FSComp.txt:335) + /// (Originally from ..\FSComp.txt:335) static member csArgumentTypesDoNotMatch() = (488, GetStringFunc("csArgumentTypesDoNotMatch",",,,") ) /// This method expects a CLI 'params' parameter in this position. 'params' is a way of passing a variable number of arguments to a method in languages such as C#. Consider passing an array for this argument - /// (Originally from ../FSComp.txt:336) + /// (Originally from ..\FSComp.txt:336) static member csMethodExpectsParams() = (489, GetStringFunc("csMethodExpectsParams",",,,") ) /// The member or object constructor '%s' is not %s - /// (Originally from ../FSComp.txt:337) + /// (Originally from ..\FSComp.txt:337) static member csMemberIsNotAccessible(a0 : System.String, a1 : System.String) = (490, GetStringFunc("csMemberIsNotAccessible",",,,%s,,,%s,,,") a0 a1) /// The member or object constructor '%s' is not %s. Private members may only be accessed from within the declaring type. Protected members may only be accessed from an extending type and cannot be accessed from inner lambda expressions. - /// (Originally from ../FSComp.txt:338) + /// (Originally from ..\FSComp.txt:338) static member csMemberIsNotAccessible2(a0 : System.String, a1 : System.String) = (491, GetStringFunc("csMemberIsNotAccessible2",",,,%s,,,%s,,,") a0 a1) /// %s is not a static method - /// (Originally from ../FSComp.txt:339) + /// (Originally from ..\FSComp.txt:339) static member csMethodIsNotAStaticMethod(a0 : System.String) = (492, GetStringFunc("csMethodIsNotAStaticMethod",",,,%s,,,") a0) /// %s is not an instance method - /// (Originally from ../FSComp.txt:340) + /// (Originally from ..\FSComp.txt:340) static member csMethodIsNotAnInstanceMethod(a0 : System.String) = (493, GetStringFunc("csMethodIsNotAnInstanceMethod",",,,%s,,,") a0) /// The member or object constructor '%s' has no argument or settable return property '%s'. %s. - /// (Originally from ../FSComp.txt:341) + /// (Originally from ..\FSComp.txt:341) static member csMemberHasNoArgumentOrReturnProperty(a0 : System.String, a1 : System.String, a2 : System.String) = (GetStringFunc("csMemberHasNoArgumentOrReturnProperty",",,,%s,,,%s,,,%s,,,") a0 a1 a2) /// The object constructor '%s' has no argument or settable return property '%s'. %s. - /// (Originally from ../FSComp.txt:342) + /// (Originally from ..\FSComp.txt:342) static member csCtorHasNoArgumentOrReturnProperty(a0 : System.String, a1 : System.String, a2 : System.String) = (GetStringFunc("csCtorHasNoArgumentOrReturnProperty",",,,%s,,,%s,,,%s,,,") a0 a1 a2) /// The required signature is %s - /// (Originally from ../FSComp.txt:343) + /// (Originally from ..\FSComp.txt:343) static member csRequiredSignatureIs(a0 : System.String) = (495, GetStringFunc("csRequiredSignatureIs",",,,%s,,,") a0) /// The member or object constructor '%s' requires %d argument(s). The required signature is '%s'. - /// (Originally from ../FSComp.txt:344) + /// (Originally from ..\FSComp.txt:344) static member csMemberSignatureMismatch(a0 : System.String, a1 : System.Int32, a2 : System.String) = (496, GetStringFunc("csMemberSignatureMismatch",",,,%s,,,%d,,,%s,,,") a0 a1 a2) /// The member or object constructor '%s' requires %d additional argument(s). The required signature is '%s'. - /// (Originally from ../FSComp.txt:345) + /// (Originally from ..\FSComp.txt:345) static member csMemberSignatureMismatch2(a0 : System.String, a1 : System.Int32, a2 : System.String) = (497, GetStringFunc("csMemberSignatureMismatch2",",,,%s,,,%d,,,%s,,,") a0 a1 a2) /// The member or object constructor '%s' requires %d argument(s). The required signature is '%s'. Some names for missing arguments are %s. - /// (Originally from ../FSComp.txt:346) + /// (Originally from ..\FSComp.txt:346) static member csMemberSignatureMismatch3(a0 : System.String, a1 : System.Int32, a2 : System.String, a3 : System.String) = (498, GetStringFunc("csMemberSignatureMismatch3",",,,%s,,,%d,,,%s,,,%s,,,") a0 a1 a2 a3) /// The member or object constructor '%s' requires %d additional argument(s). The required signature is '%s'. Some names for missing arguments are %s. - /// (Originally from ../FSComp.txt:347) + /// (Originally from ..\FSComp.txt:347) static member csMemberSignatureMismatch4(a0 : System.String, a1 : System.Int32, a2 : System.String, a3 : System.String) = (499, GetStringFunc("csMemberSignatureMismatch4",",,,%s,,,%d,,,%s,,,%s,,,") a0 a1 a2 a3) /// The member or object constructor '%s' requires %d argument(s) but is here given %d unnamed and %d named argument(s). The required signature is '%s'. - /// (Originally from ../FSComp.txt:348) + /// (Originally from ..\FSComp.txt:348) static member csMemberSignatureMismatchArityNamed(a0 : System.String, a1 : System.Int32, a2 : System.Int32, a3 : System.Int32, a4 : System.String) = (500, GetStringFunc("csMemberSignatureMismatchArityNamed",",,,%s,,,%d,,,%d,,,%d,,,%s,,,") a0 a1 a2 a3 a4) /// The member or object constructor '%s' takes %d argument(s) but is here given %d. The required signature is '%s'. - /// (Originally from ../FSComp.txt:349) + /// (Originally from ..\FSComp.txt:349) static member csMemberSignatureMismatchArity(a0 : System.String, a1 : System.Int32, a2 : System.Int32, a3 : System.String) = (501, GetStringFunc("csMemberSignatureMismatchArity",",,,%s,,,%d,,,%d,,,%s,,,") a0 a1 a2 a3) /// The object constructor '%s' takes %d argument(s) but is here given %d. The required signature is '%s'. - /// (Originally from ../FSComp.txt:350) + /// (Originally from ..\FSComp.txt:350) static member csCtorSignatureMismatchArity(a0 : System.String, a1 : System.Int32, a2 : System.Int32, a3 : System.String) = (501, GetStringFunc("csCtorSignatureMismatchArity",",,,%s,,,%d,,,%d,,,%s,,,") a0 a1 a2 a3) /// The object constructor '%s' takes %d argument(s) but is here given %d. The required signature is '%s'. If some of the arguments are meant to assign values to properties, consider separating those arguments with a comma (','). - /// (Originally from ../FSComp.txt:351) + /// (Originally from ..\FSComp.txt:351) static member csCtorSignatureMismatchArityProp(a0 : System.String, a1 : System.Int32, a2 : System.Int32, a3 : System.String) = (501, GetStringFunc("csCtorSignatureMismatchArityProp",",,,%s,,,%d,,,%d,,,%s,,,") a0 a1 a2 a3) /// The member or object constructor '%s' takes %d type argument(s) but is here given %d. The required signature is '%s'. - /// (Originally from ../FSComp.txt:352) + /// (Originally from ..\FSComp.txt:352) static member csMemberSignatureMismatchArityType(a0 : System.String, a1 : System.Int32, a2 : System.Int32, a3 : System.String) = (502, GetStringFunc("csMemberSignatureMismatchArityType",",,,%s,,,%d,,,%d,,,%s,,,") a0 a1 a2 a3) /// A member or object constructor '%s' taking %d arguments is not accessible from this code location. All accessible versions of method '%s' take %d arguments. - /// (Originally from ../FSComp.txt:353) + /// (Originally from ..\FSComp.txt:353) static member csMemberNotAccessible(a0 : System.String, a1 : System.Int32, a2 : System.String, a3 : System.Int32) = (503, GetStringFunc("csMemberNotAccessible",",,,%s,,,%d,,,%s,,,%d,,,") a0 a1 a2 a3) /// Incorrect generic instantiation. No %s member named '%s' takes %d generic arguments. - /// (Originally from ../FSComp.txt:354) + /// (Originally from ..\FSComp.txt:354) static member csIncorrectGenericInstantiation(a0 : System.String, a1 : System.String, a2 : System.Int32) = (504, GetStringFunc("csIncorrectGenericInstantiation",",,,%s,,,%s,,,%d,,,") a0 a1 a2) /// The member or object constructor '%s' does not take %d argument(s). An overload was found taking %d arguments. - /// (Originally from ../FSComp.txt:355) + /// (Originally from ..\FSComp.txt:355) static member csMemberOverloadArityMismatch(a0 : System.String, a1 : System.Int32, a2 : System.Int32) = (505, GetStringFunc("csMemberOverloadArityMismatch",",,,%s,,,%d,,,%d,,,") a0 a1 a2) /// No %s member or object constructor named '%s' takes %d arguments - /// (Originally from ../FSComp.txt:356) + /// (Originally from ..\FSComp.txt:356) static member csNoMemberTakesTheseArguments(a0 : System.String, a1 : System.String, a2 : System.Int32) = (506, GetStringFunc("csNoMemberTakesTheseArguments",",,,%s,,,%s,,,%d,,,") a0 a1 a2) /// No %s member or object constructor named '%s' takes %d arguments. Note the call to this member also provides %d named arguments. - /// (Originally from ../FSComp.txt:357) + /// (Originally from ..\FSComp.txt:357) static member csNoMemberTakesTheseArguments2(a0 : System.String, a1 : System.String, a2 : System.Int32, a3 : System.Int32) = (507, GetStringFunc("csNoMemberTakesTheseArguments2",",,,%s,,,%s,,,%d,,,%d,,,") a0 a1 a2 a3) /// No %s member or object constructor named '%s' takes %d arguments. The named argument '%s' doesn't correspond to any argument or settable return property for any overload. - /// (Originally from ../FSComp.txt:358) + /// (Originally from ..\FSComp.txt:358) static member csNoMemberTakesTheseArguments3(a0 : System.String, a1 : System.String, a2 : System.Int32, a3 : System.String) = (508, GetStringFunc("csNoMemberTakesTheseArguments3",",,,%s,,,%s,,,%d,,,%s,,,") a0 a1 a2 a3) /// Method or object constructor '%s' not found - /// (Originally from ../FSComp.txt:359) + /// (Originally from ..\FSComp.txt:359) static member csMethodNotFound(a0 : System.String) = (509, GetStringFunc("csMethodNotFound",",,,%s,,,") a0) /// No overloads match for method '%s'. - /// (Originally from ../FSComp.txt:360) + /// (Originally from ..\FSComp.txt:360) static member csNoOverloadsFound(a0 : System.String) = (GetStringFunc("csNoOverloadsFound",",,,%s,,,") a0) /// A unique overload for method '%s' could not be determined based on type information prior to this program point. A type annotation may be needed. - /// (Originally from ../FSComp.txt:361) + /// (Originally from ..\FSComp.txt:361) static member csMethodIsOverloaded(a0 : System.String) = (GetStringFunc("csMethodIsOverloaded",",,,%s,,,") a0) /// Candidates: %s - /// (Originally from ../FSComp.txt:362) + /// (Originally from ..\FSComp.txt:362) static member csCandidates(a0 : System.String) = (GetStringFunc("csCandidates",",,,%s,,,") a0) /// The available overloads are shown below. - /// (Originally from ../FSComp.txt:363) + /// (Originally from ..\FSComp.txt:363) static member csSeeAvailableOverloads() = (GetStringFunc("csSeeAvailableOverloads",",,,") ) /// Accessibility modifiers are not permitted on 'do' bindings, but '%s' was given. - /// (Originally from ../FSComp.txt:364) + /// (Originally from ..\FSComp.txt:364) static member parsDoCannotHaveVisibilityDeclarations(a0 : System.String) = (512, GetStringFunc("parsDoCannotHaveVisibilityDeclarations",",,,%s,,,") a0) /// End of file in #if section begun at or after here - /// (Originally from ../FSComp.txt:365) + /// (Originally from ..\FSComp.txt:365) static member parsEofInHashIf() = (513, GetStringFunc("parsEofInHashIf",",,,") ) /// End of file in string begun at or before here - /// (Originally from ../FSComp.txt:366) + /// (Originally from ..\FSComp.txt:366) static member parsEofInString() = (514, GetStringFunc("parsEofInString",",,,") ) /// End of file in verbatim string begun at or before here - /// (Originally from ../FSComp.txt:367) + /// (Originally from ..\FSComp.txt:367) static member parsEofInVerbatimString() = (515, GetStringFunc("parsEofInVerbatimString",",,,") ) /// End of file in comment begun at or before here - /// (Originally from ../FSComp.txt:368) + /// (Originally from ..\FSComp.txt:368) static member parsEofInComment() = (516, GetStringFunc("parsEofInComment",",,,") ) /// End of file in string embedded in comment begun at or before here - /// (Originally from ../FSComp.txt:369) + /// (Originally from ..\FSComp.txt:369) static member parsEofInStringInComment() = (517, GetStringFunc("parsEofInStringInComment",",,,") ) /// End of file in verbatim string embedded in comment begun at or before here - /// (Originally from ../FSComp.txt:370) + /// (Originally from ..\FSComp.txt:370) static member parsEofInVerbatimStringInComment() = (518, GetStringFunc("parsEofInVerbatimStringInComment",",,,") ) /// End of file in IF-OCAML section begun at or before here - /// (Originally from ../FSComp.txt:371) + /// (Originally from ..\FSComp.txt:371) static member parsEofInIfOcaml() = (519, GetStringFunc("parsEofInIfOcaml",",,,") ) /// End of file in directive begun at or before here - /// (Originally from ../FSComp.txt:372) + /// (Originally from ..\FSComp.txt:372) static member parsEofInDirective() = (520, GetStringFunc("parsEofInDirective",",,,") ) /// No #endif found for #if or #else - /// (Originally from ../FSComp.txt:373) + /// (Originally from ..\FSComp.txt:373) static member parsNoHashEndIfFound() = (521, GetStringFunc("parsNoHashEndIfFound",",,,") ) /// Attributes have been ignored in this construct - /// (Originally from ../FSComp.txt:374) + /// (Originally from ..\FSComp.txt:374) static member parsAttributesIgnored() = (522, GetStringFunc("parsAttributesIgnored",",,,") ) /// 'use' bindings are not permitted in primary constructors - /// (Originally from ../FSComp.txt:375) + /// (Originally from ..\FSComp.txt:375) static member parsUseBindingsIllegalInImplicitClassConstructors() = (523, GetStringFunc("parsUseBindingsIllegalInImplicitClassConstructors",",,,") ) /// 'use' bindings are not permitted in modules and are treated as 'let' bindings - /// (Originally from ../FSComp.txt:376) + /// (Originally from ..\FSComp.txt:376) static member parsUseBindingsIllegalInModules() = (524, GetStringFunc("parsUseBindingsIllegalInModules",",,,") ) /// An integer for loop must use a simple identifier - /// (Originally from ../FSComp.txt:377) + /// (Originally from ..\FSComp.txt:377) static member parsIntegerForLoopRequiresSimpleIdentifier() = (525, GetStringFunc("parsIntegerForLoopRequiresSimpleIdentifier",",,,") ) /// At most one 'with' augmentation is permitted - /// (Originally from ../FSComp.txt:378) + /// (Originally from ..\FSComp.txt:378) static member parsOnlyOneWithAugmentationAllowed() = (526, GetStringFunc("parsOnlyOneWithAugmentationAllowed",",,,") ) /// A semicolon is not expected at this point - /// (Originally from ../FSComp.txt:379) + /// (Originally from ..\FSComp.txt:379) static member parsUnexpectedSemicolon() = (527, GetStringFunc("parsUnexpectedSemicolon",",,,") ) /// Unexpected end of input - /// (Originally from ../FSComp.txt:380) + /// (Originally from ..\FSComp.txt:380) static member parsUnexpectedEndOfFile() = (528, GetStringFunc("parsUnexpectedEndOfFile",",,,") ) /// Accessibility modifiers are not permitted here, but '%s' was given. - /// (Originally from ../FSComp.txt:381) + /// (Originally from ..\FSComp.txt:381) static member parsUnexpectedVisibilityDeclaration(a0 : System.String) = (529, GetStringFunc("parsUnexpectedVisibilityDeclaration",",,,%s,,,") a0) /// Only '#' compiler directives may occur prior to the first 'namespace' declaration - /// (Originally from ../FSComp.txt:382) + /// (Originally from ..\FSComp.txt:382) static member parsOnlyHashDirectivesAllowed() = (530, GetStringFunc("parsOnlyHashDirectivesAllowed",",,,") ) /// Accessibility modifiers should come immediately prior to the identifier naming a construct - /// (Originally from ../FSComp.txt:383) + /// (Originally from ..\FSComp.txt:383) static member parsVisibilityDeclarationsShouldComePriorToIdentifier() = (531, GetStringFunc("parsVisibilityDeclarationsShouldComePriorToIdentifier",",,,") ) /// Files should begin with either a namespace or module declaration, e.g. 'namespace SomeNamespace.SubNamespace' or 'module SomeNamespace.SomeModule', but not both. To define a module within a namespace use 'module SomeModule = ...' - /// (Originally from ../FSComp.txt:384) + /// (Originally from ..\FSComp.txt:384) static member parsNamespaceOrModuleNotBoth() = (532, GetStringFunc("parsNamespaceOrModuleNotBoth",",,,") ) /// A module abbreviation must be a simple name, not a path - /// (Originally from ../FSComp.txt:385) + /// (Originally from ..\FSComp.txt:385) static member parsModuleAbbreviationMustBeSimpleName() = (534, GetStringFunc("parsModuleAbbreviationMustBeSimpleName",",,,") ) /// Ignoring attributes on module abbreviation - /// (Originally from ../FSComp.txt:386) + /// (Originally from ..\FSComp.txt:386) static member parsIgnoreAttributesOnModuleAbbreviation() = (535, GetStringFunc("parsIgnoreAttributesOnModuleAbbreviation",",,,") ) /// The '%s' accessibility attribute is not allowed on module abbreviation. Module abbreviations are always private. - /// (Originally from ../FSComp.txt:387) + /// (Originally from ..\FSComp.txt:387) static member parsIgnoreAttributesOnModuleAbbreviationAlwaysPrivate(a0 : System.String) = (536, GetStringFunc("parsIgnoreAttributesOnModuleAbbreviationAlwaysPrivate",",,,%s,,,") a0) /// The '%s' visibility attribute is not allowed on module abbreviation. Module abbreviations are always private. - /// (Originally from ../FSComp.txt:388) + /// (Originally from ..\FSComp.txt:388) static member parsIgnoreVisibilityOnModuleAbbreviationAlwaysPrivate(a0 : System.String) = (537, GetStringFunc("parsIgnoreVisibilityOnModuleAbbreviationAlwaysPrivate",",,,%s,,,") a0) /// Unclosed block - /// (Originally from ../FSComp.txt:389) + /// (Originally from ..\FSComp.txt:389) static member parsUnClosedBlockInHashLight() = (538, GetStringFunc("parsUnClosedBlockInHashLight",",,,") ) /// Unmatched 'begin' or 'struct' - /// (Originally from ../FSComp.txt:390) + /// (Originally from ..\FSComp.txt:390) static member parsUnmatchedBeginOrStruct() = (539, GetStringFunc("parsUnmatchedBeginOrStruct",",,,") ) /// A module name must be a simple name, not a path - /// (Originally from ../FSComp.txt:391) + /// (Originally from ..\FSComp.txt:391) static member parsModuleDefnMustBeSimpleName() = (541, GetStringFunc("parsModuleDefnMustBeSimpleName",",,,") ) /// Unexpected empty type moduleDefn list - /// (Originally from ../FSComp.txt:392) + /// (Originally from ..\FSComp.txt:392) static member parsUnexpectedEmptyModuleDefn() = (542, GetStringFunc("parsUnexpectedEmptyModuleDefn",",,,") ) /// Attributes should be placed before 'val' - /// (Originally from ../FSComp.txt:393) + /// (Originally from ..\FSComp.txt:393) static member parsAttributesMustComeBeforeVal() = (GetStringFunc("parsAttributesMustComeBeforeVal",",,,") ) /// Attributes are not permitted on interface implementations - /// (Originally from ../FSComp.txt:394) + /// (Originally from ..\FSComp.txt:394) static member parsAttributesAreNotPermittedOnInterfaceImplementations() = (543, GetStringFunc("parsAttributesAreNotPermittedOnInterfaceImplementations",",,,") ) /// Syntax error - /// (Originally from ../FSComp.txt:395) + /// (Originally from ..\FSComp.txt:395) static member parsSyntaxError() = (544, GetStringFunc("parsSyntaxError",",,,") ) /// Augmentations are not permitted on delegate type moduleDefns - /// (Originally from ../FSComp.txt:396) + /// (Originally from ..\FSComp.txt:396) static member parsAugmentationsIllegalOnDelegateType() = (545, GetStringFunc("parsAugmentationsIllegalOnDelegateType",",,,") ) /// Unmatched 'class', 'interface' or 'struct' - /// (Originally from ../FSComp.txt:397) + /// (Originally from ..\FSComp.txt:397) static member parsUnmatchedClassInterfaceOrStruct() = (546, GetStringFunc("parsUnmatchedClassInterfaceOrStruct",",,,") ) /// 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'. - /// (Originally from ../FSComp.txt:398) + /// (Originally from ..\FSComp.txt:398) static member parsEmptyTypeDefinition() = (547, GetStringFunc("parsEmptyTypeDefinition",",,,") ) /// Unmatched 'with' or badly formatted 'with' block - /// (Originally from ../FSComp.txt:399) + /// (Originally from ..\FSComp.txt:399) static member parsUnmatchedWith() = (550, GetStringFunc("parsUnmatchedWith",",,,") ) /// 'get', 'set' or 'get,set' required - /// (Originally from ../FSComp.txt:400) + /// (Originally from ..\FSComp.txt:400) static member parsGetOrSetRequired() = (551, GetStringFunc("parsGetOrSetRequired",",,,") ) /// Only class types may take value arguments - /// (Originally from ../FSComp.txt:401) + /// (Originally from ..\FSComp.txt:401) static member parsOnlyClassCanTakeValueArguments() = (552, GetStringFunc("parsOnlyClassCanTakeValueArguments",",,,") ) /// Unmatched 'begin' - /// (Originally from ../FSComp.txt:402) + /// (Originally from ..\FSComp.txt:402) static member parsUnmatchedBegin() = (553, GetStringFunc("parsUnmatchedBegin",",,,") ) /// Invalid declaration syntax - /// (Originally from ../FSComp.txt:403) + /// (Originally from ..\FSComp.txt:403) static member parsInvalidDeclarationSyntax() = (554, GetStringFunc("parsInvalidDeclarationSyntax",",,,") ) /// 'get' and/or 'set' required - /// (Originally from ../FSComp.txt:404) + /// (Originally from ..\FSComp.txt:404) static member parsGetAndOrSetRequired() = (555, GetStringFunc("parsGetAndOrSetRequired",",,,") ) /// Type annotations on property getters and setters must be given after the 'get()' or 'set(v)', e.g. 'with get() : string = ...' - /// (Originally from ../FSComp.txt:405) + /// (Originally from ..\FSComp.txt:405) static member parsTypeAnnotationsOnGetSet() = (556, GetStringFunc("parsTypeAnnotationsOnGetSet",",,,") ) /// A getter property is expected to be a function, e.g. 'get() = ...' or 'get(index) = ...' - /// (Originally from ../FSComp.txt:406) + /// (Originally from ..\FSComp.txt:406) static member parsGetterMustHaveAtLeastOneArgument() = (557, GetStringFunc("parsGetterMustHaveAtLeastOneArgument",",,,") ) /// Multiple accessibilities given for property getter or setter - /// (Originally from ../FSComp.txt:407) + /// (Originally from ..\FSComp.txt:407) static member parsMultipleAccessibilitiesForGetSet() = (558, GetStringFunc("parsMultipleAccessibilitiesForGetSet",",,,") ) /// Property setters must be defined using 'set value = ', 'set idx value = ' or 'set (idx1,...,idxN) value = ... ' - /// (Originally from ../FSComp.txt:408) + /// (Originally from ..\FSComp.txt:408) static member parsSetSyntax() = (559, GetStringFunc("parsSetSyntax",",,,") ) /// Interfaces always have the same visibility as the enclosing type - /// (Originally from ../FSComp.txt:409) + /// (Originally from ..\FSComp.txt:409) static member parsInterfacesHaveSameVisibilityAsEnclosingType() = (560, GetStringFunc("parsInterfacesHaveSameVisibilityAsEnclosingType",",,,") ) /// Accessibility modifiers are not allowed on this member. Abstract slots always have the same visibility as the enclosing type. - /// (Originally from ../FSComp.txt:410) + /// (Originally from ..\FSComp.txt:410) static member parsAccessibilityModsIllegalForAbstract() = (561, GetStringFunc("parsAccessibilityModsIllegalForAbstract",",,,") ) /// Attributes are not permitted on 'inherit' declarations - /// (Originally from ../FSComp.txt:411) + /// (Originally from ..\FSComp.txt:411) static member parsAttributesIllegalOnInherit() = (562, GetStringFunc("parsAttributesIllegalOnInherit",",,,") ) /// Accessibility modifiers are not permitted on an 'inherits' declaration - /// (Originally from ../FSComp.txt:412) + /// (Originally from ..\FSComp.txt:412) static member parsVisibilityIllegalOnInherit() = (563, GetStringFunc("parsVisibilityIllegalOnInherit",",,,") ) /// 'inherit' declarations cannot have 'as' bindings. To access members of the base class when overriding a method, the syntax 'base.SomeMember' may be used; 'base' is a keyword. Remove this 'as' binding. - /// (Originally from ../FSComp.txt:413) + /// (Originally from ..\FSComp.txt:413) static member parsInheritDeclarationsCannotHaveAsBindings() = (564, GetStringFunc("parsInheritDeclarationsCannotHaveAsBindings",",,,") ) /// Attributes are not allowed here - /// (Originally from ../FSComp.txt:414) + /// (Originally from ..\FSComp.txt:414) static member parsAttributesIllegalHere() = (565, GetStringFunc("parsAttributesIllegalHere",",,,") ) /// Accessibility modifiers are not permitted in this position for type abbreviations - /// (Originally from ../FSComp.txt:415) + /// (Originally from ..\FSComp.txt:415) static member parsTypeAbbreviationsCannotHaveVisibilityDeclarations() = (566, GetStringFunc("parsTypeAbbreviationsCannotHaveVisibilityDeclarations",",,,") ) /// Accessibility modifiers are not permitted in this position for enum types - /// (Originally from ../FSComp.txt:416) + /// (Originally from ..\FSComp.txt:416) static member parsEnumTypesCannotHaveVisibilityDeclarations() = (567, GetStringFunc("parsEnumTypesCannotHaveVisibilityDeclarations",",,,") ) /// All enum fields must be given values - /// (Originally from ../FSComp.txt:417) + /// (Originally from ..\FSComp.txt:417) static member parsAllEnumFieldsRequireValues() = (568, GetStringFunc("parsAllEnumFieldsRequireValues",",,,") ) /// Accessibility modifiers are not permitted on inline assembly code types - /// (Originally from ../FSComp.txt:418) + /// (Originally from ..\FSComp.txt:418) static member parsInlineAssemblyCannotHaveVisibilityDeclarations() = (569, GetStringFunc("parsInlineAssemblyCannotHaveVisibilityDeclarations",",,,") ) /// Unexpected identifier: '%s' - /// (Originally from ../FSComp.txt:419) + /// (Originally from ..\FSComp.txt:419) static member parsUnexpectedIdentifier(a0 : System.String) = (571, GetStringFunc("parsUnexpectedIdentifier",",,,%s,,,") a0) /// Accessibility modifiers are not permitted on union cases. Use 'type U = internal ...' or 'type U = private ...' to give an accessibility to the whole representation. - /// (Originally from ../FSComp.txt:420) + /// (Originally from ..\FSComp.txt:420) static member parsUnionCasesCannotHaveVisibilityDeclarations() = (572, GetStringFunc("parsUnionCasesCannotHaveVisibilityDeclarations",",,,") ) /// Accessibility modifiers are not permitted on enumeration fields - /// (Originally from ../FSComp.txt:421) + /// (Originally from ..\FSComp.txt:421) static member parsEnumFieldsCannotHaveVisibilityDeclarations() = (573, GetStringFunc("parsEnumFieldsCannotHaveVisibilityDeclarations",",,,") ) /// Consider using a separate record type instead - /// (Originally from ../FSComp.txt:422) + /// (Originally from ..\FSComp.txt:422) static member parsConsiderUsingSeparateRecordType() = (GetStringFunc("parsConsiderUsingSeparateRecordType",",,,") ) /// Accessibility modifiers are not permitted on record fields. Use 'type R = internal ...' or 'type R = private ...' to give an accessibility to the whole representation. - /// (Originally from ../FSComp.txt:423) + /// (Originally from ..\FSComp.txt:423) static member parsRecordFieldsCannotHaveVisibilityDeclarations() = (575, GetStringFunc("parsRecordFieldsCannotHaveVisibilityDeclarations",",,,") ) /// The declaration form 'let ... and ...' for non-recursive bindings is not used in F# code. Consider using a sequence of 'let' bindings - /// (Originally from ../FSComp.txt:424) + /// (Originally from ..\FSComp.txt:424) static member parsLetAndForNonRecBindings() = (576, GetStringFunc("parsLetAndForNonRecBindings",",,,") ) /// Unmatched '(' - /// (Originally from ../FSComp.txt:425) + /// (Originally from ..\FSComp.txt:425) static member parsUnmatchedParen() = (583, GetStringFunc("parsUnmatchedParen",",,,") ) /// Successive patterns should be separated by spaces or tupled - /// (Originally from ../FSComp.txt:426) + /// (Originally from ..\FSComp.txt:426) static member parsSuccessivePatternsShouldBeSpacedOrTupled() = (584, GetStringFunc("parsSuccessivePatternsShouldBeSpacedOrTupled",",,,") ) /// No matching 'in' found for this 'let' - /// (Originally from ../FSComp.txt:427) + /// (Originally from ..\FSComp.txt:427) static member parsNoMatchingInForLet() = (586, GetStringFunc("parsNoMatchingInForLet",",,,") ) /// Error in the return expression for this 'let'. Possible incorrect indentation. - /// (Originally from ../FSComp.txt:428) + /// (Originally from ..\FSComp.txt:428) static member parsErrorInReturnForLetIncorrectIndentation() = (587, GetStringFunc("parsErrorInReturnForLetIncorrectIndentation",",,,") ) /// The block following this '%s' is unfinished. Every code block is an expression and must have a result. '%s' cannot be the final code element in a block. Consider giving this block an explicit result. - /// (Originally from ../FSComp.txt:429) + /// (Originally from ..\FSComp.txt:429) static member parsExpectedExpressionAfterLet(a0 : System.String, a1 : System.String) = (588, GetStringFunc("parsExpectedExpressionAfterLet",",,,%s,,,%s,,,") a0 a1) /// Incomplete conditional. Expected 'if then ' or 'if then else '. - /// (Originally from ../FSComp.txt:430) + /// (Originally from ..\FSComp.txt:430) static member parsIncompleteIf() = (589, GetStringFunc("parsIncompleteIf",",,,") ) /// 'assert' may not be used as a first class value. Use 'assert ' instead. - /// (Originally from ../FSComp.txt:431) + /// (Originally from ..\FSComp.txt:431) static member parsAssertIsNotFirstClassValue() = (590, GetStringFunc("parsAssertIsNotFirstClassValue",",,,") ) /// Identifier expected - /// (Originally from ../FSComp.txt:432) + /// (Originally from ..\FSComp.txt:432) static member parsIdentifierExpected() = (594, GetStringFunc("parsIdentifierExpected",",,,") ) /// 'in' or '=' expected - /// (Originally from ../FSComp.txt:433) + /// (Originally from ..\FSComp.txt:433) static member parsInOrEqualExpected() = (595, GetStringFunc("parsInOrEqualExpected",",,,") ) /// The use of '->' in sequence and computation expressions is limited to the form 'for pat in expr -> expr'. Use the syntax 'for ... in ... do ... yield...' to generate elements in more complex sequence expressions. - /// (Originally from ../FSComp.txt:434) + /// (Originally from ..\FSComp.txt:434) static member parsArrowUseIsLimited() = (596, GetStringFunc("parsArrowUseIsLimited",",,,") ) /// Successive arguments should be separated by spaces or tupled, and arguments involving function or method applications should be parenthesized - /// (Originally from ../FSComp.txt:435) + /// (Originally from ..\FSComp.txt:435) static member parsSuccessiveArgsShouldBeSpacedOrTupled() = (597, GetStringFunc("parsSuccessiveArgsShouldBeSpacedOrTupled",",,,") ) /// Unmatched '[' - /// (Originally from ../FSComp.txt:436) + /// (Originally from ..\FSComp.txt:436) static member parsUnmatchedBracket() = (598, GetStringFunc("parsUnmatchedBracket",",,,") ) /// Missing qualification after '.' - /// (Originally from ../FSComp.txt:437) + /// (Originally from ..\FSComp.txt:437) static member parsMissingQualificationAfterDot() = (599, GetStringFunc("parsMissingQualificationAfterDot",",,,") ) /// In F# code you may use 'expr.[expr]'. A type annotation may be required to indicate the first expression is an array - /// (Originally from ../FSComp.txt:438) + /// (Originally from ..\FSComp.txt:438) static member parsParenFormIsForML() = (GetStringFunc("parsParenFormIsForML",",,,") ) /// Mismatched quotation, beginning with '%s' - /// (Originally from ../FSComp.txt:439) + /// (Originally from ..\FSComp.txt:439) static member parsMismatchedQuote(a0 : System.String) = (601, GetStringFunc("parsMismatchedQuote",",,,%s,,,") a0) /// Unmatched '%s' - /// (Originally from ../FSComp.txt:440) + /// (Originally from ..\FSComp.txt:440) static member parsUnmatched(a0 : System.String) = (602, GetStringFunc("parsUnmatched",",,,%s,,,") a0) /// Unmatched '[|' - /// (Originally from ../FSComp.txt:441) + /// (Originally from ..\FSComp.txt:441) static member parsUnmatchedBracketBar() = (603, GetStringFunc("parsUnmatchedBracketBar",",,,") ) /// Unmatched '{' - /// (Originally from ../FSComp.txt:442) + /// (Originally from ..\FSComp.txt:442) static member parsUnmatchedBrace() = (604, GetStringFunc("parsUnmatchedBrace",",,,") ) + /// Unmatched '{|' + /// (Originally from ..\FSComp.txt:443) + static member parsUnmatchedBraceBar() = (605, GetStringFunc("parsUnmatchedBraceBar",",,,") ) /// Field bindings must have the form 'id = expr;' - /// (Originally from ../FSComp.txt:443) + /// (Originally from ..\FSComp.txt:444) static member parsFieldBinding() = (609, GetStringFunc("parsFieldBinding",",,,") ) /// This member is not permitted in an object implementation - /// (Originally from ../FSComp.txt:444) + /// (Originally from ..\FSComp.txt:445) static member parsMemberIllegalInObjectImplementation() = (610, GetStringFunc("parsMemberIllegalInObjectImplementation",",,,") ) /// Missing function body - /// (Originally from ../FSComp.txt:445) + /// (Originally from ..\FSComp.txt:446) static member parsMissingFunctionBody() = (611, GetStringFunc("parsMissingFunctionBody",",,,") ) /// Syntax error in labelled type argument - /// (Originally from ../FSComp.txt:446) + /// (Originally from ..\FSComp.txt:447) static member parsSyntaxErrorInLabeledType() = (613, GetStringFunc("parsSyntaxErrorInLabeledType",",,,") ) /// Unexpected infix operator in type expression - /// (Originally from ../FSComp.txt:447) + /// (Originally from ..\FSComp.txt:448) static member parsUnexpectedInfixOperator() = (615, GetStringFunc("parsUnexpectedInfixOperator",",,,") ) /// The syntax '(typ,...,typ) ident' is not used in F# code. Consider using 'ident' instead - /// (Originally from ../FSComp.txt:448) + /// (Originally from ..\FSComp.txt:449) static member parsMultiArgumentGenericTypeFormDeprecated() = (GetStringFunc("parsMultiArgumentGenericTypeFormDeprecated",",,,") ) /// Invalid literal in type - /// (Originally from ../FSComp.txt:449) + /// (Originally from ..\FSComp.txt:450) static member parsInvalidLiteralInType() = (618, GetStringFunc("parsInvalidLiteralInType",",,,") ) /// Unexpected infix operator in unit-of-measure expression. Legal operators are '*', '/' and '^'. - /// (Originally from ../FSComp.txt:450) + /// (Originally from ..\FSComp.txt:451) static member parsUnexpectedOperatorForUnitOfMeasure() = (619, GetStringFunc("parsUnexpectedOperatorForUnitOfMeasure",",,,") ) /// Unexpected integer literal in unit-of-measure expression - /// (Originally from ../FSComp.txt:451) + /// (Originally from ..\FSComp.txt:452) static member parsUnexpectedIntegerLiteralForUnitOfMeasure() = (620, GetStringFunc("parsUnexpectedIntegerLiteralForUnitOfMeasure",",,,") ) /// Syntax error: unexpected type parameter specification - /// (Originally from ../FSComp.txt:452) + /// (Originally from ..\FSComp.txt:453) static member parsUnexpectedTypeParameter() = (621, GetStringFunc("parsUnexpectedTypeParameter",",,,") ) /// Mismatched quotation operator name, beginning with '%s' - /// (Originally from ../FSComp.txt:453) + /// (Originally from ..\FSComp.txt:454) static member parsMismatchedQuotationName(a0 : System.String) = (622, GetStringFunc("parsMismatchedQuotationName",",,,%s,,,") a0) /// Active pattern case identifiers must begin with an uppercase letter - /// (Originally from ../FSComp.txt:454) + /// (Originally from ..\FSComp.txt:455) static member parsActivePatternCaseMustBeginWithUpperCase() = (623, GetStringFunc("parsActivePatternCaseMustBeginWithUpperCase",",,,") ) /// The '|' character is not permitted in active pattern case identifiers - /// (Originally from ../FSComp.txt:455) + /// (Originally from ..\FSComp.txt:456) static member parsActivePatternCaseContainsPipe() = (624, GetStringFunc("parsActivePatternCaseContainsPipe",",,,") ) /// Denominator must not be 0 in unit-of-measure exponent - /// (Originally from ../FSComp.txt:456) + /// (Originally from ..\FSComp.txt:457) static member parsIllegalDenominatorForMeasureExponent() = (625, GetStringFunc("parsIllegalDenominatorForMeasureExponent",",,,") ) /// No '=' symbol should follow a 'namespace' declaration - /// (Originally from ../FSComp.txt:457) + /// (Originally from ..\FSComp.txt:458) static member parsNoEqualShouldFollowNamespace() = (GetStringFunc("parsNoEqualShouldFollowNamespace",",,,") ) /// The syntax 'module ... = struct .. end' is not used in F# code. Consider using 'module ... = begin .. end' - /// (Originally from ../FSComp.txt:458) + /// (Originally from ..\FSComp.txt:459) static member parsSyntaxModuleStructEndDeprecated() = (GetStringFunc("parsSyntaxModuleStructEndDeprecated",",,,") ) /// The syntax 'module ... : sig .. end' is not used in F# code. Consider using 'module ... = begin .. end' - /// (Originally from ../FSComp.txt:459) + /// (Originally from ..\FSComp.txt:460) static member parsSyntaxModuleSigEndDeprecated() = (GetStringFunc("parsSyntaxModuleSigEndDeprecated",",,,") ) /// A static field was used where an instance field is expected - /// (Originally from ../FSComp.txt:460) + /// (Originally from ..\FSComp.txt:461) static member tcStaticFieldUsedWhenInstanceFieldExpected() = (627, GetStringFunc("tcStaticFieldUsedWhenInstanceFieldExpected",",,,") ) /// Method '%s' is not accessible from this code location - /// (Originally from ../FSComp.txt:461) + /// (Originally from ..\FSComp.txt:462) static member tcMethodNotAccessible(a0 : System.String) = (629, GetStringFunc("tcMethodNotAccessible",",,,%s,,,") a0) /// Implicit product of measures following / - /// (Originally from ../FSComp.txt:463) + /// (Originally from ..\FSComp.txt:464) static member tcImplicitMeasureFollowingSlash() = (632, GetStringFunc("tcImplicitMeasureFollowingSlash",",,,") ) /// Unexpected SynMeasure.Anon - /// (Originally from ../FSComp.txt:464) + /// (Originally from ..\FSComp.txt:465) static member tcUnexpectedMeasureAnon() = (633, GetStringFunc("tcUnexpectedMeasureAnon",",,,") ) /// Non-zero constants cannot have generic units. For generic zero, write 0.0<_>. - /// (Originally from ../FSComp.txt:465) + /// (Originally from ..\FSComp.txt:466) static member tcNonZeroConstantCannotHaveGenericUnit() = (634, GetStringFunc("tcNonZeroConstantCannotHaveGenericUnit",",,,") ) /// In sequence expressions, results are generated using 'yield' - /// (Originally from ../FSComp.txt:466) + /// (Originally from ..\FSComp.txt:467) static member tcSeqResultsUseYield() = (635, GetStringFunc("tcSeqResultsUseYield",",,,") ) /// Unexpected big rational constant - /// (Originally from ../FSComp.txt:467) + /// (Originally from ..\FSComp.txt:468) static member tcUnexpectedBigRationalConstant() = (GetStringFunc("tcUnexpectedBigRationalConstant",",,,") ) /// Units-of-measure supported only on float, float32, decimal and signed integer types - /// (Originally from ../FSComp.txt:468) + /// (Originally from ..\FSComp.txt:469) static member tcInvalidTypeForUnitsOfMeasure() = (636, GetStringFunc("tcInvalidTypeForUnitsOfMeasure",",,,") ) /// Unexpected Const_uint16array - /// (Originally from ../FSComp.txt:469) + /// (Originally from ..\FSComp.txt:470) static member tcUnexpectedConstUint16Array() = (GetStringFunc("tcUnexpectedConstUint16Array",",,,") ) /// Unexpected Const_bytearray - /// (Originally from ../FSComp.txt:470) + /// (Originally from ..\FSComp.txt:471) static member tcUnexpectedConstByteArray() = (GetStringFunc("tcUnexpectedConstByteArray",",,,") ) /// A parameter with attributes must also be given a name, e.g. '[] Name : Type' - /// (Originally from ../FSComp.txt:471) + /// (Originally from ..\FSComp.txt:472) static member tcParameterRequiresName() = (640, GetStringFunc("tcParameterRequiresName",",,,") ) /// Return values cannot have names - /// (Originally from ../FSComp.txt:472) + /// (Originally from ..\FSComp.txt:473) static member tcReturnValuesCannotHaveNames() = (641, GetStringFunc("tcReturnValuesCannotHaveNames",",,,") ) /// MemberKind.PropertyGetSet only expected in parse trees - /// (Originally from ../FSComp.txt:473) + /// (Originally from ..\FSComp.txt:474) static member tcMemberKindPropertyGetSetNotExpected() = (GetStringFunc("tcMemberKindPropertyGetSetNotExpected",",,,") ) /// Namespaces cannot contain values. Consider using a module to hold your value declarations. - /// (Originally from ../FSComp.txt:474) + /// (Originally from ..\FSComp.txt:475) static member tcNamespaceCannotContainValues() = (201, GetStringFunc("tcNamespaceCannotContainValues",",,,") ) /// Namespaces cannot contain extension members except in the same file and namespace declaration group where the type is defined. Consider using a module to hold declarations of extension members. - /// (Originally from ../FSComp.txt:475) + /// (Originally from ..\FSComp.txt:476) static member tcNamespaceCannotContainExtensionMembers() = (644, GetStringFunc("tcNamespaceCannotContainExtensionMembers",",,,") ) /// Multiple visibility attributes have been specified for this identifier - /// (Originally from ../FSComp.txt:476) + /// (Originally from ..\FSComp.txt:477) static member tcMultipleVisibilityAttributes() = (645, GetStringFunc("tcMultipleVisibilityAttributes",",,,") ) /// Multiple visibility attributes have been specified for this identifier. 'let' bindings in classes are always private, as are any 'let' bindings inside expressions. - /// (Originally from ../FSComp.txt:477) + /// (Originally from ..\FSComp.txt:478) static member tcMultipleVisibilityAttributesWithLet() = (646, GetStringFunc("tcMultipleVisibilityAttributesWithLet",",,,") ) /// The name '(%s)' should not be used as a member name. To define comparison semantics for a type, implement the 'System.IComparable' interface. If defining a static member for use from other CLI languages then use the name '%s' instead. - /// (Originally from ../FSComp.txt:478) + /// (Originally from ..\FSComp.txt:479) static member tcInvalidMethodNameForRelationalOperator(a0 : System.String, a1 : System.String) = (GetStringFunc("tcInvalidMethodNameForRelationalOperator",",,,%s,,,%s,,,") a0 a1) /// The name '(%s)' should not be used as a member name. To define equality semantics for a type, override the 'Object.Equals' member. If defining a static member for use from other CLI languages then use the name '%s' instead. - /// (Originally from ../FSComp.txt:479) + /// (Originally from ..\FSComp.txt:480) static member tcInvalidMethodNameForEquality(a0 : System.String, a1 : System.String) = (GetStringFunc("tcInvalidMethodNameForEquality",",,,%s,,,%s,,,") a0 a1) /// The name '(%s)' should not be used as a member name. If defining a static member for use from other CLI languages then use the name '%s' instead. - /// (Originally from ../FSComp.txt:480) + /// (Originally from ..\FSComp.txt:481) static member tcInvalidMemberName(a0 : System.String, a1 : System.String) = (GetStringFunc("tcInvalidMemberName",",,,%s,,,%s,,,") a0 a1) /// The name '(%s)' should not be used as a member name because it is given a standard definition in the F# library over fixed types - /// (Originally from ../FSComp.txt:481) + /// (Originally from ..\FSComp.txt:482) static member tcInvalidMemberNameFixedTypes(a0 : System.String) = (GetStringFunc("tcInvalidMemberNameFixedTypes",",,,%s,,,") a0) /// The '%s' operator should not normally be redefined. To define overloaded comparison semantics for a particular type, implement the 'System.IComparable' interface in the definition of that type. - /// (Originally from ../FSComp.txt:482) + /// (Originally from ..\FSComp.txt:483) static member tcInvalidOperatorDefinitionRelational(a0 : System.String) = (GetStringFunc("tcInvalidOperatorDefinitionRelational",",,,%s,,,") a0) /// The '%s' operator should not normally be redefined. To define equality semantics for a type, override the 'Object.Equals' member in the definition of that type. - /// (Originally from ../FSComp.txt:483) + /// (Originally from ..\FSComp.txt:484) static member tcInvalidOperatorDefinitionEquality(a0 : System.String) = (GetStringFunc("tcInvalidOperatorDefinitionEquality",",,,%s,,,") a0) /// The '%s' operator should not normally be redefined. Consider using a different operator name - /// (Originally from ../FSComp.txt:484) + /// (Originally from ..\FSComp.txt:485) static member tcInvalidOperatorDefinition(a0 : System.String) = (GetStringFunc("tcInvalidOperatorDefinition",",,,%s,,,") a0) /// The '%s' operator cannot be redefined. Consider using a different operator name - /// (Originally from ../FSComp.txt:485) + /// (Originally from ..\FSComp.txt:486) static member tcInvalidIndexOperatorDefinition(a0 : System.String) = (GetStringFunc("tcInvalidIndexOperatorDefinition",",,,%s,,,") a0) /// Expected module or namespace parent %s - /// (Originally from ../FSComp.txt:486) + /// (Originally from ..\FSComp.txt:487) static member tcExpectModuleOrNamespaceParent(a0 : System.String) = (GetStringFunc("tcExpectModuleOrNamespaceParent",",,,%s,,,") a0) /// The struct, record or union type '%s' implements the interface 'System.IComparable' explicitly. You must apply the 'CustomComparison' attribute to the type. - /// (Originally from ../FSComp.txt:487) + /// (Originally from ..\FSComp.txt:488) static member tcImplementsIComparableExplicitly(a0 : System.String) = (647, GetStringFunc("tcImplementsIComparableExplicitly",",,,%s,,,") a0) /// The struct, record or union type '%s' implements the interface 'System.IComparable<_>' explicitly. You must apply the 'CustomComparison' attribute to the type, and should also provide a consistent implementation of the non-generic interface System.IComparable. - /// (Originally from ../FSComp.txt:488) + /// (Originally from ..\FSComp.txt:489) static member tcImplementsGenericIComparableExplicitly(a0 : System.String) = (648, GetStringFunc("tcImplementsGenericIComparableExplicitly",",,,%s,,,") a0) /// The struct, record or union type '%s' implements the interface 'System.IStructuralComparable' explicitly. Apply the 'CustomComparison' attribute to the type. - /// (Originally from ../FSComp.txt:489) + /// (Originally from ..\FSComp.txt:490) static member tcImplementsIStructuralComparableExplicitly(a0 : System.String) = (649, GetStringFunc("tcImplementsIStructuralComparableExplicitly",",,,%s,,,") a0) /// This record contains fields from inconsistent types - /// (Originally from ../FSComp.txt:490) + /// (Originally from ..\FSComp.txt:491) static member tcRecordFieldInconsistentTypes() = (656, GetStringFunc("tcRecordFieldInconsistentTypes",",,,") ) /// DLLImport stubs cannot be inlined - /// (Originally from ../FSComp.txt:491) + /// (Originally from ..\FSComp.txt:492) static member tcDllImportStubsCannotBeInlined() = (657, GetStringFunc("tcDllImportStubsCannotBeInlined",",,,") ) /// Structs may only bind a 'this' parameter at member declarations - /// (Originally from ../FSComp.txt:492) + /// (Originally from ..\FSComp.txt:493) static member tcStructsCanOnlyBindThisAtMemberDeclaration() = (658, GetStringFunc("tcStructsCanOnlyBindThisAtMemberDeclaration",",,,") ) /// Unexpected expression at recursive inference point - /// (Originally from ../FSComp.txt:493) + /// (Originally from ..\FSComp.txt:494) static member tcUnexpectedExprAtRecInfPoint() = (659, GetStringFunc("tcUnexpectedExprAtRecInfPoint",",,,") ) /// This code is less generic than required by its annotations because the explicit type variable '%s' could not be generalized. It was constrained to be '%s'. - /// (Originally from ../FSComp.txt:494) + /// (Originally from ..\FSComp.txt:495) static member tcLessGenericBecauseOfAnnotation(a0 : System.String, a1 : System.String) = (660, GetStringFunc("tcLessGenericBecauseOfAnnotation",",,,%s,,,%s,,,") a0 a1) /// One or more of the explicit class or function type variables for this binding could not be generalized, because they were constrained to other types - /// (Originally from ../FSComp.txt:495) + /// (Originally from ..\FSComp.txt:496) static member tcConstrainedTypeVariableCannotBeGeneralized() = (661, GetStringFunc("tcConstrainedTypeVariableCannotBeGeneralized",",,,") ) /// A generic type parameter has been used in a way that constrains it to always be '%s' - /// (Originally from ../FSComp.txt:496) + /// (Originally from ..\FSComp.txt:497) static member tcGenericParameterHasBeenConstrained(a0 : System.String) = (662, GetStringFunc("tcGenericParameterHasBeenConstrained",",,,%s,,,") a0) /// This type parameter has been used in a way that constrains it to always be '%s' - /// (Originally from ../FSComp.txt:497) + /// (Originally from ..\FSComp.txt:498) static member tcTypeParameterHasBeenConstrained(a0 : System.String) = (663, GetStringFunc("tcTypeParameterHasBeenConstrained",",,,%s,,,") a0) /// The type parameters inferred for this value are not stable under the erasure of type abbreviations. This is due to the use of type abbreviations which drop or reorder type parameters, e.g. \n\ttype taggedInt<'a> = int or\n\ttype swap<'a,'b> = 'b * 'a.\nConsider declaring the type parameters for this value explicitly, e.g.\n\tlet f<'a,'b> ((x,y) : swap<'b,'a>) : swap<'a,'b> = (y,x). - /// (Originally from ../FSComp.txt:498) + /// (Originally from ..\FSComp.txt:499) static member tcTypeParametersInferredAreNotStable() = (664, GetStringFunc("tcTypeParametersInferredAreNotStable",",,,") ) /// Explicit type parameters may only be used on module or member bindings - /// (Originally from ../FSComp.txt:499) + /// (Originally from ..\FSComp.txt:500) static member tcExplicitTypeParameterInvalid() = (665, GetStringFunc("tcExplicitTypeParameterInvalid",",,,") ) /// You must explicitly declare either all or no type parameters when overriding a generic abstract method - /// (Originally from ../FSComp.txt:500) + /// (Originally from ..\FSComp.txt:501) static member tcOverridingMethodRequiresAllOrNoTypeParameters() = (666, GetStringFunc("tcOverridingMethodRequiresAllOrNoTypeParameters",",,,") ) /// The field labels and expected type of this record expression or pattern do not uniquely determine a corresponding record type - /// (Originally from ../FSComp.txt:501) + /// (Originally from ..\FSComp.txt:502) static member tcFieldsDoNotDetermineUniqueRecordType() = (667, GetStringFunc("tcFieldsDoNotDetermineUniqueRecordType",",,,") ) /// The field '%s' appears twice in this record expression or pattern - /// (Originally from ../FSComp.txt:502) + /// (Originally from ..\FSComp.txt:503) static member tcFieldAppearsTwiceInRecord(a0 : System.String) = (668, GetStringFunc("tcFieldAppearsTwiceInRecord",",,,%s,,,") a0) /// Unknown union case - /// (Originally from ../FSComp.txt:503) + /// (Originally from ..\FSComp.txt:504) static member tcUnknownUnion() = (669, GetStringFunc("tcUnknownUnion",",,,") ) /// This code is not sufficiently generic. The type variable %s could not be generalized because it would escape its scope. - /// (Originally from ../FSComp.txt:504) + /// (Originally from ..\FSComp.txt:505) static member tcNotSufficientlyGenericBecauseOfScope(a0 : System.String) = (670, GetStringFunc("tcNotSufficientlyGenericBecauseOfScope",",,,%s,,,") a0) /// A property cannot have explicit type parameters. Consider using a method instead. - /// (Originally from ../FSComp.txt:505) + /// (Originally from ..\FSComp.txt:506) static member tcPropertyRequiresExplicitTypeParameters() = (671, GetStringFunc("tcPropertyRequiresExplicitTypeParameters",",,,") ) /// A constructor cannot have explicit type parameters. Consider using a static construction method instead. - /// (Originally from ../FSComp.txt:506) + /// (Originally from ..\FSComp.txt:507) static member tcConstructorCannotHaveTypeParameters() = (672, GetStringFunc("tcConstructorCannotHaveTypeParameters",",,,") ) /// This instance member needs a parameter to represent the object being invoked. Make the member static or use the notation 'member x.Member(args) = ...'. - /// (Originally from ../FSComp.txt:507) + /// (Originally from ..\FSComp.txt:508) static member tcInstanceMemberRequiresTarget() = (673, GetStringFunc("tcInstanceMemberRequiresTarget",",,,") ) /// Unexpected source-level property specification in syntax tree - /// (Originally from ../FSComp.txt:508) + /// (Originally from ..\FSComp.txt:509) static member tcUnexpectedPropertyInSyntaxTree() = (674, GetStringFunc("tcUnexpectedPropertyInSyntaxTree",",,,") ) /// A static initializer requires an argument - /// (Originally from ../FSComp.txt:509) + /// (Originally from ..\FSComp.txt:510) static member tcStaticInitializerRequiresArgument() = (675, GetStringFunc("tcStaticInitializerRequiresArgument",",,,") ) /// An object constructor requires an argument - /// (Originally from ../FSComp.txt:510) + /// (Originally from ..\FSComp.txt:511) static member tcObjectConstructorRequiresArgument() = (676, GetStringFunc("tcObjectConstructorRequiresArgument",",,,") ) /// This static member should not have a 'this' parameter. Consider using the notation 'member Member(args) = ...'. - /// (Originally from ../FSComp.txt:511) + /// (Originally from ..\FSComp.txt:512) static member tcStaticMemberShouldNotHaveThis() = (677, GetStringFunc("tcStaticMemberShouldNotHaveThis",",,,") ) /// An explicit static initializer should use the syntax 'static new(args) = expr' - /// (Originally from ../FSComp.txt:512) + /// (Originally from ..\FSComp.txt:513) static member tcExplicitStaticInitializerSyntax() = (678, GetStringFunc("tcExplicitStaticInitializerSyntax",",,,") ) /// An explicit object constructor should use the syntax 'new(args) = expr' - /// (Originally from ../FSComp.txt:513) + /// (Originally from ..\FSComp.txt:514) static member tcExplicitObjectConstructorSyntax() = (679, GetStringFunc("tcExplicitObjectConstructorSyntax",",,,") ) /// Unexpected source-level property specification - /// (Originally from ../FSComp.txt:514) + /// (Originally from ..\FSComp.txt:515) static member tcUnexpectedPropertySpec() = (680, GetStringFunc("tcUnexpectedPropertySpec",",,,") ) /// This form of object expression is not used in F#. Use 'member this.MemberName ... = ...' to define member implementations in object expressions. - /// (Originally from ../FSComp.txt:515) + /// (Originally from ..\FSComp.txt:516) static member tcObjectExpressionFormDeprecated() = (GetStringFunc("tcObjectExpressionFormDeprecated",",,,") ) /// Invalid declaration - /// (Originally from ../FSComp.txt:516) + /// (Originally from ..\FSComp.txt:517) static member tcInvalidDeclaration() = (682, GetStringFunc("tcInvalidDeclaration",",,,") ) /// Attributes are not allowed within patterns - /// (Originally from ../FSComp.txt:517) + /// (Originally from ..\FSComp.txt:518) static member tcAttributesInvalidInPatterns() = (683, GetStringFunc("tcAttributesInvalidInPatterns",",,,") ) /// The generic function '%s' must be given explicit type argument(s) - /// (Originally from ../FSComp.txt:518) + /// (Originally from ..\FSComp.txt:519) static member tcFunctionRequiresExplicitTypeArguments(a0 : System.String) = (685, GetStringFunc("tcFunctionRequiresExplicitTypeArguments",",,,%s,,,") a0) /// The method or function '%s' should not be given explicit type argument(s) because it does not declare its type parameters explicitly - /// (Originally from ../FSComp.txt:519) + /// (Originally from ..\FSComp.txt:520) static member tcDoesNotAllowExplicitTypeArguments(a0 : System.String) = (686, GetStringFunc("tcDoesNotAllowExplicitTypeArguments",",,,%s,,,") a0) /// This value, type or method expects %d type parameter(s) but was given %d - /// (Originally from ../FSComp.txt:520) + /// (Originally from ..\FSComp.txt:521) static member tcTypeParameterArityMismatch(a0 : System.Int32, a1 : System.Int32) = (687, GetStringFunc("tcTypeParameterArityMismatch",",,,%d,,,%d,,,") a0 a1) /// The default, zero-initializing constructor of a struct type may only be used if all the fields of the struct type admit default initialization - /// (Originally from ../FSComp.txt:521) + /// (Originally from ..\FSComp.txt:522) static member tcDefaultStructConstructorCall() = (688, GetStringFunc("tcDefaultStructConstructorCall",",,,") ) /// Couldn't find Dispose on IDisposable, or it was overloaded - /// (Originally from ../FSComp.txt:522) + /// (Originally from ..\FSComp.txt:523) static member tcCouldNotFindIDisposable() = (GetStringFunc("tcCouldNotFindIDisposable",",,,") ) /// This value is not a literal and cannot be used in a pattern - /// (Originally from ../FSComp.txt:523) + /// (Originally from ..\FSComp.txt:524) static member tcNonLiteralCannotBeUsedInPattern() = (689, GetStringFunc("tcNonLiteralCannotBeUsedInPattern",",,,") ) /// This field is readonly - /// (Originally from ../FSComp.txt:524) + /// (Originally from ..\FSComp.txt:525) static member tcFieldIsReadonly() = (690, GetStringFunc("tcFieldIsReadonly",",,,") ) /// Named arguments must appear after all other arguments - /// (Originally from ../FSComp.txt:525) + /// (Originally from ..\FSComp.txt:526) static member tcNameArgumentsMustAppearLast() = (691, GetStringFunc("tcNameArgumentsMustAppearLast",",,,") ) /// This function value is being used to construct a delegate type whose signature includes a byref argument. You must use an explicit lambda expression taking %d arguments. - /// (Originally from ../FSComp.txt:526) + /// (Originally from ..\FSComp.txt:527) static member tcFunctionRequiresExplicitLambda(a0 : System.Int32) = (692, GetStringFunc("tcFunctionRequiresExplicitLambda",",,,%d,,,") a0) /// The type '%s' is not a type whose values can be enumerated with this syntax, i.e. is not compatible with either seq<_>, IEnumerable<_> or IEnumerable and does not have a GetEnumerator method - /// (Originally from ../FSComp.txt:527) + /// (Originally from ..\FSComp.txt:528) static member tcTypeCannotBeEnumerated(a0 : System.String) = (693, GetStringFunc("tcTypeCannotBeEnumerated",",,,%s,,,") a0) /// This recursive binding uses an invalid mixture of recursive forms - /// (Originally from ../FSComp.txt:528) + /// (Originally from ..\FSComp.txt:529) static member tcInvalidMixtureOfRecursiveForms() = (695, GetStringFunc("tcInvalidMixtureOfRecursiveForms",",,,") ) /// This is not a valid object construction expression. Explicit object constructors must either call an alternate constructor or initialize all fields of the object and specify a call to a super class constructor. - /// (Originally from ../FSComp.txt:529) + /// (Originally from ..\FSComp.txt:530) static member tcInvalidObjectConstructionExpression() = (696, GetStringFunc("tcInvalidObjectConstructionExpression",",,,") ) /// Invalid constraint - /// (Originally from ../FSComp.txt:530) + /// (Originally from ..\FSComp.txt:531) static member tcInvalidConstraint() = (697, GetStringFunc("tcInvalidConstraint",",,,") ) /// Invalid constraint: the type used for the constraint is sealed, which means the constraint could only be satisfied by at most one solution - /// (Originally from ../FSComp.txt:531) + /// (Originally from ..\FSComp.txt:532) static member tcInvalidConstraintTypeSealed() = (698, GetStringFunc("tcInvalidConstraintTypeSealed",",,,") ) /// An 'enum' constraint must be of the form 'enum' - /// (Originally from ../FSComp.txt:532) + /// (Originally from ..\FSComp.txt:533) static member tcInvalidEnumConstraint() = (699, GetStringFunc("tcInvalidEnumConstraint",",,,") ) /// 'new' constraints must take one argument of type 'unit' and return the constructed type - /// (Originally from ../FSComp.txt:533) + /// (Originally from ..\FSComp.txt:534) static member tcInvalidNewConstraint() = (700, GetStringFunc("tcInvalidNewConstraint",",,,") ) /// This property has an invalid type. Properties taking multiple indexer arguments should have types of the form 'ty1 * ty2 -> ty3'. Properties returning functions should have types of the form '(ty1 -> ty2)'. - /// (Originally from ../FSComp.txt:534) + /// (Originally from ..\FSComp.txt:535) static member tcInvalidPropertyType() = (701, GetStringFunc("tcInvalidPropertyType",",,,") ) /// Expected unit-of-measure parameter, not type parameter. Explicit unit-of-measure parameters must be marked with the [] attribute. - /// (Originally from ../FSComp.txt:535) + /// (Originally from ..\FSComp.txt:536) static member tcExpectedUnitOfMeasureMarkWithAttribute() = (702, GetStringFunc("tcExpectedUnitOfMeasureMarkWithAttribute",",,,") ) /// Expected type parameter, not unit-of-measure parameter - /// (Originally from ../FSComp.txt:536) + /// (Originally from ..\FSComp.txt:537) static member tcExpectedTypeParameter() = (703, GetStringFunc("tcExpectedTypeParameter",",,,") ) /// Expected type, not unit-of-measure - /// (Originally from ../FSComp.txt:537) + /// (Originally from ..\FSComp.txt:538) static member tcExpectedTypeNotUnitOfMeasure() = (704, GetStringFunc("tcExpectedTypeNotUnitOfMeasure",",,,") ) /// Expected unit-of-measure, not type - /// (Originally from ../FSComp.txt:538) + /// (Originally from ..\FSComp.txt:539) static member tcExpectedUnitOfMeasureNotType() = (705, GetStringFunc("tcExpectedUnitOfMeasureNotType",",,,") ) /// Units-of-measure cannot be used as prefix arguments to a type. Rewrite as postfix arguments in angle brackets. - /// (Originally from ../FSComp.txt:539) + /// (Originally from ..\FSComp.txt:540) static member tcInvalidUnitsOfMeasurePrefix() = (706, GetStringFunc("tcInvalidUnitsOfMeasurePrefix",",,,") ) /// Unit-of-measure cannot be used in type constructor application - /// (Originally from ../FSComp.txt:540) + /// (Originally from ..\FSComp.txt:541) static member tcUnitsOfMeasureInvalidInTypeConstructor() = (707, GetStringFunc("tcUnitsOfMeasureInvalidInTypeConstructor",",,,") ) /// This control construct may only be used if the computation expression builder defines a '%s' method - /// (Originally from ../FSComp.txt:541) + /// (Originally from ..\FSComp.txt:542) static member tcRequireBuilderMethod(a0 : System.String) = (708, GetStringFunc("tcRequireBuilderMethod",",,,%s,,,") a0) /// This type has no nested types - /// (Originally from ../FSComp.txt:542) + /// (Originally from ..\FSComp.txt:543) static member tcTypeHasNoNestedTypes() = (709, GetStringFunc("tcTypeHasNoNestedTypes",",,,") ) /// Unexpected %s in type expression - /// (Originally from ../FSComp.txt:543) + /// (Originally from ..\FSComp.txt:544) static member tcUnexpectedSymbolInTypeExpression(a0 : System.String) = (711, GetStringFunc("tcUnexpectedSymbolInTypeExpression",",,,%s,,,") a0) /// Type parameter cannot be used as type constructor - /// (Originally from ../FSComp.txt:544) + /// (Originally from ..\FSComp.txt:545) static member tcTypeParameterInvalidAsTypeConstructor() = (712, GetStringFunc("tcTypeParameterInvalidAsTypeConstructor",",,,") ) /// Illegal syntax in type expression - /// (Originally from ../FSComp.txt:545) + /// (Originally from ..\FSComp.txt:546) static member tcIllegalSyntaxInTypeExpression() = (713, GetStringFunc("tcIllegalSyntaxInTypeExpression",",,,") ) /// Anonymous unit-of-measure cannot be nested inside another unit-of-measure expression - /// (Originally from ../FSComp.txt:546) + /// (Originally from ..\FSComp.txt:547) static member tcAnonymousUnitsOfMeasureCannotBeNested() = (714, GetStringFunc("tcAnonymousUnitsOfMeasureCannotBeNested",",,,") ) /// Anonymous type variables are not permitted in this declaration - /// (Originally from ../FSComp.txt:547) + /// (Originally from ..\FSComp.txt:548) static member tcAnonymousTypeInvalidInDeclaration() = (715, GetStringFunc("tcAnonymousTypeInvalidInDeclaration",",,,") ) /// Unexpected / in type - /// (Originally from ../FSComp.txt:548) + /// (Originally from ..\FSComp.txt:549) static member tcUnexpectedSlashInType() = (716, GetStringFunc("tcUnexpectedSlashInType",",,,") ) /// Unexpected type arguments - /// (Originally from ../FSComp.txt:549) + /// (Originally from ..\FSComp.txt:550) static member tcUnexpectedTypeArguments() = (717, GetStringFunc("tcUnexpectedTypeArguments",",,,") ) /// Optional arguments are only permitted on type members - /// (Originally from ../FSComp.txt:550) + /// (Originally from ..\FSComp.txt:551) static member tcOptionalArgsOnlyOnMembers() = (718, GetStringFunc("tcOptionalArgsOnlyOnMembers",",,,") ) /// Name '%s' not bound in pattern context - /// (Originally from ../FSComp.txt:551) + /// (Originally from ..\FSComp.txt:552) static member tcNameNotBoundInPattern(a0 : System.String) = (719, GetStringFunc("tcNameNotBoundInPattern",",,,%s,,,") a0) /// Non-primitive numeric literal constants cannot be used in pattern matches because they can be mapped to multiple different types through the use of a NumericLiteral module. Consider using replacing with a variable, and use 'when = ' at the end of the match clause. - /// (Originally from ../FSComp.txt:552) + /// (Originally from ..\FSComp.txt:553) static member tcInvalidNonPrimitiveLiteralInPatternMatch() = (720, GetStringFunc("tcInvalidNonPrimitiveLiteralInPatternMatch",",,,") ) /// Type arguments cannot be specified here - /// (Originally from ../FSComp.txt:553) + /// (Originally from ..\FSComp.txt:554) static member tcInvalidTypeArgumentUsage() = (721, GetStringFunc("tcInvalidTypeArgumentUsage",",,,") ) /// Only active patterns returning exactly one result may accept arguments - /// (Originally from ../FSComp.txt:554) + /// (Originally from ..\FSComp.txt:555) static member tcRequireActivePatternWithOneResult() = (722, GetStringFunc("tcRequireActivePatternWithOneResult",",,,") ) /// Invalid argument to parameterized pattern label - /// (Originally from ../FSComp.txt:555) + /// (Originally from ..\FSComp.txt:556) static member tcInvalidArgForParameterizedPattern() = (723, GetStringFunc("tcInvalidArgForParameterizedPattern",",,,") ) /// Internal error. Invalid index into active pattern array - /// (Originally from ../FSComp.txt:556) + /// (Originally from ..\FSComp.txt:557) static member tcInvalidIndexIntoActivePatternArray() = (724, GetStringFunc("tcInvalidIndexIntoActivePatternArray",",,,") ) /// This union case does not take arguments - /// (Originally from ../FSComp.txt:557) + /// (Originally from ..\FSComp.txt:558) static member tcUnionCaseDoesNotTakeArguments() = (725, GetStringFunc("tcUnionCaseDoesNotTakeArguments",",,,") ) /// This union case takes one argument - /// (Originally from ../FSComp.txt:558) + /// (Originally from ..\FSComp.txt:559) static member tcUnionCaseRequiresOneArgument() = (726, GetStringFunc("tcUnionCaseRequiresOneArgument",",,,") ) /// This union case expects %d arguments in tupled form - /// (Originally from ../FSComp.txt:559) + /// (Originally from ..\FSComp.txt:560) static member tcUnionCaseExpectsTupledArguments(a0 : System.Int32) = (727, GetStringFunc("tcUnionCaseExpectsTupledArguments",",,,%d,,,") a0) /// Field '%s' is not static - /// (Originally from ../FSComp.txt:560) + /// (Originally from ..\FSComp.txt:561) static member tcFieldIsNotStatic(a0 : System.String) = (728, GetStringFunc("tcFieldIsNotStatic",",,,%s,,,") a0) /// This field is not a literal and cannot be used in a pattern - /// (Originally from ../FSComp.txt:561) + /// (Originally from ..\FSComp.txt:562) static member tcFieldNotLiteralCannotBeUsedInPattern() = (729, GetStringFunc("tcFieldNotLiteralCannotBeUsedInPattern",",,,") ) /// This is not a variable, constant, active recognizer or literal - /// (Originally from ../FSComp.txt:562) + /// (Originally from ..\FSComp.txt:563) static member tcRequireVarConstRecogOrLiteral() = (730, GetStringFunc("tcRequireVarConstRecogOrLiteral",",,,") ) /// This is not a valid pattern - /// (Originally from ../FSComp.txt:563) + /// (Originally from ..\FSComp.txt:564) static member tcInvalidPattern() = (731, GetStringFunc("tcInvalidPattern",",,,") ) /// Character range matches have been removed in F#. Consider using a 'when' pattern guard instead. - /// (Originally from ../FSComp.txt:564) + /// (Originally from ..\FSComp.txt:565) static member tcUseWhenPatternGuard() = (GetStringFunc("tcUseWhenPatternGuard",",,,") ) /// Illegal pattern - /// (Originally from ../FSComp.txt:565) + /// (Originally from ..\FSComp.txt:566) static member tcIllegalPattern() = (733, GetStringFunc("tcIllegalPattern",",,,") ) /// Syntax error - unexpected '?' symbol - /// (Originally from ../FSComp.txt:566) + /// (Originally from ..\FSComp.txt:567) static member tcSyntaxErrorUnexpectedQMark() = (734, GetStringFunc("tcSyntaxErrorUnexpectedQMark",",,,") ) /// Expected %d expressions, got %d - /// (Originally from ../FSComp.txt:567) + /// (Originally from ..\FSComp.txt:568) static member tcExpressionCountMisMatch(a0 : System.Int32, a1 : System.Int32) = (735, GetStringFunc("tcExpressionCountMisMatch",",,,%d,,,%d,,,") a0 a1) /// TcExprUndelayed: delayed - /// (Originally from ../FSComp.txt:568) + /// (Originally from ..\FSComp.txt:569) static member tcExprUndelayed() = (736, GetStringFunc("tcExprUndelayed",",,,") ) /// This expression form may only be used in sequence and computation expressions - /// (Originally from ../FSComp.txt:569) + /// (Originally from ..\FSComp.txt:570) static member tcExpressionRequiresSequence() = (737, GetStringFunc("tcExpressionRequiresSequence",",,,") ) /// Invalid object expression. Objects without overrides or interfaces should use the expression form 'new Type(args)' without braces. - /// (Originally from ../FSComp.txt:570) + /// (Originally from ..\FSComp.txt:571) static member tcInvalidObjectExpressionSyntaxForm() = (738, GetStringFunc("tcInvalidObjectExpressionSyntaxForm",",,,") ) /// Invalid object, sequence or record expression - /// (Originally from ../FSComp.txt:571) + /// (Originally from ..\FSComp.txt:572) static member tcInvalidObjectSequenceOrRecordExpression() = (739, GetStringFunc("tcInvalidObjectSequenceOrRecordExpression",",,,") ) /// Invalid record, sequence or computation expression. Sequence expressions should be of the form 'seq { ... }' - /// (Originally from ../FSComp.txt:572) + /// (Originally from ..\FSComp.txt:573) static member tcInvalidSequenceExpressionSyntaxForm() = (740, GetStringFunc("tcInvalidSequenceExpressionSyntaxForm",",,,") ) /// This list or array expression includes an element of the form 'if ... then ... else'. Parenthesize this expression to indicate it is an individual element of the list or array, to disambiguate this from a list generated using a sequence expression - /// (Originally from ../FSComp.txt:573) + /// (Originally from ..\FSComp.txt:574) static member tcExpressionWithIfRequiresParenthesis() = (GetStringFunc("tcExpressionWithIfRequiresParenthesis",",,,") ) /// Unable to parse format string '%s' - /// (Originally from ../FSComp.txt:574) + /// (Originally from ..\FSComp.txt:575) static member tcUnableToParseFormatString(a0 : System.String) = (741, GetStringFunc("tcUnableToParseFormatString",",,,%s,,,") a0) /// This list expression exceeds the maximum size for list literals. Use an array for larger literals and call Array.ToList. - /// (Originally from ../FSComp.txt:575) + /// (Originally from ..\FSComp.txt:576) static member tcListLiteralMaxSize() = (742, GetStringFunc("tcListLiteralMaxSize",",,,") ) /// The expression form 'expr then expr' may only be used as part of an explicit object constructor - /// (Originally from ../FSComp.txt:576) + /// (Originally from ..\FSComp.txt:577) static member tcExpressionFormRequiresObjectConstructor() = (743, GetStringFunc("tcExpressionFormRequiresObjectConstructor",",,,") ) /// Named arguments cannot be given to member trait calls - /// (Originally from ../FSComp.txt:577) + /// (Originally from ..\FSComp.txt:578) static member tcNamedArgumentsCannotBeUsedInMemberTraits() = (744, GetStringFunc("tcNamedArgumentsCannotBeUsedInMemberTraits",",,,") ) /// This is not a valid name for an enumeration case - /// (Originally from ../FSComp.txt:578) + /// (Originally from ..\FSComp.txt:579) static member tcNotValidEnumCaseName() = (745, GetStringFunc("tcNotValidEnumCaseName",",,,") ) /// This field is not mutable - /// (Originally from ../FSComp.txt:579) + /// (Originally from ..\FSComp.txt:580) static member tcFieldIsNotMutable() = (746, GetStringFunc("tcFieldIsNotMutable",",,,") ) /// This construct may only be used within list, array and sequence expressions, e.g. expressions of the form 'seq { ... }', '[ ... ]' or '[| ... |]'. These use the syntax 'for ... in ... do ... yield...' to generate elements - /// (Originally from ../FSComp.txt:580) + /// (Originally from ..\FSComp.txt:581) static member tcConstructRequiresListArrayOrSequence() = (747, GetStringFunc("tcConstructRequiresListArrayOrSequence",",,,") ) /// This construct may only be used within computation expressions. To return a value from an ordinary function simply write the expression without 'return'. - /// (Originally from ../FSComp.txt:581) + /// (Originally from ..\FSComp.txt:582) static member tcConstructRequiresComputationExpressions() = (748, GetStringFunc("tcConstructRequiresComputationExpressions",",,,") ) /// This construct may only be used within sequence or computation expressions - /// (Originally from ../FSComp.txt:582) + /// (Originally from ..\FSComp.txt:583) static member tcConstructRequiresSequenceOrComputations() = (749, GetStringFunc("tcConstructRequiresSequenceOrComputations",",,,") ) /// This construct may only be used within computation expressions - /// (Originally from ../FSComp.txt:583) + /// (Originally from ..\FSComp.txt:584) static member tcConstructRequiresComputationExpression() = (750, GetStringFunc("tcConstructRequiresComputationExpression",",,,") ) /// Invalid indexer expression - /// (Originally from ../FSComp.txt:584) + /// (Originally from ..\FSComp.txt:585) static member tcInvalidIndexerExpression() = (751, GetStringFunc("tcInvalidIndexerExpression",",,,") ) /// The operator 'expr.[idx]' has been used on an object of indeterminate type based on information prior to this program point. Consider adding further type constraints - /// (Originally from ../FSComp.txt:585) + /// (Originally from ..\FSComp.txt:586) static member tcObjectOfIndeterminateTypeUsedRequireTypeConstraint() = (752, GetStringFunc("tcObjectOfIndeterminateTypeUsedRequireTypeConstraint",",,,") ) /// Cannot inherit from a variable type - /// (Originally from ../FSComp.txt:586) + /// (Originally from ..\FSComp.txt:587) static member tcCannotInheritFromVariableType() = (753, GetStringFunc("tcCannotInheritFromVariableType",",,,") ) /// Calls to object constructors on type parameters cannot be given arguments - /// (Originally from ../FSComp.txt:587) + /// (Originally from ..\FSComp.txt:588) static member tcObjectConstructorsOnTypeParametersCannotTakeArguments() = (754, GetStringFunc("tcObjectConstructorsOnTypeParametersCannotTakeArguments",",,,") ) /// The 'CompiledName' attribute cannot be used with this language element - /// (Originally from ../FSComp.txt:588) + /// (Originally from ..\FSComp.txt:589) static member tcCompiledNameAttributeMisused() = (755, GetStringFunc("tcCompiledNameAttributeMisused",",,,") ) /// '%s' may only be used with named types - /// (Originally from ../FSComp.txt:589) + /// (Originally from ..\FSComp.txt:590) static member tcNamedTypeRequired(a0 : System.String) = (756, GetStringFunc("tcNamedTypeRequired",",,,%s,,,") a0) /// 'inherit' cannot be used on interface types. Consider implementing the interface by using 'interface ... with ... end' instead. - /// (Originally from ../FSComp.txt:590) + /// (Originally from ..\FSComp.txt:591) static member tcInheritCannotBeUsedOnInterfaceType() = (757, GetStringFunc("tcInheritCannotBeUsedOnInterfaceType",",,,") ) /// 'new' cannot be used on interface types. Consider using an object expression '{ new ... with ... }' instead. - /// (Originally from ../FSComp.txt:591) + /// (Originally from ..\FSComp.txt:592) static member tcNewCannotBeUsedOnInterfaceType() = (758, GetStringFunc("tcNewCannotBeUsedOnInterfaceType",",,,") ) /// Instances of this type cannot be created since it has been marked abstract or not all methods have been given implementations. Consider using an object expression '{ new ... with ... }' instead. - /// (Originally from ../FSComp.txt:592) + /// (Originally from ..\FSComp.txt:593) static member tcAbstractTypeCannotBeInstantiated() = (759, GetStringFunc("tcAbstractTypeCannotBeInstantiated",",,,") ) /// It is recommended that objects supporting the IDisposable interface are created using the syntax 'new Type(args)', rather than 'Type(args)' or 'Type' as a function value representing the constructor, to indicate that resources may be owned by the generated value - /// (Originally from ../FSComp.txt:593) + /// (Originally from ..\FSComp.txt:594) static member tcIDisposableTypeShouldUseNew() = (760, GetStringFunc("tcIDisposableTypeShouldUseNew",",,,") ) /// '%s' may only be used to construct object types - /// (Originally from ../FSComp.txt:594) + /// (Originally from ..\FSComp.txt:595) static member tcSyntaxCanOnlyBeUsedToCreateObjectTypes(a0 : System.String) = (761, GetStringFunc("tcSyntaxCanOnlyBeUsedToCreateObjectTypes",",,,%s,,,") a0) /// Constructors for the type '%s' must directly or indirectly call its implicit object constructor. Use a call to the implicit object constructor instead of a record expression. - /// (Originally from ../FSComp.txt:595) + /// (Originally from ..\FSComp.txt:596) static member tcConstructorRequiresCall(a0 : System.String) = (762, GetStringFunc("tcConstructorRequiresCall",",,,%s,,,") a0) /// The field '%s' has been given a value, but is not present in the type '%s' - /// (Originally from ../FSComp.txt:596) + /// (Originally from ..\FSComp.txt:597) static member tcUndefinedField(a0 : System.String, a1 : System.String) = (763, GetStringFunc("tcUndefinedField",",,,%s,,,%s,,,") a0 a1) /// No assignment given for field '%s' of type '%s' - /// (Originally from ../FSComp.txt:597) + /// (Originally from ..\FSComp.txt:598) static member tcFieldRequiresAssignment(a0 : System.String, a1 : System.String) = (764, GetStringFunc("tcFieldRequiresAssignment",",,,%s,,,%s,,,") a0 a1) /// Extraneous fields have been given values - /// (Originally from ../FSComp.txt:598) + /// (Originally from ..\FSComp.txt:599) static member tcExtraneousFieldsGivenValues() = (765, GetStringFunc("tcExtraneousFieldsGivenValues",",,,") ) /// Only overrides of abstract and virtual members may be specified in object expressions - /// (Originally from ../FSComp.txt:599) + /// (Originally from ..\FSComp.txt:600) static member tcObjectExpressionsCanOnlyOverrideAbstractOrVirtual() = (766, GetStringFunc("tcObjectExpressionsCanOnlyOverrideAbstractOrVirtual",",,,") ) /// The member '%s' does not correspond to any abstract or virtual method available to override or implement. - /// (Originally from ../FSComp.txt:600) + /// (Originally from ..\FSComp.txt:601) static member tcNoAbstractOrVirtualMemberFound(a0 : System.String) = (767, GetStringFunc("tcNoAbstractOrVirtualMemberFound",",,,%s,,,") a0) /// The type %s contains the member '%s' but it is not a virtual or abstract method that is available to override or implement. - /// (Originally from ../FSComp.txt:601) + /// (Originally from ..\FSComp.txt:602) static member tcMemberFoundIsNotAbstractOrVirtual(a0 : System.String, a1 : System.String) = (767, GetStringFunc("tcMemberFoundIsNotAbstractOrVirtual",",,,%s,,,%s,,,") a0 a1) /// The member '%s' does not accept the correct number of arguments. %d argument(s) are expected, but %d were given. The required signature is '%s'.%s - /// (Originally from ../FSComp.txt:602) + /// (Originally from ..\FSComp.txt:603) static member tcArgumentArityMismatch(a0 : System.String, a1 : System.Int32, a2 : System.Int32, a3 : System.String, a4 : System.String) = (768, GetStringFunc("tcArgumentArityMismatch",",,,%s,,,%d,,,%d,,,%s,,,%s,,,") a0 a1 a2 a3 a4) /// The member '%s' does not accept the correct number of arguments. One overload accepts %d arguments, but %d were given. The required signature is '%s'.%s - /// (Originally from ../FSComp.txt:603) + /// (Originally from ..\FSComp.txt:604) static member tcArgumentArityMismatchOneOverload(a0 : System.String, a1 : System.Int32, a2 : System.Int32, a3 : System.String, a4 : System.String) = (769, GetStringFunc("tcArgumentArityMismatchOneOverload",",,,%s,,,%d,,,%d,,,%s,,,%s,,,") a0 a1 a2 a3 a4) /// A simple method name is required here - /// (Originally from ../FSComp.txt:604) + /// (Originally from ..\FSComp.txt:605) static member tcSimpleMethodNameRequired() = (770, GetStringFunc("tcSimpleMethodNameRequired",",,,") ) /// The types System.ValueType, System.Enum, System.Delegate, System.MulticastDelegate and System.Array cannot be used as super types in an object expression or class - /// (Originally from ../FSComp.txt:605) + /// (Originally from ..\FSComp.txt:606) static member tcPredefinedTypeCannotBeUsedAsSuperType() = (771, GetStringFunc("tcPredefinedTypeCannotBeUsedAsSuperType",",,,") ) /// 'new' must be used with a named type - /// (Originally from ../FSComp.txt:606) + /// (Originally from ..\FSComp.txt:607) static member tcNewMustBeUsedWithNamedType() = (772, GetStringFunc("tcNewMustBeUsedWithNamedType",",,,") ) /// Cannot create an extension of a sealed type - /// (Originally from ../FSComp.txt:607) + /// (Originally from ..\FSComp.txt:608) static member tcCannotCreateExtensionOfSealedType() = (773, GetStringFunc("tcCannotCreateExtensionOfSealedType",",,,") ) /// No arguments may be given when constructing a record value - /// (Originally from ../FSComp.txt:608) + /// (Originally from ..\FSComp.txt:609) static member tcNoArgumentsForRecordValue() = (774, GetStringFunc("tcNoArgumentsForRecordValue",",,,") ) /// Interface implementations cannot be given on construction expressions - /// (Originally from ../FSComp.txt:609) + /// (Originally from ..\FSComp.txt:610) static member tcNoInterfaceImplementationForConstructionExpression() = (775, GetStringFunc("tcNoInterfaceImplementationForConstructionExpression",",,,") ) /// Object construction expressions may only be used to implement constructors in class types - /// (Originally from ../FSComp.txt:610) + /// (Originally from ..\FSComp.txt:611) static member tcObjectConstructionCanOnlyBeUsedInClassTypes() = (776, GetStringFunc("tcObjectConstructionCanOnlyBeUsedInClassTypes",",,,") ) /// Only simple bindings of the form 'id = expr' can be used in construction expressions - /// (Originally from ../FSComp.txt:611) + /// (Originally from ..\FSComp.txt:612) static member tcOnlySimpleBindingsCanBeUsedInConstructionExpressions() = (777, GetStringFunc("tcOnlySimpleBindingsCanBeUsedInConstructionExpressions",",,,") ) /// Objects must be initialized by an object construction expression that calls an inherited object constructor and assigns a value to each field - /// (Originally from ../FSComp.txt:612) + /// (Originally from ..\FSComp.txt:613) static member tcObjectsMustBeInitializedWithObjectExpression() = (778, GetStringFunc("tcObjectsMustBeInitializedWithObjectExpression",",,,") ) /// Expected an interface type - /// (Originally from ../FSComp.txt:613) + /// (Originally from ..\FSComp.txt:614) static member tcExpectedInterfaceType() = (779, GetStringFunc("tcExpectedInterfaceType",",,,") ) /// Constructor expressions for interfaces do not take arguments - /// (Originally from ../FSComp.txt:614) + /// (Originally from ..\FSComp.txt:615) static member tcConstructorForInterfacesDoNotTakeArguments() = (780, GetStringFunc("tcConstructorForInterfacesDoNotTakeArguments",",,,") ) /// This object constructor requires arguments - /// (Originally from ../FSComp.txt:615) + /// (Originally from ..\FSComp.txt:616) static member tcConstructorRequiresArguments() = (781, GetStringFunc("tcConstructorRequiresArguments",",,,") ) /// 'new' may only be used with object constructors - /// (Originally from ../FSComp.txt:616) + /// (Originally from ..\FSComp.txt:617) static member tcNewRequiresObjectConstructor() = (782, GetStringFunc("tcNewRequiresObjectConstructor",",,,") ) /// At least one override did not correctly implement its corresponding abstract member - /// (Originally from ../FSComp.txt:617) + /// (Originally from ..\FSComp.txt:618) static member tcAtLeastOneOverrideIsInvalid() = (783, GetStringFunc("tcAtLeastOneOverrideIsInvalid",",,,") ) /// This numeric literal requires that a module '%s' defining functions FromZero, FromOne, FromInt32, FromInt64 and FromString be in scope - /// (Originally from ../FSComp.txt:618) + /// (Originally from ..\FSComp.txt:619) static member tcNumericLiteralRequiresModule(a0 : System.String) = (784, GetStringFunc("tcNumericLiteralRequiresModule",",,,%s,,,") a0) /// Invalid record construction - /// (Originally from ../FSComp.txt:619) + /// (Originally from ..\FSComp.txt:620) static member tcInvalidRecordConstruction() = (785, GetStringFunc("tcInvalidRecordConstruction",",,,") ) /// The expression form { expr with ... } may only be used with record types. To build object types use { new Type(...) with ... } - /// (Originally from ../FSComp.txt:620) + /// (Originally from ..\FSComp.txt:621) static member tcExpressionFormRequiresRecordTypes() = (786, GetStringFunc("tcExpressionFormRequiresRecordTypes",",,,") ) /// The inherited type is not an object model type - /// (Originally from ../FSComp.txt:621) + /// (Originally from ..\FSComp.txt:622) static member tcInheritedTypeIsNotObjectModelType() = (787, GetStringFunc("tcInheritedTypeIsNotObjectModelType",",,,") ) /// Object construction expressions (i.e. record expressions with inheritance specifications) may only be used to implement constructors in object model types. Use 'new ObjectType(args)' to construct instances of object model types outside of constructors - /// (Originally from ../FSComp.txt:622) + /// (Originally from ..\FSComp.txt:623) static member tcObjectConstructionExpressionCanOnlyImplementConstructorsInObjectModelTypes() = (788, GetStringFunc("tcObjectConstructionExpressionCanOnlyImplementConstructorsInObjectModelTypes",",,,") ) /// '{ }' is not a valid expression. Records must include at least one field. Empty sequences are specified by using Seq.empty or an empty list '[]'. - /// (Originally from ../FSComp.txt:623) + /// (Originally from ..\FSComp.txt:624) static member tcEmptyRecordInvalid() = (789, GetStringFunc("tcEmptyRecordInvalid",",,,") ) /// This type is not a record type. Values of class and struct types must be created using calls to object constructors. - /// (Originally from ../FSComp.txt:624) + /// (Originally from ..\FSComp.txt:625) static member tcTypeIsNotARecordTypeNeedConstructor() = (790, GetStringFunc("tcTypeIsNotARecordTypeNeedConstructor",",,,") ) /// This type is not a record type - /// (Originally from ../FSComp.txt:625) + /// (Originally from ..\FSComp.txt:626) static member tcTypeIsNotARecordType() = (791, GetStringFunc("tcTypeIsNotARecordType",",,,") ) /// This construct is ambiguous as part of a computation expression. Nested expressions may be written using 'let _ = (...)' and nested computations using 'let! res = builder { ... }'. - /// (Originally from ../FSComp.txt:626) + /// (Originally from ..\FSComp.txt:627) static member tcConstructIsAmbiguousInComputationExpression() = (792, GetStringFunc("tcConstructIsAmbiguousInComputationExpression",",,,") ) /// This construct is ambiguous as part of a sequence expression. Nested expressions may be written using 'let _ = (...)' and nested sequences using 'yield! seq {... }'. - /// (Originally from ../FSComp.txt:627) + /// (Originally from ..\FSComp.txt:628) static member tcConstructIsAmbiguousInSequenceExpression() = (793, GetStringFunc("tcConstructIsAmbiguousInSequenceExpression",",,,") ) /// 'do!' cannot be used within sequence expressions - /// (Originally from ../FSComp.txt:628) + /// (Originally from ..\FSComp.txt:629) static member tcDoBangIllegalInSequenceExpression() = (794, GetStringFunc("tcDoBangIllegalInSequenceExpression",",,,") ) /// The use of 'let! x = coll' in sequence expressions is not permitted. Use 'for x in coll' instead. - /// (Originally from ../FSComp.txt:629) + /// (Originally from ..\FSComp.txt:630) static member tcUseForInSequenceExpression() = (795, GetStringFunc("tcUseForInSequenceExpression",",,,") ) /// 'try'/'with' cannot be used within sequence expressions - /// (Originally from ../FSComp.txt:630) + /// (Originally from ..\FSComp.txt:631) static member tcTryIllegalInSequenceExpression() = (796, GetStringFunc("tcTryIllegalInSequenceExpression",",,,") ) /// In sequence expressions, multiple results are generated using 'yield!' - /// (Originally from ../FSComp.txt:631) + /// (Originally from ..\FSComp.txt:632) static member tcUseYieldBangForMultipleResults() = (797, GetStringFunc("tcUseYieldBangForMultipleResults",",,,") ) /// Invalid assignment - /// (Originally from ../FSComp.txt:632) + /// (Originally from ..\FSComp.txt:633) static member tcInvalidAssignment() = (799, GetStringFunc("tcInvalidAssignment",",,,") ) /// Invalid use of a type name - /// (Originally from ../FSComp.txt:633) + /// (Originally from ..\FSComp.txt:634) static member tcInvalidUseOfTypeName() = (800, GetStringFunc("tcInvalidUseOfTypeName",",,,") ) /// This type has no accessible object constructors - /// (Originally from ../FSComp.txt:634) + /// (Originally from ..\FSComp.txt:635) static member tcTypeHasNoAccessibleConstructor() = (801, GetStringFunc("tcTypeHasNoAccessibleConstructor",",,,") ) /// Invalid use of an interface type - /// (Originally from ../FSComp.txt:637) + /// (Originally from ..\FSComp.txt:638) static member tcInvalidUseOfInterfaceType() = (804, GetStringFunc("tcInvalidUseOfInterfaceType",",,,") ) /// Invalid use of a delegate constructor. Use the syntax 'new Type(args)' or just 'Type(args)'. - /// (Originally from ../FSComp.txt:638) + /// (Originally from ..\FSComp.txt:639) static member tcInvalidUseOfDelegate() = (805, GetStringFunc("tcInvalidUseOfDelegate",",,,") ) /// Property '%s' is not static - /// (Originally from ../FSComp.txt:639) + /// (Originally from ..\FSComp.txt:640) static member tcPropertyIsNotStatic(a0 : System.String) = (806, GetStringFunc("tcPropertyIsNotStatic",",,,%s,,,") a0) /// Property '%s' is not readable - /// (Originally from ../FSComp.txt:640) + /// (Originally from ..\FSComp.txt:641) static member tcPropertyIsNotReadable(a0 : System.String) = (807, GetStringFunc("tcPropertyIsNotReadable",",,,%s,,,") a0) /// This lookup cannot be used here - /// (Originally from ../FSComp.txt:641) + /// (Originally from ..\FSComp.txt:642) static member tcLookupMayNotBeUsedHere() = (808, GetStringFunc("tcLookupMayNotBeUsedHere",",,,") ) /// Property '%s' is static - /// (Originally from ../FSComp.txt:642) + /// (Originally from ..\FSComp.txt:643) static member tcPropertyIsStatic(a0 : System.String) = (809, GetStringFunc("tcPropertyIsStatic",",,,%s,,,") a0) /// Property '%s' cannot be set - /// (Originally from ../FSComp.txt:643) + /// (Originally from ..\FSComp.txt:644) static member tcPropertyCannotBeSet1(a0 : System.String) = (810, GetStringFunc("tcPropertyCannotBeSet1",",,,%s,,,") a0) /// Constructors must be applied to arguments and cannot be used as first-class values. If necessary use an anonymous function '(fun arg1 ... argN -> new Type(arg1,...,argN))'. - /// (Originally from ../FSComp.txt:644) + /// (Originally from ..\FSComp.txt:645) static member tcConstructorsCannotBeFirstClassValues() = (811, GetStringFunc("tcConstructorsCannotBeFirstClassValues",",,,") ) /// The syntax 'expr.id' may only be used with record labels, properties and fields - /// (Originally from ../FSComp.txt:645) + /// (Originally from ..\FSComp.txt:646) static member tcSyntaxFormUsedOnlyWithRecordLabelsPropertiesAndFields() = (812, GetStringFunc("tcSyntaxFormUsedOnlyWithRecordLabelsPropertiesAndFields",",,,") ) /// Event '%s' is static - /// (Originally from ../FSComp.txt:646) + /// (Originally from ..\FSComp.txt:647) static member tcEventIsStatic(a0 : System.String) = (813, GetStringFunc("tcEventIsStatic",",,,%s,,,") a0) /// Event '%s' is not static - /// (Originally from ../FSComp.txt:647) + /// (Originally from ..\FSComp.txt:648) static member tcEventIsNotStatic(a0 : System.String) = (814, GetStringFunc("tcEventIsNotStatic",",,,%s,,,") a0) /// The named argument '%s' did not match any argument or mutable property - /// (Originally from ../FSComp.txt:648) + /// (Originally from ..\FSComp.txt:649) static member tcNamedArgumentDidNotMatch(a0 : System.String) = (815, GetStringFunc("tcNamedArgumentDidNotMatch",",,,%s,,,") a0) /// One or more of the overloads of this method has curried arguments. Consider redesigning these members to take arguments in tupled form. - /// (Originally from ../FSComp.txt:649) + /// (Originally from ..\FSComp.txt:650) static member tcOverloadsCannotHaveCurriedArguments() = (816, GetStringFunc("tcOverloadsCannotHaveCurriedArguments",",,,") ) /// The unnamed arguments do not form a prefix of the arguments of the method called - /// (Originally from ../FSComp.txt:650) + /// (Originally from ..\FSComp.txt:651) static member tcUnnamedArgumentsDoNotFormPrefix() = (GetStringFunc("tcUnnamedArgumentsDoNotFormPrefix",",,,") ) /// Static optimization conditionals are only for use within the F# library - /// (Originally from ../FSComp.txt:651) + /// (Originally from ..\FSComp.txt:652) static member tcStaticOptimizationConditionalsOnlyForFSharpLibrary() = (817, GetStringFunc("tcStaticOptimizationConditionalsOnlyForFSharpLibrary",",,,") ) /// The corresponding formal argument is not optional - /// (Originally from ../FSComp.txt:652) + /// (Originally from ..\FSComp.txt:653) static member tcFormalArgumentIsNotOptional() = (818, GetStringFunc("tcFormalArgumentIsNotOptional",",,,") ) /// Invalid optional assignment to a property or field - /// (Originally from ../FSComp.txt:653) + /// (Originally from ..\FSComp.txt:654) static member tcInvalidOptionalAssignmentToPropertyOrField() = (819, GetStringFunc("tcInvalidOptionalAssignmentToPropertyOrField",",,,") ) /// A delegate constructor must be passed a single function value - /// (Originally from ../FSComp.txt:654) + /// (Originally from ..\FSComp.txt:655) static member tcDelegateConstructorMustBePassed() = (820, GetStringFunc("tcDelegateConstructorMustBePassed",",,,") ) /// A binding cannot be marked both 'use' and 'rec' - /// (Originally from ../FSComp.txt:655) + /// (Originally from ..\FSComp.txt:656) static member tcBindingCannotBeUseAndRec() = (821, GetStringFunc("tcBindingCannotBeUseAndRec",",,,") ) /// The 'VolatileField' attribute may only be used on 'let' bindings in classes - /// (Originally from ../FSComp.txt:656) + /// (Originally from ..\FSComp.txt:657) static member tcVolatileOnlyOnClassLetBindings() = (823, GetStringFunc("tcVolatileOnlyOnClassLetBindings",",,,") ) /// Attributes are not permitted on 'let' bindings in expressions - /// (Originally from ../FSComp.txt:657) + /// (Originally from ..\FSComp.txt:658) static member tcAttributesAreNotPermittedOnLetBindings() = (824, GetStringFunc("tcAttributesAreNotPermittedOnLetBindings",",,,") ) /// The 'DefaultValue' attribute may only be used on 'val' declarations - /// (Originally from ../FSComp.txt:658) + /// (Originally from ..\FSComp.txt:659) static member tcDefaultValueAttributeRequiresVal() = (825, GetStringFunc("tcDefaultValueAttributeRequiresVal",",,,") ) /// The 'ConditionalAttribute' attribute may only be used on members - /// (Originally from ../FSComp.txt:659) + /// (Originally from ..\FSComp.txt:660) static member tcConditionalAttributeRequiresMembers() = (826, GetStringFunc("tcConditionalAttributeRequiresMembers",",,,") ) /// This is not a valid name for an active pattern - /// (Originally from ../FSComp.txt:660) + /// (Originally from ..\FSComp.txt:661) static member tcInvalidActivePatternName() = (827, GetStringFunc("tcInvalidActivePatternName",",,,") ) /// The 'EntryPointAttribute' attribute may only be used on function definitions in modules - /// (Originally from ../FSComp.txt:661) + /// (Originally from ..\FSComp.txt:662) static member tcEntryPointAttributeRequiresFunctionInModule() = (828, GetStringFunc("tcEntryPointAttributeRequiresFunctionInModule",",,,") ) /// Mutable values cannot be marked 'inline' - /// (Originally from ../FSComp.txt:662) + /// (Originally from ..\FSComp.txt:663) static member tcMutableValuesCannotBeInline() = (829, GetStringFunc("tcMutableValuesCannotBeInline",",,,") ) /// Mutable values cannot have generic parameters - /// (Originally from ../FSComp.txt:663) + /// (Originally from ..\FSComp.txt:664) static member tcMutableValuesMayNotHaveGenericParameters() = (830, GetStringFunc("tcMutableValuesMayNotHaveGenericParameters",",,,") ) /// Mutable function values should be written 'let mutable f = (fun args -> ...)' - /// (Originally from ../FSComp.txt:664) + /// (Originally from ..\FSComp.txt:665) static member tcMutableValuesSyntax() = (831, GetStringFunc("tcMutableValuesSyntax",",,,") ) /// Only functions may be marked 'inline' - /// (Originally from ../FSComp.txt:665) + /// (Originally from ..\FSComp.txt:666) static member tcOnlyFunctionsCanBeInline() = (832, GetStringFunc("tcOnlyFunctionsCanBeInline",",,,") ) /// A literal value cannot be given the [] or [] attributes - /// (Originally from ../FSComp.txt:666) + /// (Originally from ..\FSComp.txt:667) static member tcIllegalAttributesForLiteral() = (833, GetStringFunc("tcIllegalAttributesForLiteral",",,,") ) /// A literal value cannot be marked 'mutable' - /// (Originally from ../FSComp.txt:667) + /// (Originally from ..\FSComp.txt:668) static member tcLiteralCannotBeMutable() = (834, GetStringFunc("tcLiteralCannotBeMutable",",,,") ) /// A literal value cannot be marked 'inline' - /// (Originally from ../FSComp.txt:668) + /// (Originally from ..\FSComp.txt:669) static member tcLiteralCannotBeInline() = (835, GetStringFunc("tcLiteralCannotBeInline",",,,") ) /// Literal values cannot have generic parameters - /// (Originally from ../FSComp.txt:669) + /// (Originally from ..\FSComp.txt:670) static member tcLiteralCannotHaveGenericParameters() = (836, GetStringFunc("tcLiteralCannotHaveGenericParameters",",,,") ) /// This is not a valid constant expression - /// (Originally from ../FSComp.txt:670) + /// (Originally from ..\FSComp.txt:671) static member tcInvalidConstantExpression() = (837, GetStringFunc("tcInvalidConstantExpression",",,,") ) /// This type is not accessible from this code location - /// (Originally from ../FSComp.txt:671) + /// (Originally from ..\FSComp.txt:672) static member tcTypeIsInaccessible() = (838, GetStringFunc("tcTypeIsInaccessible",",,,") ) /// Unexpected condition in imported assembly: failed to decode AttributeUsage attribute - /// (Originally from ../FSComp.txt:672) + /// (Originally from ..\FSComp.txt:673) static member tcUnexpectedConditionInImportedAssembly() = (839, GetStringFunc("tcUnexpectedConditionInImportedAssembly",",,,") ) /// Unrecognized attribute target. Valid attribute targets are 'assembly', 'module', 'type', 'method', 'property', 'return', 'param', 'field', 'event', 'constructor'. - /// (Originally from ../FSComp.txt:673) + /// (Originally from ..\FSComp.txt:674) static member tcUnrecognizedAttributeTarget() = (840, GetStringFunc("tcUnrecognizedAttributeTarget",",,,") ) /// This attribute is not valid for use on this language element. Assembly attributes should be attached to a 'do ()' declaration, if necessary within an F# module. - /// (Originally from ../FSComp.txt:674) + /// (Originally from ..\FSComp.txt:675) static member tcAttributeIsNotValidForLanguageElementUseDo() = (841, GetStringFunc("tcAttributeIsNotValidForLanguageElementUseDo",",,,") ) /// This attribute is not valid for use on this language element - /// (Originally from ../FSComp.txt:675) + /// (Originally from ..\FSComp.txt:676) static member tcAttributeIsNotValidForLanguageElement() = (842, GetStringFunc("tcAttributeIsNotValidForLanguageElement",",,,") ) /// Optional arguments cannot be used in custom attributes - /// (Originally from ../FSComp.txt:676) + /// (Originally from ..\FSComp.txt:677) static member tcOptionalArgumentsCannotBeUsedInCustomAttribute() = (843, GetStringFunc("tcOptionalArgumentsCannotBeUsedInCustomAttribute",",,,") ) /// This property cannot be set - /// (Originally from ../FSComp.txt:677) + /// (Originally from ..\FSComp.txt:678) static member tcPropertyCannotBeSet0() = (844, GetStringFunc("tcPropertyCannotBeSet0",",,,") ) /// This property or field was not found on this custom attribute type - /// (Originally from ../FSComp.txt:678) + /// (Originally from ..\FSComp.txt:679) static member tcPropertyOrFieldNotFoundInAttribute() = (845, GetStringFunc("tcPropertyOrFieldNotFoundInAttribute",",,,") ) /// A custom attribute must be a reference type - /// (Originally from ../FSComp.txt:679) + /// (Originally from ..\FSComp.txt:680) static member tcCustomAttributeMustBeReferenceType() = (846, GetStringFunc("tcCustomAttributeMustBeReferenceType",",,,") ) /// The number of args for a custom attribute does not match the expected number of args for the attribute constructor - /// (Originally from ../FSComp.txt:680) + /// (Originally from ..\FSComp.txt:681) static member tcCustomAttributeArgumentMismatch() = (847, GetStringFunc("tcCustomAttributeArgumentMismatch",",,,") ) /// A custom attribute must invoke an object constructor - /// (Originally from ../FSComp.txt:681) + /// (Originally from ..\FSComp.txt:682) static member tcCustomAttributeMustInvokeConstructor() = (848, GetStringFunc("tcCustomAttributeMustInvokeConstructor",",,,") ) /// Attribute expressions must be calls to object constructors - /// (Originally from ../FSComp.txt:682) + /// (Originally from ..\FSComp.txt:683) static member tcAttributeExpressionsMustBeConstructorCalls() = (849, GetStringFunc("tcAttributeExpressionsMustBeConstructorCalls",",,,") ) /// This attribute cannot be used in this version of F# - /// (Originally from ../FSComp.txt:683) + /// (Originally from ..\FSComp.txt:684) static member tcUnsupportedAttribute() = (850, GetStringFunc("tcUnsupportedAttribute",",,,") ) /// Invalid inline specification - /// (Originally from ../FSComp.txt:684) + /// (Originally from ..\FSComp.txt:685) static member tcInvalidInlineSpecification() = (851, GetStringFunc("tcInvalidInlineSpecification",",,,") ) /// 'use' bindings must be of the form 'use = ' - /// (Originally from ../FSComp.txt:685) + /// (Originally from ..\FSComp.txt:686) static member tcInvalidUseBinding() = (852, GetStringFunc("tcInvalidUseBinding",",,,") ) /// Abstract members are not permitted in an augmentation - they must be defined as part of the type itself - /// (Originally from ../FSComp.txt:686) + /// (Originally from ..\FSComp.txt:687) static member tcAbstractMembersIllegalInAugmentation() = (853, GetStringFunc("tcAbstractMembersIllegalInAugmentation",",,,") ) /// Method overrides and interface implementations are not permitted here - /// (Originally from ../FSComp.txt:687) + /// (Originally from ..\FSComp.txt:688) static member tcMethodOverridesIllegalHere() = (854, GetStringFunc("tcMethodOverridesIllegalHere",",,,") ) /// No abstract or interface member was found that corresponds to this override - /// (Originally from ../FSComp.txt:688) + /// (Originally from ..\FSComp.txt:689) static member tcNoMemberFoundForOverride() = (855, GetStringFunc("tcNoMemberFoundForOverride",",,,") ) /// This override takes a different number of arguments to the corresponding abstract member. The following abstract members were found:%s - /// (Originally from ../FSComp.txt:689) + /// (Originally from ..\FSComp.txt:690) static member tcOverrideArityMismatch(a0 : System.String) = (856, GetStringFunc("tcOverrideArityMismatch",",,,%s,,,") a0) /// This method already has a default implementation - /// (Originally from ../FSComp.txt:690) + /// (Originally from ..\FSComp.txt:691) static member tcDefaultImplementationAlreadyExists() = (857, GetStringFunc("tcDefaultImplementationAlreadyExists",",,,") ) /// The method implemented by this default is ambiguous - /// (Originally from ../FSComp.txt:691) + /// (Originally from ..\FSComp.txt:692) static member tcDefaultAmbiguous() = (858, GetStringFunc("tcDefaultAmbiguous",",,,") ) /// No abstract property was found that corresponds to this override - /// (Originally from ../FSComp.txt:692) + /// (Originally from ..\FSComp.txt:693) static member tcNoPropertyFoundForOverride() = (859, GetStringFunc("tcNoPropertyFoundForOverride",",,,") ) /// This property overrides or implements an abstract property but the abstract property doesn't have a corresponding %s - /// (Originally from ../FSComp.txt:693) + /// (Originally from ..\FSComp.txt:694) static member tcAbstractPropertyMissingGetOrSet(a0 : System.String) = (860, GetStringFunc("tcAbstractPropertyMissingGetOrSet",",,,%s,,,") a0) /// Invalid signature for set member - /// (Originally from ../FSComp.txt:694) + /// (Originally from ..\FSComp.txt:695) static member tcInvalidSignatureForSet() = (861, GetStringFunc("tcInvalidSignatureForSet",",,,") ) /// This new member hides the abstract member '%s'. Rename the member or use 'override' instead. - /// (Originally from ../FSComp.txt:695) + /// (Originally from ..\FSComp.txt:696) static member tcNewMemberHidesAbstractMember(a0 : System.String) = (864, GetStringFunc("tcNewMemberHidesAbstractMember",",,,%s,,,") a0) /// This new member hides the abstract member '%s' once tuples, functions, units of measure and/or provided types are erased. Rename the member or use 'override' instead. - /// (Originally from ../FSComp.txt:696) + /// (Originally from ..\FSComp.txt:697) static member tcNewMemberHidesAbstractMemberWithSuffix(a0 : System.String) = (864, GetStringFunc("tcNewMemberHidesAbstractMemberWithSuffix",",,,%s,,,") a0) /// Interfaces cannot contain definitions of static initializers - /// (Originally from ../FSComp.txt:697) + /// (Originally from ..\FSComp.txt:698) static member tcStaticInitializersIllegalInInterface() = (865, GetStringFunc("tcStaticInitializersIllegalInInterface",",,,") ) /// Interfaces cannot contain definitions of object constructors - /// (Originally from ../FSComp.txt:698) + /// (Originally from ..\FSComp.txt:699) static member tcObjectConstructorsIllegalInInterface() = (866, GetStringFunc("tcObjectConstructorsIllegalInInterface",",,,") ) /// Interfaces cannot contain definitions of member overrides - /// (Originally from ../FSComp.txt:699) + /// (Originally from ..\FSComp.txt:700) static member tcMemberOverridesIllegalInInterface() = (867, GetStringFunc("tcMemberOverridesIllegalInInterface",",,,") ) /// Interfaces cannot contain definitions of concrete members. You may need to define a constructor on your type to indicate that the type is a class. - /// (Originally from ../FSComp.txt:700) + /// (Originally from ..\FSComp.txt:701) static member tcConcreteMembersIllegalInInterface() = (868, GetStringFunc("tcConcreteMembersIllegalInInterface",",,,") ) /// Constructors cannot be specified in exception augmentations - /// (Originally from ../FSComp.txt:701) + /// (Originally from ..\FSComp.txt:702) static member tcConstructorsDisallowedInExceptionAugmentation() = (869, GetStringFunc("tcConstructorsDisallowedInExceptionAugmentation",",,,") ) /// Structs cannot have an object constructor with no arguments. This is a restriction imposed on all CLI languages as structs automatically support a default constructor. - /// (Originally from ../FSComp.txt:702) + /// (Originally from ..\FSComp.txt:703) static member tcStructsCannotHaveConstructorWithNoArguments() = (870, GetStringFunc("tcStructsCannotHaveConstructorWithNoArguments",",,,") ) /// Constructors cannot be defined for this type - /// (Originally from ../FSComp.txt:703) + /// (Originally from ..\FSComp.txt:704) static member tcConstructorsIllegalForThisType() = (871, GetStringFunc("tcConstructorsIllegalForThisType",",,,") ) /// Recursive bindings that include member specifications can only occur as a direct augmentation of a type - /// (Originally from ../FSComp.txt:704) + /// (Originally from ..\FSComp.txt:705) static member tcRecursiveBindingsWithMembersMustBeDirectAugmentation() = (872, GetStringFunc("tcRecursiveBindingsWithMembersMustBeDirectAugmentation",",,,") ) /// Only simple variable patterns can be bound in 'let rec' constructs - /// (Originally from ../FSComp.txt:705) + /// (Originally from ..\FSComp.txt:706) static member tcOnlySimplePatternsInLetRec() = (873, GetStringFunc("tcOnlySimplePatternsInLetRec",",,,") ) /// Only record fields and simple, non-recursive 'let' bindings may be marked mutable - /// (Originally from ../FSComp.txt:706) + /// (Originally from ..\FSComp.txt:707) static member tcOnlyRecordFieldsAndSimpleLetCanBeMutable() = (874, GetStringFunc("tcOnlyRecordFieldsAndSimpleLetCanBeMutable",",,,") ) /// This member is not sufficiently generic - /// (Originally from ../FSComp.txt:707) + /// (Originally from ..\FSComp.txt:708) static member tcMemberIsNotSufficientlyGeneric() = (875, GetStringFunc("tcMemberIsNotSufficientlyGeneric",",,,") ) /// A declaration may only be the [] attribute if a constant value is also given, e.g. 'val x : int = 1' - /// (Originally from ../FSComp.txt:708) + /// (Originally from ..\FSComp.txt:709) static member tcLiteralAttributeRequiresConstantValue() = (876, GetStringFunc("tcLiteralAttributeRequiresConstantValue",",,,") ) /// A declaration may only be given a value in a signature if the declaration has the [] attribute - /// (Originally from ../FSComp.txt:709) + /// (Originally from ..\FSComp.txt:710) static member tcValueInSignatureRequiresLiteralAttribute() = (877, GetStringFunc("tcValueInSignatureRequiresLiteralAttribute",",,,") ) /// Thread-static and context-static variables must be static and given the [] attribute to indicate that the value is initialized to the default value on each new thread - /// (Originally from ../FSComp.txt:710) + /// (Originally from ..\FSComp.txt:711) static member tcThreadStaticAndContextStaticMustBeStatic() = (878, GetStringFunc("tcThreadStaticAndContextStaticMustBeStatic",",,,") ) /// Volatile fields must be marked 'mutable' and cannot be thread-static - /// (Originally from ../FSComp.txt:711) + /// (Originally from ..\FSComp.txt:712) static member tcVolatileFieldsMustBeMutable() = (879, GetStringFunc("tcVolatileFieldsMustBeMutable",",,,") ) /// Uninitialized 'val' fields must be mutable and marked with the '[]' attribute. Consider using a 'let' binding instead of a 'val' field. - /// (Originally from ../FSComp.txt:712) + /// (Originally from ..\FSComp.txt:713) static member tcUninitializedValFieldsMustBeMutable() = (880, GetStringFunc("tcUninitializedValFieldsMustBeMutable",",,,") ) /// Static 'val' fields in types must be mutable, private and marked with the '[]' attribute. They are initialized to the 'null' or 'zero' value for their type. Consider also using a 'static let mutable' binding in a class type. - /// (Originally from ../FSComp.txt:713) + /// (Originally from ..\FSComp.txt:714) static member tcStaticValFieldsMustBeMutableAndPrivate() = (881, GetStringFunc("tcStaticValFieldsMustBeMutableAndPrivate",",,,") ) /// This field requires a name - /// (Originally from ../FSComp.txt:714) + /// (Originally from ..\FSComp.txt:715) static member tcFieldRequiresName() = (882, GetStringFunc("tcFieldRequiresName",",,,") ) /// Invalid namespace, module, type or union case name - /// (Originally from ../FSComp.txt:715) + /// (Originally from ..\FSComp.txt:716) static member tcInvalidNamespaceModuleTypeUnionName() = (883, GetStringFunc("tcInvalidNamespaceModuleTypeUnionName",",,,") ) /// Explicit type declarations for constructors must be of the form 'ty1 * ... * tyN -> resTy'. Parentheses may be required around 'resTy' - /// (Originally from ../FSComp.txt:716) + /// (Originally from ..\FSComp.txt:717) static member tcIllegalFormForExplicitTypeDeclaration() = (884, GetStringFunc("tcIllegalFormForExplicitTypeDeclaration",",,,") ) /// Return types of union cases must be identical to the type being defined, up to abbreviations - /// (Originally from ../FSComp.txt:717) + /// (Originally from ..\FSComp.txt:718) static member tcReturnTypesForUnionMustBeSameAsType() = (885, GetStringFunc("tcReturnTypesForUnionMustBeSameAsType",",,,") ) /// This is not a valid value for an enumeration literal - /// (Originally from ../FSComp.txt:718) + /// (Originally from ..\FSComp.txt:719) static member tcInvalidEnumerationLiteral() = (886, GetStringFunc("tcInvalidEnumerationLiteral",",,,") ) /// The type '%s' is not an interface type - /// (Originally from ../FSComp.txt:719) + /// (Originally from ..\FSComp.txt:720) static member tcTypeIsNotInterfaceType1(a0 : System.String) = (887, GetStringFunc("tcTypeIsNotInterfaceType1",",,,%s,,,") a0) /// Duplicate specification of an interface - /// (Originally from ../FSComp.txt:720) + /// (Originally from ..\FSComp.txt:721) static member tcDuplicateSpecOfInterface() = (888, GetStringFunc("tcDuplicateSpecOfInterface",",,,") ) /// A field/val declaration is not permitted here - /// (Originally from ../FSComp.txt:721) + /// (Originally from ..\FSComp.txt:722) static member tcFieldValIllegalHere() = (889, GetStringFunc("tcFieldValIllegalHere",",,,") ) /// A inheritance declaration is not permitted here - /// (Originally from ../FSComp.txt:722) + /// (Originally from ..\FSComp.txt:723) static member tcInheritIllegalHere() = (890, GetStringFunc("tcInheritIllegalHere",",,,") ) /// This declaration opens the module '%s', which is marked as 'RequireQualifiedAccess'. Adjust your code to use qualified references to the elements of the module instead, e.g. 'List.map' instead of 'map'. This change will ensure that your code is robust as new constructs are added to libraries. - /// (Originally from ../FSComp.txt:723) + /// (Originally from ..\FSComp.txt:724) static member tcModuleRequiresQualifiedAccess(a0 : System.String) = (892, GetStringFunc("tcModuleRequiresQualifiedAccess",",,,%s,,,") a0) /// This declaration opens the namespace or module '%s' through a partially qualified path. Adjust this code to use the full path of the namespace. This change will make your code more robust as new constructs are added to the F# and CLI libraries. - /// (Originally from ../FSComp.txt:724) + /// (Originally from ..\FSComp.txt:725) static member tcOpenUsedWithPartiallyQualifiedPath(a0 : System.String) = (893, GetStringFunc("tcOpenUsedWithPartiallyQualifiedPath",",,,%s,,,") a0) /// Local class bindings cannot be marked inline. Consider lifting the definition out of the class or else do not mark it as inline. - /// (Originally from ../FSComp.txt:725) + /// (Originally from ..\FSComp.txt:726) static member tcLocalClassBindingsCannotBeInline() = (894, GetStringFunc("tcLocalClassBindingsCannotBeInline",",,,") ) /// Type abbreviations cannot have members - /// (Originally from ../FSComp.txt:726) + /// (Originally from ..\FSComp.txt:727) static member tcTypeAbbreviationsMayNotHaveMembers() = (895, GetStringFunc("tcTypeAbbreviationsMayNotHaveMembers",",,,") ) /// As of F# 4.1, the accessibility of type abbreviations is checked at compile-time. Consider changing the accessibility of the type abbreviation. Ignoring this warning might lead to runtime errors. - /// (Originally from ../FSComp.txt:727) + /// (Originally from ..\FSComp.txt:728) static member tcTypeAbbreviationsCheckedAtCompileTime() = (GetStringFunc("tcTypeAbbreviationsCheckedAtCompileTime",",,,") ) /// Enumerations cannot have members - /// (Originally from ../FSComp.txt:728) + /// (Originally from ..\FSComp.txt:729) static member tcEnumerationsMayNotHaveMembers() = (896, GetStringFunc("tcEnumerationsMayNotHaveMembers",",,,") ) /// Measure declarations may have only static members - /// (Originally from ../FSComp.txt:729) + /// (Originally from ..\FSComp.txt:730) static member tcMeasureDeclarationsRequireStaticMembers() = (897, GetStringFunc("tcMeasureDeclarationsRequireStaticMembers",",,,") ) /// Structs cannot contain 'do' bindings because the default constructor for structs would not execute these bindings - /// (Originally from ../FSComp.txt:730) + /// (Originally from ..\FSComp.txt:731) static member tcStructsMayNotContainDoBindings() = (GetStringFunc("tcStructsMayNotContainDoBindings",",,,") ) /// Structs cannot contain value definitions because the default constructor for structs will not execute these bindings. Consider adding additional arguments to the primary constructor for the type. - /// (Originally from ../FSComp.txt:731) + /// (Originally from ..\FSComp.txt:732) static member tcStructsMayNotContainLetBindings() = (901, GetStringFunc("tcStructsMayNotContainLetBindings",",,,") ) /// Static value definitions may only be used in types with a primary constructor. Consider adding arguments to the type definition, e.g. 'type X(args) = ...'. - /// (Originally from ../FSComp.txt:732) + /// (Originally from ..\FSComp.txt:733) static member tcStaticLetBindingsRequireClassesWithImplicitConstructors() = (902, GetStringFunc("tcStaticLetBindingsRequireClassesWithImplicitConstructors",",,,") ) /// Measure declarations may have only static members: constructors are not available - /// (Originally from ../FSComp.txt:733) + /// (Originally from ..\FSComp.txt:734) static member tcMeasureDeclarationsRequireStaticMembersNotConstructors() = (904, GetStringFunc("tcMeasureDeclarationsRequireStaticMembersNotConstructors",",,,") ) /// A member and a local class binding both have the name '%s' - /// (Originally from ../FSComp.txt:734) + /// (Originally from ..\FSComp.txt:735) static member tcMemberAndLocalClassBindingHaveSameName(a0 : System.String) = (905, GetStringFunc("tcMemberAndLocalClassBindingHaveSameName",",,,%s,,,") a0) /// Type abbreviations cannot have interface declarations - /// (Originally from ../FSComp.txt:735) + /// (Originally from ..\FSComp.txt:736) static member tcTypeAbbreviationsCannotHaveInterfaceDeclaration() = (906, GetStringFunc("tcTypeAbbreviationsCannotHaveInterfaceDeclaration",",,,") ) /// Enumerations cannot have interface declarations - /// (Originally from ../FSComp.txt:736) + /// (Originally from ..\FSComp.txt:737) static member tcEnumerationsCannotHaveInterfaceDeclaration() = (907, GetStringFunc("tcEnumerationsCannotHaveInterfaceDeclaration",",,,") ) /// This type is not an interface type - /// (Originally from ../FSComp.txt:737) + /// (Originally from ..\FSComp.txt:738) static member tcTypeIsNotInterfaceType0() = (908, GetStringFunc("tcTypeIsNotInterfaceType0",",,,") ) /// All implemented interfaces should be declared on the initial declaration of the type - /// (Originally from ../FSComp.txt:738) + /// (Originally from ..\FSComp.txt:739) static member tcAllImplementedInterfacesShouldBeDeclared() = (909, GetStringFunc("tcAllImplementedInterfacesShouldBeDeclared",",,,") ) /// A default implementation of this interface has already been added because the explicit implementation of the interface was not specified at the definition of the type - /// (Originally from ../FSComp.txt:739) + /// (Originally from ..\FSComp.txt:740) static member tcDefaultImplementationForInterfaceHasAlreadyBeenAdded() = (910, GetStringFunc("tcDefaultImplementationForInterfaceHasAlreadyBeenAdded",",,,") ) /// This member is not permitted in an interface implementation - /// (Originally from ../FSComp.txt:740) + /// (Originally from ..\FSComp.txt:741) static member tcMemberNotPermittedInInterfaceImplementation() = (911, GetStringFunc("tcMemberNotPermittedInInterfaceImplementation",",,,") ) /// This declaration element is not permitted in an augmentation - /// (Originally from ../FSComp.txt:741) + /// (Originally from ..\FSComp.txt:742) static member tcDeclarationElementNotPermittedInAugmentation() = (912, GetStringFunc("tcDeclarationElementNotPermittedInAugmentation",",,,") ) /// Types cannot contain nested type definitions - /// (Originally from ../FSComp.txt:742) + /// (Originally from ..\FSComp.txt:743) static member tcTypesCannotContainNestedTypes() = (913, GetStringFunc("tcTypesCannotContainNestedTypes",",,,") ) /// type, exception or module - /// (Originally from ../FSComp.txt:743) + /// (Originally from ..\FSComp.txt:744) static member tcTypeExceptionOrModule() = (GetStringFunc("tcTypeExceptionOrModule",",,,") ) /// type or module - /// (Originally from ../FSComp.txt:744) + /// (Originally from ..\FSComp.txt:745) static member tcTypeOrModule() = (GetStringFunc("tcTypeOrModule",",,,") ) /// The struct, record or union type '%s' implements the interface 'System.IStructuralEquatable' explicitly. Apply the 'CustomEquality' attribute to the type. - /// (Originally from ../FSComp.txt:745) + /// (Originally from ..\FSComp.txt:746) static member tcImplementsIStructuralEquatableExplicitly(a0 : System.String) = (914, GetStringFunc("tcImplementsIStructuralEquatableExplicitly",",,,%s,,,") a0) /// The struct, record or union type '%s' implements the interface 'System.IEquatable<_>' explicitly. Apply the 'CustomEquality' attribute to the type and provide a consistent implementation of the non-generic override 'System.Object.Equals(obj)'. - /// (Originally from ../FSComp.txt:746) + /// (Originally from ..\FSComp.txt:747) static member tcImplementsIEquatableExplicitly(a0 : System.String) = (915, GetStringFunc("tcImplementsIEquatableExplicitly",",,,%s,,,") a0) /// Explicit type specifications cannot be used for exception constructors - /// (Originally from ../FSComp.txt:747) + /// (Originally from ..\FSComp.txt:748) static member tcExplicitTypeSpecificationCannotBeUsedForExceptionConstructors() = (916, GetStringFunc("tcExplicitTypeSpecificationCannotBeUsedForExceptionConstructors",",,,") ) /// Exception abbreviations should not have argument lists - /// (Originally from ../FSComp.txt:748) + /// (Originally from ..\FSComp.txt:749) static member tcExceptionAbbreviationsShouldNotHaveArgumentList() = (917, GetStringFunc("tcExceptionAbbreviationsShouldNotHaveArgumentList",",,,") ) /// Abbreviations for Common IL exceptions cannot take arguments - /// (Originally from ../FSComp.txt:749) + /// (Originally from ..\FSComp.txt:750) static member tcAbbreviationsFordotNetExceptionsCannotTakeArguments() = (918, GetStringFunc("tcAbbreviationsFordotNetExceptionsCannotTakeArguments",",,,") ) /// Exception abbreviations must refer to existing exceptions or F# types deriving from System.Exception - /// (Originally from ../FSComp.txt:750) + /// (Originally from ..\FSComp.txt:751) static member tcExceptionAbbreviationsMustReferToValidExceptions() = (919, GetStringFunc("tcExceptionAbbreviationsMustReferToValidExceptions",",,,") ) /// Abbreviations for Common IL exception types must have a matching object constructor - /// (Originally from ../FSComp.txt:751) + /// (Originally from ..\FSComp.txt:752) static member tcAbbreviationsFordotNetExceptionsMustHaveMatchingObjectConstructor() = (920, GetStringFunc("tcAbbreviationsFordotNetExceptionsMustHaveMatchingObjectConstructor",",,,") ) /// Not an exception - /// (Originally from ../FSComp.txt:752) + /// (Originally from ..\FSComp.txt:753) static member tcNotAnException() = (921, GetStringFunc("tcNotAnException",",,,") ) /// Invalid module name - /// (Originally from ../FSComp.txt:754) + /// (Originally from ..\FSComp.txt:755) static member tcInvalidModuleName() = (924, GetStringFunc("tcInvalidModuleName",",,,") ) /// Invalid type extension - /// (Originally from ../FSComp.txt:755) + /// (Originally from ..\FSComp.txt:756) static member tcInvalidTypeExtension() = (925, GetStringFunc("tcInvalidTypeExtension",",,,") ) /// The attributes of this type specify multiple kinds for the type - /// (Originally from ../FSComp.txt:756) + /// (Originally from ..\FSComp.txt:757) static member tcAttributesOfTypeSpecifyMultipleKindsForType() = (926, GetStringFunc("tcAttributesOfTypeSpecifyMultipleKindsForType",",,,") ) /// The kind of the type specified by its attributes does not match the kind implied by its definition - /// (Originally from ../FSComp.txt:757) + /// (Originally from ..\FSComp.txt:758) static member tcKindOfTypeSpecifiedDoesNotMatchDefinition() = (927, GetStringFunc("tcKindOfTypeSpecifiedDoesNotMatchDefinition",",,,") ) /// Measure definitions cannot have type parameters - /// (Originally from ../FSComp.txt:758) + /// (Originally from ..\FSComp.txt:759) static member tcMeasureDefinitionsCannotHaveTypeParameters() = (928, GetStringFunc("tcMeasureDefinitionsCannotHaveTypeParameters",",,,") ) /// This type requires a definition - /// (Originally from ../FSComp.txt:759) + /// (Originally from ..\FSComp.txt:760) static member tcTypeRequiresDefinition() = (929, GetStringFunc("tcTypeRequiresDefinition",",,,") ) /// This type abbreviation has one or more declared type parameters that do not appear in the type being abbreviated. Type abbreviations must use all declared type parameters in the type being abbreviated. Consider removing one or more type parameters, or use a concrete type definition that wraps an underlying type, such as 'type C<'a> = C of ...'. - /// (Originally from ../FSComp.txt:760) + /// (Originally from ..\FSComp.txt:761) static member tcTypeAbbreviationHasTypeParametersMissingOnType() = (GetStringFunc("tcTypeAbbreviationHasTypeParametersMissingOnType",",,,") ) /// Structs, interfaces, enums and delegates cannot inherit from other types - /// (Originally from ../FSComp.txt:761) + /// (Originally from ..\FSComp.txt:762) static member tcStructsInterfacesEnumsDelegatesMayNotInheritFromOtherTypes() = (931, GetStringFunc("tcStructsInterfacesEnumsDelegatesMayNotInheritFromOtherTypes",",,,") ) /// Types cannot inherit from multiple concrete types - /// (Originally from ../FSComp.txt:762) + /// (Originally from ..\FSComp.txt:763) static member tcTypesCannotInheritFromMultipleConcreteTypes() = (932, GetStringFunc("tcTypesCannotInheritFromMultipleConcreteTypes",",,,") ) /// Records, union, abbreviations and struct types cannot have the 'AllowNullLiteral' attribute - /// (Originally from ../FSComp.txt:763) + /// (Originally from ..\FSComp.txt:764) static member tcRecordsUnionsAbbreviationsStructsMayNotHaveAllowNullLiteralAttribute() = (934, GetStringFunc("tcRecordsUnionsAbbreviationsStructsMayNotHaveAllowNullLiteralAttribute",",,,") ) /// Types with the 'AllowNullLiteral' attribute may only inherit from or implement types which also allow the use of the null literal - /// (Originally from ../FSComp.txt:764) + /// (Originally from ..\FSComp.txt:765) static member tcAllowNullTypesMayOnlyInheritFromAllowNullTypes() = (935, GetStringFunc("tcAllowNullTypesMayOnlyInheritFromAllowNullTypes",",,,") ) /// Generic types cannot be given the 'StructLayout' attribute - /// (Originally from ../FSComp.txt:765) + /// (Originally from ..\FSComp.txt:766) static member tcGenericTypesCannotHaveStructLayout() = (936, GetStringFunc("tcGenericTypesCannotHaveStructLayout",",,,") ) /// Only structs and classes without primary constructors may be given the 'StructLayout' attribute - /// (Originally from ../FSComp.txt:766) + /// (Originally from ..\FSComp.txt:767) static member tcOnlyStructsCanHaveStructLayout() = (937, GetStringFunc("tcOnlyStructsCanHaveStructLayout",",,,") ) /// The representation of this type is hidden by the signature. It must be given an attribute such as [], [] or [] to indicate the characteristics of the type. - /// (Originally from ../FSComp.txt:767) + /// (Originally from ..\FSComp.txt:768) static member tcRepresentationOfTypeHiddenBySignature() = (938, GetStringFunc("tcRepresentationOfTypeHiddenBySignature",",,,") ) /// Only classes may be given the 'AbstractClass' attribute - /// (Originally from ../FSComp.txt:768) + /// (Originally from ..\FSComp.txt:769) static member tcOnlyClassesCanHaveAbstract() = (939, GetStringFunc("tcOnlyClassesCanHaveAbstract",",,,") ) /// Only types representing units-of-measure may be given the 'Measure' attribute - /// (Originally from ../FSComp.txt:769) + /// (Originally from ..\FSComp.txt:770) static member tcOnlyTypesRepresentingUnitsOfMeasureCanHaveMeasure() = (940, GetStringFunc("tcOnlyTypesRepresentingUnitsOfMeasureCanHaveMeasure",",,,") ) /// Accessibility modifiers are not permitted on overrides or interface implementations - /// (Originally from ../FSComp.txt:770) + /// (Originally from ..\FSComp.txt:771) static member tcOverridesCannotHaveVisibilityDeclarations() = (941, GetStringFunc("tcOverridesCannotHaveVisibilityDeclarations",",,,") ) /// Discriminated union types are always sealed - /// (Originally from ../FSComp.txt:771) + /// (Originally from ..\FSComp.txt:772) static member tcTypesAreAlwaysSealedDU() = (942, GetStringFunc("tcTypesAreAlwaysSealedDU",",,,") ) /// Record types are always sealed - /// (Originally from ../FSComp.txt:772) + /// (Originally from ..\FSComp.txt:773) static member tcTypesAreAlwaysSealedRecord() = (942, GetStringFunc("tcTypesAreAlwaysSealedRecord",",,,") ) /// Assembly code types are always sealed - /// (Originally from ../FSComp.txt:773) + /// (Originally from ..\FSComp.txt:774) static member tcTypesAreAlwaysSealedAssemblyCode() = (942, GetStringFunc("tcTypesAreAlwaysSealedAssemblyCode",",,,") ) /// Struct types are always sealed - /// (Originally from ../FSComp.txt:774) + /// (Originally from ..\FSComp.txt:775) static member tcTypesAreAlwaysSealedStruct() = (942, GetStringFunc("tcTypesAreAlwaysSealedStruct",",,,") ) /// Delegate types are always sealed - /// (Originally from ../FSComp.txt:775) + /// (Originally from ..\FSComp.txt:776) static member tcTypesAreAlwaysSealedDelegate() = (942, GetStringFunc("tcTypesAreAlwaysSealedDelegate",",,,") ) /// Enum types are always sealed - /// (Originally from ../FSComp.txt:776) + /// (Originally from ..\FSComp.txt:777) static member tcTypesAreAlwaysSealedEnum() = (942, GetStringFunc("tcTypesAreAlwaysSealedEnum",",,,") ) /// Interface types and delegate types cannot contain fields - /// (Originally from ../FSComp.txt:777) + /// (Originally from ..\FSComp.txt:778) static member tcInterfaceTypesAndDelegatesCannotContainFields() = (943, GetStringFunc("tcInterfaceTypesAndDelegatesCannotContainFields",",,,") ) /// Abbreviated types cannot be given the 'Sealed' attribute - /// (Originally from ../FSComp.txt:778) + /// (Originally from ..\FSComp.txt:779) static member tcAbbreviatedTypesCannotBeSealed() = (944, GetStringFunc("tcAbbreviatedTypesCannotBeSealed",",,,") ) /// Cannot inherit a sealed type - /// (Originally from ../FSComp.txt:779) + /// (Originally from ..\FSComp.txt:780) static member tcCannotInheritFromSealedType() = (945, GetStringFunc("tcCannotInheritFromSealedType",",,,") ) /// Cannot inherit from interface type. Use interface ... with instead. - /// (Originally from ../FSComp.txt:780) + /// (Originally from ..\FSComp.txt:781) static member tcCannotInheritFromInterfaceType() = (946, GetStringFunc("tcCannotInheritFromInterfaceType",",,,") ) /// Struct types cannot contain abstract members - /// (Originally from ../FSComp.txt:781) + /// (Originally from ..\FSComp.txt:782) static member tcStructTypesCannotContainAbstractMembers() = (947, GetStringFunc("tcStructTypesCannotContainAbstractMembers",",,,") ) /// Interface types cannot be sealed - /// (Originally from ../FSComp.txt:782) + /// (Originally from ..\FSComp.txt:783) static member tcInterfaceTypesCannotBeSealed() = (948, GetStringFunc("tcInterfaceTypesCannotBeSealed",",,,") ) /// Delegate specifications must be of the form 'typ -> typ' - /// (Originally from ../FSComp.txt:783) + /// (Originally from ..\FSComp.txt:784) static member tcInvalidDelegateSpecification() = (949, GetStringFunc("tcInvalidDelegateSpecification",",,,") ) /// Delegate specifications must not be curried types. Use 'typ * ... * typ -> typ' for multi-argument delegates, and 'typ -> (typ -> typ)' for delegates returning function values. - /// (Originally from ../FSComp.txt:784) + /// (Originally from ..\FSComp.txt:785) static member tcDelegatesCannotBeCurried() = (950, GetStringFunc("tcDelegatesCannotBeCurried",",,,") ) /// Literal enumerations must have type int, uint, int16, uint16, int64, uint64, byte, sbyte or char - /// (Originally from ../FSComp.txt:785) + /// (Originally from ..\FSComp.txt:786) static member tcInvalidTypeForLiteralEnumeration() = (951, GetStringFunc("tcInvalidTypeForLiteralEnumeration",",,,") ) /// This type definition involves an immediate cyclic reference through an abbreviation - /// (Originally from ../FSComp.txt:787) + /// (Originally from ..\FSComp.txt:788) static member tcTypeDefinitionIsCyclic() = (953, GetStringFunc("tcTypeDefinitionIsCyclic",",,,") ) /// This type definition involves an immediate cyclic reference through a struct field or inheritance relation - /// (Originally from ../FSComp.txt:788) + /// (Originally from ..\FSComp.txt:789) static member tcTypeDefinitionIsCyclicThroughInheritance() = (954, GetStringFunc("tcTypeDefinitionIsCyclicThroughInheritance",",,,") ) /// The syntax 'type X with ...' is reserved for augmentations. Types whose representations are hidden but which have members are now declared in signatures using 'type X = ...'. You may also need to add the '[] attribute to the type definition in the signature - /// (Originally from ../FSComp.txt:789) + /// (Originally from ..\FSComp.txt:790) static member tcReservedSyntaxForAugmentation() = (GetStringFunc("tcReservedSyntaxForAugmentation",",,,") ) /// Members that extend interface, delegate or enum types must be placed in a module separate to the definition of the type. This module must either have the AutoOpen attribute or be opened explicitly by client code to bring the extension members into scope. - /// (Originally from ../FSComp.txt:790) + /// (Originally from ..\FSComp.txt:791) static member tcMembersThatExtendInterfaceMustBePlacedInSeparateModule() = (956, GetStringFunc("tcMembersThatExtendInterfaceMustBePlacedInSeparateModule",",,,") ) /// One or more of the declared type parameters for this type extension have a missing or wrong type constraint not matching the original type constraints on '%s' - /// (Originally from ../FSComp.txt:791) + /// (Originally from ..\FSComp.txt:792) static member tcDeclaredTypeParametersForExtensionDoNotMatchOriginal(a0 : System.String) = (957, GetStringFunc("tcDeclaredTypeParametersForExtensionDoNotMatchOriginal",",,,%s,,,") a0) /// Type definitions may only have one 'inherit' specification and it must be the first declaration - /// (Originally from ../FSComp.txt:792) + /// (Originally from ..\FSComp.txt:793) static member tcTypeDefinitionsWithImplicitConstructionMustHaveOneInherit() = (959, GetStringFunc("tcTypeDefinitionsWithImplicitConstructionMustHaveOneInherit",",,,") ) /// 'let' and 'do' bindings must come before member and interface definitions in type definitions - /// (Originally from ../FSComp.txt:793) + /// (Originally from ..\FSComp.txt:794) static member tcTypeDefinitionsWithImplicitConstructionMustHaveLocalBindingsBeforeMembers() = (960, GetStringFunc("tcTypeDefinitionsWithImplicitConstructionMustHaveLocalBindingsBeforeMembers",",,,") ) /// This 'inherit' declaration specifies the inherited type but no arguments. Consider supplying arguments, e.g. 'inherit BaseType(args)'. - /// (Originally from ../FSComp.txt:794) + /// (Originally from ..\FSComp.txt:795) static member tcInheritDeclarationMissingArguments() = (961, GetStringFunc("tcInheritDeclarationMissingArguments",",,,") ) /// This 'inherit' declaration has arguments, but is not in a type with a primary constructor. Consider adding arguments to your type definition, e.g. 'type X(args) = ...'. - /// (Originally from ../FSComp.txt:795) + /// (Originally from ..\FSComp.txt:796) static member tcInheritConstructionCallNotPartOfImplicitSequence() = (962, GetStringFunc("tcInheritConstructionCallNotPartOfImplicitSequence",",,,") ) /// This definition may only be used in a type with a primary constructor. Consider adding arguments to your type definition, e.g. 'type X(args) = ...'. - /// (Originally from ../FSComp.txt:796) + /// (Originally from ..\FSComp.txt:797) static member tcLetAndDoRequiresImplicitConstructionSequence() = (963, GetStringFunc("tcLetAndDoRequiresImplicitConstructionSequence",",,,") ) /// Type abbreviations cannot have augmentations - /// (Originally from ../FSComp.txt:797) + /// (Originally from ..\FSComp.txt:798) static member tcTypeAbbreviationsCannotHaveAugmentations() = (964, GetStringFunc("tcTypeAbbreviationsCannotHaveAugmentations",",,,") ) /// The path '%s' is a namespace. A module abbreviation may not abbreviate a namespace. - /// (Originally from ../FSComp.txt:798) + /// (Originally from ..\FSComp.txt:799) static member tcModuleAbbreviationForNamespace(a0 : System.String) = (965, GetStringFunc("tcModuleAbbreviationForNamespace",",,,%s,,,") a0) /// The type '%s' is used in an invalid way. A value prior to '%s' has an inferred type involving '%s', which is an invalid forward reference. - /// (Originally from ../FSComp.txt:799) + /// (Originally from ..\FSComp.txt:800) static member tcTypeUsedInInvalidWay(a0 : System.String, a1 : System.String, a2 : System.String) = (966, GetStringFunc("tcTypeUsedInInvalidWay",",,,%s,,,%s,,,%s,,,") a0 a1 a2) /// The member '%s' is used in an invalid way. A use of '%s' has been inferred prior to the definition of '%s', which is an invalid forward reference. - /// (Originally from ../FSComp.txt:800) + /// (Originally from ..\FSComp.txt:801) static member tcMemberUsedInInvalidWay(a0 : System.String, a1 : System.String, a2 : System.String) = (967, GetStringFunc("tcMemberUsedInInvalidWay",",,,%s,,,%s,,,%s,,,") a0 a1 a2) /// The attribute 'AutoOpen(\"%s\")' in the assembly '%s' did not refer to a valid module or namespace in that assembly and has been ignored - /// (Originally from ../FSComp.txt:803) + /// (Originally from ..\FSComp.txt:804) static member tcAttributeAutoOpenWasIgnored(a0 : System.String, a1 : System.String) = (970, GetStringFunc("tcAttributeAutoOpenWasIgnored",",,,%s,,,%s,,,") a0 a1) /// Undefined value '%s' - /// (Originally from ../FSComp.txt:804) + /// (Originally from ..\FSComp.txt:805) static member ilUndefinedValue(a0 : System.String) = (971, GetStringFunc("ilUndefinedValue",",,,%s,,,") a0) /// Label %s not found - /// (Originally from ../FSComp.txt:805) + /// (Originally from ..\FSComp.txt:806) static member ilLabelNotFound(a0 : System.String) = (972, GetStringFunc("ilLabelNotFound",",,,%s,,,") a0) /// Incorrect number of type arguments to local call - /// (Originally from ../FSComp.txt:806) + /// (Originally from ..\FSComp.txt:807) static member ilIncorrectNumberOfTypeArguments() = (973, GetStringFunc("ilIncorrectNumberOfTypeArguments",",,,") ) /// Dynamic invocation of %s is not supported - /// (Originally from ../FSComp.txt:807) + /// (Originally from ..\FSComp.txt:808) static member ilDynamicInvocationNotSupported(a0 : System.String) = (GetStringFunc("ilDynamicInvocationNotSupported",",,,%s,,,") a0) /// Taking the address of a literal field is invalid - /// (Originally from ../FSComp.txt:808) + /// (Originally from ..\FSComp.txt:809) static member ilAddressOfLiteralFieldIsInvalid() = (975, GetStringFunc("ilAddressOfLiteralFieldIsInvalid",",,,") ) /// This operation involves taking the address of a value '%s' represented using a local variable or other special representation. This is invalid. - /// (Originally from ../FSComp.txt:809) + /// (Originally from ..\FSComp.txt:810) static member ilAddressOfValueHereIsInvalid(a0 : System.String) = (976, GetStringFunc("ilAddressOfValueHereIsInvalid",",,,%s,,,") a0) /// Custom marshallers cannot be specified in F# code. Consider using a C# helper function. - /// (Originally from ../FSComp.txt:810) + /// (Originally from ..\FSComp.txt:811) static member ilCustomMarshallersCannotBeUsedInFSharp() = (980, GetStringFunc("ilCustomMarshallersCannotBeUsedInFSharp",",,,") ) /// The MarshalAs attribute could not be decoded - /// (Originally from ../FSComp.txt:811) + /// (Originally from ..\FSComp.txt:812) static member ilMarshalAsAttributeCannotBeDecoded() = (981, GetStringFunc("ilMarshalAsAttributeCannotBeDecoded",",,,") ) /// The signature for this external function contains type parameters. Constrain the argument and return types to indicate the types of the corresponding C function. - /// (Originally from ../FSComp.txt:812) + /// (Originally from ..\FSComp.txt:813) static member ilSignatureForExternalFunctionContainsTypeParameters() = (982, GetStringFunc("ilSignatureForExternalFunctionContainsTypeParameters",",,,") ) /// The DllImport attribute could not be decoded - /// (Originally from ../FSComp.txt:813) + /// (Originally from ..\FSComp.txt:814) static member ilDllImportAttributeCouldNotBeDecoded() = (983, GetStringFunc("ilDllImportAttributeCouldNotBeDecoded",",,,") ) /// Literal fields cannot be set - /// (Originally from ../FSComp.txt:814) + /// (Originally from ..\FSComp.txt:815) static member ilLiteralFieldsCannotBeSet() = (984, GetStringFunc("ilLiteralFieldsCannotBeSet",",,,") ) /// GenSetStorage: %s was represented as a static method but was not an appropriate lambda expression - /// (Originally from ../FSComp.txt:815) + /// (Originally from ..\FSComp.txt:816) static member ilStaticMethodIsNotLambda(a0 : System.String) = (985, GetStringFunc("ilStaticMethodIsNotLambda",",,,%s,,,") a0) /// Mutable variables cannot escape their method - /// (Originally from ../FSComp.txt:816) + /// (Originally from ..\FSComp.txt:817) static member ilMutableVariablesCannotEscapeMethod() = (986, GetStringFunc("ilMutableVariablesCannotEscapeMethod",",,,") ) /// Compiler error: unexpected unrealized value - /// (Originally from ../FSComp.txt:817) + /// (Originally from ..\FSComp.txt:818) static member ilUnexpectedUnrealizedValue() = (987, GetStringFunc("ilUnexpectedUnrealizedValue",",,,") ) /// Main module of program is empty: nothing will happen when it is run - /// (Originally from ../FSComp.txt:818) + /// (Originally from ..\FSComp.txt:819) static member ilMainModuleEmpty() = (988, GetStringFunc("ilMainModuleEmpty",",,,") ) /// This type cannot be used for a literal field - /// (Originally from ../FSComp.txt:819) + /// (Originally from ..\FSComp.txt:820) static member ilTypeCannotBeUsedForLiteralField() = (989, GetStringFunc("ilTypeCannotBeUsedForLiteralField",",,,") ) /// Unexpected GetSet annotation on a property - /// (Originally from ../FSComp.txt:820) + /// (Originally from ..\FSComp.txt:821) static member ilUnexpectedGetSetAnnotation() = (990, GetStringFunc("ilUnexpectedGetSetAnnotation",",,,") ) /// The FieldOffset attribute could not be decoded - /// (Originally from ../FSComp.txt:821) + /// (Originally from ..\FSComp.txt:822) static member ilFieldOffsetAttributeCouldNotBeDecoded() = (991, GetStringFunc("ilFieldOffsetAttributeCouldNotBeDecoded",",,,") ) /// The StructLayout attribute could not be decoded - /// (Originally from ../FSComp.txt:822) + /// (Originally from ..\FSComp.txt:823) static member ilStructLayoutAttributeCouldNotBeDecoded() = (992, GetStringFunc("ilStructLayoutAttributeCouldNotBeDecoded",",,,") ) /// The DefaultAugmentation attribute could not be decoded - /// (Originally from ../FSComp.txt:823) + /// (Originally from ..\FSComp.txt:824) static member ilDefaultAugmentationAttributeCouldNotBeDecoded() = (993, GetStringFunc("ilDefaultAugmentationAttributeCouldNotBeDecoded",",,,") ) /// Reflected definitions cannot contain uses of the prefix splice operator '%%' - /// (Originally from ../FSComp.txt:824) + /// (Originally from ..\FSComp.txt:825) static member ilReflectedDefinitionsCannotUseSliceOperator() = (994, GetStringFunc("ilReflectedDefinitionsCannotUseSliceOperator",",,,") ) /// Problem with codepage '%d': %s - /// (Originally from ../FSComp.txt:825) + /// (Originally from ..\FSComp.txt:826) static member optsProblemWithCodepage(a0 : System.Int32, a1 : System.String) = (1000, GetStringFunc("optsProblemWithCodepage",",,,%d,,,%s,,,") a0 a1) /// Copyright (c) Microsoft Corporation. All Rights Reserved. - /// (Originally from ../FSComp.txt:826) + /// (Originally from ..\FSComp.txt:827) static member optsCopyright() = (GetStringFunc("optsCopyright",",,,") ) /// Freely distributed under the MIT Open Source License. https://github.com/Microsoft/visualfsharp/blob/master/License.txt - /// (Originally from ../FSComp.txt:827) + /// (Originally from ..\FSComp.txt:828) static member optsCopyrightCommunity() = (GetStringFunc("optsCopyrightCommunity",",,,") ) /// Name of the output file (Short form: -o) - /// (Originally from ../FSComp.txt:828) + /// (Originally from ..\FSComp.txt:829) static member optsNameOfOutputFile() = (GetStringFunc("optsNameOfOutputFile",",,,") ) /// Build a console executable - /// (Originally from ../FSComp.txt:829) + /// (Originally from ..\FSComp.txt:830) static member optsBuildConsole() = (GetStringFunc("optsBuildConsole",",,,") ) /// Build a Windows executable - /// (Originally from ../FSComp.txt:830) + /// (Originally from ..\FSComp.txt:831) static member optsBuildWindows() = (GetStringFunc("optsBuildWindows",",,,") ) /// Build a library (Short form: -a) - /// (Originally from ../FSComp.txt:831) + /// (Originally from ..\FSComp.txt:832) static member optsBuildLibrary() = (GetStringFunc("optsBuildLibrary",",,,") ) /// Build a module that can be added to another assembly - /// (Originally from ../FSComp.txt:832) + /// (Originally from ..\FSComp.txt:833) static member optsBuildModule() = (GetStringFunc("optsBuildModule",",,,") ) /// Delay-sign the assembly using only the public portion of the strong name key - /// (Originally from ../FSComp.txt:833) + /// (Originally from ..\FSComp.txt:834) static member optsDelaySign() = (GetStringFunc("optsDelaySign",",,,") ) /// Public-sign the assembly using only the public portion of the strong name key, and mark the assembly as signed - /// (Originally from ../FSComp.txt:834) + /// (Originally from ..\FSComp.txt:835) static member optsPublicSign() = (GetStringFunc("optsPublicSign",",,,") ) /// Write the xmldoc of the assembly to the given file - /// (Originally from ../FSComp.txt:835) + /// (Originally from ..\FSComp.txt:836) static member optsWriteXml() = (GetStringFunc("optsWriteXml",",,,") ) /// Specify a strong name key file - /// (Originally from ../FSComp.txt:836) + /// (Originally from ..\FSComp.txt:837) static member optsStrongKeyFile() = (GetStringFunc("optsStrongKeyFile",",,,") ) /// Specify a strong name key container - /// (Originally from ../FSComp.txt:837) + /// (Originally from ..\FSComp.txt:838) static member optsStrongKeyContainer() = (GetStringFunc("optsStrongKeyContainer",",,,") ) /// Limit which platforms this code can run on: x86, Itanium, x64, anycpu32bitpreferred, or anycpu. The default is anycpu. - /// (Originally from ../FSComp.txt:838) + /// (Originally from ..\FSComp.txt:839) static member optsPlatform() = (GetStringFunc("optsPlatform",",,,") ) /// Only include optimization information essential for implementing inlined constructs. Inhibits cross-module inlining but improves binary compatibility. - /// (Originally from ../FSComp.txt:839) + /// (Originally from ..\FSComp.txt:840) static member optsNoOpt() = (GetStringFunc("optsNoOpt",",,,") ) /// Don't add a resource to the generated assembly containing F#-specific metadata - /// (Originally from ../FSComp.txt:840) + /// (Originally from ..\FSComp.txt:841) static member optsNoInterface() = (GetStringFunc("optsNoInterface",",,,") ) /// Print the inferred interface of the assembly to a file - /// (Originally from ../FSComp.txt:841) + /// (Originally from ..\FSComp.txt:842) static member optsSig() = (GetStringFunc("optsSig",",,,") ) /// Reference an assembly (Short form: -r) - /// (Originally from ../FSComp.txt:842) + /// (Originally from ..\FSComp.txt:843) static member optsReference() = (GetStringFunc("optsReference",",,,") ) /// Specify a Win32 resource file (.res) - /// (Originally from ../FSComp.txt:843) + /// (Originally from ..\FSComp.txt:844) static member optsWin32res() = (GetStringFunc("optsWin32res",",,,") ) /// Specify a Win32 manifest file - /// (Originally from ../FSComp.txt:844) + /// (Originally from ..\FSComp.txt:845) static member optsWin32manifest() = (GetStringFunc("optsWin32manifest",",,,") ) /// Do not include the default Win32 manifest - /// (Originally from ../FSComp.txt:845) + /// (Originally from ..\FSComp.txt:846) static member optsNowin32manifest() = (GetStringFunc("optsNowin32manifest",",,,") ) /// Embed all source files in the portable PDB file - /// (Originally from ../FSComp.txt:846) + /// (Originally from ..\FSComp.txt:847) static member optsEmbedAllSource() = (GetStringFunc("optsEmbedAllSource",",,,") ) /// Embed specific source files in the portable PDB file - /// (Originally from ../FSComp.txt:847) + /// (Originally from ..\FSComp.txt:848) static member optsEmbedSource() = (GetStringFunc("optsEmbedSource",",,,") ) /// Source link information file to embed in the portable PDB file - /// (Originally from ../FSComp.txt:848) + /// (Originally from ..\FSComp.txt:849) static member optsSourceLink() = (GetStringFunc("optsSourceLink",",,,") ) /// --embed switch only supported when emitting a Portable PDB (--debug:portable or --debug:embedded) - /// (Originally from ../FSComp.txt:849) + /// (Originally from ..\FSComp.txt:850) static member optsEmbeddedSourceRequirePortablePDBs() = (1501, GetStringFunc("optsEmbeddedSourceRequirePortablePDBs",",,,") ) /// --sourcelink switch only supported when emitting a Portable PDB (--debug:portable or --debug:embedded) - /// (Originally from ../FSComp.txt:850) + /// (Originally from ..\FSComp.txt:851) static member optsSourceLinkRequirePortablePDBs() = (1502, GetStringFunc("optsSourceLinkRequirePortablePDBs",",,,") ) /// Source file is too large to embed in a portable PDB - /// (Originally from ../FSComp.txt:851) + /// (Originally from ..\FSComp.txt:852) static member srcFileTooLarge() = (GetStringFunc("srcFileTooLarge",",,,") ) /// Embed the specified managed resource - /// (Originally from ../FSComp.txt:852) + /// (Originally from ..\FSComp.txt:853) static member optsResource() = (GetStringFunc("optsResource",",,,") ) /// Link the specified resource to this assembly where the resinfo format is [,[,public|private]] - /// (Originally from ../FSComp.txt:853) + /// (Originally from ..\FSComp.txt:854) static member optsLinkresource() = (GetStringFunc("optsLinkresource",",,,") ) /// Emit debug information (Short form: -g) - /// (Originally from ../FSComp.txt:854) + /// (Originally from ..\FSComp.txt:855) static member optsDebugPM() = (GetStringFunc("optsDebugPM",",,,") ) /// Specify debugging type: full, portable, embedded, pdbonly. ('%s' is the default if no debuggging type specified and enables attaching a debugger to a running program, 'portable' is a cross-platform format, 'embedded' is a cross-platform format embedded into the output file). - /// (Originally from ../FSComp.txt:855) + /// (Originally from ..\FSComp.txt:856) static member optsDebug(a0 : System.String) = (GetStringFunc("optsDebug",",,,%s,,,") a0) /// Enable optimizations (Short form: -O) - /// (Originally from ../FSComp.txt:856) + /// (Originally from ..\FSComp.txt:857) static member optsOptimize() = (GetStringFunc("optsOptimize",",,,") ) /// Enable or disable tailcalls - /// (Originally from ../FSComp.txt:857) + /// (Originally from ..\FSComp.txt:858) static member optsTailcalls() = (GetStringFunc("optsTailcalls",",,,") ) /// Produce a deterministic assembly (including module version GUID and timestamp) - /// (Originally from ../FSComp.txt:858) + /// (Originally from ..\FSComp.txt:859) static member optsDeterministic() = (GetStringFunc("optsDeterministic",",,,") ) /// Enable or disable cross-module optimizations - /// (Originally from ../FSComp.txt:859) + /// (Originally from ..\FSComp.txt:860) static member optsCrossoptimize() = (GetStringFunc("optsCrossoptimize",",,,") ) /// Report all warnings as errors - /// (Originally from ../FSComp.txt:860) + /// (Originally from ..\FSComp.txt:861) static member optsWarnaserrorPM() = (GetStringFunc("optsWarnaserrorPM",",,,") ) /// Report specific warnings as errors - /// (Originally from ../FSComp.txt:861) + /// (Originally from ..\FSComp.txt:862) static member optsWarnaserror() = (GetStringFunc("optsWarnaserror",",,,") ) /// Set a warning level (0-5) - /// (Originally from ../FSComp.txt:862) + /// (Originally from ..\FSComp.txt:863) static member optsWarn() = (GetStringFunc("optsWarn",",,,") ) /// Disable specific warning messages - /// (Originally from ../FSComp.txt:863) + /// (Originally from ..\FSComp.txt:864) static member optsNowarn() = (GetStringFunc("optsNowarn",",,,") ) /// Enable specific warnings that may be off by default - /// (Originally from ../FSComp.txt:864) + /// (Originally from ..\FSComp.txt:865) static member optsWarnOn() = (GetStringFunc("optsWarnOn",",,,") ) /// Generate overflow checks - /// (Originally from ../FSComp.txt:865) + /// (Originally from ..\FSComp.txt:866) static member optsChecked() = (GetStringFunc("optsChecked",",,,") ) /// Define conditional compilation symbols (Short form: -d) - /// (Originally from ../FSComp.txt:866) + /// (Originally from ..\FSComp.txt:867) static member optsDefine() = (GetStringFunc("optsDefine",",,,") ) /// Ignore ML compatibility warnings - /// (Originally from ../FSComp.txt:867) + /// (Originally from ..\FSComp.txt:868) static member optsMlcompatibility() = (GetStringFunc("optsMlcompatibility",",,,") ) /// Suppress compiler copyright message - /// (Originally from ../FSComp.txt:868) + /// (Originally from ..\FSComp.txt:869) static member optsNologo() = (GetStringFunc("optsNologo",",,,") ) /// Display this usage message (Short form: -?) - /// (Originally from ../FSComp.txt:869) + /// (Originally from ..\FSComp.txt:870) static member optsHelp() = (GetStringFunc("optsHelp",",,,") ) /// Read response file for more options - /// (Originally from ../FSComp.txt:870) + /// (Originally from ..\FSComp.txt:871) static member optsResponseFile() = (GetStringFunc("optsResponseFile",",,,") ) /// Specify the codepage used to read source files - /// (Originally from ../FSComp.txt:871) + /// (Originally from ..\FSComp.txt:872) static member optsCodepage() = (GetStringFunc("optsCodepage",",,,") ) /// Output messages in UTF-8 encoding - /// (Originally from ../FSComp.txt:872) + /// (Originally from ..\FSComp.txt:873) static member optsUtf8output() = (GetStringFunc("optsUtf8output",",,,") ) /// Output messages with fully qualified paths - /// (Originally from ../FSComp.txt:873) + /// (Originally from ..\FSComp.txt:874) static member optsFullpaths() = (GetStringFunc("optsFullpaths",",,,") ) /// Specify a directory for the include path which is used to resolve source files and assemblies (Short form: -I) - /// (Originally from ../FSComp.txt:874) + /// (Originally from ..\FSComp.txt:875) static member optsLib() = (GetStringFunc("optsLib",",,,") ) /// Base address for the library to be built - /// (Originally from ../FSComp.txt:875) + /// (Originally from ..\FSComp.txt:876) static member optsBaseaddress() = (GetStringFunc("optsBaseaddress",",,,") ) /// Do not reference the default CLI assemblies by default - /// (Originally from ../FSComp.txt:876) + /// (Originally from ..\FSComp.txt:877) static member optsNoframework() = (GetStringFunc("optsNoframework",",,,") ) /// Statically link the F# library and all referenced DLLs that depend on it into the assembly being generated - /// (Originally from ../FSComp.txt:877) + /// (Originally from ..\FSComp.txt:878) static member optsStandalone() = (GetStringFunc("optsStandalone",",,,") ) /// Statically link the given assembly and all referenced DLLs that depend on this assembly. Use an assembly name e.g. mylib, not a DLL name. - /// (Originally from ../FSComp.txt:878) + /// (Originally from ..\FSComp.txt:879) static member optsStaticlink() = (GetStringFunc("optsStaticlink",",,,") ) /// Use a resident background compilation service to improve compiler startup times. - /// (Originally from ../FSComp.txt:879) + /// (Originally from ..\FSComp.txt:880) static member optsResident() = (GetStringFunc("optsResident",",,,") ) /// Name the output debug file - /// (Originally from ../FSComp.txt:880) + /// (Originally from ..\FSComp.txt:881) static member optsPdb() = (GetStringFunc("optsPdb",",,,") ) /// Resolve assembly references using directory-based rules rather than MSBuild resolution - /// (Originally from ../FSComp.txt:881) + /// (Originally from ..\FSComp.txt:882) static member optsSimpleresolution() = (GetStringFunc("optsSimpleresolution",",,,") ) /// Unrecognized target '%s', expected 'exe', 'winexe', 'library' or 'module' - /// (Originally from ../FSComp.txt:882) + /// (Originally from ..\FSComp.txt:883) static member optsUnrecognizedTarget(a0 : System.String) = (1048, GetStringFunc("optsUnrecognizedTarget",",,,%s,,,") a0) /// Unrecognized debug type '%s', expected 'pdbonly' or 'full' - /// (Originally from ../FSComp.txt:883) + /// (Originally from ..\FSComp.txt:884) static member optsUnrecognizedDebugType(a0 : System.String) = (1049, GetStringFunc("optsUnrecognizedDebugType",",,,%s,,,") a0) /// Invalid warning level '%d' - /// (Originally from ../FSComp.txt:884) + /// (Originally from ..\FSComp.txt:885) static member optsInvalidWarningLevel(a0 : System.Int32) = (1050, GetStringFunc("optsInvalidWarningLevel",",,,%d,,,") a0) /// Short form of '%s' - /// (Originally from ../FSComp.txt:885) + /// (Originally from ..\FSComp.txt:886) static member optsShortFormOf(a0 : System.String) = (GetStringFunc("optsShortFormOf",",,,%s,,,") a0) /// The command-line option '--cliroot' has been deprecated. Use an explicit reference to a specific copy of mscorlib.dll instead. - /// (Originally from ../FSComp.txt:886) + /// (Originally from ..\FSComp.txt:887) static member optsClirootDeprecatedMsg() = (GetStringFunc("optsClirootDeprecatedMsg",",,,") ) /// Use to override where the compiler looks for mscorlib.dll and framework components - /// (Originally from ../FSComp.txt:887) + /// (Originally from ..\FSComp.txt:888) static member optsClirootDescription() = (GetStringFunc("optsClirootDescription",",,,") ) /// - OUTPUT FILES - - /// (Originally from ../FSComp.txt:888) + /// (Originally from ..\FSComp.txt:889) static member optsHelpBannerOutputFiles() = (GetStringFunc("optsHelpBannerOutputFiles",",,,") ) /// - INPUT FILES - - /// (Originally from ../FSComp.txt:889) + /// (Originally from ..\FSComp.txt:890) static member optsHelpBannerInputFiles() = (GetStringFunc("optsHelpBannerInputFiles",",,,") ) /// - RESOURCES - - /// (Originally from ../FSComp.txt:890) + /// (Originally from ..\FSComp.txt:891) static member optsHelpBannerResources() = (GetStringFunc("optsHelpBannerResources",",,,") ) /// - CODE GENERATION - - /// (Originally from ../FSComp.txt:891) + /// (Originally from ..\FSComp.txt:892) static member optsHelpBannerCodeGen() = (GetStringFunc("optsHelpBannerCodeGen",",,,") ) /// - ADVANCED - - /// (Originally from ../FSComp.txt:892) + /// (Originally from ..\FSComp.txt:893) static member optsHelpBannerAdvanced() = (GetStringFunc("optsHelpBannerAdvanced",",,,") ) /// - MISCELLANEOUS - - /// (Originally from ../FSComp.txt:893) + /// (Originally from ..\FSComp.txt:894) static member optsHelpBannerMisc() = (GetStringFunc("optsHelpBannerMisc",",,,") ) /// - LANGUAGE - - /// (Originally from ../FSComp.txt:894) + /// (Originally from ..\FSComp.txt:895) static member optsHelpBannerLanguage() = (GetStringFunc("optsHelpBannerLanguage",",,,") ) /// - ERRORS AND WARNINGS - - /// (Originally from ../FSComp.txt:895) + /// (Originally from ..\FSComp.txt:896) static member optsHelpBannerErrsAndWarns() = (GetStringFunc("optsHelpBannerErrsAndWarns",",,,") ) /// Unknown --test argument: '%s' - /// (Originally from ../FSComp.txt:896) + /// (Originally from ..\FSComp.txt:897) static member optsUnknownArgumentToTheTestSwitch(a0 : System.String) = (1063, GetStringFunc("optsUnknownArgumentToTheTestSwitch",",,,%s,,,") a0) /// Unrecognized platform '%s', valid values are 'x86', 'x64', 'Itanium', 'anycpu32bitpreferred', and 'anycpu' - /// (Originally from ../FSComp.txt:897) + /// (Originally from ..\FSComp.txt:898) static member optsUnknownPlatform(a0 : System.String) = (1064, GetStringFunc("optsUnknownPlatform",",,,%s,,,") a0) /// The command-line option '%s' is for test purposes only - /// (Originally from ../FSComp.txt:898) + /// (Originally from ..\FSComp.txt:899) static member optsInternalNoDescription(a0 : System.String) = (GetStringFunc("optsInternalNoDescription",",,,%s,,,") a0) /// The command-line option '%s' has been deprecated - /// (Originally from ../FSComp.txt:899) + /// (Originally from ..\FSComp.txt:900) static member optsDCLONoDescription(a0 : System.String) = (GetStringFunc("optsDCLONoDescription",",,,%s,,,") a0) /// The command-line option '%s' has been deprecated. Use '%s' instead. - /// (Originally from ../FSComp.txt:900) + /// (Originally from ..\FSComp.txt:901) static member optsDCLODeprecatedSuggestAlternative(a0 : System.String, a1 : System.String) = (GetStringFunc("optsDCLODeprecatedSuggestAlternative",",,,%s,,,%s,,,") a0 a1) /// The command-line option '%s' has been deprecated. HTML document generation is now part of the F# Power Pack, via the tool FsHtmlDoc.exe. - /// (Originally from ../FSComp.txt:901) + /// (Originally from ..\FSComp.txt:902) static member optsDCLOHtmlDoc(a0 : System.String) = (GetStringFunc("optsDCLOHtmlDoc",",,,%s,,,") a0) /// Output warning and error messages in color - /// (Originally from ../FSComp.txt:902) + /// (Originally from ..\FSComp.txt:903) static member optsConsoleColors() = (GetStringFunc("optsConsoleColors",",,,") ) /// Enable high-entropy ASLR - /// (Originally from ../FSComp.txt:903) + /// (Originally from ..\FSComp.txt:904) static member optsUseHighEntropyVA() = (GetStringFunc("optsUseHighEntropyVA",",,,") ) /// Specify subsystem version of this assembly - /// (Originally from ../FSComp.txt:904) + /// (Originally from ..\FSComp.txt:905) static member optsSubSystemVersion() = (GetStringFunc("optsSubSystemVersion",",,,") ) /// Specify target framework profile of this assembly. Valid values are mscorlib, netcore or netstandard. Default - mscorlib - /// (Originally from ../FSComp.txt:905) + /// (Originally from ..\FSComp.txt:906) static member optsTargetProfile() = (GetStringFunc("optsTargetProfile",",,,") ) /// Emit debug information in quotations - /// (Originally from ../FSComp.txt:906) + /// (Originally from ..\FSComp.txt:907) static member optsEmitDebugInfoInQuotations() = (GetStringFunc("optsEmitDebugInfoInQuotations",",,,") ) /// Specify the preferred output language culture name (e.g. es-ES, ja-JP) - /// (Originally from ../FSComp.txt:907) + /// (Originally from ..\FSComp.txt:908) static member optsPreferredUiLang() = (GetStringFunc("optsPreferredUiLang",",,,") ) /// Don't copy FSharp.Core.dll along the produced binaries - /// (Originally from ../FSComp.txt:908) + /// (Originally from ..\FSComp.txt:909) static member optsNoCopyFsharpCore() = (GetStringFunc("optsNoCopyFsharpCore",",,,") ) /// Invalid version '%s' for '--subsystemversion'. The version must be 4.00 or greater. - /// (Originally from ../FSComp.txt:909) + /// (Originally from ..\FSComp.txt:910) static member optsInvalidSubSystemVersion(a0 : System.String) = (1051, GetStringFunc("optsInvalidSubSystemVersion",",,,%s,,,") a0) /// Invalid value '%s' for '--targetprofile', valid values are 'mscorlib', 'netcore' or 'netstandard'. - /// (Originally from ../FSComp.txt:910) + /// (Originally from ..\FSComp.txt:911) static member optsInvalidTargetProfile(a0 : System.String) = (1052, GetStringFunc("optsInvalidTargetProfile",",,,%s,,,") a0) /// Full name - /// (Originally from ../FSComp.txt:911) + /// (Originally from ..\FSComp.txt:912) static member typeInfoFullName() = (GetStringFunc("typeInfoFullName",",,,") ) /// and %d other overloads - /// (Originally from ../FSComp.txt:915) + /// (Originally from ..\FSComp.txt:916) static member typeInfoOtherOverloads(a0 : System.Int32) = (GetStringFunc("typeInfoOtherOverloads",",,,%d,,,") a0) /// union case - /// (Originally from ../FSComp.txt:916) + /// (Originally from ..\FSComp.txt:917) static member typeInfoUnionCase() = (GetStringFunc("typeInfoUnionCase",",,,") ) /// active pattern result - /// (Originally from ../FSComp.txt:917) + /// (Originally from ..\FSComp.txt:918) static member typeInfoActivePatternResult() = (GetStringFunc("typeInfoActivePatternResult",",,,") ) /// active recognizer - /// (Originally from ../FSComp.txt:918) + /// (Originally from ..\FSComp.txt:919) static member typeInfoActiveRecognizer() = (GetStringFunc("typeInfoActiveRecognizer",",,,") ) /// field - /// (Originally from ../FSComp.txt:919) + /// (Originally from ..\FSComp.txt:920) static member typeInfoField() = (GetStringFunc("typeInfoField",",,,") ) /// event - /// (Originally from ../FSComp.txt:920) + /// (Originally from ..\FSComp.txt:921) static member typeInfoEvent() = (GetStringFunc("typeInfoEvent",",,,") ) /// property - /// (Originally from ../FSComp.txt:921) + /// (Originally from ..\FSComp.txt:922) static member typeInfoProperty() = (GetStringFunc("typeInfoProperty",",,,") ) /// extension - /// (Originally from ../FSComp.txt:922) + /// (Originally from ..\FSComp.txt:923) static member typeInfoExtension() = (GetStringFunc("typeInfoExtension",",,,") ) /// custom operation - /// (Originally from ../FSComp.txt:923) + /// (Originally from ..\FSComp.txt:924) static member typeInfoCustomOperation() = (GetStringFunc("typeInfoCustomOperation",",,,") ) /// argument - /// (Originally from ../FSComp.txt:924) + /// (Originally from ..\FSComp.txt:925) static member typeInfoArgument() = (GetStringFunc("typeInfoArgument",",,,") ) /// anonymous record field /// (Originally from ..\FSComp.txt:926) static member typeInfoAnonRecdField() = (GetStringFunc("typeInfoAnonRecdField",",,,") ) /// patvar - /// (Originally from ../FSComp.txt:925) + /// (Originally from ..\FSComp.txt:927) static member typeInfoPatternVariable() = (GetStringFunc("typeInfoPatternVariable",",,,") ) /// namespace - /// (Originally from ../FSComp.txt:926) + /// (Originally from ..\FSComp.txt:928) static member typeInfoNamespace() = (GetStringFunc("typeInfoNamespace",",,,") ) /// module - /// (Originally from ../FSComp.txt:927) + /// (Originally from ..\FSComp.txt:929) static member typeInfoModule() = (GetStringFunc("typeInfoModule",",,,") ) /// namespace/module - /// (Originally from ../FSComp.txt:928) + /// (Originally from ..\FSComp.txt:930) static member typeInfoNamespaceOrModule() = (GetStringFunc("typeInfoNamespaceOrModule",",,,") ) /// from %s - /// (Originally from ../FSComp.txt:929) + /// (Originally from ..\FSComp.txt:931) static member typeInfoFromFirst(a0 : System.String) = (GetStringFunc("typeInfoFromFirst",",,,%s,,,") a0) /// also from %s - /// (Originally from ../FSComp.txt:930) + /// (Originally from ..\FSComp.txt:932) static member typeInfoFromNext(a0 : System.String) = (GetStringFunc("typeInfoFromNext",",,,%s,,,") a0) /// generated property - /// (Originally from ../FSComp.txt:931) + /// (Originally from ..\FSComp.txt:933) static member typeInfoGeneratedProperty() = (GetStringFunc("typeInfoGeneratedProperty",",,,") ) /// generated type - /// (Originally from ../FSComp.txt:932) + /// (Originally from ..\FSComp.txt:934) static member typeInfoGeneratedType() = (GetStringFunc("typeInfoGeneratedType",",,,") ) /// Found by AssemblyFolders registry key - /// (Originally from ../FSComp.txt:933) + /// (Originally from ..\FSComp.txt:935) static member assemblyResolutionFoundByAssemblyFoldersKey() = (GetStringFunc("assemblyResolutionFoundByAssemblyFoldersKey",",,,") ) /// Found by AssemblyFoldersEx registry key - /// (Originally from ../FSComp.txt:934) + /// (Originally from ..\FSComp.txt:936) static member assemblyResolutionFoundByAssemblyFoldersExKey() = (GetStringFunc("assemblyResolutionFoundByAssemblyFoldersExKey",",,,") ) /// .NET Framework - /// (Originally from ../FSComp.txt:935) + /// (Originally from ..\FSComp.txt:937) static member assemblyResolutionNetFramework() = (GetStringFunc("assemblyResolutionNetFramework",",,,") ) /// Global Assembly Cache - /// (Originally from ../FSComp.txt:936) + /// (Originally from ..\FSComp.txt:938) static member assemblyResolutionGAC() = (GetStringFunc("assemblyResolutionGAC",",,,") ) /// Recursive class hierarchy in type '%s' - /// (Originally from ../FSComp.txt:937) + /// (Originally from ..\FSComp.txt:939) static member recursiveClassHierarchy(a0 : System.String) = (1089, GetStringFunc("recursiveClassHierarchy",",,,%s,,,") a0) /// Invalid recursive reference to an abstract slot - /// (Originally from ../FSComp.txt:938) + /// (Originally from ..\FSComp.txt:940) static member InvalidRecursiveReferenceToAbstractSlot() = (1090, GetStringFunc("InvalidRecursiveReferenceToAbstractSlot",",,,") ) /// The event '%s' has a non-standard type. If this event is declared in another CLI language, you may need to access this event using the explicit %s and %s methods for the event. If this event is declared in F#, make the type of the event an instantiation of either 'IDelegateEvent<_>' or 'IEvent<_,_>'. - /// (Originally from ../FSComp.txt:939) + /// (Originally from ..\FSComp.txt:941) static member eventHasNonStandardType(a0 : System.String, a1 : System.String, a2 : System.String) = (1091, GetStringFunc("eventHasNonStandardType",",,,%s,,,%s,,,%s,,,") a0 a1 a2) /// The type '%s' is not accessible from this code location - /// (Originally from ../FSComp.txt:940) + /// (Originally from ..\FSComp.txt:942) static member typeIsNotAccessible(a0 : System.String) = (1092, GetStringFunc("typeIsNotAccessible",",,,%s,,,") a0) /// The union cases or fields of the type '%s' are not accessible from this code location - /// (Originally from ../FSComp.txt:941) + /// (Originally from ..\FSComp.txt:943) static member unionCasesAreNotAccessible(a0 : System.String) = (1093, GetStringFunc("unionCasesAreNotAccessible",",,,%s,,,") a0) /// The value '%s' is not accessible from this code location - /// (Originally from ../FSComp.txt:942) + /// (Originally from ..\FSComp.txt:944) static member valueIsNotAccessible(a0 : System.String) = (1094, GetStringFunc("valueIsNotAccessible",",,,%s,,,") a0) /// The union case '%s' is not accessible from this code location - /// (Originally from ../FSComp.txt:943) + /// (Originally from ..\FSComp.txt:945) static member unionCaseIsNotAccessible(a0 : System.String) = (1095, GetStringFunc("unionCaseIsNotAccessible",",,,%s,,,") a0) /// The record, struct or class field '%s' is not accessible from this code location - /// (Originally from ../FSComp.txt:944) + /// (Originally from ..\FSComp.txt:946) static member fieldIsNotAccessible(a0 : System.String) = (1096, GetStringFunc("fieldIsNotAccessible",",,,%s,,,") a0) /// The struct or class field '%s' is not accessible from this code location - /// (Originally from ../FSComp.txt:945) + /// (Originally from ..\FSComp.txt:947) static member structOrClassFieldIsNotAccessible(a0 : System.String) = (1097, GetStringFunc("structOrClassFieldIsNotAccessible",",,,%s,,,") a0) /// This construct is experimental - /// (Originally from ../FSComp.txt:946) + /// (Originally from ..\FSComp.txt:948) static member experimentalConstruct() = (GetStringFunc("experimentalConstruct",",,,") ) /// No Invoke methods found for delegate type - /// (Originally from ../FSComp.txt:947) + /// (Originally from ..\FSComp.txt:949) static member noInvokeMethodsFound() = (1099, GetStringFunc("noInvokeMethodsFound",",,,") ) /// More than one Invoke method found for delegate type - /// (Originally from ../FSComp.txt:948) + /// (Originally from ..\FSComp.txt:950) static member moreThanOneInvokeMethodFound() = (GetStringFunc("moreThanOneInvokeMethodFound",",,,") ) /// Delegates are not allowed to have curried signatures - /// (Originally from ../FSComp.txt:949) + /// (Originally from ..\FSComp.txt:951) static member delegatesNotAllowedToHaveCurriedSignatures() = (1101, GetStringFunc("delegatesNotAllowedToHaveCurriedSignatures",",,,") ) /// Unexpected Expr.TyChoose - /// (Originally from ../FSComp.txt:950) + /// (Originally from ..\FSComp.txt:952) static member tlrUnexpectedTExpr() = (1102, GetStringFunc("tlrUnexpectedTExpr",",,,") ) /// Note: Lambda-lifting optimizations have not been applied because of the use of this local constrained generic function as a first class value. Adding type constraints may resolve this condition. - /// (Originally from ../FSComp.txt:951) + /// (Originally from ..\FSComp.txt:953) static member tlrLambdaLiftingOptimizationsNotApplied() = (1103, GetStringFunc("tlrLambdaLiftingOptimizationsNotApplied",",,,") ) /// Identifiers containing '@' are reserved for use in F# code generation - /// (Originally from ../FSComp.txt:952) + /// (Originally from ..\FSComp.txt:954) static member lexhlpIdentifiersContainingAtSymbolReserved() = (1104, GetStringFunc("lexhlpIdentifiersContainingAtSymbolReserved",",,,") ) /// The identifier '%s' is reserved for future use by F# - /// (Originally from ../FSComp.txt:953) + /// (Originally from ..\FSComp.txt:955) static member lexhlpIdentifierReserved(a0 : System.String) = (GetStringFunc("lexhlpIdentifierReserved",",,,%s,,,") a0) /// Missing variable '%s' - /// (Originally from ../FSComp.txt:954) + /// (Originally from ..\FSComp.txt:956) static member patcMissingVariable(a0 : System.String) = (1106, GetStringFunc("patcMissingVariable",",,,%s,,,") a0) /// Partial active patterns may only generate one result - /// (Originally from ../FSComp.txt:955) + /// (Originally from ..\FSComp.txt:957) static member patcPartialActivePatternsGenerateOneResult() = (1107, GetStringFunc("patcPartialActivePatternsGenerateOneResult",",,,") ) /// The type '%s' is required here and is unavailable. You must add a reference to assembly '%s'. - /// (Originally from ../FSComp.txt:956) + /// (Originally from ..\FSComp.txt:958) static member impTypeRequiredUnavailable(a0 : System.String, a1 : System.String) = (1108, GetStringFunc("impTypeRequiredUnavailable",",,,%s,,,%s,,,") a0 a1) /// A reference to the type '%s' in assembly '%s' was found, but the type could not be found in that assembly - /// (Originally from ../FSComp.txt:957) + /// (Originally from ..\FSComp.txt:959) static member impReferencedTypeCouldNotBeFoundInAssembly(a0 : System.String, a1 : System.String) = (1109, GetStringFunc("impReferencedTypeCouldNotBeFoundInAssembly",",,,%s,,,%s,,,") a0 a1) /// Internal error or badly formed metadata: not enough type parameters were in scope while importing - /// (Originally from ../FSComp.txt:958) + /// (Originally from ..\FSComp.txt:960) static member impNotEnoughTypeParamsInScopeWhileImporting() = (1110, GetStringFunc("impNotEnoughTypeParamsInScopeWhileImporting",",,,") ) /// A reference to the DLL %s is required by assembly %s. The imported type %s is located in the first assembly and could not be resolved. - /// (Originally from ../FSComp.txt:959) + /// (Originally from ..\FSComp.txt:961) static member impReferenceToDllRequiredByAssembly(a0 : System.String, a1 : System.String, a2 : System.String) = (1111, GetStringFunc("impReferenceToDllRequiredByAssembly",",,,%s,,,%s,,,%s,,,") a0 a1 a2) /// An imported assembly uses the type '%s' but that type is not public - /// (Originally from ../FSComp.txt:960) + /// (Originally from ..\FSComp.txt:962) static member impImportedAssemblyUsesNotPublicType(a0 : System.String) = (1112, GetStringFunc("impImportedAssemblyUsesNotPublicType",",,,%s,,,") a0) /// The value '%s' was marked inline but its implementation makes use of an internal or private function which is not sufficiently accessible - /// (Originally from ../FSComp.txt:961) + /// (Originally from ..\FSComp.txt:963) static member optValueMarkedInlineButIncomplete(a0 : System.String) = (1113, GetStringFunc("optValueMarkedInlineButIncomplete",",,,%s,,,") a0) /// The value '%s' was marked inline but was not bound in the optimization environment - /// (Originally from ../FSComp.txt:962) + /// (Originally from ..\FSComp.txt:964) static member optValueMarkedInlineButWasNotBoundInTheOptEnv(a0 : System.String) = (1114, GetStringFunc("optValueMarkedInlineButWasNotBoundInTheOptEnv",",,,%s,,,") a0) /// Local value %s not found during optimization - /// (Originally from ../FSComp.txt:963) + /// (Originally from ..\FSComp.txt:965) static member optLocalValueNotFoundDuringOptimization(a0 : System.String) = (1115, GetStringFunc("optLocalValueNotFoundDuringOptimization",",,,%s,,,") a0) /// A value marked as 'inline' has an unexpected value - /// (Originally from ../FSComp.txt:964) + /// (Originally from ..\FSComp.txt:966) static member optValueMarkedInlineHasUnexpectedValue() = (1116, GetStringFunc("optValueMarkedInlineHasUnexpectedValue",",,,") ) /// A value marked as 'inline' could not be inlined - /// (Originally from ../FSComp.txt:965) + /// (Originally from ..\FSComp.txt:967) static member optValueMarkedInlineCouldNotBeInlined() = (1117, GetStringFunc("optValueMarkedInlineCouldNotBeInlined",",,,") ) /// Failed to inline the value '%s' marked 'inline', perhaps because a recursive value was marked 'inline' - /// (Originally from ../FSComp.txt:966) + /// (Originally from ..\FSComp.txt:968) static member optFailedToInlineValue(a0 : System.String) = (1118, GetStringFunc("optFailedToInlineValue",",,,%s,,,") a0) /// Recursive ValValue %s - /// (Originally from ../FSComp.txt:967) + /// (Originally from ..\FSComp.txt:969) static member optRecursiveValValue(a0 : System.String) = (1119, GetStringFunc("optRecursiveValValue",",,,%s,,,") a0) /// The indentation of this 'in' token is incorrect with respect to the corresponding 'let' - /// (Originally from ../FSComp.txt:968) + /// (Originally from ..\FSComp.txt:970) static member lexfltIncorrentIndentationOfIn() = (GetStringFunc("lexfltIncorrentIndentationOfIn",",,,") ) /// Possible incorrect indentation: this token is offside of context started at position %s. Try indenting this token further or using standard formatting conventions. - /// (Originally from ../FSComp.txt:969) + /// (Originally from ..\FSComp.txt:971) static member lexfltTokenIsOffsideOfContextStartedEarlier(a0 : System.String) = (GetStringFunc("lexfltTokenIsOffsideOfContextStartedEarlier",",,,%s,,,") a0) /// The '|' tokens separating rules of this pattern match are misaligned by one column. Consider realigning your code or using further indentation. - /// (Originally from ../FSComp.txt:970) + /// (Originally from ..\FSComp.txt:972) static member lexfltSeparatorTokensOfPatternMatchMisaligned() = (GetStringFunc("lexfltSeparatorTokensOfPatternMatchMisaligned",",,,") ) /// Invalid module/expression/type - /// (Originally from ../FSComp.txt:971) + /// (Originally from ..\FSComp.txt:973) static member nrInvalidModuleExprType() = (1123, GetStringFunc("nrInvalidModuleExprType",",,,") ) /// Multiple types exist called '%s', taking different numbers of generic parameters. Provide a type instantiation to disambiguate the type resolution, e.g. '%s'. - /// (Originally from ../FSComp.txt:972) + /// (Originally from ..\FSComp.txt:974) static member nrTypeInstantiationNeededToDisambiguateTypesWithSameName(a0 : System.String, a1 : System.String) = (1124, GetStringFunc("nrTypeInstantiationNeededToDisambiguateTypesWithSameName",",,,%s,,,%s,,,") a0 a1) /// The instantiation of the generic type '%s' is missing and can't be inferred from the arguments or return type of this member. Consider providing a type instantiation when accessing this type, e.g. '%s'. - /// (Originally from ../FSComp.txt:973) + /// (Originally from ..\FSComp.txt:975) static member nrTypeInstantiationIsMissingAndCouldNotBeInferred(a0 : System.String, a1 : System.String) = (1125, GetStringFunc("nrTypeInstantiationIsMissingAndCouldNotBeInferred",",,,%s,,,%s,,,") a0 a1) /// 'global' may only be used as the first name in a qualified path - /// (Originally from ../FSComp.txt:974) + /// (Originally from ..\FSComp.txt:976) static member nrGlobalUsedOnlyAsFirstName() = (1126, GetStringFunc("nrGlobalUsedOnlyAsFirstName",",,,") ) /// This is not a constructor or literal, or a constructor is being used incorrectly - /// (Originally from ../FSComp.txt:975) + /// (Originally from ..\FSComp.txt:977) static member nrIsNotConstructorOrLiteral() = (1127, GetStringFunc("nrIsNotConstructorOrLiteral",",,,") ) /// Unexpected empty long identifier - /// (Originally from ../FSComp.txt:976) + /// (Originally from ..\FSComp.txt:978) static member nrUnexpectedEmptyLongId() = (1128, GetStringFunc("nrUnexpectedEmptyLongId",",,,") ) /// The record type '%s' does not contain a label '%s'. - /// (Originally from ../FSComp.txt:977) + /// (Originally from ..\FSComp.txt:979) static member nrRecordDoesNotContainSuchLabel(a0 : System.String, a1 : System.String) = (1129, GetStringFunc("nrRecordDoesNotContainSuchLabel",",,,%s,,,%s,,,") a0 a1) /// Invalid field label - /// (Originally from ../FSComp.txt:978) + /// (Originally from ..\FSComp.txt:980) static member nrInvalidFieldLabel() = (1130, GetStringFunc("nrInvalidFieldLabel",",,,") ) /// Invalid expression '%s' - /// (Originally from ../FSComp.txt:979) + /// (Originally from ..\FSComp.txt:981) static member nrInvalidExpression(a0 : System.String) = (1132, GetStringFunc("nrInvalidExpression",",,,%s,,,") a0) /// No constructors are available for the type '%s' - /// (Originally from ../FSComp.txt:980) + /// (Originally from ..\FSComp.txt:982) static member nrNoConstructorsAvailableForType(a0 : System.String) = (1133, GetStringFunc("nrNoConstructorsAvailableForType",",,,%s,,,") a0) /// The union type for union case '%s' was defined with the RequireQualifiedAccessAttribute. Include the name of the union type ('%s') in the name you are using. - /// (Originally from ../FSComp.txt:981) + /// (Originally from ..\FSComp.txt:983) static member nrUnionTypeNeedsQualifiedAccess(a0 : System.String, a1 : System.String) = (1134, GetStringFunc("nrUnionTypeNeedsQualifiedAccess",",,,%s,,,%s,,,") a0 a1) /// The record type for the record field '%s' was defined with the RequireQualifiedAccessAttribute. Include the name of the record type ('%s') in the name you are using. - /// (Originally from ../FSComp.txt:982) + /// (Originally from ..\FSComp.txt:984) static member nrRecordTypeNeedsQualifiedAccess(a0 : System.String, a1 : System.String) = (1135, GetStringFunc("nrRecordTypeNeedsQualifiedAccess",",,,%s,,,%s,,,") a0 a1) /// Unexpected error creating debug information file '%s' - /// (Originally from ../FSComp.txt:983) + /// (Originally from ..\FSComp.txt:985) static member ilwriteErrorCreatingPdb(a0 : System.String) = (1136, GetStringFunc("ilwriteErrorCreatingPdb",",,,%s,,,") a0) /// This number is outside the allowable range for this integer type - /// (Originally from ../FSComp.txt:984) + /// (Originally from ..\FSComp.txt:986) static member lexOutsideIntegerRange() = (1138, GetStringFunc("lexOutsideIntegerRange",",,,") ) /// '%s' is not permitted as a character in operator names and is reserved for future use - /// (Originally from ../FSComp.txt:988) + /// (Originally from ..\FSComp.txt:990) static member lexCharNotAllowedInOperatorNames(a0 : System.String) = (GetStringFunc("lexCharNotAllowedInOperatorNames",",,,%s,,,") a0) /// Unexpected character '%s' - /// (Originally from ../FSComp.txt:989) + /// (Originally from ..\FSComp.txt:991) static member lexUnexpectedChar(a0 : System.String) = (GetStringFunc("lexUnexpectedChar",",,,%s,,,") a0) /// This byte array literal contains characters that do not encode as a single byte - /// (Originally from ../FSComp.txt:990) + /// (Originally from ..\FSComp.txt:992) static member lexByteArrayCannotEncode() = (1140, GetStringFunc("lexByteArrayCannotEncode",",,,") ) /// Identifiers followed by '%s' are reserved for future use - /// (Originally from ../FSComp.txt:991) + /// (Originally from ..\FSComp.txt:993) static member lexIdentEndInMarkReserved(a0 : System.String) = (1141, GetStringFunc("lexIdentEndInMarkReserved",",,,%s,,,") a0) /// This number is outside the allowable range for 8-bit signed integers - /// (Originally from ../FSComp.txt:992) + /// (Originally from ..\FSComp.txt:994) static member lexOutsideEightBitSigned() = (1142, GetStringFunc("lexOutsideEightBitSigned",",,,") ) /// This number is outside the allowable range for hexadecimal 8-bit signed integers - /// (Originally from ../FSComp.txt:993) + /// (Originally from ..\FSComp.txt:995) static member lexOutsideEightBitSignedHex() = (1143, GetStringFunc("lexOutsideEightBitSignedHex",",,,") ) /// This number is outside the allowable range for 8-bit unsigned integers - /// (Originally from ../FSComp.txt:994) + /// (Originally from ..\FSComp.txt:996) static member lexOutsideEightBitUnsigned() = (1144, GetStringFunc("lexOutsideEightBitUnsigned",",,,") ) /// This number is outside the allowable range for 16-bit signed integers - /// (Originally from ../FSComp.txt:995) + /// (Originally from ..\FSComp.txt:997) static member lexOutsideSixteenBitSigned() = (1145, GetStringFunc("lexOutsideSixteenBitSigned",",,,") ) /// This number is outside the allowable range for 16-bit unsigned integers - /// (Originally from ../FSComp.txt:996) + /// (Originally from ..\FSComp.txt:998) static member lexOutsideSixteenBitUnsigned() = (1146, GetStringFunc("lexOutsideSixteenBitUnsigned",",,,") ) /// This number is outside the allowable range for 32-bit signed integers - /// (Originally from ../FSComp.txt:997) + /// (Originally from ..\FSComp.txt:999) static member lexOutsideThirtyTwoBitSigned() = (1147, GetStringFunc("lexOutsideThirtyTwoBitSigned",",,,") ) /// This number is outside the allowable range for 32-bit unsigned integers - /// (Originally from ../FSComp.txt:998) + /// (Originally from ..\FSComp.txt:1000) static member lexOutsideThirtyTwoBitUnsigned() = (1148, GetStringFunc("lexOutsideThirtyTwoBitUnsigned",",,,") ) /// This number is outside the allowable range for 64-bit signed integers - /// (Originally from ../FSComp.txt:999) + /// (Originally from ..\FSComp.txt:1001) static member lexOutsideSixtyFourBitSigned() = (1149, GetStringFunc("lexOutsideSixtyFourBitSigned",",,,") ) /// This number is outside the allowable range for 64-bit unsigned integers - /// (Originally from ../FSComp.txt:1000) + /// (Originally from ..\FSComp.txt:1002) static member lexOutsideSixtyFourBitUnsigned() = (1150, GetStringFunc("lexOutsideSixtyFourBitUnsigned",",,,") ) /// This number is outside the allowable range for signed native integers - /// (Originally from ../FSComp.txt:1001) + /// (Originally from ..\FSComp.txt:1003) static member lexOutsideNativeSigned() = (1151, GetStringFunc("lexOutsideNativeSigned",",,,") ) /// This number is outside the allowable range for unsigned native integers - /// (Originally from ../FSComp.txt:1002) + /// (Originally from ..\FSComp.txt:1004) static member lexOutsideNativeUnsigned() = (1152, GetStringFunc("lexOutsideNativeUnsigned",",,,") ) /// Invalid floating point number - /// (Originally from ../FSComp.txt:1003) + /// (Originally from ..\FSComp.txt:1005) static member lexInvalidFloat() = (1153, GetStringFunc("lexInvalidFloat",",,,") ) /// This number is outside the allowable range for decimal literals - /// (Originally from ../FSComp.txt:1004) + /// (Originally from ..\FSComp.txt:1006) static member lexOusideDecimal() = (1154, GetStringFunc("lexOusideDecimal",",,,") ) /// This number is outside the allowable range for 32-bit floats - /// (Originally from ../FSComp.txt:1005) + /// (Originally from ..\FSComp.txt:1007) static member lexOusideThirtyTwoBitFloat() = (1155, GetStringFunc("lexOusideThirtyTwoBitFloat",",,,") ) /// This is not a valid numeric literal. Valid numeric literals include 1, 0x1, 0b0001 (int), 1u (uint32), 1L (int64), 1UL (uint64), 1s (int16), 1y (sbyte), 1uy (byte), 1.0 (float), 1.0f (float32), 1.0m (decimal), 1I (BigInteger). - /// (Originally from ../FSComp.txt:1006) + /// (Originally from ..\FSComp.txt:1008) static member lexInvalidNumericLiteral() = (1156, GetStringFunc("lexInvalidNumericLiteral",",,,") ) /// This is not a valid byte literal - /// (Originally from ../FSComp.txt:1007) + /// (Originally from ..\FSComp.txt:1009) static member lexInvalidByteLiteral() = (1157, GetStringFunc("lexInvalidByteLiteral",",,,") ) /// This is not a valid character literal - /// (Originally from ../FSComp.txt:1008) + /// (Originally from ..\FSComp.txt:1010) static member lexInvalidCharLiteral() = (1158, GetStringFunc("lexInvalidCharLiteral",",,,") ) /// This Unicode encoding is only valid in string literals - /// (Originally from ../FSComp.txt:1009) + /// (Originally from ..\FSComp.txt:1011) static member lexThisUnicodeOnlyInStringLiterals() = (1159, GetStringFunc("lexThisUnicodeOnlyInStringLiterals",",,,") ) /// This token is reserved for future use - /// (Originally from ../FSComp.txt:1010) + /// (Originally from ..\FSComp.txt:1012) static member lexTokenReserved() = (1160, GetStringFunc("lexTokenReserved",",,,") ) /// TABs are not allowed in F# code unless the #indent \"off\" option is used - /// (Originally from ../FSComp.txt:1011) + /// (Originally from ..\FSComp.txt:1013) static member lexTabsNotAllowed() = (1161, GetStringFunc("lexTabsNotAllowed",",,,") ) /// Invalid line number: '%s' - /// (Originally from ../FSComp.txt:1012) + /// (Originally from ..\FSComp.txt:1014) static member lexInvalidLineNumber(a0 : System.String) = (1162, GetStringFunc("lexInvalidLineNumber",",,,%s,,,") a0) /// #if directive must appear as the first non-whitespace character on a line - /// (Originally from ../FSComp.txt:1013) + /// (Originally from ..\FSComp.txt:1015) static member lexHashIfMustBeFirst() = (1163, GetStringFunc("lexHashIfMustBeFirst",",,,") ) /// #else has no matching #if - /// (Originally from ../FSComp.txt:1014) + /// (Originally from ..\FSComp.txt:1016) static member lexHashElseNoMatchingIf() = (GetStringFunc("lexHashElseNoMatchingIf",",,,") ) /// #endif required for #else - /// (Originally from ../FSComp.txt:1015) + /// (Originally from ..\FSComp.txt:1017) static member lexHashEndifRequiredForElse() = (GetStringFunc("lexHashEndifRequiredForElse",",,,") ) /// #else directive must appear as the first non-whitespace character on a line - /// (Originally from ../FSComp.txt:1016) + /// (Originally from ..\FSComp.txt:1018) static member lexHashElseMustBeFirst() = (1166, GetStringFunc("lexHashElseMustBeFirst",",,,") ) /// #endif has no matching #if - /// (Originally from ../FSComp.txt:1017) + /// (Originally from ..\FSComp.txt:1019) static member lexHashEndingNoMatchingIf() = (GetStringFunc("lexHashEndingNoMatchingIf",",,,") ) /// #endif directive must appear as the first non-whitespace character on a line - /// (Originally from ../FSComp.txt:1018) + /// (Originally from ..\FSComp.txt:1020) static member lexHashEndifMustBeFirst() = (1168, GetStringFunc("lexHashEndifMustBeFirst",",,,") ) /// #if directive should be immediately followed by an identifier - /// (Originally from ../FSComp.txt:1019) + /// (Originally from ..\FSComp.txt:1021) static member lexHashIfMustHaveIdent() = (1169, GetStringFunc("lexHashIfMustHaveIdent",",,,") ) /// Syntax error. Wrong nested #endif, unexpected tokens before it. - /// (Originally from ../FSComp.txt:1020) + /// (Originally from ..\FSComp.txt:1022) static member lexWrongNestedHashEndif() = (1170, GetStringFunc("lexWrongNestedHashEndif",",,,") ) /// #! may only appear as the first line at the start of a file. - /// (Originally from ../FSComp.txt:1021) + /// (Originally from ..\FSComp.txt:1023) static member lexHashBangMustBeFirstInFile() = (GetStringFunc("lexHashBangMustBeFirstInFile",",,,") ) /// Expected single line comment or end of line - /// (Originally from ../FSComp.txt:1022) + /// (Originally from ..\FSComp.txt:1024) static member pplexExpectedSingleLineComment() = (1171, GetStringFunc("pplexExpectedSingleLineComment",",,,") ) /// Infix operator member '%s' has no arguments. Expected a tuple of 2 arguments, e.g. static member (+) (x,y) = ... - /// (Originally from ../FSComp.txt:1023) + /// (Originally from ..\FSComp.txt:1025) static member memberOperatorDefinitionWithNoArguments(a0 : System.String) = (1172, GetStringFunc("memberOperatorDefinitionWithNoArguments",",,,%s,,,") a0) /// Infix operator member '%s' has %d initial argument(s). Expected a tuple of 2 arguments, e.g. static member (+) (x,y) = ... - /// (Originally from ../FSComp.txt:1024) + /// (Originally from ..\FSComp.txt:1026) static member memberOperatorDefinitionWithNonPairArgument(a0 : System.String, a1 : System.Int32) = (1173, GetStringFunc("memberOperatorDefinitionWithNonPairArgument",",,,%s,,,%d,,,") a0 a1) /// Infix operator member '%s' has extra curried arguments. Expected a tuple of 2 arguments, e.g. static member (+) (x,y) = ... - /// (Originally from ../FSComp.txt:1025) + /// (Originally from ..\FSComp.txt:1027) static member memberOperatorDefinitionWithCurriedArguments(a0 : System.String) = (1174, GetStringFunc("memberOperatorDefinitionWithCurriedArguments",",,,%s,,,") a0) /// All record, union and struct types in FSharp.Core.dll must be explicitly labelled with 'StructuralComparison' or 'NoComparison' - /// (Originally from ../FSComp.txt:1026) + /// (Originally from ..\FSComp.txt:1028) static member tcFSharpCoreRequiresExplicit() = (1175, GetStringFunc("tcFSharpCoreRequiresExplicit",",,,") ) /// The struct, record or union type '%s' has the 'StructuralComparison' attribute but the type parameter '%s' does not satisfy the 'comparison' constraint. Consider adding the 'comparison' constraint to the type parameter - /// (Originally from ../FSComp.txt:1027) + /// (Originally from ..\FSComp.txt:1029) static member tcStructuralComparisonNotSatisfied1(a0 : System.String, a1 : System.String) = (1176, GetStringFunc("tcStructuralComparisonNotSatisfied1",",,,%s,,,%s,,,") a0 a1) /// The struct, record or union type '%s' has the 'StructuralComparison' attribute but the component type '%s' does not satisfy the 'comparison' constraint - /// (Originally from ../FSComp.txt:1028) + /// (Originally from ..\FSComp.txt:1030) static member tcStructuralComparisonNotSatisfied2(a0 : System.String, a1 : System.String) = (1177, GetStringFunc("tcStructuralComparisonNotSatisfied2",",,,%s,,,%s,,,") a0 a1) /// The struct, record or union type '%s' is not structurally comparable because the type parameter %s does not satisfy the 'comparison' constraint. Consider adding the 'NoComparison' attribute to the type '%s' to clarify that the type is not comparable - /// (Originally from ../FSComp.txt:1029) + /// (Originally from ..\FSComp.txt:1031) static member tcNoComparisonNeeded1(a0 : System.String, a1 : System.String, a2 : System.String) = (1178, GetStringFunc("tcNoComparisonNeeded1",",,,%s,,,%s,,,%s,,,") a0 a1 a2) /// The struct, record or union type '%s' is not structurally comparable because the type '%s' does not satisfy the 'comparison' constraint. Consider adding the 'NoComparison' attribute to the type '%s' to clarify that the type is not comparable - /// (Originally from ../FSComp.txt:1030) + /// (Originally from ..\FSComp.txt:1032) static member tcNoComparisonNeeded2(a0 : System.String, a1 : System.String, a2 : System.String) = (1178, GetStringFunc("tcNoComparisonNeeded2",",,,%s,,,%s,,,%s,,,") a0 a1 a2) /// The struct, record or union type '%s' does not support structural equality because the type parameter %s does not satisfy the 'equality' constraint. Consider adding the 'NoEquality' attribute to the type '%s' to clarify that the type does not support structural equality - /// (Originally from ../FSComp.txt:1031) + /// (Originally from ..\FSComp.txt:1033) static member tcNoEqualityNeeded1(a0 : System.String, a1 : System.String, a2 : System.String) = (1178, GetStringFunc("tcNoEqualityNeeded1",",,,%s,,,%s,,,%s,,,") a0 a1 a2) /// The struct, record or union type '%s' does not support structural equality because the type '%s' does not satisfy the 'equality' constraint. Consider adding the 'NoEquality' attribute to the type '%s' to clarify that the type does not support structural equality - /// (Originally from ../FSComp.txt:1032) + /// (Originally from ..\FSComp.txt:1034) static member tcNoEqualityNeeded2(a0 : System.String, a1 : System.String, a2 : System.String) = (1178, GetStringFunc("tcNoEqualityNeeded2",",,,%s,,,%s,,,%s,,,") a0 a1 a2) /// The struct, record or union type '%s' has the 'StructuralEquality' attribute but the type parameter '%s' does not satisfy the 'equality' constraint. Consider adding the 'equality' constraint to the type parameter - /// (Originally from ../FSComp.txt:1033) + /// (Originally from ..\FSComp.txt:1035) static member tcStructuralEqualityNotSatisfied1(a0 : System.String, a1 : System.String) = (1179, GetStringFunc("tcStructuralEqualityNotSatisfied1",",,,%s,,,%s,,,") a0 a1) /// The struct, record or union type '%s' has the 'StructuralEquality' attribute but the component type '%s' does not satisfy the 'equality' constraint - /// (Originally from ../FSComp.txt:1034) + /// (Originally from ..\FSComp.txt:1036) static member tcStructuralEqualityNotSatisfied2(a0 : System.String, a1 : System.String) = (1180, GetStringFunc("tcStructuralEqualityNotSatisfied2",",,,%s,,,%s,,,") a0 a1) /// Each argument of the primary constructor for a struct must be given a type, for example 'type S(x1:int, x2: int) = ...'. These arguments determine the fields of the struct. - /// (Originally from ../FSComp.txt:1035) + /// (Originally from ..\FSComp.txt:1037) static member tcStructsMustDeclareTypesOfImplicitCtorArgsExplicitly() = (1181, GetStringFunc("tcStructsMustDeclareTypesOfImplicitCtorArgsExplicitly",",,,") ) /// The value '%s' is unused - /// (Originally from ../FSComp.txt:1036) + /// (Originally from ..\FSComp.txt:1038) static member chkUnusedValue(a0 : System.String) = (1182, GetStringFunc("chkUnusedValue",",,,%s,,,") a0) /// The recursive object reference '%s' is unused. The presence of a recursive object reference adds runtime initialization checks to members in this and derived types. Consider removing this recursive object reference. - /// (Originally from ../FSComp.txt:1037) + /// (Originally from ..\FSComp.txt:1039) static member chkUnusedThisVariable(a0 : System.String) = (1183, GetStringFunc("chkUnusedThisVariable",",,,%s,,,") a0) /// A getter property may have at most one argument group - /// (Originally from ../FSComp.txt:1038) + /// (Originally from ..\FSComp.txt:1040) static member parsGetterAtMostOneArgument() = (1184, GetStringFunc("parsGetterAtMostOneArgument",",,,") ) /// A setter property may have at most two argument groups - /// (Originally from ../FSComp.txt:1039) + /// (Originally from ..\FSComp.txt:1041) static member parsSetterAtMostTwoArguments() = (1185, GetStringFunc("parsSetterAtMostTwoArguments",",,,") ) /// Invalid property getter or setter - /// (Originally from ../FSComp.txt:1040) + /// (Originally from ..\FSComp.txt:1042) static member parsInvalidProperty() = (1186, GetStringFunc("parsInvalidProperty",",,,") ) /// An indexer property must be given at least one argument - /// (Originally from ../FSComp.txt:1041) + /// (Originally from ..\FSComp.txt:1043) static member parsIndexerPropertyRequiresAtLeastOneArgument() = (1187, GetStringFunc("parsIndexerPropertyRequiresAtLeastOneArgument",",,,") ) /// This operation accesses a mutable top-level value defined in another assembly in an unsupported way. The value cannot be accessed through its address. Consider copying the expression to a mutable local, e.g. 'let mutable x = ...', and if necessary assigning the value back after the completion of the operation - /// (Originally from ../FSComp.txt:1042) + /// (Originally from ..\FSComp.txt:1044) static member tastInvalidAddressOfMutableAcrossAssemblyBoundary() = (1188, GetStringFunc("tastInvalidAddressOfMutableAcrossAssemblyBoundary",",,,") ) /// Type parameters must be placed directly adjacent to the type name, e.g. \"type C<'T>\", not type \"C <'T>\" - /// (Originally from ../FSComp.txt:1043) + /// (Originally from ..\FSComp.txt:1045) static member parsNonAdjacentTypars() = (1189, GetStringFunc("parsNonAdjacentTypars",",,,") ) /// Type arguments must be placed directly adjacent to the type name, e.g. \"C<'T>\", not \"C <'T>\" - /// (Originally from ../FSComp.txt:1044) + /// (Originally from ..\FSComp.txt:1046) static member parsNonAdjacentTyargs() = (1190, GetStringFunc("parsNonAdjacentTyargs",",,,") ) /// The use of the type syntax 'int C' and 'C ' is not permitted here. Consider adjusting this type to be written in the form 'C' - /// (Originally from ../FSComp.txt:1045) + /// (Originally from ..\FSComp.txt:1047) static member parsNonAtomicType() = (GetStringFunc("parsNonAtomicType",",,,") ) /// The module/namespace '%s' from compilation unit '%s' did not contain the module/namespace '%s' - /// (Originally from ../FSComp.txt:1048) + /// (Originally from ..\FSComp.txt:1050) static member tastUndefinedItemRefModuleNamespace(a0 : System.String, a1 : System.String, a2 : System.String) = (1193, GetStringFunc("tastUndefinedItemRefModuleNamespace",",,,%s,,,%s,,,%s,,,") a0 a1 a2) /// The module/namespace '%s' from compilation unit '%s' did not contain the val '%s' - /// (Originally from ../FSComp.txt:1049) + /// (Originally from ..\FSComp.txt:1051) static member tastUndefinedItemRefVal(a0 : System.String, a1 : System.String, a2 : System.String) = (1194, GetStringFunc("tastUndefinedItemRefVal",",,,%s,,,%s,,,%s,,,") a0 a1 a2) /// The module/namespace '%s' from compilation unit '%s' did not contain the namespace, module or type '%s' - /// (Originally from ../FSComp.txt:1050) + /// (Originally from ..\FSComp.txt:1052) static member tastUndefinedItemRefModuleNamespaceType(a0 : System.String, a1 : System.String, a2 : System.String) = (1195, GetStringFunc("tastUndefinedItemRefModuleNamespaceType",",,,%s,,,%s,,,%s,,,") a0 a1 a2) /// The 'UseNullAsTrueValue' attribute flag may only be used with union types that have one nullary case and at least one non-nullary case - /// (Originally from ../FSComp.txt:1051) + /// (Originally from ..\FSComp.txt:1053) static member tcInvalidUseNullAsTrueValue() = (1196, GetStringFunc("tcInvalidUseNullAsTrueValue",",,,") ) /// The parameter '%s' was inferred to have byref type. Parameters of byref type must be given an explicit type annotation, e.g. 'x1: byref'. When used, a byref parameter is implicitly dereferenced. - /// (Originally from ../FSComp.txt:1052) + /// (Originally from ..\FSComp.txt:1054) static member tcParameterInferredByref(a0 : System.String) = (1197, GetStringFunc("tcParameterInferredByref",",,,%s,,,") a0) /// The generic member '%s' has been used at a non-uniform instantiation prior to this program point. Consider reordering the members so this member occurs first. Alternatively, specify the full type of the member explicitly, including argument types, return type and any additional generic parameters and constraints. - /// (Originally from ../FSComp.txt:1053) + /// (Originally from ..\FSComp.txt:1055) static member tcNonUniformMemberUse(a0 : System.String) = (1198, GetStringFunc("tcNonUniformMemberUse",",,,%s,,,") a0) /// The attribute '%s' appears in both the implementation and the signature, but the attribute arguments differ. Only the attribute from the signature will be included in the compiled code. - /// (Originally from ../FSComp.txt:1054) + /// (Originally from ..\FSComp.txt:1056) static member tcAttribArgsDiffer(a0 : System.String) = (1200, GetStringFunc("tcAttribArgsDiffer",",,,%s,,,") a0) /// Cannot call an abstract base member: '%s' - /// (Originally from ../FSComp.txt:1055) + /// (Originally from ..\FSComp.txt:1057) static member tcCannotCallAbstractBaseMember(a0 : System.String) = (1201, GetStringFunc("tcCannotCallAbstractBaseMember",",,,%s,,,") a0) /// Could not resolve the ambiguity in the use of a generic construct with an 'unmanaged' constraint at or near this position - /// (Originally from ../FSComp.txt:1056) + /// (Originally from ..\FSComp.txt:1058) static member typrelCannotResolveAmbiguityInUnmanaged() = (1202, GetStringFunc("typrelCannotResolveAmbiguityInUnmanaged",",,,") ) /// This construct is for ML compatibility. %s. You can disable this warning by using '--mlcompatibility' or '--nowarn:62'. - /// (Originally from ../FSComp.txt:1059) + /// (Originally from ..\FSComp.txt:1061) static member mlCompatMessage(a0 : System.String) = (GetStringFunc("mlCompatMessage",",,,%s,,,") a0) /// The type '%s' has been marked as having an Explicit layout, but the field '%s' has not been marked with the 'FieldOffset' attribute - /// (Originally from ../FSComp.txt:1061) + /// (Originally from ..\FSComp.txt:1063) static member ilFieldDoesNotHaveValidOffsetForStructureLayout(a0 : System.String, a1 : System.String) = (1206, GetStringFunc("ilFieldDoesNotHaveValidOffsetForStructureLayout",",,,%s,,,%s,,,") a0 a1) /// Interfaces inherited by other interfaces should be declared using 'inherit ...' instead of 'interface ...' - /// (Originally from ../FSComp.txt:1062) + /// (Originally from ..\FSComp.txt:1064) static member tcInterfacesShouldUseInheritNotInterface() = (1207, GetStringFunc("tcInterfacesShouldUseInheritNotInterface",",,,") ) /// Invalid prefix operator - /// (Originally from ../FSComp.txt:1063) + /// (Originally from ..\FSComp.txt:1065) static member parsInvalidPrefixOperator() = (1208, GetStringFunc("parsInvalidPrefixOperator",",,,") ) /// Invalid operator definition. Prefix operator definitions must use a valid prefix operator name. - /// (Originally from ../FSComp.txt:1064) + /// (Originally from ..\FSComp.txt:1066) static member parsInvalidPrefixOperatorDefinition() = (1208, GetStringFunc("parsInvalidPrefixOperatorDefinition",",,,") ) /// The file extensions '.ml' and '.mli' are for ML compatibility - /// (Originally from ../FSComp.txt:1065) + /// (Originally from ..\FSComp.txt:1067) static member buildCompilingExtensionIsForML() = (GetStringFunc("buildCompilingExtensionIsForML",",,,") ) /// Consider using a file with extension '.ml' or '.mli' instead - /// (Originally from ../FSComp.txt:1066) + /// (Originally from ..\FSComp.txt:1068) static member lexIndentOffForML() = (GetStringFunc("lexIndentOffForML",",,,") ) /// Active pattern '%s' is not a function - /// (Originally from ../FSComp.txt:1067) + /// (Originally from ..\FSComp.txt:1069) static member activePatternIdentIsNotFunctionTyped(a0 : System.String) = (1209, GetStringFunc("activePatternIdentIsNotFunctionTyped",",,,%s,,,") a0) /// Active pattern '%s' has a result type containing type variables that are not determined by the input. The common cause is a when a result case is not mentioned, e.g. 'let (|A|B|) (x:int) = A x'. This can be fixed with a type constraint, e.g. 'let (|A|B|) (x:int) : Choice = A x' - /// (Originally from ../FSComp.txt:1068) + /// (Originally from ..\FSComp.txt:1070) static member activePatternChoiceHasFreeTypars(a0 : System.String) = (1210, GetStringFunc("activePatternChoiceHasFreeTypars",",,,%s,,,") a0) /// The FieldOffset attribute can only be placed on members of types marked with the StructLayout(LayoutKind.Explicit) - /// (Originally from ../FSComp.txt:1069) + /// (Originally from ..\FSComp.txt:1071) static member ilFieldHasOffsetForSequentialLayout() = (1211, GetStringFunc("ilFieldHasOffsetForSequentialLayout",",,,") ) /// Optional arguments must come at the end of the argument list, after any non-optional arguments - /// (Originally from ../FSComp.txt:1070) + /// (Originally from ..\FSComp.txt:1072) static member tcOptionalArgsMustComeAfterNonOptionalArgs() = (1212, GetStringFunc("tcOptionalArgsMustComeAfterNonOptionalArgs",",,,") ) /// Attribute 'System.Diagnostics.ConditionalAttribute' is only valid on methods or attribute classes - /// (Originally from ../FSComp.txt:1071) + /// (Originally from ..\FSComp.txt:1073) static member tcConditionalAttributeUsage() = (1213, GetStringFunc("tcConditionalAttributeUsage",",,,") ) /// Extension members cannot provide operator overloads. Consider defining the operator as part of the type definition instead. - /// (Originally from ../FSComp.txt:1073) + /// (Originally from ..\FSComp.txt:1075) static member tcMemberOperatorDefinitionInExtrinsic() = (1215, GetStringFunc("tcMemberOperatorDefinitionInExtrinsic",",,,") ) /// The name of the MDB file must be .mdb. The --pdb option will be ignored. - /// (Originally from ../FSComp.txt:1074) + /// (Originally from ..\FSComp.txt:1076) static member ilwriteMDBFileNameCannotBeChangedWarning() = (1216, GetStringFunc("ilwriteMDBFileNameCannotBeChangedWarning",",,,") ) /// MDB generation failed. Could not find compatible member %s - /// (Originally from ../FSComp.txt:1075) + /// (Originally from ..\FSComp.txt:1077) static member ilwriteMDBMemberMissing(a0 : System.String) = (1217, GetStringFunc("ilwriteMDBMemberMissing",",,,%s,,,") a0) /// Cannot generate MDB debug information. Failed to load the 'MonoSymbolWriter' type from the 'Mono.CompilerServices.SymbolWriter.dll' assembly. - /// (Originally from ../FSComp.txt:1076) + /// (Originally from ..\FSComp.txt:1078) static member ilwriteErrorCreatingMdb() = (1218, GetStringFunc("ilwriteErrorCreatingMdb",",,,") ) /// The union case named '%s' conflicts with the generated type '%s' - /// (Originally from ../FSComp.txt:1077) + /// (Originally from ..\FSComp.txt:1079) static member tcUnionCaseNameConflictsWithGeneratedType(a0 : System.String, a1 : System.String) = (1219, GetStringFunc("tcUnionCaseNameConflictsWithGeneratedType",",,,%s,,,%s,,,") a0 a1) /// ReflectedDefinitionAttribute may not be applied to an instance member on a struct type, because the instance member takes an implicit 'this' byref parameter - /// (Originally from ../FSComp.txt:1078) + /// (Originally from ..\FSComp.txt:1080) static member chkNoReflectedDefinitionOnStructMember() = (1220, GetStringFunc("chkNoReflectedDefinitionOnStructMember",",,,") ) /// DLLImport bindings must be static members in a class or function definitions in a module - /// (Originally from ../FSComp.txt:1079) + /// (Originally from ..\FSComp.txt:1081) static member tcDllImportNotAllowed() = (1221, GetStringFunc("tcDllImportNotAllowed",",,,") ) /// When mscorlib.dll or FSharp.Core.dll is explicitly referenced the %s option must also be passed - /// (Originally from ../FSComp.txt:1080) + /// (Originally from ..\FSComp.txt:1082) static member buildExplicitCoreLibRequiresNoFramework(a0 : System.String) = (1222, GetStringFunc("buildExplicitCoreLibRequiresNoFramework",",,,%s,,,") a0) /// FSharp.Core.sigdata not found alongside FSharp.Core. File expected in %s. Consider upgrading to a more recent version of FSharp.Core, where this file is no longer be required. - /// (Originally from ../FSComp.txt:1081) + /// (Originally from ..\FSComp.txt:1083) static member buildExpectedSigdataFile(a0 : System.String) = (1223, GetStringFunc("buildExpectedSigdataFile",",,,%s,,,") a0) /// File '%s' not found alongside FSharp.Core. File expected in %s. Consider upgrading to a more recent version of FSharp.Core, where this file is no longer be required. - /// (Originally from ../FSComp.txt:1082) + /// (Originally from ..\FSComp.txt:1084) static member buildExpectedFileAlongSideFSharpCore(a0 : System.String, a1 : System.String) = (1225, GetStringFunc("buildExpectedFileAlongSideFSharpCore",",,,%s,,,%s,,,") a0 a1) /// Filename '%s' contains invalid character '%s' - /// (Originally from ../FSComp.txt:1083) + /// (Originally from ..\FSComp.txt:1085) static member buildUnexpectedFileNameCharacter(a0 : System.String, a1 : System.String) = (1227, GetStringFunc("buildUnexpectedFileNameCharacter",",,,%s,,,%s,,,") a0 a1) /// 'use!' bindings must be of the form 'use! = ' - /// (Originally from ../FSComp.txt:1084) + /// (Originally from ..\FSComp.txt:1086) static member tcInvalidUseBangBinding() = (1228, GetStringFunc("tcInvalidUseBangBinding",",,,") ) /// Inner generic functions are not permitted in quoted expressions. Consider adding some type constraints until this function is no longer generic. - /// (Originally from ../FSComp.txt:1085) + /// (Originally from ..\FSComp.txt:1087) static member crefNoInnerGenericsInQuotations() = (1230, GetStringFunc("crefNoInnerGenericsInQuotations",",,,") ) /// The type '%s' is not a valid enumerator type , i.e. does not have a 'MoveNext()' method returning a bool, and a 'Current' property - /// (Originally from ../FSComp.txt:1086) + /// (Originally from ..\FSComp.txt:1088) static member tcEnumTypeCannotBeEnumerated(a0 : System.String) = (1231, GetStringFunc("tcEnumTypeCannotBeEnumerated",",,,%s,,,") a0) /// End of file in triple-quote string begun at or before here - /// (Originally from ../FSComp.txt:1087) + /// (Originally from ..\FSComp.txt:1089) static member parsEofInTripleQuoteString() = (1232, GetStringFunc("parsEofInTripleQuoteString",",,,") ) /// End of file in triple-quote string embedded in comment begun at or before here - /// (Originally from ../FSComp.txt:1088) + /// (Originally from ..\FSComp.txt:1090) static member parsEofInTripleQuoteStringInComment() = (1233, GetStringFunc("parsEofInTripleQuoteStringInComment",",,,") ) /// This type test or downcast will ignore the unit-of-measure '%s' - /// (Originally from ../FSComp.txt:1089) + /// (Originally from ..\FSComp.txt:1091) static member tcTypeTestLosesMeasures(a0 : System.String) = (1240, GetStringFunc("tcTypeTestLosesMeasures",",,,%s,,,") a0) /// Expected type argument or static argument - /// (Originally from ../FSComp.txt:1090) + /// (Originally from ..\FSComp.txt:1092) static member parsMissingTypeArgs() = (1241, GetStringFunc("parsMissingTypeArgs",",,,") ) /// Unmatched '<'. Expected closing '>' - /// (Originally from ../FSComp.txt:1091) + /// (Originally from ..\FSComp.txt:1093) static member parsMissingGreaterThan() = (1242, GetStringFunc("parsMissingGreaterThan",",,,") ) /// Unexpected quotation operator '<@' in type definition. If you intend to pass a verbatim string as a static argument to a type provider, put a space between the '<' and '@' characters. - /// (Originally from ../FSComp.txt:1092) + /// (Originally from ..\FSComp.txt:1094) static member parsUnexpectedQuotationOperatorInTypeAliasDidYouMeanVerbatimString() = (1243, GetStringFunc("parsUnexpectedQuotationOperatorInTypeAliasDidYouMeanVerbatimString",",,,") ) /// Attempted to parse this as an operator name, but failed - /// (Originally from ../FSComp.txt:1093) + /// (Originally from ..\FSComp.txt:1095) static member parsErrorParsingAsOperatorName() = (1244, GetStringFunc("parsErrorParsingAsOperatorName",",,,") ) /// \U%s is not a valid Unicode character escape sequence - /// (Originally from ../FSComp.txt:1094) + /// (Originally from ..\FSComp.txt:1096) static member lexInvalidUnicodeLiteral(a0 : System.String) = (1245, GetStringFunc("lexInvalidUnicodeLiteral",",,,%s,,,") a0) /// '%s' must be applied to an argument of type '%s', but has been applied to an argument of type '%s' - /// (Originally from ../FSComp.txt:1095) + /// (Originally from ..\FSComp.txt:1097) static member tcCallerInfoWrongType(a0 : System.String, a1 : System.String, a2 : System.String) = (1246, GetStringFunc("tcCallerInfoWrongType",",,,%s,,,%s,,,%s,,,") a0 a1 a2) /// '%s' can only be applied to optional arguments - /// (Originally from ../FSComp.txt:1096) + /// (Originally from ..\FSComp.txt:1098) static member tcCallerInfoNotOptional(a0 : System.String) = (1247, GetStringFunc("tcCallerInfoNotOptional",",,,%s,,,") a0) /// The specified .NET Framework version '%s' is not supported. Please specify a value from the enumeration Microsoft.Build.Utilities.TargetDotNetFrameworkVersion. - /// (Originally from ../FSComp.txt:1098) + /// (Originally from ..\FSComp.txt:1100) static member toolLocationHelperUnsupportedFrameworkVersion(a0 : System.String) = (1300, GetStringFunc("toolLocationHelperUnsupportedFrameworkVersion",",,,%s,,,") a0) /// Invalid Magic value in CLR Header - /// (Originally from ../FSComp.txt:1102) + /// (Originally from ..\FSComp.txt:1104) static member ilSignInvalidMagicValue() = (1301, GetStringFunc("ilSignInvalidMagicValue",",,,") ) /// Bad image format - /// (Originally from ../FSComp.txt:1103) + /// (Originally from ..\FSComp.txt:1105) static member ilSignBadImageFormat() = (1302, GetStringFunc("ilSignBadImageFormat",",,,") ) /// Private key expected - /// (Originally from ../FSComp.txt:1104) + /// (Originally from ..\FSComp.txt:1106) static member ilSignPrivateKeyExpected() = (1303, GetStringFunc("ilSignPrivateKeyExpected",",,,") ) /// RSA key expected - /// (Originally from ../FSComp.txt:1105) + /// (Originally from ..\FSComp.txt:1107) static member ilSignRsaKeyExpected() = (1304, GetStringFunc("ilSignRsaKeyExpected",",,,") ) /// Invalid bit Length - /// (Originally from ../FSComp.txt:1106) + /// (Originally from ..\FSComp.txt:1108) static member ilSignInvalidBitLen() = (1305, GetStringFunc("ilSignInvalidBitLen",",,,") ) /// Invalid RSAParameters structure - '{0}' expected - /// (Originally from ../FSComp.txt:1107) + /// (Originally from ..\FSComp.txt:1109) static member ilSignInvalidRSAParams() = (1306, GetStringFunc("ilSignInvalidRSAParams",",,,") ) /// Invalid algId - 'Exponent' expected - /// (Originally from ../FSComp.txt:1108) + /// (Originally from ..\FSComp.txt:1110) static member ilSignInvalidAlgId() = (1307, GetStringFunc("ilSignInvalidAlgId",",,,") ) /// Invalid signature size - /// (Originally from ../FSComp.txt:1109) + /// (Originally from ..\FSComp.txt:1111) static member ilSignInvalidSignatureSize() = (1308, GetStringFunc("ilSignInvalidSignatureSize",",,,") ) /// No signature directory - /// (Originally from ../FSComp.txt:1110) + /// (Originally from ..\FSComp.txt:1112) static member ilSignNoSignatureDirectory() = (1309, GetStringFunc("ilSignNoSignatureDirectory",",,,") ) /// Invalid Public Key blob - /// (Originally from ../FSComp.txt:1111) + /// (Originally from ..\FSComp.txt:1113) static member ilSignInvalidPKBlob() = (1310, GetStringFunc("ilSignInvalidPKBlob",",,,") ) /// Exiting - too many errors - /// (Originally from ../FSComp.txt:1113) + /// (Originally from ..\FSComp.txt:1115) static member fscTooManyErrors() = (GetStringFunc("fscTooManyErrors",",,,") ) /// The documentation file has no .xml suffix - /// (Originally from ../FSComp.txt:1114) + /// (Originally from ..\FSComp.txt:1116) static member docfileNoXmlSuffix() = (2001, GetStringFunc("docfileNoXmlSuffix",",,,") ) /// No implementation files specified - /// (Originally from ../FSComp.txt:1115) + /// (Originally from ..\FSComp.txt:1117) static member fscNoImplementationFiles() = (2002, GetStringFunc("fscNoImplementationFiles",",,,") ) - /// An %s specified version '%s', but this value is invalid and has been ignored - /// (Originally from ../FSComp.txt:1116) + /// The attribute %s specified version '%s', but this value is invalid and has been ignored + /// (Originally from ..\FSComp.txt:1118) static member fscBadAssemblyVersion(a0 : System.String, a1 : System.String) = (2003, GetStringFunc("fscBadAssemblyVersion",",,,%s,,,%s,,,") a0 a1) /// Conflicting options specified: 'win32manifest' and 'win32res'. Only one of these can be used. - /// (Originally from ../FSComp.txt:1117) + /// (Originally from ..\FSComp.txt:1119) static member fscTwoResourceManifests() = (2004, GetStringFunc("fscTwoResourceManifests",",,,") ) /// The code in assembly '%s' makes uses of quotation literals. Static linking may not include components that make use of quotation literals unless all assemblies are compiled with at least F# 4.0. - /// (Originally from ../FSComp.txt:1118) + /// (Originally from ..\FSComp.txt:1120) static member fscQuotationLiteralsStaticLinking(a0 : System.String) = (2005, GetStringFunc("fscQuotationLiteralsStaticLinking",",,,%s,,,") a0) /// Code in this assembly makes uses of quotation literals. Static linking may not include components that make use of quotation literals unless all assemblies are compiled with at least F# 4.0. - /// (Originally from ../FSComp.txt:1119) + /// (Originally from ..\FSComp.txt:1121) static member fscQuotationLiteralsStaticLinking0() = (2006, GetStringFunc("fscQuotationLiteralsStaticLinking0",",,,") ) /// Static linking may not include a .EXE - /// (Originally from ../FSComp.txt:1120) + /// (Originally from ..\FSComp.txt:1122) static member fscStaticLinkingNoEXE() = (2007, GetStringFunc("fscStaticLinkingNoEXE",",,,") ) /// Static linking may not include a mixed managed/unmanaged DLL - /// (Originally from ../FSComp.txt:1121) + /// (Originally from ..\FSComp.txt:1123) static member fscStaticLinkingNoMixedDLL() = (2008, GetStringFunc("fscStaticLinkingNoMixedDLL",",,,") ) /// Ignoring mixed managed/unmanaged assembly '%s' during static linking - /// (Originally from ../FSComp.txt:1122) + /// (Originally from ..\FSComp.txt:1124) static member fscIgnoringMixedWhenLinking(a0 : System.String) = (2009, GetStringFunc("fscIgnoringMixedWhenLinking",",,,%s,,,") a0) /// Assembly '%s' was referenced transitively and the assembly could not be resolved automatically. Static linking will assume this DLL has no dependencies on the F# library or other statically linked DLLs. Consider adding an explicit reference to this DLL. - /// (Originally from ../FSComp.txt:1123) + /// (Originally from ..\FSComp.txt:1125) static member fscAssumeStaticLinkContainsNoDependencies(a0 : System.String) = (2011, GetStringFunc("fscAssumeStaticLinkContainsNoDependencies",",,,%s,,,") a0) /// Assembly '%s' not found in dependency set of target binary. Statically linked roots should be specified using an assembly name, without a DLL or EXE extension. If this assembly was referenced explicitly then it is possible the assembly was not actually required by the generated binary, in which case it should not be statically linked. - /// (Originally from ../FSComp.txt:1124) + /// (Originally from ..\FSComp.txt:1126) static member fscAssemblyNotFoundInDependencySet(a0 : System.String) = (2012, GetStringFunc("fscAssemblyNotFoundInDependencySet",",,,%s,,,") a0) /// The key file '%s' could not be opened - /// (Originally from ../FSComp.txt:1125) + /// (Originally from ..\FSComp.txt:1127) static member fscKeyFileCouldNotBeOpened(a0 : System.String) = (2013, GetStringFunc("fscKeyFileCouldNotBeOpened",",,,%s,,,") a0) /// A problem occurred writing the binary '%s': %s - /// (Originally from ../FSComp.txt:1126) + /// (Originally from ..\FSComp.txt:1128) static member fscProblemWritingBinary(a0 : System.String, a1 : System.String) = (2014, GetStringFunc("fscProblemWritingBinary",",,,%s,,,%s,,,") a0 a1) /// The 'AssemblyVersionAttribute' has been ignored because a version was given using a command line option - /// (Originally from ../FSComp.txt:1127) + /// (Originally from ..\FSComp.txt:1129) static member fscAssemblyVersionAttributeIgnored() = (2015, GetStringFunc("fscAssemblyVersionAttributeIgnored",",,,") ) /// Error emitting 'System.Reflection.AssemblyCultureAttribute' attribute -- 'Executables cannot be satellite assemblies, Culture should always be empty' - /// (Originally from ../FSComp.txt:1128) + /// (Originally from ..\FSComp.txt:1130) static member fscAssemblyCultureAttributeError() = (2016, GetStringFunc("fscAssemblyCultureAttributeError",",,,") ) /// Option '--delaysign' overrides attribute 'System.Reflection.AssemblyDelaySignAttribute' given in a source file or added module - /// (Originally from ../FSComp.txt:1129) + /// (Originally from ..\FSComp.txt:1131) static member fscDelaySignWarning() = (2017, GetStringFunc("fscDelaySignWarning",",,,") ) /// Option '--keyfile' overrides attribute 'System.Reflection.AssemblyKeyFileAttribute' given in a source file or added module - /// (Originally from ../FSComp.txt:1130) + /// (Originally from ..\FSComp.txt:1132) static member fscKeyFileWarning() = (2018, GetStringFunc("fscKeyFileWarning",",,,") ) /// Option '--keycontainer' overrides attribute 'System.Reflection.AssemblyNameAttribute' given in a source file or added module - /// (Originally from ../FSComp.txt:1131) + /// (Originally from ..\FSComp.txt:1133) static member fscKeyNameWarning() = (2019, GetStringFunc("fscKeyNameWarning",",,,") ) /// The assembly '%s' is listed on the command line. Assemblies should be referenced using a command line flag such as '-r'. - /// (Originally from ../FSComp.txt:1132) + /// (Originally from ..\FSComp.txt:1134) static member fscReferenceOnCommandLine(a0 : System.String) = (2020, GetStringFunc("fscReferenceOnCommandLine",",,,%s,,,") a0) /// The resident compilation service was not used because a problem occured in communicating with the server. - /// (Originally from ../FSComp.txt:1133) + /// (Originally from ..\FSComp.txt:1135) static member fscRemotingError() = (2021, GetStringFunc("fscRemotingError",",,,") ) /// Problem with filename '%s': Illegal characters in path. - /// (Originally from ../FSComp.txt:1134) + /// (Originally from ..\FSComp.txt:1136) static member pathIsInvalid(a0 : System.String) = (2022, GetStringFunc("pathIsInvalid",",,,%s,,,") a0) /// Passing a .resx file (%s) as a source file to the compiler is deprecated. Use resgen.exe to transform the .resx file into a .resources file to pass as a --resource option. If you are using MSBuild, this can be done via an item in the .fsproj project file. - /// (Originally from ../FSComp.txt:1135) + /// (Originally from ..\FSComp.txt:1137) static member fscResxSourceFileDeprecated(a0 : System.String) = (2023, GetStringFunc("fscResxSourceFileDeprecated",",,,%s,,,") a0) /// Static linking may not be used on an assembly referencing mscorlib (e.g. a .NET Framework assembly) when generating an assembly that references System.Runtime (e.g. a .NET Core or Portable assembly). - /// (Originally from ../FSComp.txt:1136) + /// (Originally from ..\FSComp.txt:1138) static member fscStaticLinkingNoProfileMismatches() = (2024, GetStringFunc("fscStaticLinkingNoProfileMismatches",",,,") ) /// An %s specified version '%s', but this value is a wildcard, and you have requested a deterministic build, these are in conflict. - /// (Originally from ../FSComp.txt:1137) + /// (Originally from ..\FSComp.txt:1139) static member fscAssemblyWildcardAndDeterminism(a0 : System.String, a1 : System.String) = (2025, GetStringFunc("fscAssemblyWildcardAndDeterminism",",,,%s,,,%s,,,") a0 a1) /// Determinstic builds only support portable PDBs (--debug:portable or --debug:embedded) - /// (Originally from ../FSComp.txt:1138) + /// (Originally from ..\FSComp.txt:1140) static member fscDeterministicDebugRequiresPortablePdb() = (2026, GetStringFunc("fscDeterministicDebugRequiresPortablePdb",",,,") ) /// Character '%s' is not allowed in provided namespace name '%s' - /// (Originally from ../FSComp.txt:1139) + /// (Originally from ..\FSComp.txt:1141) static member etIllegalCharactersInNamespaceName(a0 : System.String, a1 : System.String) = (3000, GetStringFunc("etIllegalCharactersInNamespaceName",",,,%s,,,%s,,,") a0 a1) /// The provided type '%s' returned a member with a null or empty member name - /// (Originally from ../FSComp.txt:1140) + /// (Originally from ..\FSComp.txt:1142) static member etNullOrEmptyMemberName(a0 : System.String) = (3001, GetStringFunc("etNullOrEmptyMemberName",",,,%s,,,") a0) /// The provided type '%s' returned a null member - /// (Originally from ../FSComp.txt:1141) + /// (Originally from ..\FSComp.txt:1143) static member etNullMember(a0 : System.String) = (3002, GetStringFunc("etNullMember",",,,%s,,,") a0) /// The provided type '%s' member info '%s' has null declaring type - /// (Originally from ../FSComp.txt:1142) + /// (Originally from ..\FSComp.txt:1144) static member etNullMemberDeclaringType(a0 : System.String, a1 : System.String) = (3003, GetStringFunc("etNullMemberDeclaringType",",,,%s,,,%s,,,") a0 a1) /// The provided type '%s' has member '%s' which has declaring type '%s'. Expected declaring type to be the same as provided type. - /// (Originally from ../FSComp.txt:1143) + /// (Originally from ..\FSComp.txt:1145) static member etNullMemberDeclaringTypeDifferentFromProvidedType(a0 : System.String, a1 : System.String, a2 : System.String) = (3004, GetStringFunc("etNullMemberDeclaringTypeDifferentFromProvidedType",",,,%s,,,%s,,,%s,,,") a0 a1 a2) /// Referenced assembly '%s' has assembly level attribute '%s' but no public type provider classes were found - /// (Originally from ../FSComp.txt:1144) + /// (Originally from ..\FSComp.txt:1146) static member etHostingAssemblyFoundWithoutHosts(a0 : System.String, a1 : System.String) = (3005, GetStringFunc("etHostingAssemblyFoundWithoutHosts",",,,%s,,,%s,,,") a0 a1) /// Type '%s' from type provider '%s' has an empty namespace. Use 'null' for the global namespace. - /// (Originally from ../FSComp.txt:1145) + /// (Originally from ..\FSComp.txt:1147) static member etEmptyNamespaceOfTypeNotAllowed(a0 : System.String, a1 : System.String) = (3006, GetStringFunc("etEmptyNamespaceOfTypeNotAllowed",",,,%s,,,%s,,,") a0 a1) /// Empty namespace found from the type provider '%s'. Use 'null' for the global namespace. - /// (Originally from ../FSComp.txt:1146) + /// (Originally from ..\FSComp.txt:1148) static member etEmptyNamespaceNotAllowed(a0 : System.String) = (3007, GetStringFunc("etEmptyNamespaceNotAllowed",",,,%s,,,") a0) /// Provided type '%s' has 'IsGenericType' as true, but generic types are not supported. - /// (Originally from ../FSComp.txt:1147) + /// (Originally from ..\FSComp.txt:1149) static member etMustNotBeGeneric(a0 : System.String) = (3011, GetStringFunc("etMustNotBeGeneric",",,,%s,,,") a0) /// Provided type '%s' has 'IsArray' as true, but array types are not supported. - /// (Originally from ../FSComp.txt:1148) + /// (Originally from ..\FSComp.txt:1150) static member etMustNotBeAnArray(a0 : System.String) = (3013, GetStringFunc("etMustNotBeAnArray",",,,%s,,,") a0) /// Invalid member '%s' on provided type '%s'. Provided type members must be public, and not be generic, virtual, or abstract. - /// (Originally from ../FSComp.txt:1149) + /// (Originally from ..\FSComp.txt:1151) static member etMethodHasRequirements(a0 : System.String, a1 : System.String) = (3014, GetStringFunc("etMethodHasRequirements",",,,%s,,,%s,,,") a0 a1) /// Invalid member '%s' on provided type '%s'. Only properties, methods and constructors are allowed - /// (Originally from ../FSComp.txt:1150) + /// (Originally from ..\FSComp.txt:1152) static member etUnsupportedMemberKind(a0 : System.String, a1 : System.String) = (3015, GetStringFunc("etUnsupportedMemberKind",",,,%s,,,%s,,,") a0 a1) /// Property '%s' on provided type '%s' has CanRead=true but there was no value from GetGetMethod() - /// (Originally from ../FSComp.txt:1151) + /// (Originally from ..\FSComp.txt:1153) static member etPropertyCanReadButHasNoGetter(a0 : System.String, a1 : System.String) = (3016, GetStringFunc("etPropertyCanReadButHasNoGetter",",,,%s,,,%s,,,") a0 a1) /// Property '%s' on provided type '%s' has CanRead=false but GetGetMethod() returned a method - /// (Originally from ../FSComp.txt:1152) + /// (Originally from ..\FSComp.txt:1154) static member etPropertyHasGetterButNoCanRead(a0 : System.String, a1 : System.String) = (3017, GetStringFunc("etPropertyHasGetterButNoCanRead",",,,%s,,,%s,,,") a0 a1) /// Property '%s' on provided type '%s' has CanWrite=true but there was no value from GetSetMethod() - /// (Originally from ../FSComp.txt:1153) + /// (Originally from ..\FSComp.txt:1155) static member etPropertyCanWriteButHasNoSetter(a0 : System.String, a1 : System.String) = (3018, GetStringFunc("etPropertyCanWriteButHasNoSetter",",,,%s,,,%s,,,") a0 a1) /// Property '%s' on provided type '%s' has CanWrite=false but GetSetMethod() returned a method - /// (Originally from ../FSComp.txt:1154) + /// (Originally from ..\FSComp.txt:1156) static member etPropertyHasSetterButNoCanWrite(a0 : System.String, a1 : System.String) = (3019, GetStringFunc("etPropertyHasSetterButNoCanWrite",",,,%s,,,%s,,,") a0 a1) /// One or more errors seen during provided type setup - /// (Originally from ../FSComp.txt:1155) + /// (Originally from ..\FSComp.txt:1157) static member etOneOrMoreErrorsSeenDuringExtensionTypeSetting() = (3020, GetStringFunc("etOneOrMoreErrorsSeenDuringExtensionTypeSetting",",,,") ) /// Unexpected exception from provided type '%s' member '%s': %s - /// (Originally from ../FSComp.txt:1156) + /// (Originally from ..\FSComp.txt:1158) static member etUnexpectedExceptionFromProvidedTypeMember(a0 : System.String, a1 : System.String, a2 : System.String) = (3021, GetStringFunc("etUnexpectedExceptionFromProvidedTypeMember",",,,%s,,,%s,,,%s,,,") a0 a1 a2) /// Unsupported constant type '%s'. Quotations provided by type providers can only contain simple constants. The implementation of the type provider may need to be adjusted by moving a value declared outside a provided quotation literal to be a 'let' binding inside the quotation literal. - /// (Originally from ../FSComp.txt:1157) + /// (Originally from ..\FSComp.txt:1159) static member etUnsupportedConstantType(a0 : System.String) = (3022, GetStringFunc("etUnsupportedConstantType",",,,%s,,,") a0) /// Unsupported expression '%s' from type provider. If you are the author of this type provider, consider adjusting it to provide a different provided expression. - /// (Originally from ../FSComp.txt:1158) + /// (Originally from ..\FSComp.txt:1160) static member etUnsupportedProvidedExpression(a0 : System.String) = (3025, GetStringFunc("etUnsupportedProvidedExpression",",,,%s,,,") a0) /// Expected provided type named '%s' but provided type has 'Name' with value '%s' - /// (Originally from ../FSComp.txt:1159) + /// (Originally from ..\FSComp.txt:1161) static member etProvidedTypeHasUnexpectedName(a0 : System.String, a1 : System.String) = (3028, GetStringFunc("etProvidedTypeHasUnexpectedName",",,,%s,,,%s,,,") a0 a1) /// Event '%s' on provided type '%s' has no value from GetAddMethod() - /// (Originally from ../FSComp.txt:1160) + /// (Originally from ..\FSComp.txt:1162) static member etEventNoAdd(a0 : System.String, a1 : System.String) = (3029, GetStringFunc("etEventNoAdd",",,,%s,,,%s,,,") a0 a1) /// Event '%s' on provided type '%s' has no value from GetRemoveMethod() - /// (Originally from ../FSComp.txt:1161) + /// (Originally from ..\FSComp.txt:1163) static member etEventNoRemove(a0 : System.String, a1 : System.String) = (3030, GetStringFunc("etEventNoRemove",",,,%s,,,%s,,,") a0 a1) /// Assembly attribute '%s' refers to a designer assembly '%s' which cannot be loaded or doesn't exist. %s - /// (Originally from ../FSComp.txt:1162) + /// (Originally from ..\FSComp.txt:1164) static member etProviderHasWrongDesignerAssembly(a0 : System.String, a1 : System.String, a2 : System.String) = (3031, GetStringFunc("etProviderHasWrongDesignerAssembly",",,,%s,,,%s,,,%s,,,") a0 a1 a2) /// The type provider does not have a valid constructor. A constructor taking either no arguments or one argument of type 'TypeProviderConfig' was expected. - /// (Originally from ../FSComp.txt:1163) + /// (Originally from ..\FSComp.txt:1165) static member etProviderDoesNotHaveValidConstructor() = (3032, GetStringFunc("etProviderDoesNotHaveValidConstructor",",,,") ) /// The type provider '%s' reported an error: %s - /// (Originally from ../FSComp.txt:1164) + /// (Originally from ..\FSComp.txt:1166) static member etProviderError(a0 : System.String, a1 : System.String) = (3033, GetStringFunc("etProviderError",",,,%s,,,%s,,,") a0 a1) /// The type provider '%s' used an invalid parameter in the ParameterExpression: %s - /// (Originally from ../FSComp.txt:1165) + /// (Originally from ..\FSComp.txt:1167) static member etIncorrectParameterExpression(a0 : System.String, a1 : System.String) = (3034, GetStringFunc("etIncorrectParameterExpression",",,,%s,,,%s,,,") a0 a1) /// The type provider '%s' provided a method with a name '%s' and metadata token '%d', which is not reported among its methods of its declaring type '%s' - /// (Originally from ../FSComp.txt:1166) + /// (Originally from ..\FSComp.txt:1168) static member etIncorrectProvidedMethod(a0 : System.String, a1 : System.String, a2 : System.Int32, a3 : System.String) = (3035, GetStringFunc("etIncorrectProvidedMethod",",,,%s,,,%s,,,%d,,,%s,,,") a0 a1 a2 a3) /// The type provider '%s' provided a constructor which is not reported among the constructors of its declaring type '%s' - /// (Originally from ../FSComp.txt:1167) + /// (Originally from ..\FSComp.txt:1169) static member etIncorrectProvidedConstructor(a0 : System.String, a1 : System.String) = (3036, GetStringFunc("etIncorrectProvidedConstructor",",,,%s,,,%s,,,") a0 a1) /// A direct reference to the generated type '%s' is not permitted. Instead, use a type definition, e.g. 'type TypeAlias = '. This indicates that a type provider adds generated types to your assembly. - /// (Originally from ../FSComp.txt:1168) + /// (Originally from ..\FSComp.txt:1170) static member etDirectReferenceToGeneratedTypeNotAllowed(a0 : System.String) = (3039, GetStringFunc("etDirectReferenceToGeneratedTypeNotAllowed",",,,%s,,,") a0) /// Expected provided type with path '%s' but provided type has path '%s' - /// (Originally from ../FSComp.txt:1169) + /// (Originally from ..\FSComp.txt:1171) static member etProvidedTypeHasUnexpectedPath(a0 : System.String, a1 : System.String) = (3041, GetStringFunc("etProvidedTypeHasUnexpectedPath",",,,%s,,,%s,,,") a0 a1) /// Unexpected 'null' return value from provided type '%s' member '%s' - /// (Originally from ../FSComp.txt:1170) + /// (Originally from ..\FSComp.txt:1172) static member etUnexpectedNullFromProvidedTypeMember(a0 : System.String, a1 : System.String) = (3042, GetStringFunc("etUnexpectedNullFromProvidedTypeMember",",,,%s,,,%s,,,") a0 a1) /// Unexpected exception from member '%s' of provided type '%s' member '%s': %s - /// (Originally from ../FSComp.txt:1171) + /// (Originally from ..\FSComp.txt:1173) static member etUnexpectedExceptionFromProvidedMemberMember(a0 : System.String, a1 : System.String, a2 : System.String, a3 : System.String) = (3043, GetStringFunc("etUnexpectedExceptionFromProvidedMemberMember",",,,%s,,,%s,,,%s,,,%s,,,") a0 a1 a2 a3) /// Nested provided types do not take static arguments or generic parameters - /// (Originally from ../FSComp.txt:1172) + /// (Originally from ..\FSComp.txt:1174) static member etNestedProvidedTypesDoNotTakeStaticArgumentsOrGenericParameters() = (3044, GetStringFunc("etNestedProvidedTypesDoNotTakeStaticArgumentsOrGenericParameters",",,,") ) /// Invalid static argument to provided type. Expected an argument of kind '%s'. - /// (Originally from ../FSComp.txt:1173) + /// (Originally from ..\FSComp.txt:1175) static member etInvalidStaticArgument(a0 : System.String) = (3045, GetStringFunc("etInvalidStaticArgument",",,,%s,,,") a0) /// An error occured applying the static arguments to a provided type - /// (Originally from ../FSComp.txt:1174) + /// (Originally from ..\FSComp.txt:1176) static member etErrorApplyingStaticArgumentsToType() = (3046, GetStringFunc("etErrorApplyingStaticArgumentsToType",",,,") ) /// Unknown static argument kind '%s' when resolving a reference to a provided type or method '%s' - /// (Originally from ../FSComp.txt:1175) + /// (Originally from ..\FSComp.txt:1177) static member etUnknownStaticArgumentKind(a0 : System.String, a1 : System.String) = (3047, GetStringFunc("etUnknownStaticArgumentKind",",,,%s,,,%s,,,") a0 a1) /// invalid namespace for provided type - /// (Originally from ../FSComp.txt:1176) + /// (Originally from ..\FSComp.txt:1178) static member invalidNamespaceForProvidedType() = (GetStringFunc("invalidNamespaceForProvidedType",",,,") ) /// invalid full name for provided type - /// (Originally from ../FSComp.txt:1177) + /// (Originally from ..\FSComp.txt:1179) static member invalidFullNameForProvidedType() = (GetStringFunc("invalidFullNameForProvidedType",",,,") ) /// The type provider returned 'null', which is not a valid return value from '%s' - /// (Originally from ../FSComp.txt:1179) + /// (Originally from ..\FSComp.txt:1181) static member etProviderReturnedNull(a0 : System.String) = (3051, GetStringFunc("etProviderReturnedNull",",,,%s,,,") a0) /// The type provider constructor has thrown an exception: %s - /// (Originally from ../FSComp.txt:1180) + /// (Originally from ..\FSComp.txt:1182) static member etTypeProviderConstructorException(a0 : System.String) = (3053, GetStringFunc("etTypeProviderConstructorException",",,,%s,,,") a0) /// Type provider '%s' returned null from GetInvokerExpression. - /// (Originally from ../FSComp.txt:1181) + /// (Originally from ..\FSComp.txt:1183) static member etNullProvidedExpression(a0 : System.String) = (3056, GetStringFunc("etNullProvidedExpression",",,,%s,,,") a0) /// The type provider '%s' returned an invalid type from 'ApplyStaticArguments'. A type with name '%s' was expected, but a type with name '%s' was returned. - /// (Originally from ../FSComp.txt:1182) + /// (Originally from ..\FSComp.txt:1184) static member etProvidedAppliedTypeHadWrongName(a0 : System.String, a1 : System.String, a2 : System.String) = (3057, GetStringFunc("etProvidedAppliedTypeHadWrongName",",,,%s,,,%s,,,%s,,,") a0 a1 a2) /// The type provider '%s' returned an invalid method from 'ApplyStaticArgumentsForMethod'. A method with name '%s' was expected, but a method with name '%s' was returned. - /// (Originally from ../FSComp.txt:1183) + /// (Originally from ..\FSComp.txt:1185) static member etProvidedAppliedMethodHadWrongName(a0 : System.String, a1 : System.String, a2 : System.String) = (3058, GetStringFunc("etProvidedAppliedMethodHadWrongName",",,,%s,,,%s,,,%s,,,") a0 a1 a2) /// This type test or downcast will erase the provided type '%s' to the type '%s' - /// (Originally from ../FSComp.txt:1184) + /// (Originally from ..\FSComp.txt:1186) static member tcTypeTestLossy(a0 : System.String, a1 : System.String) = (3060, GetStringFunc("tcTypeTestLossy",",,,%s,,,%s,,,") a0 a1) /// This downcast will erase the provided type '%s' to the type '%s'. - /// (Originally from ../FSComp.txt:1185) + /// (Originally from ..\FSComp.txt:1187) static member tcTypeCastErased(a0 : System.String, a1 : System.String) = (3061, GetStringFunc("tcTypeCastErased",",,,%s,,,%s,,,") a0 a1) /// This type test with a provided type '%s' is not allowed because this provided type will be erased to '%s' at runtime. - /// (Originally from ../FSComp.txt:1186) + /// (Originally from ..\FSComp.txt:1188) static member tcTypeTestErased(a0 : System.String, a1 : System.String) = (3062, GetStringFunc("tcTypeTestErased",",,,%s,,,%s,,,") a0 a1) /// Cannot inherit from erased provided type - /// (Originally from ../FSComp.txt:1187) + /// (Originally from ..\FSComp.txt:1189) static member tcCannotInheritFromErasedType() = (3063, GetStringFunc("tcCannotInheritFromErasedType",",,,") ) /// Assembly '%s' hase TypeProviderAssembly attribute with invalid value '%s'. The value should be a valid assembly name - /// (Originally from ../FSComp.txt:1188) + /// (Originally from ..\FSComp.txt:1190) static member etInvalidTypeProviderAssemblyName(a0 : System.String, a1 : System.String) = (3065, GetStringFunc("etInvalidTypeProviderAssemblyName",",,,%s,,,%s,,,") a0 a1) /// Invalid member name. Members may not have name '.ctor' or '.cctor' - /// (Originally from ../FSComp.txt:1189) + /// (Originally from ..\FSComp.txt:1191) static member tcInvalidMemberNameCtor() = (3066, GetStringFunc("tcInvalidMemberNameCtor",",,,") ) /// The function or member '%s' is used in a way that requires further type annotations at its definition to ensure consistency of inferred types. The inferred signature is '%s'. - /// (Originally from ../FSComp.txt:1190) + /// (Originally from ..\FSComp.txt:1192) static member tcInferredGenericTypeGivesRiseToInconsistency(a0 : System.String, a1 : System.String) = (3068, GetStringFunc("tcInferredGenericTypeGivesRiseToInconsistency",",,,%s,,,%s,,,") a0 a1) /// The number of type arguments did not match: '%d' given, '%d' expected. This may be related to a previously reported error. - /// (Originally from ../FSComp.txt:1191) + /// (Originally from ..\FSComp.txt:1193) static member tcInvalidTypeArgumentCount(a0 : System.Int32, a1 : System.Int32) = (3069, GetStringFunc("tcInvalidTypeArgumentCount",",,,%d,,,%d,,,") a0 a1) /// Cannot override inherited member '%s' because it is sealed - /// (Originally from ../FSComp.txt:1192) + /// (Originally from ..\FSComp.txt:1194) static member tcCannotOverrideSealedMethod(a0 : System.String) = (3070, GetStringFunc("tcCannotOverrideSealedMethod",",,,%s,,,") a0) /// The type provider '%s' reported an error in the context of provided type '%s', member '%s'. The error: %s - /// (Originally from ../FSComp.txt:1193) + /// (Originally from ..\FSComp.txt:1195) static member etProviderErrorWithContext(a0 : System.String, a1 : System.String, a2 : System.String, a3 : System.String) = (3071, GetStringFunc("etProviderErrorWithContext",",,,%s,,,%s,,,%s,,,%s,,,") a0 a1 a2 a3) /// An exception occurred when accessing the '%s' of a provided type: %s - /// (Originally from ../FSComp.txt:1194) + /// (Originally from ..\FSComp.txt:1196) static member etProvidedTypeWithNameException(a0 : System.String, a1 : System.String) = (3072, GetStringFunc("etProvidedTypeWithNameException",",,,%s,,,%s,,,") a0 a1) /// The '%s' of a provided type was null or empty. - /// (Originally from ../FSComp.txt:1195) + /// (Originally from ..\FSComp.txt:1197) static member etProvidedTypeWithNullOrEmptyName(a0 : System.String) = (3073, GetStringFunc("etProvidedTypeWithNullOrEmptyName",",,,%s,,,") a0) /// Character '%s' is not allowed in provided type name '%s' - /// (Originally from ../FSComp.txt:1196) + /// (Originally from ..\FSComp.txt:1198) static member etIllegalCharactersInTypeName(a0 : System.String, a1 : System.String) = (3075, GetStringFunc("etIllegalCharactersInTypeName",",,,%s,,,%s,,,") a0 a1) /// In queries, '%s' must use a simple pattern - /// (Originally from ../FSComp.txt:1197) + /// (Originally from ..\FSComp.txt:1199) static member tcJoinMustUseSimplePattern(a0 : System.String) = (3077, GetStringFunc("tcJoinMustUseSimplePattern",",,,%s,,,") a0) /// A custom query operation for '%s' is required but not specified - /// (Originally from ../FSComp.txt:1198) + /// (Originally from ..\FSComp.txt:1200) static member tcMissingCustomOperation(a0 : System.String) = (3078, GetStringFunc("tcMissingCustomOperation",",,,%s,,,") a0) /// Named static arguments must come after all unnamed static arguments - /// (Originally from ../FSComp.txt:1199) + /// (Originally from ..\FSComp.txt:1201) static member etBadUnnamedStaticArgs() = (3080, GetStringFunc("etBadUnnamedStaticArgs",",,,") ) /// The static parameter '%s' of the provided type or method '%s' requires a value. Static parameters to type providers may be optionally specified using named arguments, e.g. '%s<%s=...>'. - /// (Originally from ../FSComp.txt:1200) + /// (Originally from ..\FSComp.txt:1202) static member etStaticParameterRequiresAValue(a0 : System.String, a1 : System.String, a2 : System.String, a3 : System.String) = (3081, GetStringFunc("etStaticParameterRequiresAValue",",,,%s,,,%s,,,%s,,,%s,,,") a0 a1 a2 a3) /// No static parameter exists with name '%s' - /// (Originally from ../FSComp.txt:1201) + /// (Originally from ..\FSComp.txt:1203) static member etNoStaticParameterWithName(a0 : System.String) = (3082, GetStringFunc("etNoStaticParameterWithName",",,,%s,,,") a0) /// The static parameter '%s' has already been given a value - /// (Originally from ../FSComp.txt:1202) + /// (Originally from ..\FSComp.txt:1204) static member etStaticParameterAlreadyHasValue(a0 : System.String) = (3083, GetStringFunc("etStaticParameterAlreadyHasValue",",,,%s,,,") a0) /// Multiple static parameters exist with name '%s' - /// (Originally from ../FSComp.txt:1203) + /// (Originally from ..\FSComp.txt:1205) static member etMultipleStaticParameterWithName(a0 : System.String) = (3084, GetStringFunc("etMultipleStaticParameterWithName",",,,%s,,,") a0) /// A custom operation may not be used in conjunction with a non-value or recursive 'let' binding in another part of this computation expression - /// (Originally from ../FSComp.txt:1204) + /// (Originally from ..\FSComp.txt:1206) static member tcCustomOperationMayNotBeUsedInConjunctionWithNonSimpleLetBindings() = (3085, GetStringFunc("tcCustomOperationMayNotBeUsedInConjunctionWithNonSimpleLetBindings",",,,") ) /// A custom operation may not be used in conjunction with 'use', 'try/with', 'try/finally', 'if/then/else' or 'match' operators within this computation expression - /// (Originally from ../FSComp.txt:1205) + /// (Originally from ..\FSComp.txt:1207) static member tcCustomOperationMayNotBeUsedHere() = (3086, GetStringFunc("tcCustomOperationMayNotBeUsedHere",",,,") ) /// The custom operation '%s' refers to a method which is overloaded. The implementations of custom operations may not be overloaded. - /// (Originally from ../FSComp.txt:1206) + /// (Originally from ..\FSComp.txt:1208) static member tcCustomOperationMayNotBeOverloaded(a0 : System.String) = (3087, GetStringFunc("tcCustomOperationMayNotBeOverloaded",",,,%s,,,") a0) /// An if/then/else expression may not be used within queries. Consider using either an if/then expression, or use a sequence expression instead. - /// (Originally from ../FSComp.txt:1207) + /// (Originally from ..\FSComp.txt:1209) static member tcIfThenElseMayNotBeUsedWithinQueries() = (3090, GetStringFunc("tcIfThenElseMayNotBeUsedWithinQueries",",,,") ) /// Invalid argument to 'methodhandleof' during codegen - /// (Originally from ../FSComp.txt:1208) + /// (Originally from ..\FSComp.txt:1210) static member ilxgenUnexpectedArgumentToMethodHandleOfDuringCodegen() = (3091, GetStringFunc("ilxgenUnexpectedArgumentToMethodHandleOfDuringCodegen",",,,") ) /// A reference to a provided type was missing a value for the static parameter '%s'. You may need to recompile one or more referenced assemblies. - /// (Originally from ../FSComp.txt:1209) + /// (Originally from ..\FSComp.txt:1211) static member etProvidedTypeReferenceMissingArgument(a0 : System.String) = (3092, GetStringFunc("etProvidedTypeReferenceMissingArgument",",,,%s,,,") a0) /// A reference to a provided type had an invalid value '%s' for a static parameter. You may need to recompile one or more referenced assemblies. - /// (Originally from ../FSComp.txt:1210) + /// (Originally from ..\FSComp.txt:1212) static member etProvidedTypeReferenceInvalidText(a0 : System.String) = (3093, GetStringFunc("etProvidedTypeReferenceInvalidText",",,,%s,,,") a0) /// '%s' is not used correctly. This is a custom operation in this query or computation expression. - /// (Originally from ../FSComp.txt:1211) + /// (Originally from ..\FSComp.txt:1213) static member tcCustomOperationNotUsedCorrectly(a0 : System.String) = (3095, GetStringFunc("tcCustomOperationNotUsedCorrectly",",,,%s,,,") a0) /// '%s' is not used correctly. Usage: %s. This is a custom operation in this query or computation expression. - /// (Originally from ../FSComp.txt:1212) + /// (Originally from ..\FSComp.txt:1214) static member tcCustomOperationNotUsedCorrectly2(a0 : System.String, a1 : System.String) = (3095, GetStringFunc("tcCustomOperationNotUsedCorrectly2",",,,%s,,,%s,,,") a0 a1) /// %s var in collection %s (outerKey = innerKey). Note that parentheses are required after '%s' - /// (Originally from ../FSComp.txt:1213) + /// (Originally from ..\FSComp.txt:1215) static member customOperationTextLikeJoin(a0 : System.String, a1 : System.String, a2 : System.String) = (GetStringFunc("customOperationTextLikeJoin",",,,%s,,,%s,,,%s,,,") a0 a1 a2) /// %s var in collection %s (outerKey = innerKey) into group. Note that parentheses are required after '%s' - /// (Originally from ../FSComp.txt:1214) + /// (Originally from ..\FSComp.txt:1216) static member customOperationTextLikeGroupJoin(a0 : System.String, a1 : System.String, a2 : System.String) = (GetStringFunc("customOperationTextLikeGroupJoin",",,,%s,,,%s,,,%s,,,") a0 a1 a2) /// %s var in collection - /// (Originally from ../FSComp.txt:1215) + /// (Originally from ..\FSComp.txt:1217) static member customOperationTextLikeZip(a0 : System.String) = (GetStringFunc("customOperationTextLikeZip",",,,%s,,,") a0) /// '%s' must be followed by a variable name. Usage: %s. - /// (Originally from ../FSComp.txt:1216) + /// (Originally from ..\FSComp.txt:1218) static member tcBinaryOperatorRequiresVariable(a0 : System.String, a1 : System.String) = (3096, GetStringFunc("tcBinaryOperatorRequiresVariable",",,,%s,,,%s,,,") a0 a1) /// Incorrect syntax for '%s'. Usage: %s. - /// (Originally from ../FSComp.txt:1217) + /// (Originally from ..\FSComp.txt:1219) static member tcOperatorIncorrectSyntax(a0 : System.String, a1 : System.String) = (3097, GetStringFunc("tcOperatorIncorrectSyntax",",,,%s,,,%s,,,") a0 a1) /// '%s' must come after a 'for' selection clause and be followed by the rest of the query. Syntax: ... %s ... - /// (Originally from ../FSComp.txt:1218) + /// (Originally from ..\FSComp.txt:1220) static member tcBinaryOperatorRequiresBody(a0 : System.String, a1 : System.String) = (3098, GetStringFunc("tcBinaryOperatorRequiresBody",",,,%s,,,%s,,,") a0 a1) /// '%s' is used with an incorrect number of arguments. This is a custom operation in this query or computation expression. Expected %d argument(s), but given %d. - /// (Originally from ../FSComp.txt:1219) + /// (Originally from ..\FSComp.txt:1221) static member tcCustomOperationHasIncorrectArgCount(a0 : System.String, a1 : System.Int32, a2 : System.Int32) = (3099, GetStringFunc("tcCustomOperationHasIncorrectArgCount",",,,%s,,,%d,,,%d,,,") a0 a1 a2) /// Expected an expression after this point - /// (Originally from ../FSComp.txt:1220) + /// (Originally from ..\FSComp.txt:1222) static member parsExpectedExpressionAfterToken() = (3100, GetStringFunc("parsExpectedExpressionAfterToken",",,,") ) /// Expected a type after this point - /// (Originally from ../FSComp.txt:1221) + /// (Originally from ..\FSComp.txt:1223) static member parsExpectedTypeAfterToken() = (3101, GetStringFunc("parsExpectedTypeAfterToken",",,,") ) /// Unmatched '[<'. Expected closing '>]' - /// (Originally from ../FSComp.txt:1222) + /// (Originally from ..\FSComp.txt:1224) static member parsUnmatchedLBrackLess() = (3102, GetStringFunc("parsUnmatchedLBrackLess",",,,") ) /// Unexpected end of input in 'match' expression. Expected 'match with | -> | -> ...'. - /// (Originally from ../FSComp.txt:1223) + /// (Originally from ..\FSComp.txt:1225) static member parsUnexpectedEndOfFileMatch() = (3103, GetStringFunc("parsUnexpectedEndOfFileMatch",",,,") ) /// Unexpected end of input in 'try' expression. Expected 'try with ' or 'try finally '. - /// (Originally from ../FSComp.txt:1224) + /// (Originally from ..\FSComp.txt:1226) static member parsUnexpectedEndOfFileTry() = (3104, GetStringFunc("parsUnexpectedEndOfFileTry",",,,") ) /// Unexpected end of input in 'while' expression. Expected 'while do '. - /// (Originally from ../FSComp.txt:1225) + /// (Originally from ..\FSComp.txt:1227) static member parsUnexpectedEndOfFileWhile() = (3105, GetStringFunc("parsUnexpectedEndOfFileWhile",",,,") ) /// Unexpected end of input in 'for' expression. Expected 'for in do '. - /// (Originally from ../FSComp.txt:1226) + /// (Originally from ..\FSComp.txt:1228) static member parsUnexpectedEndOfFileFor() = (3106, GetStringFunc("parsUnexpectedEndOfFileFor",",,,") ) /// Unexpected end of input in 'match' or 'try' expression - /// (Originally from ../FSComp.txt:1227) + /// (Originally from ..\FSComp.txt:1229) static member parsUnexpectedEndOfFileWith() = (3107, GetStringFunc("parsUnexpectedEndOfFileWith",",,,") ) /// Unexpected end of input in 'then' branch of conditional expression. Expected 'if then ' or 'if then else '. - /// (Originally from ../FSComp.txt:1228) + /// (Originally from ..\FSComp.txt:1230) static member parsUnexpectedEndOfFileThen() = (3108, GetStringFunc("parsUnexpectedEndOfFileThen",",,,") ) /// Unexpected end of input in 'else' branch of conditional expression. Expected 'if then ' or 'if then else '. - /// (Originally from ../FSComp.txt:1229) + /// (Originally from ..\FSComp.txt:1231) static member parsUnexpectedEndOfFileElse() = (3109, GetStringFunc("parsUnexpectedEndOfFileElse",",,,") ) /// Unexpected end of input in body of lambda expression. Expected 'fun ... -> '. - /// (Originally from ../FSComp.txt:1230) + /// (Originally from ..\FSComp.txt:1232) static member parsUnexpectedEndOfFileFunBody() = (3110, GetStringFunc("parsUnexpectedEndOfFileFunBody",",,,") ) /// Unexpected end of input in type arguments - /// (Originally from ../FSComp.txt:1231) + /// (Originally from ..\FSComp.txt:1233) static member parsUnexpectedEndOfFileTypeArgs() = (3111, GetStringFunc("parsUnexpectedEndOfFileTypeArgs",",,,") ) /// Unexpected end of input in type signature - /// (Originally from ../FSComp.txt:1232) + /// (Originally from ..\FSComp.txt:1234) static member parsUnexpectedEndOfFileTypeSignature() = (3112, GetStringFunc("parsUnexpectedEndOfFileTypeSignature",",,,") ) /// Unexpected end of input in type definition - /// (Originally from ../FSComp.txt:1233) + /// (Originally from ..\FSComp.txt:1235) static member parsUnexpectedEndOfFileTypeDefinition() = (3113, GetStringFunc("parsUnexpectedEndOfFileTypeDefinition",",,,") ) /// Unexpected end of input in object members - /// (Originally from ../FSComp.txt:1234) + /// (Originally from ..\FSComp.txt:1236) static member parsUnexpectedEndOfFileObjectMembers() = (3114, GetStringFunc("parsUnexpectedEndOfFileObjectMembers",",,,") ) /// Unexpected end of input in value, function or member definition - /// (Originally from ../FSComp.txt:1235) + /// (Originally from ..\FSComp.txt:1237) static member parsUnexpectedEndOfFileDefinition() = (3115, GetStringFunc("parsUnexpectedEndOfFileDefinition",",,,") ) /// Unexpected end of input in expression - /// (Originally from ../FSComp.txt:1236) + /// (Originally from ..\FSComp.txt:1238) static member parsUnexpectedEndOfFileExpression() = (3116, GetStringFunc("parsUnexpectedEndOfFileExpression",",,,") ) /// Unexpected end of type. Expected a name after this point. - /// (Originally from ../FSComp.txt:1237) + /// (Originally from ..\FSComp.txt:1239) static member parsExpectedNameAfterToken() = (3117, GetStringFunc("parsExpectedNameAfterToken",",,,") ) /// Incomplete value or function definition. If this is in an expression, the body of the expression must be indented to the same column as the 'let' keyword. - /// (Originally from ../FSComp.txt:1238) + /// (Originally from ..\FSComp.txt:1240) static member parsUnmatchedLet() = (3118, GetStringFunc("parsUnmatchedLet",",,,") ) /// Incomplete value definition. If this is in an expression, the body of the expression must be indented to the same column as the 'let!' keyword. - /// (Originally from ../FSComp.txt:1239) + /// (Originally from ..\FSComp.txt:1241) static member parsUnmatchedLetBang() = (3119, GetStringFunc("parsUnmatchedLetBang",",,,") ) /// Incomplete value definition. If this is in an expression, the body of the expression must be indented to the same column as the 'use!' keyword. - /// (Originally from ../FSComp.txt:1240) + /// (Originally from ..\FSComp.txt:1242) static member parsUnmatchedUseBang() = (3120, GetStringFunc("parsUnmatchedUseBang",",,,") ) /// Incomplete value definition. If this is in an expression, the body of the expression must be indented to the same column as the 'use' keyword. - /// (Originally from ../FSComp.txt:1241) + /// (Originally from ..\FSComp.txt:1243) static member parsUnmatchedUse() = (3121, GetStringFunc("parsUnmatchedUse",",,,") ) /// Missing 'do' in 'while' expression. Expected 'while do '. - /// (Originally from ../FSComp.txt:1242) + /// (Originally from ..\FSComp.txt:1244) static member parsWhileDoExpected() = (3122, GetStringFunc("parsWhileDoExpected",",,,") ) /// Missing 'do' in 'for' expression. Expected 'for in do '. - /// (Originally from ../FSComp.txt:1243) + /// (Originally from ..\FSComp.txt:1245) static member parsForDoExpected() = (3123, GetStringFunc("parsForDoExpected",",,,") ) /// Invalid join relation in '%s'. Expected 'expr expr', where is =, =?, ?= or ?=?. - /// (Originally from ../FSComp.txt:1244) + /// (Originally from ..\FSComp.txt:1246) static member tcInvalidRelationInJoin(a0 : System.String) = (3125, GetStringFunc("tcInvalidRelationInJoin",",,,%s,,,") a0) /// Calls - /// (Originally from ../FSComp.txt:1245) + /// (Originally from ..\FSComp.txt:1247) static member typeInfoCallsWord() = (GetStringFunc("typeInfoCallsWord",",,,") ) /// Invalid number of generic arguments to type '%s' in provided type. Expected '%d' arguments, given '%d'. - /// (Originally from ../FSComp.txt:1246) + /// (Originally from ..\FSComp.txt:1248) static member impInvalidNumberOfGenericArguments(a0 : System.String, a1 : System.Int32, a2 : System.Int32) = (3126, GetStringFunc("impInvalidNumberOfGenericArguments",",,,%s,,,%d,,,%d,,,") a0 a1 a2) /// Invalid value '%s' for unit-of-measure parameter '%s' - /// (Originally from ../FSComp.txt:1247) + /// (Originally from ..\FSComp.txt:1249) static member impInvalidMeasureArgument1(a0 : System.String, a1 : System.String) = (3127, GetStringFunc("impInvalidMeasureArgument1",",,,%s,,,%s,,,") a0 a1) /// Invalid value unit-of-measure parameter '%s' - /// (Originally from ../FSComp.txt:1248) + /// (Originally from ..\FSComp.txt:1250) static member impInvalidMeasureArgument2(a0 : System.String) = (3127, GetStringFunc("impInvalidMeasureArgument2",",,,%s,,,") a0) /// Property '%s' on provided type '%s' is neither readable nor writable as it has CanRead=false and CanWrite=false - /// (Originally from ../FSComp.txt:1249) + /// (Originally from ..\FSComp.txt:1251) static member etPropertyNeedsCanWriteOrCanRead(a0 : System.String, a1 : System.String) = (3128, GetStringFunc("etPropertyNeedsCanWriteOrCanRead",",,,%s,,,%s,,,") a0 a1) /// A use of 'into' must be followed by the remainder of the computation - /// (Originally from ../FSComp.txt:1250) + /// (Originally from ..\FSComp.txt:1252) static member tcIntoNeedsRestOfQuery() = (3129, GetStringFunc("tcIntoNeedsRestOfQuery",",,,") ) /// The operator '%s' does not accept the use of 'into' - /// (Originally from ../FSComp.txt:1251) + /// (Originally from ..\FSComp.txt:1253) static member tcOperatorDoesntAcceptInto(a0 : System.String) = (3130, GetStringFunc("tcOperatorDoesntAcceptInto",",,,%s,,,") a0) /// The definition of the custom operator '%s' does not use a valid combination of attribute flags - /// (Originally from ../FSComp.txt:1252) + /// (Originally from ..\FSComp.txt:1254) static member tcCustomOperationInvalid(a0 : System.String) = (3131, GetStringFunc("tcCustomOperationInvalid",",,,%s,,,") a0) /// This type definition may not have the 'CLIMutable' attribute. Only record types may have this attribute. - /// (Originally from ../FSComp.txt:1253) + /// (Originally from ..\FSComp.txt:1255) static member tcThisTypeMayNotHaveACLIMutableAttribute() = (3132, GetStringFunc("tcThisTypeMayNotHaveACLIMutableAttribute",",,,") ) /// 'member val' definitions are only permitted in types with a primary constructor. Consider adding arguments to your type definition, e.g. 'type X(args) = ...'. - /// (Originally from ../FSComp.txt:1254) + /// (Originally from ..\FSComp.txt:1256) static member tcAutoPropertyRequiresImplicitConstructionSequence() = (3133, GetStringFunc("tcAutoPropertyRequiresImplicitConstructionSequence",",,,") ) /// Property definitions may not be declared mutable. To indicate that this property can be set, use 'member val PropertyName = expr with get,set'. - /// (Originally from ../FSComp.txt:1255) + /// (Originally from ..\FSComp.txt:1257) static member parsMutableOnAutoPropertyShouldBeGetSet() = (3134, GetStringFunc("parsMutableOnAutoPropertyShouldBeGetSet",",,,") ) /// To indicate that this property can be set, use 'member val PropertyName = expr with get,set'. - /// (Originally from ../FSComp.txt:1256) + /// (Originally from ..\FSComp.txt:1258) static member parsMutableOnAutoPropertyShouldBeGetSetNotJustSet() = (3135, GetStringFunc("parsMutableOnAutoPropertyShouldBeGetSetNotJustSet",",,,") ) /// Type '%s' is illegal because in byref, T cannot contain byref types. - /// (Originally from ../FSComp.txt:1257) + /// (Originally from ..\FSComp.txt:1259) static member chkNoByrefsOfByrefs(a0 : System.String) = (3136, GetStringFunc("chkNoByrefsOfByrefs",",,,%s,,,") a0) /// F# supports array ranks between 1 and 32. The value %d is not allowed. - /// (Originally from ../FSComp.txt:1258) + /// (Originally from ..\FSComp.txt:1260) static member tastopsMaxArrayThirtyTwo(a0 : System.Int32) = (3138, GetStringFunc("tastopsMaxArrayThirtyTwo",",,,%d,,,") a0) /// In queries, use the form 'for x in n .. m do ...' for ranging over integers - /// (Originally from ../FSComp.txt:1259) + /// (Originally from ..\FSComp.txt:1261) static member tcNoIntegerForLoopInQuery() = (3139, GetStringFunc("tcNoIntegerForLoopInQuery",",,,") ) /// 'while' expressions may not be used in queries - /// (Originally from ../FSComp.txt:1260) + /// (Originally from ..\FSComp.txt:1262) static member tcNoWhileInQuery() = (3140, GetStringFunc("tcNoWhileInQuery",",,,") ) /// 'try/finally' expressions may not be used in queries - /// (Originally from ../FSComp.txt:1261) + /// (Originally from ..\FSComp.txt:1263) static member tcNoTryFinallyInQuery() = (3141, GetStringFunc("tcNoTryFinallyInQuery",",,,") ) /// 'use' expressions may not be used in queries - /// (Originally from ../FSComp.txt:1262) + /// (Originally from ..\FSComp.txt:1264) static member tcUseMayNotBeUsedInQueries() = (3142, GetStringFunc("tcUseMayNotBeUsedInQueries",",,,") ) /// 'let!', 'use!' and 'do!' expressions may not be used in queries - /// (Originally from ../FSComp.txt:1263) + /// (Originally from ..\FSComp.txt:1265) static member tcBindMayNotBeUsedInQueries() = (3143, GetStringFunc("tcBindMayNotBeUsedInQueries",",,,") ) /// 'return' and 'return!' may not be used in queries - /// (Originally from ../FSComp.txt:1264) + /// (Originally from ..\FSComp.txt:1266) static member tcReturnMayNotBeUsedInQueries() = (3144, GetStringFunc("tcReturnMayNotBeUsedInQueries",",,,") ) /// This is not a known query operator. Query operators are identifiers such as 'select', 'where', 'sortBy', 'thenBy', 'groupBy', 'groupValBy', 'join', 'groupJoin', 'sumBy' and 'averageBy', defined using corresponding methods on the 'QueryBuilder' type. - /// (Originally from ../FSComp.txt:1265) + /// (Originally from ..\FSComp.txt:1267) static member tcUnrecognizedQueryOperator() = (3145, GetStringFunc("tcUnrecognizedQueryOperator",",,,") ) /// 'try/with' expressions may not be used in queries - /// (Originally from ../FSComp.txt:1266) + /// (Originally from ..\FSComp.txt:1268) static member tcTryWithMayNotBeUsedInQueries() = (3146, GetStringFunc("tcTryWithMayNotBeUsedInQueries",",,,") ) /// This 'let' definition may not be used in a query. Only simple value definitions may be used in queries. - /// (Originally from ../FSComp.txt:1267) + /// (Originally from ..\FSComp.txt:1269) static member tcNonSimpleLetBindingInQuery() = (3147, GetStringFunc("tcNonSimpleLetBindingInQuery",",,,") ) /// Too many static parameters. Expected at most %d parameters, but got %d unnamed and %d named parameters. - /// (Originally from ../FSComp.txt:1268) + /// (Originally from ..\FSComp.txt:1270) static member etTooManyStaticParameters(a0 : System.Int32, a1 : System.Int32, a2 : System.Int32) = (3148, GetStringFunc("etTooManyStaticParameters",",,,%d,,,%d,,,%d,,,") a0 a1 a2) /// Invalid provided literal value '%s' - /// (Originally from ../FSComp.txt:1269) + /// (Originally from ..\FSComp.txt:1271) static member infosInvalidProvidedLiteralValue(a0 : System.String) = (3149, GetStringFunc("infosInvalidProvidedLiteralValue",",,,%s,,,") a0) /// The 'anycpu32bitpreferred' platform can only be used with EXE targets. You must use 'anycpu' instead. - /// (Originally from ../FSComp.txt:1270) + /// (Originally from ..\FSComp.txt:1272) static member invalidPlatformTarget() = (3150, GetStringFunc("invalidPlatformTarget",",,,") ) /// This member, function or value declaration may not be declared 'inline' - /// (Originally from ../FSComp.txt:1271) + /// (Originally from ..\FSComp.txt:1273) static member tcThisValueMayNotBeInlined() = (3151, GetStringFunc("tcThisValueMayNotBeInlined",",,,") ) /// The provider '%s' returned a non-generated type '%s' in the context of a set of generated types. Consider adjusting the type provider to only return generated types. - /// (Originally from ../FSComp.txt:1272) + /// (Originally from ..\FSComp.txt:1274) static member etErasedTypeUsedInGeneration(a0 : System.String, a1 : System.String) = (3152, GetStringFunc("etErasedTypeUsedInGeneration",",,,%s,,,%s,,,") a0 a1) /// Arguments to query operators may require parentheses, e.g. 'where (x > y)' or 'groupBy (x.Length / 10)' - /// (Originally from ../FSComp.txt:1273) + /// (Originally from ..\FSComp.txt:1275) static member tcUnrecognizedQueryBinaryOperator() = (3153, GetStringFunc("tcUnrecognizedQueryBinaryOperator",",,,") ) /// A quotation may not involve an assignment to or taking the address of a captured local variable - /// (Originally from ../FSComp.txt:1274) + /// (Originally from ..\FSComp.txt:1276) static member crefNoSetOfHole() = (3155, GetStringFunc("crefNoSetOfHole",",,,") ) /// + 1 overload - /// (Originally from ../FSComp.txt:1275) + /// (Originally from ..\FSComp.txt:1277) static member nicePrintOtherOverloads1() = (GetStringFunc("nicePrintOtherOverloads1",",,,") ) /// + %d overloads - /// (Originally from ../FSComp.txt:1276) + /// (Originally from ..\FSComp.txt:1278) static member nicePrintOtherOverloadsN(a0 : System.Int32) = (GetStringFunc("nicePrintOtherOverloadsN",",,,%d,,,") a0) /// Erased to - /// (Originally from ../FSComp.txt:1277) + /// (Originally from ..\FSComp.txt:1279) static member erasedTo() = (GetStringFunc("erasedTo",",,,") ) /// Unexpected token '%s' or incomplete expression - /// (Originally from ../FSComp.txt:1278) + /// (Originally from ..\FSComp.txt:1280) static member parsUnfinishedExpression(a0 : System.String) = (3156, GetStringFunc("parsUnfinishedExpression",",,,%s,,,") a0) /// Cannot find code target for this attribute, possibly because the code after the attribute is incomplete. - /// (Originally from ../FSComp.txt:1279) + /// (Originally from ..\FSComp.txt:1281) static member parsAttributeOnIncompleteCode() = (3158, GetStringFunc("parsAttributeOnIncompleteCode",",,,") ) /// Type name cannot be empty. - /// (Originally from ../FSComp.txt:1280) + /// (Originally from ..\FSComp.txt:1282) static member parsTypeNameCannotBeEmpty() = (3159, GetStringFunc("parsTypeNameCannotBeEmpty",",,,") ) /// Problem reading assembly '%s': %s - /// (Originally from ../FSComp.txt:1281) + /// (Originally from ..\FSComp.txt:1283) static member buildProblemReadingAssembly(a0 : System.String, a1 : System.String) = (3160, GetStringFunc("buildProblemReadingAssembly",",,,%s,,,%s,,,") a0 a1) /// Invalid provided field. Provided fields of erased provided types must be literals. - /// (Originally from ../FSComp.txt:1282) + /// (Originally from ..\FSComp.txt:1284) static member tcTPFieldMustBeLiteral() = (3161, GetStringFunc("tcTPFieldMustBeLiteral",",,,") ) /// (loading description...) - /// (Originally from ../FSComp.txt:1283) + /// (Originally from ..\FSComp.txt:1285) static member loadingDescription() = (GetStringFunc("loadingDescription",",,,") ) /// (description unavailable...) - /// (Originally from ../FSComp.txt:1284) + /// (Originally from ..\FSComp.txt:1286) static member descriptionUnavailable() = (GetStringFunc("descriptionUnavailable",",,,") ) /// A type variable has been constrained by multiple different class types. A type variable may only have one class constraint. - /// (Originally from ../FSComp.txt:1285) + /// (Originally from ..\FSComp.txt:1287) static member chkTyparMultipleClassConstraints() = (3162, GetStringFunc("chkTyparMultipleClassConstraints",",,,") ) /// 'match' expressions may not be used in queries - /// (Originally from ../FSComp.txt:1286) + /// (Originally from ..\FSComp.txt:1288) static member tcMatchMayNotBeUsedWithQuery() = (3163, GetStringFunc("tcMatchMayNotBeUsedWithQuery",",,,") ) /// Infix operator member '%s' has %d initial argument(s). Expected a tuple of 3 arguments - /// (Originally from ../FSComp.txt:1287) + /// (Originally from ..\FSComp.txt:1289) static member memberOperatorDefinitionWithNonTripleArgument(a0 : System.String, a1 : System.Int32) = (3164, GetStringFunc("memberOperatorDefinitionWithNonTripleArgument",",,,%s,,,%d,,,") a0 a1) /// The operator '%s' cannot be resolved. Consider opening the module 'Microsoft.FSharp.Linq.NullableOperators'. - /// (Originally from ../FSComp.txt:1288) + /// (Originally from ..\FSComp.txt:1290) static member cannotResolveNullableOperators(a0 : System.String) = (3165, GetStringFunc("cannotResolveNullableOperators",",,,%s,,,") a0) /// '%s' must be followed by 'in'. Usage: %s. - /// (Originally from ../FSComp.txt:1289) + /// (Originally from ..\FSComp.txt:1291) static member tcOperatorRequiresIn(a0 : System.String, a1 : System.String) = (3167, GetStringFunc("tcOperatorRequiresIn",",,,%s,,,%s,,,") a0 a1) /// Neither 'member val' nor 'override val' definitions are permitted in object expressions. - /// (Originally from ../FSComp.txt:1290) + /// (Originally from ..\FSComp.txt:1292) static member parsIllegalMemberVarInObjectImplementation() = (3168, GetStringFunc("parsIllegalMemberVarInObjectImplementation",",,,") ) /// Copy-and-update record expressions must include at least one field. - /// (Originally from ../FSComp.txt:1291) + /// (Originally from ..\FSComp.txt:1293) static member tcEmptyCopyAndUpdateRecordInvalid() = (3169, GetStringFunc("tcEmptyCopyAndUpdateRecordInvalid",",,,") ) /// '_' cannot be used as field name - /// (Originally from ../FSComp.txt:1292) + /// (Originally from ..\FSComp.txt:1294) static member parsUnderscoreInvalidFieldName() = (3170, GetStringFunc("parsUnderscoreInvalidFieldName",",,,") ) /// The provided types generated by this use of a type provider may not be used from other F# assemblies and should be marked internal or private. Consider using 'type internal TypeName = ...' or 'type private TypeName = ...'. - /// (Originally from ../FSComp.txt:1293) + /// (Originally from ..\FSComp.txt:1295) static member tcGeneratedTypesShouldBeInternalOrPrivate() = (3171, GetStringFunc("tcGeneratedTypesShouldBeInternalOrPrivate",",,,") ) /// A property's getter and setter must have the same type. Property '%s' has getter of type '%s' but setter of type '%s'. - /// (Originally from ../FSComp.txt:1294) + /// (Originally from ..\FSComp.txt:1296) static member chkGetterAndSetterHaveSamePropertyType(a0 : System.String, a1 : System.String, a2 : System.String) = (3172, GetStringFunc("chkGetterAndSetterHaveSamePropertyType",",,,%s,,,%s,,,%s,,,") a0 a1 a2) /// Array method '%s' is supplied by the runtime and cannot be directly used in code. For operations with array elements consider using family of GetArray/SetArray functions from LanguagePrimitives.IntrinsicFunctions module. - /// (Originally from ../FSComp.txt:1295) + /// (Originally from ..\FSComp.txt:1297) static member tcRuntimeSuppliedMethodCannotBeUsedInUserCode(a0 : System.String) = (3173, GetStringFunc("tcRuntimeSuppliedMethodCannotBeUsedInUserCode",",,,%s,,,") a0) /// Union case/exception '%s' does not have field named '%s'. - /// (Originally from ../FSComp.txt:1296) + /// (Originally from ..\FSComp.txt:1298) static member tcUnionCaseConstructorDoesNotHaveFieldWithGivenName(a0 : System.String, a1 : System.String) = (3174, GetStringFunc("tcUnionCaseConstructorDoesNotHaveFieldWithGivenName",",,,%s,,,%s,,,") a0 a1) /// Union case/exception field '%s' cannot be used more than once. - /// (Originally from ../FSComp.txt:1297) + /// (Originally from ..\FSComp.txt:1299) static member tcUnionCaseFieldCannotBeUsedMoreThanOnce(a0 : System.String) = (3175, GetStringFunc("tcUnionCaseFieldCannotBeUsedMoreThanOnce",",,,%s,,,") a0) /// Named field '%s' is used more than once. - /// (Originally from ../FSComp.txt:1298) + /// (Originally from ..\FSComp.txt:1300) static member tcFieldNameIsUsedModeThanOnce(a0 : System.String) = (3176, GetStringFunc("tcFieldNameIsUsedModeThanOnce",",,,%s,,,") a0) /// Named field '%s' conflicts with autogenerated name for anonymous field. - /// (Originally from ../FSComp.txt:1299) + /// (Originally from ..\FSComp.txt:1301) static member tcFieldNameConflictsWithGeneratedNameForAnonymousField(a0 : System.String) = (3176, GetStringFunc("tcFieldNameConflictsWithGeneratedNameForAnonymousField",",,,%s,,,") a0) /// This literal expression or attribute argument results in an arithmetic overflow. - /// (Originally from ../FSComp.txt:1300) + /// (Originally from ..\FSComp.txt:1302) static member tastConstantExpressionOverflow() = (3177, GetStringFunc("tastConstantExpressionOverflow",",,,") ) /// This is not valid literal expression. The [] attribute will be ignored. - /// (Originally from ../FSComp.txt:1301) + /// (Originally from ..\FSComp.txt:1303) static member tcIllegalStructTypeForConstantExpression() = (3178, GetStringFunc("tcIllegalStructTypeForConstantExpression",",,,") ) /// System.Runtime.InteropServices assembly is required to use UnknownWrapper\DispatchWrapper classes. - /// (Originally from ../FSComp.txt:1302) + /// (Originally from ..\FSComp.txt:1304) static member fscSystemRuntimeInteropServicesIsRequired() = (3179, GetStringFunc("fscSystemRuntimeInteropServicesIsRequired",",,,") ) /// The mutable local '%s' is implicitly allocated as a reference cell because it has been captured by a closure. This warning is for informational purposes only to indicate where implicit allocations are performed. - /// (Originally from ../FSComp.txt:1303) + /// (Originally from ..\FSComp.txt:1305) static member abImplicitHeapAllocation(a0 : System.String) = (3180, GetStringFunc("abImplicitHeapAllocation",",,,%s,,,") a0) /// A type provider implemented GetStaticParametersForMethod, but ApplyStaticArgumentsForMethod was not implemented or invalid - /// (Originally from ../FSComp.txt:1304) + /// (Originally from ..\FSComp.txt:1306) static member estApplyStaticArgumentsForMethodNotImplemented() = (GetStringFunc("estApplyStaticArgumentsForMethodNotImplemented",",,,") ) /// An error occured applying the static arguments to a provided method - /// (Originally from ../FSComp.txt:1305) + /// (Originally from ..\FSComp.txt:1307) static member etErrorApplyingStaticArgumentsToMethod() = (3181, GetStringFunc("etErrorApplyingStaticArgumentsToMethod",",,,") ) /// Unexpected character '%s' in preprocessor expression - /// (Originally from ../FSComp.txt:1306) + /// (Originally from ..\FSComp.txt:1308) static member pplexUnexpectedChar(a0 : System.String) = (3182, GetStringFunc("pplexUnexpectedChar",",,,%s,,,") a0) /// Unexpected token '%s' in preprocessor expression - /// (Originally from ../FSComp.txt:1307) + /// (Originally from ..\FSComp.txt:1309) static member ppparsUnexpectedToken(a0 : System.String) = (3183, GetStringFunc("ppparsUnexpectedToken",",,,%s,,,") a0) /// Incomplete preprocessor expression - /// (Originally from ../FSComp.txt:1308) + /// (Originally from ..\FSComp.txt:1310) static member ppparsIncompleteExpression() = (3184, GetStringFunc("ppparsIncompleteExpression",",,,") ) /// Missing token '%s' in preprocessor expression - /// (Originally from ../FSComp.txt:1309) + /// (Originally from ..\FSComp.txt:1311) static member ppparsMissingToken(a0 : System.String) = (3185, GetStringFunc("ppparsMissingToken",",,,%s,,,") a0) /// An error occurred while reading the F# metadata node at position %d in table '%s' of assembly '%s'. The node had no matching declaration. Please report this warning. You may need to recompile the F# assembly you are using. - /// (Originally from ../FSComp.txt:1310) + /// (Originally from ..\FSComp.txt:1312) static member pickleMissingDefinition(a0 : System.Int32, a1 : System.String, a2 : System.String) = (3186, GetStringFunc("pickleMissingDefinition",",,,%d,,,%s,,,%s,,,") a0 a1 a2) /// Type inference caused the type variable %s to escape its scope. Consider adding an explicit type parameter declaration or adjusting your code to be less generic. - /// (Originally from ../FSComp.txt:1311) + /// (Originally from ..\FSComp.txt:1313) static member checkNotSufficientlyGenericBecauseOfScope(a0 : System.String) = (3187, GetStringFunc("checkNotSufficientlyGenericBecauseOfScope",",,,%s,,,") a0) /// Type inference caused an inference type variable to escape its scope. Consider adding type annotations to make your code less generic. - /// (Originally from ../FSComp.txt:1312) + /// (Originally from ..\FSComp.txt:1314) static member checkNotSufficientlyGenericBecauseOfScopeAnon() = (3188, GetStringFunc("checkNotSufficientlyGenericBecauseOfScopeAnon",",,,") ) /// Redundant arguments are being ignored in function '%s'. Expected %d but got %d arguments. - /// (Originally from ../FSComp.txt:1313) + /// (Originally from ..\FSComp.txt:1315) static member checkRaiseFamilyFunctionArgumentCount(a0 : System.String, a1 : System.Int32, a2 : System.Int32) = (3189, GetStringFunc("checkRaiseFamilyFunctionArgumentCount",",,,%s,,,%d,,,%d,,,") a0 a1 a2) /// Lowercase literal '%s' is being shadowed by a new pattern with the same name. Only uppercase and module-prefixed literals can be used as named patterns. - /// (Originally from ../FSComp.txt:1314) + /// (Originally from ..\FSComp.txt:1316) static member checkLowercaseLiteralBindingInPattern(a0 : System.String) = (3190, GetStringFunc("checkLowercaseLiteralBindingInPattern",",,,%s,,,") a0) /// This literal pattern does not take arguments - /// (Originally from ../FSComp.txt:1315) + /// (Originally from ..\FSComp.txt:1317) static member tcLiteralDoesNotTakeArguments() = (3191, GetStringFunc("tcLiteralDoesNotTakeArguments",",,,") ) /// Constructors are not permitted as extension members - they must be defined as part of the original definition of the type - /// (Originally from ../FSComp.txt:1316) + /// (Originally from ..\FSComp.txt:1318) static member tcConstructorsIllegalInAugmentation() = (3192, GetStringFunc("tcConstructorsIllegalInAugmentation",",,,") ) /// Invalid response file '%s' ( '%s' ) - /// (Originally from ../FSComp.txt:1317) + /// (Originally from ..\FSComp.txt:1319) static member optsInvalidResponseFile(a0 : System.String, a1 : System.String) = (3193, GetStringFunc("optsInvalidResponseFile",",,,%s,,,%s,,,") a0 a1) /// Response file '%s' not found in '%s' - /// (Originally from ../FSComp.txt:1318) + /// (Originally from ..\FSComp.txt:1320) static member optsResponseFileNotFound(a0 : System.String, a1 : System.String) = (3194, GetStringFunc("optsResponseFileNotFound",",,,%s,,,%s,,,") a0 a1) /// Response file name '%s' is empty, contains invalid characters, has a drive specification without an absolute path, or is too long - /// (Originally from ../FSComp.txt:1319) + /// (Originally from ..\FSComp.txt:1321) static member optsResponseFileNameInvalid(a0 : System.String) = (3195, GetStringFunc("optsResponseFileNameInvalid",",,,%s,,,") a0) /// Cannot find FSharp.Core.dll in compiler's directory - /// (Originally from ../FSComp.txt:1320) + /// (Originally from ..\FSComp.txt:1322) static member fsharpCoreNotFoundToBeCopied() = (3196, GetStringFunc("fsharpCoreNotFoundToBeCopied",",,,") ) /// One tuple type is a struct tuple, the other is a reference tuple - /// (Originally from ../FSComp.txt:1321) + /// (Originally from ..\FSComp.txt:1323) static member tcTupleStructMismatch() = (GetStringFunc("tcTupleStructMismatch",",,,") ) /// This provided method requires static parameters - /// (Originally from ../FSComp.txt:1322) + /// (Originally from ..\FSComp.txt:1324) static member etMissingStaticArgumentsToMethod() = (3197, GetStringFunc("etMissingStaticArgumentsToMethod",",,,") ) /// The conversion from %s to %s is a compile-time safe upcast, not a downcast. Consider using 'upcast' instead of 'downcast'. - /// (Originally from ../FSComp.txt:1323) + /// (Originally from ..\FSComp.txt:1325) static member considerUpcast(a0 : System.String, a1 : System.String) = (3198, GetStringFunc("considerUpcast",",,,%s,,,%s,,,") a0 a1) /// The conversion from %s to %s is a compile-time safe upcast, not a downcast. Consider using the :> (upcast) operator instead of the :?> (downcast) operator. - /// (Originally from ../FSComp.txt:1324) + /// (Originally from ..\FSComp.txt:1326) static member considerUpcastOperator(a0 : System.String, a1 : System.String) = (3198, GetStringFunc("considerUpcastOperator",",,,%s,,,%s,,,") a0 a1) /// The 'rec' on this module is implied by an outer 'rec' declaration and is being ignored - /// (Originally from ../FSComp.txt:1325) + /// (Originally from ..\FSComp.txt:1327) static member tcRecImplied() = (3199, GetStringFunc("tcRecImplied",",,,") ) /// In a recursive declaration group, 'open' declarations must come first in each module - /// (Originally from ../FSComp.txt:1326) + /// (Originally from ..\FSComp.txt:1328) static member tcOpenFirstInMutRec() = (3200, GetStringFunc("tcOpenFirstInMutRec",",,,") ) /// In a recursive declaration group, module abbreviations must come after all 'open' declarations and before other declarations - /// (Originally from ../FSComp.txt:1327) + /// (Originally from ..\FSComp.txt:1329) static member tcModuleAbbrevFirstInMutRec() = (3201, GetStringFunc("tcModuleAbbrevFirstInMutRec",",,,") ) /// This declaration is not supported in recursive declaration groups - /// (Originally from ../FSComp.txt:1328) + /// (Originally from ..\FSComp.txt:1330) static member tcUnsupportedMutRecDecl() = (3202, GetStringFunc("tcUnsupportedMutRecDecl",",,,") ) /// Invalid use of 'rec' keyword - /// (Originally from ../FSComp.txt:1329) + /// (Originally from ..\FSComp.txt:1331) static member parsInvalidUseOfRec() = (3203, GetStringFunc("parsInvalidUseOfRec",",,,") ) /// If a union type has more than one case and is a struct, then all fields within the union type must be given unique names. - /// (Originally from ../FSComp.txt:1330) + /// (Originally from ..\FSComp.txt:1332) static member tcStructUnionMultiCaseDistinctFields() = (3204, GetStringFunc("tcStructUnionMultiCaseDistinctFields",",,,") ) /// The CallerMemberNameAttribute applied to parameter '%s' will have no effect. It is overridden by the CallerFilePathAttribute. - /// (Originally from ../FSComp.txt:1331) + /// (Originally from ..\FSComp.txt:1333) static member CallerMemberNameIsOverriden(a0 : System.String) = (3206, GetStringFunc("CallerMemberNameIsOverriden",",,,%s,,,") a0) /// Invalid use of 'fixed'. 'fixed' may only be used in a declaration of the form 'use x = fixed expr' where the expression is an array, the address of a field, the address of an array element or a string' - /// (Originally from ../FSComp.txt:1332) + /// (Originally from ..\FSComp.txt:1334) static member tcFixedNotAllowed() = (3207, GetStringFunc("tcFixedNotAllowed",",,,") ) /// Could not find method System.Runtime.CompilerServices.OffsetToStringData in references when building 'fixed' expression. - /// (Originally from ../FSComp.txt:1333) + /// (Originally from ..\FSComp.txt:1335) static member tcCouldNotFindOffsetToStringData() = (3208, GetStringFunc("tcCouldNotFindOffsetToStringData",",,,") ) /// The address of the variable '%s' cannot be used at this point. A method or function may not return the address of this local value. - /// (Originally from ../FSComp.txt:1334) + /// (Originally from ..\FSComp.txt:1336) static member chkNoByrefReturnOfLocal(a0 : System.String) = (3209, GetStringFunc("chkNoByrefReturnOfLocal",",,,%s,,,") a0) /// %s is an active pattern and cannot be treated as a discriminated union case with named fields. - /// (Originally from ../FSComp.txt:1335) + /// (Originally from ..\FSComp.txt:1337) static member tcNamedActivePattern(a0 : System.String) = (3210, GetStringFunc("tcNamedActivePattern",",,,%s,,,") a0) /// The default value does not have the same type as the argument. The DefaultParameterValue attribute and any Optional attribute will be ignored. Note: 'null' needs to be annotated with the correct type, e.g. 'DefaultParameterValue(null:obj)'. - /// (Originally from ../FSComp.txt:1336) + /// (Originally from ..\FSComp.txt:1338) static member DefaultParameterValueNotAppropriateForArgument() = (3211, GetStringFunc("DefaultParameterValueNotAppropriateForArgument",",,,") ) /// The system type '%s' was required but no referenced system DLL contained this type - /// (Originally from ../FSComp.txt:1337) + /// (Originally from ..\FSComp.txt:1339) static member tcGlobalsSystemTypeNotFound(a0 : System.String) = (GetStringFunc("tcGlobalsSystemTypeNotFound",",,,%s,,,") a0) /// The member '%s' matches multiple overloads of the same method.\nPlease restrict it to one of the following:%s. - /// (Originally from ../FSComp.txt:1338) + /// (Originally from ..\FSComp.txt:1340) static member typrelMemberHasMultiplePossibleDispatchSlots(a0 : System.String, a1 : System.String) = (3213, GetStringFunc("typrelMemberHasMultiplePossibleDispatchSlots",",,,%s,,,%s,,,") a0 a1) /// Method or object constructor '%s' is not static - /// (Originally from ../FSComp.txt:1339) + /// (Originally from ..\FSComp.txt:1341) static member methodIsNotStatic(a0 : System.String) = (3214, GetStringFunc("methodIsNotStatic",",,,%s,,,") a0) /// Unexpected symbol '=' in expression. Did you intend to use 'for x in y .. z do' instead? - /// (Originally from ../FSComp.txt:1340) + /// (Originally from ..\FSComp.txt:1342) static member parsUnexpectedSymbolEqualsInsteadOfIn() = (3215, GetStringFunc("parsUnexpectedSymbolEqualsInsteadOfIn",",,,") ) /// Two anonymous record types are from different assemblies '%s' and '%s' /// (Originally from ..\FSComp.txt:1343) @@ -4058,277 +4061,277 @@ type internal SR private() = /// (Originally from ..\FSComp.txt:1344) static member tcAnonRecdFieldNameMismatch(a0 : System.String, a1 : System.String) = (GetStringFunc("tcAnonRecdFieldNameMismatch",",,,%s,,,%s,,,") a0 a1) /// Indicates a method that either has no implementation in the type in which it is declared or that is virtual and has a default implementation. - /// (Originally from ../FSComp.txt:1341) + /// (Originally from ..\FSComp.txt:1345) static member keywordDescriptionAbstract() = (GetStringFunc("keywordDescriptionAbstract",",,,") ) /// Used in mutually recursive bindings, in property declarations, and with multiple constraints on generic parameters. - /// (Originally from ../FSComp.txt:1342) + /// (Originally from ..\FSComp.txt:1346) static member keyworkDescriptionAnd() = (GetStringFunc("keyworkDescriptionAnd",",,,") ) /// Used to give the current class object an object name. Also used to give a name to a whole pattern within a pattern match. - /// (Originally from ../FSComp.txt:1343) + /// (Originally from ..\FSComp.txt:1347) static member keywordDescriptionAs() = (GetStringFunc("keywordDescriptionAs",",,,") ) /// Used to verify code during debugging. - /// (Originally from ../FSComp.txt:1344) + /// (Originally from ..\FSComp.txt:1348) static member keywordDescriptionAssert() = (GetStringFunc("keywordDescriptionAssert",",,,") ) /// Used as the name of the base class object. - /// (Originally from ../FSComp.txt:1345) + /// (Originally from ..\FSComp.txt:1349) static member keywordDescriptionBase() = (GetStringFunc("keywordDescriptionBase",",,,") ) /// In verbose syntax, indicates the start of a code block. - /// (Originally from ../FSComp.txt:1346) + /// (Originally from ..\FSComp.txt:1350) static member keywordDescriptionBegin() = (GetStringFunc("keywordDescriptionBegin",",,,") ) /// In verbose syntax, indicates the start of a class definition. - /// (Originally from ../FSComp.txt:1347) + /// (Originally from ..\FSComp.txt:1351) static member keywordDescriptionClass() = (GetStringFunc("keywordDescriptionClass",",,,") ) /// Indicates an implementation of an abstract method; used together with an abstract method declaration to create a virtual method. - /// (Originally from ../FSComp.txt:1348) + /// (Originally from ..\FSComp.txt:1352) static member keywordDescriptionDefault() = (GetStringFunc("keywordDescriptionDefault",",,,") ) /// Used to declare a delegate. - /// (Originally from ../FSComp.txt:1349) + /// (Originally from ..\FSComp.txt:1353) static member keywordDescriptionDelegate() = (GetStringFunc("keywordDescriptionDelegate",",,,") ) /// Used in looping constructs or to execute imperative code. - /// (Originally from ../FSComp.txt:1350) + /// (Originally from ..\FSComp.txt:1354) static member keywordDescriptionDo() = (GetStringFunc("keywordDescriptionDo",",,,") ) /// In verbose syntax, indicates the end of a block of code in a looping expression. - /// (Originally from ../FSComp.txt:1351) + /// (Originally from ..\FSComp.txt:1355) static member keywordDescriptionDone() = (GetStringFunc("keywordDescriptionDone",",,,") ) /// Used to convert to a type that is lower in the inheritance chain. - /// (Originally from ../FSComp.txt:1352) + /// (Originally from ..\FSComp.txt:1356) static member keywordDescriptionDowncast() = (GetStringFunc("keywordDescriptionDowncast",",,,") ) /// In a for expression, used when counting in reverse. - /// (Originally from ../FSComp.txt:1353) + /// (Originally from ..\FSComp.txt:1357) static member keywordDescriptionDownto() = (GetStringFunc("keywordDescriptionDownto",",,,") ) /// Used in conditional branching. A short form of else if. - /// (Originally from ../FSComp.txt:1354) + /// (Originally from ..\FSComp.txt:1358) static member keywordDescriptionElif() = (GetStringFunc("keywordDescriptionElif",",,,") ) /// Used in conditional branching. - /// (Originally from ../FSComp.txt:1355) + /// (Originally from ..\FSComp.txt:1359) static member keywordDescriptionElse() = (GetStringFunc("keywordDescriptionElse",",,,") ) /// In type definitions and type extensions, indicates the end of a section of member definitions. In verbose syntax, used to specify the end of a code block that starts with the begin keyword. - /// (Originally from ../FSComp.txt:1356) + /// (Originally from ..\FSComp.txt:1360) static member keywordDescriptionEnd() = (GetStringFunc("keywordDescriptionEnd",",,,") ) /// Used to declare an exception type. - /// (Originally from ../FSComp.txt:1357) + /// (Originally from ..\FSComp.txt:1361) static member keywordDescriptionException() = (GetStringFunc("keywordDescriptionException",",,,") ) /// Indicates that a declared program element is defined in another binary or assembly. - /// (Originally from ../FSComp.txt:1358) + /// (Originally from ..\FSComp.txt:1362) static member keywordDescriptionExtern() = (GetStringFunc("keywordDescriptionExtern",",,,") ) /// Used as a Boolean literal. - /// (Originally from ../FSComp.txt:1359) + /// (Originally from ..\FSComp.txt:1363) static member keywordDescriptionTrueFalse() = (GetStringFunc("keywordDescriptionTrueFalse",",,,") ) /// Used together with try to introduce a block of code that executes regardless of whether an exception occurs. - /// (Originally from ../FSComp.txt:1360) + /// (Originally from ..\FSComp.txt:1364) static member keywordDescriptionFinally() = (GetStringFunc("keywordDescriptionFinally",",,,") ) /// Used in looping constructs. - /// (Originally from ../FSComp.txt:1361) + /// (Originally from ..\FSComp.txt:1365) static member keywordDescriptionFor() = (GetStringFunc("keywordDescriptionFor",",,,") ) /// Used in lambda expressions, also known as anonymous functions. - /// (Originally from ../FSComp.txt:1362) + /// (Originally from ..\FSComp.txt:1366) static member keywordDescriptionFun() = (GetStringFunc("keywordDescriptionFun",",,,") ) /// Used as a shorter alternative to the fun keyword and a match expression in a lambda expression that has pattern matching on a single argument. - /// (Originally from ../FSComp.txt:1363) + /// (Originally from ..\FSComp.txt:1367) static member keywordDescriptionFunction() = (GetStringFunc("keywordDescriptionFunction",",,,") ) /// Used to reference the top-level .NET namespace. - /// (Originally from ../FSComp.txt:1364) + /// (Originally from ..\FSComp.txt:1368) static member keywordDescriptionGlobal() = (GetStringFunc("keywordDescriptionGlobal",",,,") ) /// Used in conditional branching constructs. - /// (Originally from ../FSComp.txt:1365) + /// (Originally from ..\FSComp.txt:1369) static member keywordDescriptionIf() = (GetStringFunc("keywordDescriptionIf",",,,") ) /// Used for sequence expressions and, in verbose syntax, to separate expressions from bindings. - /// (Originally from ../FSComp.txt:1366) + /// (Originally from ..\FSComp.txt:1370) static member keywordDescriptionIn() = (GetStringFunc("keywordDescriptionIn",",,,") ) /// Used to specify a base class or base interface. - /// (Originally from ../FSComp.txt:1367) + /// (Originally from ..\FSComp.txt:1371) static member keywordDescriptionInherit() = (GetStringFunc("keywordDescriptionInherit",",,,") ) /// Used to indicate a function that should be integrated directly into the caller's code. - /// (Originally from ../FSComp.txt:1368) + /// (Originally from ..\FSComp.txt:1372) static member keywordDescriptionInline() = (GetStringFunc("keywordDescriptionInline",",,,") ) /// Used to declare and implement interfaces. - /// (Originally from ../FSComp.txt:1369) + /// (Originally from ..\FSComp.txt:1373) static member keywordDescriptionInterface() = (GetStringFunc("keywordDescriptionInterface",",,,") ) /// Used to specify that a member is visible inside an assembly but not outside it. - /// (Originally from ../FSComp.txt:1370) + /// (Originally from ..\FSComp.txt:1374) static member keywordDescriptionInternal() = (GetStringFunc("keywordDescriptionInternal",",,,") ) /// Used to specify a computation that is to be performed only when a result is needed. - /// (Originally from ../FSComp.txt:1371) + /// (Originally from ..\FSComp.txt:1375) static member keywordDescriptionLazy() = (GetStringFunc("keywordDescriptionLazy",",,,") ) /// Used to associate, or bind, a name to a value or function. - /// (Originally from ../FSComp.txt:1372) + /// (Originally from ..\FSComp.txt:1376) static member keywordDescriptionLet() = (GetStringFunc("keywordDescriptionLet",",,,") ) /// Used in asynchronous workflows to bind a name to the result of an asynchronous computation, or, in other computation expressions, used to bind a name to a result, which is of the computation type. - /// (Originally from ../FSComp.txt:1373) + /// (Originally from ..\FSComp.txt:1377) static member keywordDescriptionLetBang() = (GetStringFunc("keywordDescriptionLetBang",",,,") ) /// Used to branch by comparing a value to a pattern. - /// (Originally from ../FSComp.txt:1374) + /// (Originally from ..\FSComp.txt:1378) static member keywordDescriptionMatch() = (GetStringFunc("keywordDescriptionMatch",",,,") ) /// Used in computation expressions to pattern match directly over the result of another computation expression. - /// (Originally from ../FSComp.txt:1375) + /// (Originally from ..\FSComp.txt:1379) static member keywordDescriptionMatchBang() = (GetStringFunc("keywordDescriptionMatchBang",",,,") ) /// Used to declare a property or method in an object type. - /// (Originally from ../FSComp.txt:1376) + /// (Originally from ..\FSComp.txt:1380) static member keywordDescriptionMember() = (GetStringFunc("keywordDescriptionMember",",,,") ) /// Used to associate a name with a group of related types, values, and functions, to logically separate it from other code. - /// (Originally from ../FSComp.txt:1377) + /// (Originally from ..\FSComp.txt:1381) static member keywordDescriptionModule() = (GetStringFunc("keywordDescriptionModule",",,,") ) /// Used to declare a variable, that is, a value that can be changed. - /// (Originally from ../FSComp.txt:1378) + /// (Originally from ..\FSComp.txt:1382) static member keywordDescriptionMutable() = (GetStringFunc("keywordDescriptionMutable",",,,") ) /// Used to associate a name with a group of related types and modules, to logically separate it from other code. - /// (Originally from ../FSComp.txt:1379) + /// (Originally from ..\FSComp.txt:1383) static member keywordDescriptionNamespace() = (GetStringFunc("keywordDescriptionNamespace",",,,") ) /// Used to declare, define, or invoke a constructor that creates or that can create an object. Also used in generic parameter constraints to indicate that a type must have a certain constructor. - /// (Originally from ../FSComp.txt:1380) + /// (Originally from ..\FSComp.txt:1384) static member keywordDescriptionNew() = (GetStringFunc("keywordDescriptionNew",",,,") ) /// Not actually a keyword. However, not struct in combination is used as a generic parameter constraint. - /// (Originally from ../FSComp.txt:1381) + /// (Originally from ..\FSComp.txt:1385) static member keywordDescriptionNot() = (GetStringFunc("keywordDescriptionNot",",,,") ) /// Indicates the absence of an object. Also used in generic parameter constraints. - /// (Originally from ../FSComp.txt:1382) + /// (Originally from ..\FSComp.txt:1386) static member keywordDescriptionNull() = (GetStringFunc("keywordDescriptionNull",",,,") ) /// Used in discriminated unions to indicate the type of categories of values, and in delegate and exception declarations. - /// (Originally from ../FSComp.txt:1383) + /// (Originally from ..\FSComp.txt:1387) static member keywordDescriptionOf() = (GetStringFunc("keywordDescriptionOf",",,,") ) /// Used to make the contents of a namespace or module available without qualification. - /// (Originally from ../FSComp.txt:1384) + /// (Originally from ..\FSComp.txt:1388) static member keywordDescriptionOpen() = (GetStringFunc("keywordDescriptionOpen",",,,") ) /// Used with Boolean conditions as a Boolean or operator. Equivalent to ||. Also used in member constraints. - /// (Originally from ../FSComp.txt:1385) + /// (Originally from ..\FSComp.txt:1389) static member keywordDescriptionOr() = (GetStringFunc("keywordDescriptionOr",",,,") ) /// Used to implement a version of an abstract or virtual method that differs from the base version. - /// (Originally from ../FSComp.txt:1386) + /// (Originally from ..\FSComp.txt:1390) static member keywordDescriptionOverride() = (GetStringFunc("keywordDescriptionOverride",",,,") ) /// Restricts access to a member to code in the same type or module. - /// (Originally from ../FSComp.txt:1387) + /// (Originally from ..\FSComp.txt:1391) static member keywordDescriptionPrivate() = (GetStringFunc("keywordDescriptionPrivate",",,,") ) /// Allows access to a member from outside the type. - /// (Originally from ../FSComp.txt:1388) + /// (Originally from ..\FSComp.txt:1392) static member keywordDescriptionPublic() = (GetStringFunc("keywordDescriptionPublic",",,,") ) /// Used to indicate that a function is recursive. - /// (Originally from ../FSComp.txt:1389) + /// (Originally from ..\FSComp.txt:1393) static member keywordDescriptionRec() = (GetStringFunc("keywordDescriptionRec",",,,") ) /// Used to indicate a value to provide as the result of a computation expression. - /// (Originally from ../FSComp.txt:1390) + /// (Originally from ..\FSComp.txt:1394) static member keywordDescriptionReturn() = (GetStringFunc("keywordDescriptionReturn",",,,") ) /// Used to indicate a computation expression that, when evaluated, provides the result of the containing computation expression. - /// (Originally from ../FSComp.txt:1391) + /// (Originally from ..\FSComp.txt:1395) static member keywordDescriptionReturnBang() = (GetStringFunc("keywordDescriptionReturnBang",",,,") ) /// Used in query expressions to specify what fields or columns to extract. Note that this is a contextual keyword, which means that it is not actually a reserved word and it only acts like a keyword in appropriate context. - /// (Originally from ../FSComp.txt:1392) + /// (Originally from ..\FSComp.txt:1396) static member keywordDescriptionSelect() = (GetStringFunc("keywordDescriptionSelect",",,,") ) /// Used to indicate a method or property that can be called without an instance of a type, or a value member that is shared among all instances of a type. - /// (Originally from ../FSComp.txt:1393) + /// (Originally from ..\FSComp.txt:1397) static member keywordDescriptionStatic() = (GetStringFunc("keywordDescriptionStatic",",,,") ) /// Used to declare a structure type. Also used in generic parameter constraints. Used for OCaml compatibility in module definitions. - /// (Originally from ../FSComp.txt:1394) + /// (Originally from ..\FSComp.txt:1398) static member keywordDescriptionStruct() = (GetStringFunc("keywordDescriptionStruct",",,,") ) /// Used in conditional expressions. Also used to perform side effects after object construction. - /// (Originally from ../FSComp.txt:1395) + /// (Originally from ..\FSComp.txt:1399) static member keywordDescriptionThen() = (GetStringFunc("keywordDescriptionThen",",,,") ) /// Used in for loops to indicate a range. - /// (Originally from ../FSComp.txt:1396) + /// (Originally from ..\FSComp.txt:1400) static member keywordDescriptionTo() = (GetStringFunc("keywordDescriptionTo",",,,") ) /// Used to introduce a block of code that might generate an exception. Used together with with or finally. - /// (Originally from ../FSComp.txt:1397) + /// (Originally from ..\FSComp.txt:1401) static member keywordDescriptionTry() = (GetStringFunc("keywordDescriptionTry",",,,") ) /// Used to declare a class, record, structure, discriminated union, enumeration type, unit of measure, or type abbreviation. - /// (Originally from ../FSComp.txt:1398) + /// (Originally from ..\FSComp.txt:1402) static member keywordDescriptionType() = (GetStringFunc("keywordDescriptionType",",,,") ) /// Used to convert to a type that is higher in the inheritance chain. - /// (Originally from ../FSComp.txt:1399) + /// (Originally from ..\FSComp.txt:1403) static member keywordDescriptionUpcast() = (GetStringFunc("keywordDescriptionUpcast",",,,") ) /// Used instead of let for values that require Dispose to be called to free resources. - /// (Originally from ../FSComp.txt:1400) + /// (Originally from ..\FSComp.txt:1404) static member keywordDescriptionUse() = (GetStringFunc("keywordDescriptionUse",",,,") ) /// Used instead of let! in asynchronous workflows and other computation expressions for values that require Dispose to be called to free resources. - /// (Originally from ../FSComp.txt:1401) + /// (Originally from ..\FSComp.txt:1405) static member keywordDescriptionUseBang() = (GetStringFunc("keywordDescriptionUseBang",",,,") ) /// Used in a signature to indicate a value, or in a type to declare a member, in limited situations. - /// (Originally from ../FSComp.txt:1402) + /// (Originally from ..\FSComp.txt:1406) static member keywordDescriptionVal() = (GetStringFunc("keywordDescriptionVal",",,,") ) /// Indicates the .NET void type. Used when interoperating with other .NET languages. - /// (Originally from ../FSComp.txt:1403) + /// (Originally from ..\FSComp.txt:1407) static member keywordDescriptionVoid() = (GetStringFunc("keywordDescriptionVoid",",,,") ) /// Used for Boolean conditions (when guards) on pattern matches and to introduce a constraint clause for a generic type parameter. - /// (Originally from ../FSComp.txt:1404) + /// (Originally from ..\FSComp.txt:1408) static member keywordDescriptionWhen() = (GetStringFunc("keywordDescriptionWhen",",,,") ) /// Introduces a looping construct. - /// (Originally from ../FSComp.txt:1405) + /// (Originally from ..\FSComp.txt:1409) static member keywordDescriptionWhile() = (GetStringFunc("keywordDescriptionWhile",",,,") ) /// Used together with the match keyword in pattern matching expressions. Also used in object expressions, record copying expressions, and type extensions to introduce member definitions, and to introduce exception handlers. - /// (Originally from ../FSComp.txt:1406) + /// (Originally from ..\FSComp.txt:1410) static member keywordDescriptionWith() = (GetStringFunc("keywordDescriptionWith",",,,") ) /// Used in a sequence expression to produce a value for a sequence. - /// (Originally from ../FSComp.txt:1407) + /// (Originally from ..\FSComp.txt:1411) static member keywordDescriptionYield() = (GetStringFunc("keywordDescriptionYield",",,,") ) /// Used in a computation expression to append the result of a given computation expression to a collection of results for the containing computation expression. - /// (Originally from ../FSComp.txt:1408) + /// (Originally from ..\FSComp.txt:1412) static member keywordDescriptionYieldBang() = (GetStringFunc("keywordDescriptionYieldBang",",,,") ) /// In function types, delimits arguments and return values. Yields an expression (in sequence expressions); equivalent to the yield keyword. Used in match expressions - /// (Originally from ../FSComp.txt:1409) + /// (Originally from ..\FSComp.txt:1413) static member keywordDescriptionRightArrow() = (GetStringFunc("keywordDescriptionRightArrow",",,,") ) /// Assigns a value to a variable. - /// (Originally from ../FSComp.txt:1410) + /// (Originally from ..\FSComp.txt:1414) static member keywordDescriptionLeftArrow() = (GetStringFunc("keywordDescriptionLeftArrow",",,,") ) /// Converts a type to type that is higher in the hierarchy. - /// (Originally from ../FSComp.txt:1411) + /// (Originally from ..\FSComp.txt:1415) static member keywordDescriptionCast() = (GetStringFunc("keywordDescriptionCast",",,,") ) /// Converts a type to a type that is lower in the hierarchy. - /// (Originally from ../FSComp.txt:1412) + /// (Originally from ..\FSComp.txt:1416) static member keywordDescriptionDynamicCast() = (GetStringFunc("keywordDescriptionDynamicCast",",,,") ) /// Delimits a typed code quotation. - /// (Originally from ../FSComp.txt:1413) + /// (Originally from ..\FSComp.txt:1417) static member keywordDescriptionTypedQuotation() = (GetStringFunc("keywordDescriptionTypedQuotation",",,,") ) /// Delimits a untyped code quotation. - /// (Originally from ../FSComp.txt:1414) + /// (Originally from ..\FSComp.txt:1418) static member keywordDescriptionUntypedQuotation() = (GetStringFunc("keywordDescriptionUntypedQuotation",",,,") ) /// %s '%s' not found in assembly '%s'. A possible cause may be a version incompatibility. You may need to explicitly reference the correct version of this assembly to allow all referenced components to use the correct version. - /// (Originally from ../FSComp.txt:1415) + /// (Originally from ..\FSComp.txt:1419) static member itemNotFoundDuringDynamicCodeGen(a0 : System.String, a1 : System.String, a2 : System.String) = (3216, GetStringFunc("itemNotFoundDuringDynamicCodeGen",",,,%s,,,%s,,,%s,,,") a0 a1 a2) /// %s '%s' not found in type '%s' from assembly '%s'. A possible cause may be a version incompatibility. You may need to explicitly reference the correct version of this assembly to allow all referenced components to use the correct version. - /// (Originally from ../FSComp.txt:1416) + /// (Originally from ..\FSComp.txt:1420) static member itemNotFoundInTypeDuringDynamicCodeGen(a0 : System.String, a1 : System.String, a2 : System.String, a3 : System.String) = (3216, GetStringFunc("itemNotFoundInTypeDuringDynamicCodeGen",",,,%s,,,%s,,,%s,,,%s,,,") a0 a1 a2 a3) /// is - /// (Originally from ../FSComp.txt:1417) + /// (Originally from ..\FSComp.txt:1421) static member descriptionWordIs() = (GetStringFunc("descriptionWordIs",",,,") ) /// This value is not a function and cannot be applied. - /// (Originally from ../FSComp.txt:1418) + /// (Originally from ..\FSComp.txt:1422) static member notAFunction() = (GetStringFunc("notAFunction",",,,") ) /// This value is not a function and cannot be applied. Did you intend to access the indexer via %s.[index] instead? - /// (Originally from ../FSComp.txt:1419) + /// (Originally from ..\FSComp.txt:1423) static member notAFunctionButMaybeIndexerWithName(a0 : System.String) = (GetStringFunc("notAFunctionButMaybeIndexerWithName",",,,%s,,,") a0) /// This expression is not a function and cannot be applied. Did you intend to access the indexer via expr.[index] instead? - /// (Originally from ../FSComp.txt:1420) + /// (Originally from ..\FSComp.txt:1424) static member notAFunctionButMaybeIndexer() = (GetStringFunc("notAFunctionButMaybeIndexer",",,,") ) /// - /// (Originally from ../FSComp.txt:1421) + /// (Originally from ..\FSComp.txt:1425) static member notAFunctionButMaybeIndexerErrorCode() = (3217, GetStringFunc("notAFunctionButMaybeIndexerErrorCode",",,,") ) /// This value is not a function and cannot be applied. Did you forget to terminate a declaration? - /// (Originally from ../FSComp.txt:1422) + /// (Originally from ..\FSComp.txt:1426) static member notAFunctionButMaybeDeclaration() = (GetStringFunc("notAFunctionButMaybeDeclaration",",,,") ) /// The argument names in the signature '%s' and implementation '%s' do not match. The argument name from the signature file will be used. This may cause problems when debugging or profiling. - /// (Originally from ../FSComp.txt:1423) + /// (Originally from ..\FSComp.txt:1427) static member ArgumentsInSigAndImplMismatch(a0 : System.String, a1 : System.String) = (3218, GetStringFunc("ArgumentsInSigAndImplMismatch",",,,%s,,,%s,,,") a0 a1) /// An error occurred while reading the F# metadata of assembly '%s'. A reserved construct was utilized. You may need to upgrade your F# compiler or use an earlier version of the assembly that doesn't make use of a specific construct. - /// (Originally from ../FSComp.txt:1424) + /// (Originally from ..\FSComp.txt:1428) static member pickleUnexpectedNonZero(a0 : System.String) = (3219, GetStringFunc("pickleUnexpectedNonZero",",,,%s,,,") a0) /// This method or property is not normally used from F# code, use an explicit tuple pattern for deconstruction instead. - /// (Originally from ../FSComp.txt:1425) + /// (Originally from ..\FSComp.txt:1429) static member tcTupleMemberNotNormallyUsed() = (3220, GetStringFunc("tcTupleMemberNotNormallyUsed",",,,") ) /// This expression returns a value of type '%s' but is implicitly discarded. Consider using 'let' to bind the result to a name, e.g. 'let result = expression'. If you intended to use the expression as a value in the sequence then use an explicit 'yield'. - /// (Originally from ../FSComp.txt:1426) + /// (Originally from ..\FSComp.txt:1430) static member implicitlyDiscardedInSequenceExpression(a0 : System.String) = (3221, GetStringFunc("implicitlyDiscardedInSequenceExpression",",,,%s,,,") a0) /// This expression returns a value of type '%s' but is implicitly discarded. Consider using 'let' to bind the result to a name, e.g. 'let result = expression'. If you intended to use the expression as a value in the sequence then use an explicit 'yield!'. - /// (Originally from ../FSComp.txt:1427) + /// (Originally from ..\FSComp.txt:1431) static member implicitlyDiscardedSequenceInSequenceExpression(a0 : System.String) = (3222, GetStringFunc("implicitlyDiscardedSequenceInSequenceExpression",",,,%s,,,") a0) /// The file '%s' changed on disk unexpectedly, please reload. - /// (Originally from ..\FSComp.txt:1427) + /// (Originally from ..\FSComp.txt:1432) static member ilreadFileChanged(a0 : System.String) = (3223, GetStringFunc("ilreadFileChanged",",,,%s,,,") a0) /// Invalid anonymous record expression - /// (Originally from ..\FSComp.txt:1431) + /// (Originally from ..\FSComp.txt:1433) static member parsInvalidAnonRecdExpr() = (3224, GetStringFunc("parsInvalidAnonRecdExpr",",,,") ) /// Invalid anonymous record type - /// (Originally from ..\FSComp.txt:1432) + /// (Originally from ..\FSComp.txt:1434) static member parsInvalidAnonRecdType() = (3225, GetStringFunc("parsInvalidAnonRecdType",",,,") ) /// The input to a copy-and-update expression that creates an anonymous record must be either an anonymous record or a record - /// (Originally from ..\FSComp.txt:1433) + /// (Originally from ..\FSComp.txt:1435) static member tcCopyAndUpdateNeedsRecordType() = (3226, GetStringFunc("tcCopyAndUpdateNeedsRecordType",",,,") ) /// Call this method once to validate that all known resources are valid; throws if not diff --git a/src/buildfromsource/FSharp.Compiler.Private/FSComp.resx b/src/buildfromsource/FSharp.Compiler.Private/FSComp.resx index 3a9b5ffe0ac..7db9fe3d46f 100644 --- a/src/buildfromsource/FSharp.Compiler.Private/FSComp.resx +++ b/src/buildfromsource/FSharp.Compiler.Private/FSComp.resx @@ -181,7 +181,7 @@ All branches of an 'if' expression must have the same type. This expression was expected to have type '{0}', but here has type '{1}'. - All branches of a pattern match expression must have the same type. This expression was expected to have type '{0}', but here has type '{1}'. + All branches of a pattern match expression must return values of the same type. The first branch returned a value of type '{0}', but this branch returned a value of type '{1}'. A pattern match guard must be of type 'bool', but this 'when' expression is of type '{0}'. From 3b836fd58adbad79cf57dc75916b6a4cd55be998 Mon Sep 17 00:00:00 2001 From: Kevin Ransom Date: Fri, 20 Jul 2018 15:56:01 -0700 Subject: [PATCH 020/160] Update FSharp.Core nuget to 4.5.3, and tooling to 10.2.3 --- src/FSharpSource.Settings.targets | 6 +++--- src/fsharp/FSharp.Build/Microsoft.FSharp.NetSdk.props | 2 +- .../ConsoleProject/Template/ConsoleApplication.fsproj | 2 +- .../ConsoleProject/Template/ConsoleApplication.vstemplate | 2 +- .../ProjectTemplates/LibraryProject/Template/Library.fsproj | 2 +- .../LibraryProject/Template/Library.vstemplate | 2 +- .../TutorialProject/Template/Tutorial.fsproj | 2 +- .../TutorialProject/Template/Tutorial.vstemplate | 2 +- 8 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/FSharpSource.Settings.targets b/src/FSharpSource.Settings.targets index 273d18ee76e..510a26d8683 100644 --- a/src/FSharpSource.Settings.targets +++ b/src/FSharpSource.Settings.targets @@ -21,8 +21,8 @@ 4.5.0.0 - 10.2.1.0 - 10.2.1 + 10.2.3.0 + 10.2.3 15.7.0.0 @@ -101,7 +101,7 @@ 4.1.19 4.1 - 4.5.1 + 4.5.2 4.5 diff --git a/src/fsharp/FSharp.Build/Microsoft.FSharp.NetSdk.props b/src/fsharp/FSharp.Build/Microsoft.FSharp.NetSdk.props index ec9a9c4f870..4ee6ad991a3 100644 --- a/src/fsharp/FSharp.Build/Microsoft.FSharp.NetSdk.props +++ b/src/fsharp/FSharp.Build/Microsoft.FSharp.NetSdk.props @@ -73,7 +73,7 @@ WARNING: DO NOT MODIFY this file unless you are knowledgeable about MSBuild and 4.4.0 - 4.5.0 + 4.5.2 $(DefaultValueTuplePackageVersion) $(DefaultFSharpCorePackageVersion) diff --git a/vsintegration/ProjectTemplates/ConsoleProject/Template/ConsoleApplication.fsproj b/vsintegration/ProjectTemplates/ConsoleProject/Template/ConsoleApplication.fsproj index e2b643f6c58..df9b2a7d3e5 100644 --- a/vsintegration/ProjectTemplates/ConsoleProject/Template/ConsoleApplication.fsproj +++ b/vsintegration/ProjectTemplates/ConsoleProject/Template/ConsoleApplication.fsproj @@ -42,7 +42,7 @@ - ..\packages\FSharp.Core.4.5.0\lib\net45\FSharp.Core.dll + ..\packages\FSharp.Core.4.5.2\lib\net45\FSharp.Core.dll True diff --git a/vsintegration/ProjectTemplates/ConsoleProject/Template/ConsoleApplication.vstemplate b/vsintegration/ProjectTemplates/ConsoleProject/Template/ConsoleApplication.vstemplate index 90f50e2d6dc..301cf58f31b 100644 --- a/vsintegration/ProjectTemplates/ConsoleProject/Template/ConsoleApplication.vstemplate +++ b/vsintegration/ProjectTemplates/ConsoleProject/Template/ConsoleApplication.vstemplate @@ -27,7 +27,7 @@ - + diff --git a/vsintegration/ProjectTemplates/LibraryProject/Template/Library.fsproj b/vsintegration/ProjectTemplates/LibraryProject/Template/Library.fsproj index 9249b782e06..83b2def5736 100644 --- a/vsintegration/ProjectTemplates/LibraryProject/Template/Library.fsproj +++ b/vsintegration/ProjectTemplates/LibraryProject/Template/Library.fsproj @@ -38,7 +38,7 @@ - ..\packages\FSharp.Core.4.5.0\lib\net45\FSharp.Core.dll + ..\packages\FSharp.Core.4.5.2\lib\net45\FSharp.Core.dll True diff --git a/vsintegration/ProjectTemplates/LibraryProject/Template/Library.vstemplate b/vsintegration/ProjectTemplates/LibraryProject/Template/Library.vstemplate index db3850602d5..e83b31f66f3 100644 --- a/vsintegration/ProjectTemplates/LibraryProject/Template/Library.vstemplate +++ b/vsintegration/ProjectTemplates/LibraryProject/Template/Library.vstemplate @@ -27,7 +27,7 @@ - + diff --git a/vsintegration/ProjectTemplates/TutorialProject/Template/Tutorial.fsproj b/vsintegration/ProjectTemplates/TutorialProject/Template/Tutorial.fsproj index 61927697e83..053f6d845eb 100644 --- a/vsintegration/ProjectTemplates/TutorialProject/Template/Tutorial.fsproj +++ b/vsintegration/ProjectTemplates/TutorialProject/Template/Tutorial.fsproj @@ -45,7 +45,7 @@ - ..\packages\FSharp.Core.4.5.0\lib\net45\FSharp.Core.dll + ..\packages\FSharp.Core.4.5.2\lib\net45\FSharp.Core.dll True diff --git a/vsintegration/ProjectTemplates/TutorialProject/Template/Tutorial.vstemplate b/vsintegration/ProjectTemplates/TutorialProject/Template/Tutorial.vstemplate index 1fe64c81c8c..8b75ea91970 100644 --- a/vsintegration/ProjectTemplates/TutorialProject/Template/Tutorial.vstemplate +++ b/vsintegration/ProjectTemplates/TutorialProject/Template/Tutorial.vstemplate @@ -25,7 +25,7 @@ - + From b15df8c8b1a39dbadbbf6f6598fbb64e07778714 Mon Sep 17 00:00:00 2001 From: "Brett V. Forsgren" Date: Thu, 26 Jul 2018 10:07:58 -0700 Subject: [PATCH 021/160] add VSTS CI --- .vsts-dotnet.yml | 59 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 .vsts-dotnet.yml diff --git a/.vsts-dotnet.yml b/.vsts-dotnet.yml new file mode 100644 index 00000000000..67f78e6df0e --- /dev/null +++ b/.vsts-dotnet.yml @@ -0,0 +1,59 @@ +phases: +- phase: Linux + queue: + name: Hosted Linux Preview + timeoutInMinutes: 90 + parallel: 2 + matrix: + release_default: + _command: ./mono/cibuild.sh + _args: release + release_fcs: + _command: ./fcs/build.sh + _args: Build + steps: + - script: $(_command) $(_args) + - task: PublishBuildArtifacts@1 + inputs: + PathtoPublish: '$(Build.SourcesDirectory)/tests/TestResults' + ArtifactName: 'Linux $(_command) $(_args)' + publishLocation: Container + continueOnError: true + condition: failed() + +- phase: Windows + queue: + name: Hosted VS2017 + timeoutInMinutes: 90 + parallel: 7 + matrix: + ci_part1: + _command: build.cmd + _args: release ci_part1 + ci_part2: + _command: build.cmd + _args: release ci_part2 + ci_part3: + _command: build.cmd + _args: release ci_part3 + ci_part4: + _command: build.cmd + _args: release ci_part4 + debug_default: + _command: build.cmd + _args: debug + net40_no_vs: + _command: build.cmd + _args: release net40 + release_fcs: + _command: fcs\build.cmd + _args: TestAndNuget + steps: + - script: $(_command) $(_args) + - task: PublishBuildArtifacts@1 + inputs: + PathtoPublish: '$(Build.SourcesDirectory)\tests\TestResults' + ArtifactName: 'Windows $(_command) $(_args)' + publishLocation: Container + continueOnError: true + condition: failed() From a8d3d1050a9da632c594a58f18c65bcf1646dc51 Mon Sep 17 00:00:00 2001 From: "Brett V. Forsgren" Date: Tue, 31 Jul 2018 10:52:09 -0700 Subject: [PATCH 022/160] rename YAML build definitions --- .vsts-pr.yaml | 59 +++++++++++++++++++++++++ .vsts-signed.yaml | 107 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 166 insertions(+) create mode 100644 .vsts-pr.yaml create mode 100644 .vsts-signed.yaml diff --git a/.vsts-pr.yaml b/.vsts-pr.yaml new file mode 100644 index 00000000000..67f78e6df0e --- /dev/null +++ b/.vsts-pr.yaml @@ -0,0 +1,59 @@ +phases: +- phase: Linux + queue: + name: Hosted Linux Preview + timeoutInMinutes: 90 + parallel: 2 + matrix: + release_default: + _command: ./mono/cibuild.sh + _args: release + release_fcs: + _command: ./fcs/build.sh + _args: Build + steps: + - script: $(_command) $(_args) + - task: PublishBuildArtifacts@1 + inputs: + PathtoPublish: '$(Build.SourcesDirectory)/tests/TestResults' + ArtifactName: 'Linux $(_command) $(_args)' + publishLocation: Container + continueOnError: true + condition: failed() + +- phase: Windows + queue: + name: Hosted VS2017 + timeoutInMinutes: 90 + parallel: 7 + matrix: + ci_part1: + _command: build.cmd + _args: release ci_part1 + ci_part2: + _command: build.cmd + _args: release ci_part2 + ci_part3: + _command: build.cmd + _args: release ci_part3 + ci_part4: + _command: build.cmd + _args: release ci_part4 + debug_default: + _command: build.cmd + _args: debug + net40_no_vs: + _command: build.cmd + _args: release net40 + release_fcs: + _command: fcs\build.cmd + _args: TestAndNuget + steps: + - script: $(_command) $(_args) + - task: PublishBuildArtifacts@1 + inputs: + PathtoPublish: '$(Build.SourcesDirectory)\tests\TestResults' + ArtifactName: 'Windows $(_command) $(_args)' + publishLocation: Container + continueOnError: true + condition: failed() diff --git a/.vsts-signed.yaml b/.vsts-signed.yaml new file mode 100644 index 00000000000..6d5193b38c0 --- /dev/null +++ b/.vsts-signed.yaml @@ -0,0 +1,107 @@ +queue: + name: VSEng-MicroBuildVS2017 + timeoutInMinutes: 300 + demands: + - visualstudio + - DotNetFramework + - msbuild + +variables: + MSBuildConfiguration: 'Release' + +steps: +# Install Signing Plugin +- task: ms-vseng.MicroBuildTasks.30666190-6959-11e5-9f96-f56098202fef.MicroBuildSigningPlugin@1 + displayName: Install Signing Plugin + inputs: + signType: real + condition: and(succeeded(), in(variables['PB_SignType'], 'test', 'real')) + +# Install Swix Plugin +- task: ms-vseng.MicroBuildTasks.32f78468-e895-4f47-962c-58a699361df8.MicroBuildSwixPlugin@1 + displayName: Install Swix Plugin + +# Run build.cmd +- task: CmdLine@1 + displayName: Run build.cmd + inputs: + filename: build.cmd + arguments: microbuild + +# Publish nightly package to MyGet +- task: PowerShell@1 + displayName: Publish nightly package to MyGet + inputs: + scriptName: 'setup\publish-assets.ps1' + arguments: '-binariesPath $(MSBuildConfiguration) -branchName $(Build.SourceBranch) -apiKey $(FSharp.MyGetApiKey)' + condition: and(succeeded(), contains(variables['PB_PublishType'], 'myget'), in(variables['Build.SourceBranchName'], 'master', 'dev15.7', 'dev15.8')) + +# Publish packages to Azure Blob Storage +- task: MSBuild@1 + displayName: Publish packages to Azure Blob Storage + inputs: + solution: PublishToBlob.proj + msbuildArguments: '/t:Build /p:ExpectedFeedUrl=$(PB_PublishBlobFeedUrl) /p:AccountKey=$(PB_PublishBlobFeedKey) /p:ManifestBranch=$(SourceBranch) /p:ManifestCommit=$(SourceVersion) /p:ManifestBuildId=$(OfficialBuildId)' + condition: and(succeeded(), contains(variables['PB_PublishType'], 'blob')) + +# Run BinSkim +- task: securedevelopmentteam.vss-secure-development-tools.build-task-binskim.BinSkim@3 + displayName: Run BinSkim + inputs: + arguments: 'analyze "$(MSBuildConfiguration)\*.dll" "$(MSBuildConfiguration)\*.exe" --recurse --output "$(MSBuildConfiguration)\artifacts"' + continueOnError: true + +# Create static drop +- task: PublishBuildArtifacts@1 + displayName: Create static drop + inputs: + PathtoPublish: '$(MSBuildConfiguration)' + ArtifactName: '$(Build.BuildNumber)' + publishLocation: FilePath + TargetPath: '$(DropRoot)\$(Build.DefinitionName)\$(Build.SourceBranchName)' + Parallel: true + ParallelCount: 64 + condition: and(succeeded(), contains(variables['PB_PublishType'], 'drop')) + +# Publish symbols +- task: PublishSymbols@1 + displayName: Publish symbols + inputs: + SymbolsPath: '$(DropRoot)\$(Build.DefinitionName)\$(Build.SourceBranchName)\$(Build.BuildNumber)\Symbols' + SearchPattern: '**\*.dll;**\*.exe;**\*.pdb' + SymbolsFolder: '$(Build.SourcesDirectory)\$(MSBuildConfiguration)' + TreatNotIndexedAsWarning: true + SymbolsProduct: '$(Build.DefinitionName)' + SymbolsVersion: '$(Build.BuildNumber)' + continueOnError: true + condition: and(succeeded(), contains(variables['PB_PublishType'], 'symbols')) + +# Upload VSTS Drop +- task: ms-vseng.MicroBuildTasks.4305a8de-ba66-4d8b-b2d1-0dc4ecbbf5e8.MicroBuildUploadVstsDropFolder@1 + displayName: Upload VSTS Drop + inputs: + DropFolder: '$(Build.SourcesDirectory)\$(MSBuildConfiguration)\insertion' + condition: and(succeeded(), contains(variables['PB_PublishType'], 'vsts')) + +# Execute cleanup tasks +- task: ms-vseng.MicroBuildTasks.521a94ea-9e68-468a-8167-6dcf361ea776.MicroBuildCleanup@1 + displayName: Execute cleanup tasks + condition: succeededOrFailed() + +# Publish Artifact: MicroBuildOutputs +- task: PublishBuildArtifacts@1 + displayName: 'Publish Artifact: MicroBuildOutputs' + inputs: + PathtoPublish: '$(Build.StagingDirectory)\MicroBuild\Output' + ArtifactName: MicroBuildOutputs + publishLocation: Container + condition: and(succeeded(), contains(variables['PB_PublishType'], 'microbuild')) + +# Publish Symbols to Symweb +- task: ms-vscs-artifact.build-tasks.artifactSymbolTask-1.artifactSymbolTask@0 + displayName: Publish symbols to SymWeb + inputs: + symbolServiceURI: 'https://microsoft.artifacts.visualstudio.com/DefaultCollection' + sourcePath: '$(DropRoot)\$(Build.DefinitionName)\$(Build.SourceBranchName)\$(Build.BuildNumber)\Symbols' + usePat: false + condition: and(succeeded(), contains(variables['PB_PublishType'], 'symweb')) From bb819d1fa38aa6d9f8a8199d92362d004a4caabd Mon Sep 17 00:00:00 2001 From: "Brett V. Forsgren" Date: Tue, 31 Jul 2018 11:14:03 -0700 Subject: [PATCH 023/160] rename old YAML files --- .vsts-ci.yaml | 107 ----------------------------------------------- .vsts-dotnet.yml | 59 -------------------------- 2 files changed, 166 deletions(-) delete mode 100644 .vsts-ci.yaml delete mode 100644 .vsts-dotnet.yml diff --git a/.vsts-ci.yaml b/.vsts-ci.yaml deleted file mode 100644 index 6c76437dc26..00000000000 --- a/.vsts-ci.yaml +++ /dev/null @@ -1,107 +0,0 @@ -queue: - name: VSEng-MicroBuildVS2017 - timeoutInMinutes: 300 - demands: - - visualstudio - - DotNetFramework - - msbuild - -variables: - MSBuildConfiguration: 'Release' - -steps: -# Install Signing Plugin -- task: ms-vseng.MicroBuildTasks.30666190-6959-11e5-9f96-f56098202fef.MicroBuildSigningPlugin@1 - displayName: Install Signing Plugin - inputs: - signType: real - condition: and(succeeded(), in(variables['PB_SignType'], 'test', 'real')) - -# Install Swix Plugin -- task: ms-vseng.MicroBuildTasks.32f78468-e895-4f47-962c-58a699361df8.MicroBuildSwixPlugin@1 - displayName: Install Swix Plugin - -# Run build.cmd -- task: CmdLine@1 - displayName: Run build.cmd - inputs: - filename: build.cmd - arguments: microbuild - -# Publish nightly package to MyGet -- task: PowerShell@1 - displayName: Publish nightly package to MyGet - inputs: - scriptName: 'setup\publish-assets.ps1' - arguments: '-binariesPath $(MSBuildConfiguration) -branchName $(Build.SourceBranch) -apiKey $(FSharp.MyGetApiKey)' - condition: and(succeeded(), contains(variables['PB_PublishType'], 'myget'), in(variables['Build.SourceBranchName'], 'master', 'dev15.7', 'dev15.8')) - -# Publish packages to Azure Blob Storage -- task: MSBuild@1 - displayName: Publish packages to Azure Blob Storage - inputs: - solution: PublishToBlob.proj - msbuildArguments: '/t:Build /p:ExpectedFeedUrl=$(PB_PublishBlobFeedUrl) /p:AccountKey=$(PB_PublishBlobFeedKey) /p:ManifestBranch=$(SourceBranch) /p:ManifestCommit=$(SourceVersion) /p:ManifestBuildId=$(OfficialBuildId)' - condition: and(succeeded(), contains(variables['PB_PublishType'], 'blob')) - -# Run BinSkim -- task: securedevelopmentteam.vss-secure-development-tools.build-task-binskim.BinSkim@3 - displayName: Run BinSkim - inputs: - arguments: 'analyze "$(MSBuildConfiguration)\*.dll" "$(MSBuildConfiguration)\*.exe" --recurse --output "$(MSBuildConfiguration)\artifacts"' - continueOnError: true - -# Create static drop -- task: PublishBuildArtifacts@1 - displayName: Create static drop - inputs: - PathtoPublish: '$(MSBuildConfiguration)' - ArtifactName: '$(Build.BuildNumber)' - publishLocation: FilePath - TargetPath: '$(DropRoot)\$(Build.DefinitionName)\$(Build.SourceBranchName)' - Parallel: true - ParallelCount: 64 - condition: and(succeeded(), contains(variables['PB_PublishType'], 'drop')) - -# Publish symbols -- task: PublishSymbols@1 - displayName: Publish symbols - inputs: - SymbolsPath: '$(DropRoot)\$(Build.DefinitionName)\$(Build.SourceBranchName)\$(Build.BuildNumber)\Symbols' - SearchPattern: '**\*.dll;**\*.exe;**\*.pdb' - SymbolsFolder: '$(Build.SourcesDirectory)\$(MSBuildConfiguration)' - TreatNotIndexedAsWarning: true - SymbolsProduct: '$(Build.DefinitionName)' - SymbolsVersion: '$(Build.BuildNumber)' - continueOnError: true - condition: and(succeeded(), contains(variables['PB_PublishType'], 'symbols')) - -# Upload VSTS Drop -- task: ms-vseng.MicroBuildTasks.4305a8de-ba66-4d8b-b2d1-0dc4ecbbf5e8.MicroBuildUploadVstsDropFolder@1 - displayName: Upload VSTS Drop - inputs: - DropFolder: '$(Build.SourcesDirectory)\$(MSBuildConfiguration)\insertion' - condition: and(succeeded(), contains(variables['PB_PublishType'], 'vsts')) - -# Execute cleanup tasks -- task: ms-vseng.MicroBuildTasks.521a94ea-9e68-468a-8167-6dcf361ea776.MicroBuildCleanup@1 - displayName: Execute cleanup tasks - condition: succeededOrFailed() - -# Publish Artifact: MicroBuildOutputs -- task: PublishBuildArtifacts@1 - displayName: 'Publish Artifact: MicroBuildOutputs' - inputs: - PathtoPublish: '$(Build.StagingDirectory)\MicroBuild\Output' - ArtifactName: MicroBuildOutputs - publishLocation: Container - condition: and(succeeded(), contains(variables['PB_PublishType'], 'microbuild')) - -# Publish Symbols to Symweb -- task: ms-vscs-artifact.build-tasks.artifactSymbolTask-1.artifactSymbolTask@0 - displayName: Publish symbols to SymWeb - inputs: - symbolServiceURI: 'https://microsoft.artifacts.visualstudio.com/DefaultCollection' - sourcePath: '$(DropRoot)\$(Build.DefinitionName)\$(Build.SourceBranchName)\$(Build.BuildNumber)\Symbols' - usePat: false - condition: and(succeeded(), contains(variables['PB_PublishType'], 'symweb')) diff --git a/.vsts-dotnet.yml b/.vsts-dotnet.yml deleted file mode 100644 index 67f78e6df0e..00000000000 --- a/.vsts-dotnet.yml +++ /dev/null @@ -1,59 +0,0 @@ -phases: -- phase: Linux - queue: - name: Hosted Linux Preview - timeoutInMinutes: 90 - parallel: 2 - matrix: - release_default: - _command: ./mono/cibuild.sh - _args: release - release_fcs: - _command: ./fcs/build.sh - _args: Build - steps: - - script: $(_command) $(_args) - - task: PublishBuildArtifacts@1 - inputs: - PathtoPublish: '$(Build.SourcesDirectory)/tests/TestResults' - ArtifactName: 'Linux $(_command) $(_args)' - publishLocation: Container - continueOnError: true - condition: failed() - -- phase: Windows - queue: - name: Hosted VS2017 - timeoutInMinutes: 90 - parallel: 7 - matrix: - ci_part1: - _command: build.cmd - _args: release ci_part1 - ci_part2: - _command: build.cmd - _args: release ci_part2 - ci_part3: - _command: build.cmd - _args: release ci_part3 - ci_part4: - _command: build.cmd - _args: release ci_part4 - debug_default: - _command: build.cmd - _args: debug - net40_no_vs: - _command: build.cmd - _args: release net40 - release_fcs: - _command: fcs\build.cmd - _args: TestAndNuget - steps: - - script: $(_command) $(_args) - - task: PublishBuildArtifacts@1 - inputs: - PathtoPublish: '$(Build.SourcesDirectory)\tests\TestResults' - ArtifactName: 'Windows $(_command) $(_args)' - publishLocation: Container - continueOnError: true - condition: failed() From ce72df25171fc1868c32e8bda489b2f912be7f93 Mon Sep 17 00:00:00 2001 From: "Brett V. Forsgren" Date: Wed, 1 Aug 2018 16:32:58 -0700 Subject: [PATCH 024/160] netci.remoovy --- netci.groovy | 124 --------------------------------------------------- 1 file changed, 124 deletions(-) delete mode 100644 netci.groovy diff --git a/netci.groovy b/netci.groovy deleted file mode 100644 index 33522433650..00000000000 --- a/netci.groovy +++ /dev/null @@ -1,124 +0,0 @@ -import jobs.generation.Utilities; -import jobs.generation.JobReport; - -def project = GithubProject -def branch = GithubBranchName - -def osList = ['Windows_NT', 'Ubuntu16.04'] //, 'OSX'], 'CentOS7.1' - -def static getBuildJobName(def configuration, def os) { - return configuration.toLowerCase() + '_' + os.toLowerCase() -} - -[true, false].each { isPullRequest -> - osList.each { os -> - def configurations = []; - if (os == 'Windows_NT') { - configurations = ['Debug_default', 'Release_ci_part1', 'Release_ci_part2', 'Release_ci_part3', 'Release_ci_part4', 'Release_net40_no_vs', 'Release_fcs' ]; - } - else - { - // Linux - // TODO: It should be possible to enable these configurations immediately subsequent to the PR containing this line - //configurations = ['Debug_default', 'Release_net40_test', 'Release_fcs' ]; - configurations = [ 'Release_default', 'Release_fcs' ]; - } - - configurations.each { configuration -> - - def jobName = getBuildJobName(configuration, os) - def buildCommand = ''; - def buildOutput= ''; - def buildArgs= ''; - - if (configuration == "Release_fcs" && branch != "dev15.5") { - // Build and test FCS NuGet package - buildOutput = "release" - if (os == 'Windows_NT') { - buildCommand = ".\\fcs\\build.cmd TestAndNuget" - } - else { - buildCommand = "./fcs/cibuild.sh Build" - } - } - else if (configuration == "Debug_default") { - buildOutput = "debug" - if (os == 'Windows_NT') { - buildCommand = "build.cmd debug" - } - else { - buildCommand = "./mono/cibuild.sh debug" - } - } - else if (configuration == "Release_default") { - buildOutput = "release" - if (os == 'Windows_NT') { - buildCommand = "build.cmd release" - } - else { - buildCommand = "./mono/cibuild.sh release" - } - } - else if (configuration == "Release_net40_test") { - buildOutput = "release" - buildCommand = "build.cmd release net40 test" - } - else if (configuration == "Release_ci_part1") { - buildOutput = "release" - buildCommand = "build.cmd release ci_part1" - } - else if (configuration == "Release_ci_part2") { - buildOutput = "release" - buildCommand = "build.cmd release ci_part2" - } - else if (configuration == "Release_ci_part3") { - buildOutput = "release" - buildCommand = "build.cmd release ci_part3" - } - else if (configuration == "Release_ci_part4") { - buildOutput = "release" - buildCommand = "build.cmd release ci_part4" - } - else if (configuration == "Release_net40_no_vs") { - buildOutput = "release" - buildCommand = "build.cmd release net40" - } - - - def newJobName = Utilities.getFullJobName(project, jobName, isPullRequest) - def newJob = job(newJobName) { - steps { - if (os == 'Windows_NT') { - batchFile(buildCommand) - } - else { - shell(buildCommand) - } - } - } - - // TODO: set to false after tests are fully enabled - def skipIfNoTestFiles = true - def skipIfNoBuildOutput = false - - // outer-latest = "sudo is enabled by default" - // latest-or-auto = "sudo is not enabled" - // - // https://github.com/Microsoft/visualfsharp/pull/4372#issuecomment-367850885 - def affinity = (configuration == 'Release_net40_no_vs' ? 'latest-or-auto' : (os == 'Windows_NT' ? 'latest-dev15-5' : 'outer-latest')) - Utilities.setMachineAffinity(newJob, os, affinity) - Utilities.standardJobSetup(newJob, project, isPullRequest, "*/${branch}") - - Utilities.addArchival(newJob, "tests/TestResults/*.*", "", skipIfNoTestFiles, false) - Utilities.addArchival(newJob, "${buildOutput}/**", "", skipIfNoBuildOutput, false) - if (isPullRequest) { - Utilities.addGithubPRTriggerForBranch(newJob, branch, "${os} ${configuration} Build") - } - else { - Utilities.addGithubPushTrigger(newJob) - } - } - } -} - -JobReport.Report.generateJobReport(out) From ac59b222f4bb6f3cc3c0ae33be826c2f81a3d0ce Mon Sep 17 00:00:00 2001 From: Will Smith Date: Tue, 7 Aug 2018 16:48:04 -0700 Subject: [PATCH 025/160] Fixed extension members that extend a type using a byref to be called with an immutable value (#5447) * Fixed extension members that extend a type using a byref to be called with an immutable value * Added more tests, but no updated baseline yet * Updated baselines * Minor cleanup * Fixed tests. Fixed output of tests * Updated buildfromsource * Minor cleanup --- .../FSharp.Compiler.Private/FSComp.fs | 38 ++++---- .../FSharp.Compiler.Private/FSComp.resx | 8 +- src/fsharp/FSComp.txt | 3 +- src/fsharp/MethodCalls.fs | 28 +++++- src/fsharp/import.fs | 1 - src/fsharp/infos.fs | 36 ++++--- src/fsharp/symbols/Exprs.fs | 2 +- src/fsharp/xlf/FSComp.txt.cs.xlf | 5 + src/fsharp/xlf/FSComp.txt.de.xlf | 5 + src/fsharp/xlf/FSComp.txt.en.xlf | 5 + src/fsharp/xlf/FSComp.txt.es.xlf | 5 + src/fsharp/xlf/FSComp.txt.fr.xlf | 5 + src/fsharp/xlf/FSComp.txt.it.xlf | 5 + src/fsharp/xlf/FSComp.txt.ja.xlf | 5 + src/fsharp/xlf/FSComp.txt.ko.xlf | 5 + src/fsharp/xlf/FSComp.txt.pl.xlf | 5 + src/fsharp/xlf/FSComp.txt.pt-BR.xlf | 5 + src/fsharp/xlf/FSComp.txt.ru.xlf | 5 + src/fsharp/xlf/FSComp.txt.tr.xlf | 5 + src/fsharp/xlf/FSComp.txt.zh-Hans.xlf | 5 + src/fsharp/xlf/FSComp.txt.zh-Hant.xlf | 5 + src/scripts/scriptlib.fsx | 4 +- tests/fsharp/core/byrefs/cslib3.cs | 17 ++++ tests/fsharp/core/byrefs/test3.bsl | 14 +++ tests/fsharp/core/byrefs/test3.fsx | 93 +++++++++++++++++++ tests/fsharp/core/fsfromfsviacs/test.fsx | 4 +- tests/fsharp/tests.fs | 22 ++--- 27 files changed, 285 insertions(+), 55 deletions(-) create mode 100644 tests/fsharp/core/byrefs/cslib3.cs create mode 100644 tests/fsharp/core/byrefs/test3.bsl create mode 100644 tests/fsharp/core/byrefs/test3.fsx diff --git a/src/buildfromsource/FSharp.Compiler.Private/FSComp.fs b/src/buildfromsource/FSharp.Compiler.Private/FSComp.fs index 7ed2ec0d0a5..41b2c5d0a52 100644 --- a/src/buildfromsource/FSharp.Compiler.Private/FSComp.fs +++ b/src/buildfromsource/FSharp.Compiler.Private/FSComp.fs @@ -4327,33 +4327,33 @@ type internal SR private() = /// The address of a value returned from the expression cannot be used at this point. This is to ensure the address of the local value does not escape its scope. /// (Originally from ..\FSComp.txt:1433) static member chkNoByrefAddressOfValueFromExpression() = (3228, GetStringFunc("chkNoByrefAddressOfValueFromExpression",",,,") ) - /// The Span or IsByRefLike expression cannot be returned from this function or method, because it is composed using elements that may escape their scope. - /// (Originally from ..\FSComp.txt:1434) - static member chkNoReturnOfLimitedSpan() = (3229, GetStringFunc("chkNoReturnOfLimitedSpan",",,,") ) /// This value can't be assigned because the target '%s' may refer to non-stack-local memory, while the expression being assigned is assessed to potentially refer to stack-local memory. This is to help prevent pointers to stack-bound memory escaping their scope. - /// (Originally from ..\FSComp.txt:1435) - static member chkNoWriteToLimitedSpan(a0 : System.String) = (3230, GetStringFunc("chkNoWriteToLimitedSpan",",,,%s,,,") a0) + /// (Originally from ..\FSComp.txt:1434) + static member chkNoWriteToLimitedSpan(a0 : System.String) = (3229, GetStringFunc("chkNoWriteToLimitedSpan",",,,%s,,,") a0) /// A value defined in a module must be mutable in order to take its address, e.g. 'let mutable x = ...' - /// (Originally from ..\FSComp.txt:1436) - static member tastValueMustBeLocal() = (3231, GetStringFunc("tastValueMustBeLocal",",,,") ) + /// (Originally from ..\FSComp.txt:1435) + static member tastValueMustBeLocal() = (3230, GetStringFunc("tastValueMustBeLocal",",,,") ) /// A type annotated with IsReadOnly must also be a struct. Consider adding the [] attribute to the type. + /// (Originally from ..\FSComp.txt:1436) + static member tcIsReadOnlyNotStruct() = (3231, GetStringFunc("tcIsReadOnlyNotStruct",",,,") ) + /// Struct members cannot return the address of fields of the struct by reference /// (Originally from ..\FSComp.txt:1437) - static member tcIsReadOnlyNotStruct() = (3232, GetStringFunc("tcIsReadOnlyNotStruct",",,,") ) - /// Struct members cannot return 'this' or fields by reference - /// (Originally from ..\FSComp.txt:1438) - static member chkStructsMayNotReturnAddressesOfContents() = (3234, GetStringFunc("chkStructsMayNotReturnAddressesOfContents",",,,") ) + static member chkStructsMayNotReturnAddressesOfContents() = (3232, GetStringFunc("chkStructsMayNotReturnAddressesOfContents",",,,") ) /// The function or method call cannot be used at this point, because one argument that is a byref of a non-stack-local Span or IsByRefLike type is used with another argument that is a stack-local Span or IsByRefLike type. This is to ensure the address of the local value does not escape its scope. - /// (Originally from ..\FSComp.txt:1439) - static member chkNoByrefLikeFunctionCall() = (3235, GetStringFunc("chkNoByrefLikeFunctionCall",",,,") ) + /// (Originally from ..\FSComp.txt:1438) + static member chkNoByrefLikeFunctionCall() = (3233, GetStringFunc("chkNoByrefLikeFunctionCall",",,,") ) /// The Span or IsByRefLike variable '%s' cannot be used at this point. This is to ensure the address of the local value does not escape its scope. - /// (Originally from ..\FSComp.txt:1440) - static member chkNoSpanLikeVariable(a0 : System.String) = (3236, GetStringFunc("chkNoSpanLikeVariable",",,,%s,,,") a0) + /// (Originally from ..\FSComp.txt:1439) + static member chkNoSpanLikeVariable(a0 : System.String) = (3234, GetStringFunc("chkNoSpanLikeVariable",",,,%s,,,") a0) /// A Span or IsByRefLike value returned from the expression cannot be used at ths point. This is to ensure the address of the local value does not escape its scope. - /// (Originally from ..\FSComp.txt:1441) - static member chkNoSpanLikeValueFromExpression() = (3237, GetStringFunc("chkNoSpanLikeValueFromExpression",",,,") ) + /// (Originally from ..\FSComp.txt:1440) + static member chkNoSpanLikeValueFromExpression() = (3235, GetStringFunc("chkNoSpanLikeValueFromExpression",",,,") ) /// Cannot take the address of the value returned from the expression. Assign the returned value to a let-bound value before taking the address. + /// (Originally from ..\FSComp.txt:1441) + static member tastCantTakeAddressOfExpression() = (3236, GetStringFunc("tastCantTakeAddressOfExpression",",,,") ) + /// Cannot call the extension member as it requires the value to be mutable or a byref type due to the extending type being used as a byref. /// (Originally from ..\FSComp.txt:1442) - static member tastCantTakeAddressOfExpression() = (3238, GetStringFunc("tastCantTakeAddressOfExpression",",,,") ) + static member tcCannotCallExtensionMemberInrefToByref() = (3237, GetStringFunc("tcCannotCallExtensionMemberInrefToByref",",,,") ) /// Call this method once to validate that all known resources are valid; throws if not static member RunStartupValidation() = @@ -5761,7 +5761,6 @@ type internal SR private() = ignore(GetString("tcByrefReturnImplicitlyDereferenced")) ignore(GetString("tcByRefLikeNotStruct")) ignore(GetString("chkNoByrefAddressOfValueFromExpression")) - ignore(GetString("chkNoReturnOfLimitedSpan")) ignore(GetString("chkNoWriteToLimitedSpan")) ignore(GetString("tastValueMustBeLocal")) ignore(GetString("tcIsReadOnlyNotStruct")) @@ -5770,4 +5769,5 @@ type internal SR private() = ignore(GetString("chkNoSpanLikeVariable")) ignore(GetString("chkNoSpanLikeValueFromExpression")) ignore(GetString("tastCantTakeAddressOfExpression")) + ignore(GetString("tcCannotCallExtensionMemberInrefToByref")) () diff --git a/src/buildfromsource/FSharp.Compiler.Private/FSComp.resx b/src/buildfromsource/FSharp.Compiler.Private/FSComp.resx index 9e1820ee5c6..40750aba5ba 100644 --- a/src/buildfromsource/FSharp.Compiler.Private/FSComp.resx +++ b/src/buildfromsource/FSharp.Compiler.Private/FSComp.resx @@ -4330,9 +4330,6 @@ The address of a value returned from the expression cannot be used at this point. This is to ensure the address of the local value does not escape its scope. - - The Span or IsByRefLike expression cannot be returned from this function or method, because it is composed using elements that may escape their scope. - This value can't be assigned because the target '{0}' may refer to non-stack-local memory, while the expression being assigned is assessed to potentially refer to stack-local memory. This is to help prevent pointers to stack-bound memory escaping their scope. @@ -4343,7 +4340,7 @@ A type annotated with IsReadOnly must also be a struct. Consider adding the [<Struct>] attribute to the type. - Struct members cannot return 'this' or fields by reference + Struct members cannot return the address of fields of the struct by reference The function or method call cannot be used at this point, because one argument that is a byref of a non-stack-local Span or IsByRefLike type is used with another argument that is a stack-local Span or IsByRefLike type. This is to ensure the address of the local value does not escape its scope. @@ -4357,4 +4354,7 @@ Cannot take the address of the value returned from the expression. Assign the returned value to a let-bound value before taking the address. + + Cannot call the extension member as it requires the value to be mutable or a byref type due to the extending type being used as a byref. + \ No newline at end of file diff --git a/src/fsharp/FSComp.txt b/src/fsharp/FSComp.txt index 45b1fd97ac3..6d94078f60e 100644 --- a/src/fsharp/FSComp.txt +++ b/src/fsharp/FSComp.txt @@ -1438,4 +1438,5 @@ notAFunctionButMaybeDeclaration,"This value is not a function and cannot be appl 3233,chkNoByrefLikeFunctionCall,"The function or method call cannot be used at this point, because one argument that is a byref of a non-stack-local Span or IsByRefLike type is used with another argument that is a stack-local Span or IsByRefLike type. This is to ensure the address of the local value does not escape its scope." 3234,chkNoSpanLikeVariable,"The Span or IsByRefLike variable '%s' cannot be used at this point. This is to ensure the address of the local value does not escape its scope." 3235,chkNoSpanLikeValueFromExpression,"A Span or IsByRefLike value returned from the expression cannot be used at ths point. This is to ensure the address of the local value does not escape its scope." -3236,tastCantTakeAddressOfExpression,"Cannot take the address of the value returned from the expression. Assign the returned value to a let-bound value before taking the address." \ No newline at end of file +3236,tastCantTakeAddressOfExpression,"Cannot take the address of the value returned from the expression. Assign the returned value to a let-bound value before taking the address." +3237,tcCannotCallExtensionMemberInrefToByref,"Cannot call the extension member as it requires the value to be mutable or a byref type due to the extending type being used as a byref." \ No newline at end of file diff --git a/src/fsharp/MethodCalls.fs b/src/fsharp/MethodCalls.fs index 2aa8b964aaf..cf8ec878fdb 100644 --- a/src/fsharp/MethodCalls.fs +++ b/src/fsharp/MethodCalls.fs @@ -585,7 +585,7 @@ let TakeObjAddrForMethodCall g amap (minfo:MethInfo) isMutable m objArgs f = let hasCallInfo = ccallInfo.IsSome let mustTakeAddress = hasCallInfo || minfo.ObjArgNeedsAddress(amap, m) let objArgTy = tyOfExpr g objArgExpr - let wrap, objArgExpr', _readonly, _writeonly = mkExprAddrOfExpr g mustTakeAddress hasCallInfo isMutable objArgExpr None m + let wrap, objArgExpr', isReadOnly, _isWriteOnly = mkExprAddrOfExpr g mustTakeAddress hasCallInfo isMutable objArgExpr None m // Extension members and calls to class constraints may need a coercion for their object argument let objArgExpr' = @@ -595,6 +595,32 @@ let TakeObjAddrForMethodCall g amap (minfo:MethInfo) isMutable m objArgs f = else objArgExpr' + // Check to see if the extension member uses the extending type as a byref. + // If so, make sure we don't allow readonly/immutable values to be passed byref from an extension member. + // An inref will work though. + if mustTakeAddress && isReadOnly && minfo.IsExtensionMember then + let tyOpt = + match minfo with + // For F# defined methods. + | FSMeth(_, _, vref, _) -> + let ty, _ = destFunTy g vref.Type + Some(ty) + + // For IL methods, defined outside of F#. + | ILMeth(_, info, _) -> + let paramTypes = info.GetRawArgTypes(amap, m, minfo.FormalMethodInst) + match paramTypes with + | [] -> failwith "impossible" + | ty :: _ -> Some(ty) + + | _ -> None + + match tyOpt with + | Some(ty) -> + if isByrefTy g ty && not (isInByrefTy g ty) then + errorR(Error(FSComp.SR.tcCannotCallExtensionMemberInrefToByref(), m)) + | _ -> () + wrap, [objArgExpr'] | _ -> diff --git a/src/fsharp/import.fs b/src/fsharp/import.fs index 098720fb0ad..6974c969663 100644 --- a/src/fsharp/import.fs +++ b/src/fsharp/import.fs @@ -168,7 +168,6 @@ let rec ImportILType (env:ImportMap) m tinst ty = let inst = tspec.GenericArgs |> List.map (ImportILType env m tinst) ImportTyconRefApp env tcref inst - | ILType.Modified(_,tref,ILType.Byref ty) when tref.Name = "System.Runtime.InteropServices.InAttribute" -> mkInByrefTy env.g (ImportILType env m tinst ty) | ILType.Byref ty -> mkByrefTy env.g (ImportILType env m tinst ty) | ILType.Ptr ILType.Void when env.g.voidptr_tcr.CanDeref -> mkVoidPtrTy env.g | ILType.Ptr ty -> mkNativePtrTy env.g (ImportILType env m tinst ty) diff --git a/src/fsharp/infos.fs b/src/fsharp/infos.fs index 12b68546901..ea2d29149bc 100755 --- a/src/fsharp/infos.fs +++ b/src/fsharp/infos.fs @@ -284,13 +284,26 @@ let ExistsHeadTypeInEntireHierarchy g amap m typeToSearchFrom tcrefToLookFor = let ImportILTypeFromMetadata amap m scoref tinst minst ilty = ImportILType scoref amap m (tinst@minst) ilty - -/// Get the return type of an IL method, taking into account instantiations for type and method generic parameters, and +/// Read an Abstract IL type from metadata, including any attributes that may affect the type itself, and convert to an F# type. +let ImportILTypeFromMetadataWithAttributes amap m scoref tinst minst ilty cattrs = + let ty = ImportILType scoref amap m (tinst@minst) ilty + // If the type is a byref and one of attributes from a return or parameter has IsReadOnly, then it's a inref. + if isByrefTy amap.g ty && TryFindILAttribute amap.g.attrib_IsReadOnlyAttribute cattrs then + mkInByrefTy amap.g (destByrefTy amap.g ty) + else + ty + +/// Get the parameter type of an IL method. +let ImportParameterTypeFromMetadata amap m ilty cattrs scoref tinst mist = + ImportILTypeFromMetadataWithAttributes amap m scoref tinst mist ilty cattrs + +/// Get the return type of an IL method, taking into account instantiations for type, return attributes and method generic parameters, and /// translating 'void' to 'None'. -let ImportReturnTypeFromMetaData amap m ty scoref tinst minst = - match ty with +let ImportReturnTypeFromMetadata amap m ilty cattrs scoref tinst minst = + match ilty with | ILType.Void -> None - | retTy -> Some (ImportILTypeFromMetadata amap m scoref tinst minst retTy) + | retTy -> Some(ImportILTypeFromMetadataWithAttributes amap m scoref tinst minst retTy cattrs) + /// Copy constraints. If the constraint comes from a type parameter associated /// with a type constructor then we are simply renaming type variables. If it comes @@ -806,19 +819,19 @@ type ILMethInfo = /// Get the argument types of the the IL method. If this is an C#-style extension method /// then drop the object argument. member x.GetParamTypes(amap,m,minst) = - x.ParamMetadata |> List.map (fun p -> ImportILTypeFromMetadata amap m x.MetadataScope x.DeclaringTypeInst minst p.Type) + x.ParamMetadata |> List.map (fun p -> ImportParameterTypeFromMetadata amap m p.Type p.CustomAttrs x.MetadataScope x.DeclaringTypeInst minst) /// Get all the argument types of the IL method. Include the object argument even if this is /// an C#-style extension method. member x.GetRawArgTypes(amap,m,minst) = - x.RawMetadata.Parameters |> List.map (fun p -> ImportILTypeFromMetadata amap m x.MetadataScope x.DeclaringTypeInst minst p.Type) + x.RawMetadata.Parameters |> List.map (fun p -> ImportParameterTypeFromMetadata amap m p.Type p.CustomAttrs x.MetadataScope x.DeclaringTypeInst minst) /// Get info about the arguments of the IL method. If this is an C#-style extension method then /// drop the object argument. /// /// Any type parameters of the enclosing type are instantiated in the type returned. member x.GetParamNamesAndTypes(amap,m,minst) = - x.ParamMetadata |> List.map (fun p -> ParamNameAndType(Option.map (mkSynId m) p.Name, ImportILTypeFromMetadata amap m x.MetadataScope x.DeclaringTypeInst minst p.Type) ) + x.ParamMetadata |> List.map (fun p -> ParamNameAndType(Option.map (mkSynId m) p.Name, ImportParameterTypeFromMetadata amap m p.Type p.CustomAttrs x.MetadataScope x.DeclaringTypeInst minst) ) /// Get a reference to the method (dropping all generic instantiations), as an Abstract IL ILMethodRef. member x.ILMethodRef = @@ -838,7 +851,8 @@ type ILMethInfo = // All C#-style extension methods are instance. We have to re-read the 'obj' type w.r.t. the // method instantiation. if x.IsILExtensionMethod then - [ImportILTypeFromMetadata amap m x.MetadataScope x.DeclaringTypeInst minst x.RawMetadata.Parameters.Head.Type] + let p = x.RawMetadata.Parameters.Head + [ ImportParameterTypeFromMetadata amap m p.Type p.CustomAttrs x.MetadataScope x.DeclaringTypeInst minst ] else if x.IsInstance then [ x.ApparentEnclosingType ] else @@ -846,7 +860,7 @@ type ILMethInfo = /// Get the compiled return type of the method, where 'void' is None. member x.GetCompiledReturnTy (amap, m, minst) = - ImportReturnTypeFromMetaData amap m x.RawMetadata.Return.Type x.MetadataScope x.DeclaringTypeInst minst + ImportReturnTypeFromMetadata amap m x.RawMetadata.Return.Type x.RawMetadata.Return.CustomAttrs x.MetadataScope x.DeclaringTypeInst minst /// Get the F# view of the return type of the method, where 'void' is 'unit'. member x.GetFSharpReturnTy (amap, m, minst) = @@ -1503,7 +1517,7 @@ type MethInfo = match x with | ILMeth(_,ilminfo,_) -> let ftinfo = ILTypeInfo.FromType g (TType_app(tcref,formalEnclosingTyparTys)) - let formalRetTy = ImportReturnTypeFromMetaData amap m ilminfo.RawMetadata.Return.Type ftinfo.ILScopeRef ftinfo.TypeInstOfRawMetadata formalMethTyparTys + let formalRetTy = ImportReturnTypeFromMetadata amap m ilminfo.RawMetadata.Return.Type ilminfo.RawMetadata.Return.CustomAttrs ftinfo.ILScopeRef ftinfo.TypeInstOfRawMetadata formalMethTyparTys let formalParams = [ [ for p in ilminfo.RawMetadata.Parameters do let paramType = ImportILTypeFromMetadata amap m ftinfo.ILScopeRef ftinfo.TypeInstOfRawMetadata formalMethTyparTys p.Type diff --git a/src/fsharp/symbols/Exprs.fs b/src/fsharp/symbols/Exprs.fs index 6cb398a4b1d..9a954181894 100644 --- a/src/fsharp/symbols/Exprs.fs +++ b/src/fsharp/symbols/Exprs.fs @@ -1033,7 +1033,7 @@ module FSharpExprConvert = // is not sufficient to resolve to a symbol unambiguously in these cases. let argtys = [ ilMethRef.ArgTypes |> List.map (ImportILTypeFromMetadata cenv.amap m scoref tinst1 tinst2) ] let rty = - match ImportReturnTypeFromMetaData cenv.amap m ilMethRef.ReturnType scoref tinst1 tinst2 with + match ImportReturnTypeFromMetadata cenv.amap m ilMethRef.ReturnType emptyILCustomAttrs scoref tinst1 tinst2 with | None -> if isCtor then enclosingType else cenv.g.unit_ty | Some ty -> ty diff --git a/src/fsharp/xlf/FSComp.txt.cs.xlf b/src/fsharp/xlf/FSComp.txt.cs.xlf index c35b624ab80..d2d83bbdec9 100644 --- a/src/fsharp/xlf/FSComp.txt.cs.xlf +++ b/src/fsharp/xlf/FSComp.txt.cs.xlf @@ -7057,6 +7057,11 @@ Adresa hodnoty vrácená výrazem nejde převzít. Před převzetím adresy přiřaďte vrácenou hodnotu hodnotě s vazbou na klauzuli Let. + + Cannot call the extension member as it requires the value to be mutable or a byref type due to the extending type being used as a byref. + Cannot call the extension member as it requires the value to be mutable or a byref type due to the extending type being used as a byref. + + \ No newline at end of file diff --git a/src/fsharp/xlf/FSComp.txt.de.xlf b/src/fsharp/xlf/FSComp.txt.de.xlf index 6473c1ca2e1..4853adb8cfe 100644 --- a/src/fsharp/xlf/FSComp.txt.de.xlf +++ b/src/fsharp/xlf/FSComp.txt.de.xlf @@ -7057,6 +7057,11 @@ Die Adresse des über den Ausdruck zurückgegebenen Werts kann nicht abgerufen werden. Weisen Sie den zurückgegebenen Wert einem let-bound-Wert zu, bevor Sie die Adresse abrufen. + + Cannot call the extension member as it requires the value to be mutable or a byref type due to the extending type being used as a byref. + Cannot call the extension member as it requires the value to be mutable or a byref type due to the extending type being used as a byref. + + \ No newline at end of file diff --git a/src/fsharp/xlf/FSComp.txt.en.xlf b/src/fsharp/xlf/FSComp.txt.en.xlf index 201f95f6014..9db0c5bd31d 100644 --- a/src/fsharp/xlf/FSComp.txt.en.xlf +++ b/src/fsharp/xlf/FSComp.txt.en.xlf @@ -7057,6 +7057,11 @@ Cannot take the address of the value returned from the expression. Assign the returned value to a let-bound value before taking the address. + + Cannot call the extension member as it requires the value to be mutable or a byref type due to the extending type being used as a byref. + Cannot call the extension member as it requires the value to be mutable or a byref type due to the extending type being used as a byref. + + \ No newline at end of file diff --git a/src/fsharp/xlf/FSComp.txt.es.xlf b/src/fsharp/xlf/FSComp.txt.es.xlf index b0d681b1a70..dcfd7de5e07 100644 --- a/src/fsharp/xlf/FSComp.txt.es.xlf +++ b/src/fsharp/xlf/FSComp.txt.es.xlf @@ -7057,6 +7057,11 @@ No se puede tomar la dirección del valor devuelto de la expresión. Asigne el valor devuelto a un valor enlazado con let antes de tomar la dirección. + + Cannot call the extension member as it requires the value to be mutable or a byref type due to the extending type being used as a byref. + Cannot call the extension member as it requires the value to be mutable or a byref type due to the extending type being used as a byref. + + \ No newline at end of file diff --git a/src/fsharp/xlf/FSComp.txt.fr.xlf b/src/fsharp/xlf/FSComp.txt.fr.xlf index 67a531340f3..6e771a8724c 100644 --- a/src/fsharp/xlf/FSComp.txt.fr.xlf +++ b/src/fsharp/xlf/FSComp.txt.fr.xlf @@ -7057,6 +7057,11 @@ Impossible de prendre l'adresse de la valeur retournée par l'expression. Assignez la valeur retournée à une valeur liée à let avant de prendre l'adresse. + + Cannot call the extension member as it requires the value to be mutable or a byref type due to the extending type being used as a byref. + Cannot call the extension member as it requires the value to be mutable or a byref type due to the extending type being used as a byref. + + \ No newline at end of file diff --git a/src/fsharp/xlf/FSComp.txt.it.xlf b/src/fsharp/xlf/FSComp.txt.it.xlf index be2e50ff23c..28a8da4bfdc 100644 --- a/src/fsharp/xlf/FSComp.txt.it.xlf +++ b/src/fsharp/xlf/FSComp.txt.it.xlf @@ -7057,6 +7057,11 @@ Non è possibile accettare l'indirizzo del valore restituito dall'espressione. Assegnare il valore restituito a un valore associato a let prima di accettare l'indirizzo. + + Cannot call the extension member as it requires the value to be mutable or a byref type due to the extending type being used as a byref. + Cannot call the extension member as it requires the value to be mutable or a byref type due to the extending type being used as a byref. + + \ No newline at end of file diff --git a/src/fsharp/xlf/FSComp.txt.ja.xlf b/src/fsharp/xlf/FSComp.txt.ja.xlf index 66c7b085814..60e547f4984 100644 --- a/src/fsharp/xlf/FSComp.txt.ja.xlf +++ b/src/fsharp/xlf/FSComp.txt.ja.xlf @@ -7057,6 +7057,11 @@ 式から返された値のアドレスを取得できません。アドレスを取得する前に、let でバインドされた値に戻り値を割り当ててください。 + + Cannot call the extension member as it requires the value to be mutable or a byref type due to the extending type being used as a byref. + Cannot call the extension member as it requires the value to be mutable or a byref type due to the extending type being used as a byref. + + \ No newline at end of file diff --git a/src/fsharp/xlf/FSComp.txt.ko.xlf b/src/fsharp/xlf/FSComp.txt.ko.xlf index 379b9edb252..9a731b6724c 100644 --- a/src/fsharp/xlf/FSComp.txt.ko.xlf +++ b/src/fsharp/xlf/FSComp.txt.ko.xlf @@ -7057,6 +7057,11 @@ 식에서 반환된 값의 주소를 가져올 수 없습니다. 주소를 가져오기 전에 반환된 값을 let 바인딩 값에 할당하세요. + + Cannot call the extension member as it requires the value to be mutable or a byref type due to the extending type being used as a byref. + Cannot call the extension member as it requires the value to be mutable or a byref type due to the extending type being used as a byref. + + \ No newline at end of file diff --git a/src/fsharp/xlf/FSComp.txt.pl.xlf b/src/fsharp/xlf/FSComp.txt.pl.xlf index 5e296e9a85f..2a8a59fac8c 100644 --- a/src/fsharp/xlf/FSComp.txt.pl.xlf +++ b/src/fsharp/xlf/FSComp.txt.pl.xlf @@ -7057,6 +7057,11 @@ Nie można uzyskać adresu wartości zwróconej przez wyrażenie. Przypisz zwróconą wartość do wartości powiązanej za pomocą instrukcji let przed uzyskaniem adresu. + + Cannot call the extension member as it requires the value to be mutable or a byref type due to the extending type being used as a byref. + Cannot call the extension member as it requires the value to be mutable or a byref type due to the extending type being used as a byref. + + \ No newline at end of file diff --git a/src/fsharp/xlf/FSComp.txt.pt-BR.xlf b/src/fsharp/xlf/FSComp.txt.pt-BR.xlf index 5c8c4378800..6b5e24ae388 100644 --- a/src/fsharp/xlf/FSComp.txt.pt-BR.xlf +++ b/src/fsharp/xlf/FSComp.txt.pt-BR.xlf @@ -7057,6 +7057,11 @@ Não é possível obter o endereço do valor retornado da expressão. Atribua o valor retornado a um valor associado a let antes de obter o endereço. + + Cannot call the extension member as it requires the value to be mutable or a byref type due to the extending type being used as a byref. + Cannot call the extension member as it requires the value to be mutable or a byref type due to the extending type being used as a byref. + + \ No newline at end of file diff --git a/src/fsharp/xlf/FSComp.txt.ru.xlf b/src/fsharp/xlf/FSComp.txt.ru.xlf index fe4b9d5e7c1..c04e61a3e05 100644 --- a/src/fsharp/xlf/FSComp.txt.ru.xlf +++ b/src/fsharp/xlf/FSComp.txt.ru.xlf @@ -7057,6 +7057,11 @@ Невозможно получить адрес значения, возвращенного из выражения. Используйте возвращенное значение в качестве значения с привязкой let, прежде чем получить адрес. + + Cannot call the extension member as it requires the value to be mutable or a byref type due to the extending type being used as a byref. + Cannot call the extension member as it requires the value to be mutable or a byref type due to the extending type being used as a byref. + + \ No newline at end of file diff --git a/src/fsharp/xlf/FSComp.txt.tr.xlf b/src/fsharp/xlf/FSComp.txt.tr.xlf index f837606166d..0f8ad5a38fd 100644 --- a/src/fsharp/xlf/FSComp.txt.tr.xlf +++ b/src/fsharp/xlf/FSComp.txt.tr.xlf @@ -7057,6 +7057,11 @@ İfadeden döndürülen değerin adresi alınamaz. Adresi almadan önce, döndürülen değeri let ile bağlanmış bir değere atayın. + + Cannot call the extension member as it requires the value to be mutable or a byref type due to the extending type being used as a byref. + Cannot call the extension member as it requires the value to be mutable or a byref type due to the extending type being used as a byref. + + \ No newline at end of file diff --git a/src/fsharp/xlf/FSComp.txt.zh-Hans.xlf b/src/fsharp/xlf/FSComp.txt.zh-Hans.xlf index 3a1592cef85..48aeeb3bf4c 100644 --- a/src/fsharp/xlf/FSComp.txt.zh-Hans.xlf +++ b/src/fsharp/xlf/FSComp.txt.zh-Hans.xlf @@ -7057,6 +7057,11 @@ 无法采用从表达式返回的地址值。在采用地址前将返回值分配给 let 绑定值。 + + Cannot call the extension member as it requires the value to be mutable or a byref type due to the extending type being used as a byref. + Cannot call the extension member as it requires the value to be mutable or a byref type due to the extending type being used as a byref. + + \ No newline at end of file diff --git a/src/fsharp/xlf/FSComp.txt.zh-Hant.xlf b/src/fsharp/xlf/FSComp.txt.zh-Hant.xlf index 32995360748..014fd1dddd0 100644 --- a/src/fsharp/xlf/FSComp.txt.zh-Hant.xlf +++ b/src/fsharp/xlf/FSComp.txt.zh-Hant.xlf @@ -7057,6 +7057,11 @@ 無法使用運算式傳回值的位址。在使用位址前,先將傳回值指派給以 let 繫結的值。 + + Cannot call the extension member as it requires the value to be mutable or a byref type due to the extending type being used as a byref. + Cannot call the extension member as it requires the value to be mutable or a byref type due to the extending type being used as a byref. + + \ No newline at end of file diff --git a/src/scripts/scriptlib.fsx b/src/scripts/scriptlib.fsx index 6835b9418fe..2bf8cc26b41 100644 --- a/src/scripts/scriptlib.fsx +++ b/src/scripts/scriptlib.fsx @@ -159,9 +159,9 @@ module Scripting = match p.ExitCode with | 0 -> Success - | err -> + | errCode -> let msg = sprintf "Error running command '%s' with args '%s' in directory '%s'.\n---- stdout below --- \n%s\n---- stderr below --- \n%s " exePath arguments workDir (out.ToString()) (err.ToString()) - ErrorLevel (msg, err) + ErrorLevel (msg, errCode) type OutPipe (writer: TextWriter) = member x.Post (msg:string) = lock writer (fun () -> writer.WriteLine(msg)) diff --git a/tests/fsharp/core/byrefs/cslib3.cs b/tests/fsharp/core/byrefs/cslib3.cs new file mode 100644 index 00000000000..727f71411df --- /dev/null +++ b/tests/fsharp/core/byrefs/cslib3.cs @@ -0,0 +1,17 @@ +using System; + +namespace CSharpLib3 +{ + public static class Extensions + { + public static void Test(this in DateTime dt) + { + + } + + public static ref readonly DateTime Test2(this ref DateTime dt) + { + return ref dt; + } + } +} \ No newline at end of file diff --git a/tests/fsharp/core/byrefs/test3.bsl b/tests/fsharp/core/byrefs/test3.bsl new file mode 100644 index 00000000000..86843df0a70 --- /dev/null +++ b/tests/fsharp/core/byrefs/test3.bsl @@ -0,0 +1,14 @@ + +test3.fsx(39,18,39,28): typecheck error FS3237: Cannot call the extension member as it requires the value to be mutable or a byref type due to the extending type being used as a byref. + +test3.fsx(40,9,40,11): typecheck error FS0001: Type mismatch. Expecting a + 'byref' +but given a + 'inref' +The type 'ByRefKinds.InOut' does not match the type 'ByRefKinds.In' + +test3.fsx(44,9,44,20): typecheck error FS3237: Cannot call the extension member as it requires the value to be mutable or a byref type due to the extending type being used as a byref. + +test3.fsx(49,19,49,30): typecheck error FS3237: Cannot call the extension member as it requires the value to be mutable or a byref type due to the extending type being used as a byref. + +test3.fsx(55,9,55,21): typecheck error FS3237: Cannot call the extension member as it requires the value to be mutable or a byref type due to the extending type being used as a byref. diff --git a/tests/fsharp/core/byrefs/test3.fsx b/tests/fsharp/core/byrefs/test3.fsx new file mode 100644 index 00000000000..47e95f2e652 --- /dev/null +++ b/tests/fsharp/core/byrefs/test3.fsx @@ -0,0 +1,93 @@ +#if TESTS_AS_APP +module Core_byrefs +#endif + +open System +open System.Runtime.CompilerServices +open CSharpLib3 + +let failures = ref false +let report_failure (s) = + stderr.WriteLine ("NO: " + s); failures := true +let test s b = if b then () else report_failure(s) + +(* TEST SUITE FOR Int32 *) + +let out r (s:string) = r := !r @ [s] + +let check s actual expected = + if actual = expected then printfn "%s: OK" s + else report_failure (sprintf "%s: FAILED, expected %A, got %A" s expected actual) + +let check2 s expected actual = check s actual expected + +// Test extension members for byrefs + +[] +type Ext() = + [] + static member inline Change(dt: byref) = () + + [] + static member inline NotChange(dt: inref) = () + +#if NEGATIVE +module Negatives = + + let test1 () : byref = + let dt = DateTime.Now + let x = &dt.Test2() // should fail + &x // should fail + + let test2 () = + let dt = DateTime.Now + dt.Change() // should fail + + let test3 () = + let dt = DateTime.Now + let dtr = &dt + let _x = &dtr.Test2() // should fail + () + + let test4 () = + let dt = DateTime.Now + let dtr = &dt + dtr.Change() // should fail + +#endif + +module Positives = + + let test1 () = + let dt = DateTime.Now + let _x = dt.Test() + let dtr = &dt + dtr.Test() + + let test2 () = + let dt = DateTime.Now + dt.NotChange() + let dtr = &dt + dtr.NotChange() + + let test3 () = + let mutable dt = DateTime.Now + let _x = dt.Test2() + dt.Test() + let dtr = &dt + let _x = dtr.Test2() + dtr.Test() + + let test4 () = + let mutable dt = DateTime.Now + dt.Change() + dt.NotChange() + let dtr = &dt + dtr.Change() + dtr.NotChange() + +let aa = + if !failures then (stdout.WriteLine "Test Failed"; exit 1) + else (stdout.WriteLine "Test Passed"; + System.IO.File.WriteAllText("test3.ok","ok"); + exit 0) \ No newline at end of file diff --git a/tests/fsharp/core/fsfromfsviacs/test.fsx b/tests/fsharp/core/fsfromfsviacs/test.fsx index 137b4df15af..76ec203112f 100644 --- a/tests/fsharp/core/fsfromfsviacs/test.fsx +++ b/tests/fsharp/core/fsfromfsviacs/test.fsx @@ -166,12 +166,10 @@ module TestExtensions = check "dfeweeon1" (System.DateTime.Now.ExtendCSharpTypeWithInRefReturnExtension()).Date x.Date check "dfeweeon2" (x.ExtendCSharpTypeWithInRefReturnExtension()).Date x.Date - check "dfeweeon3" (x.ExtendCSharpTypeWithRefReturnExtension()).Date x.Date - let mutable mx = x check "dfeweeon4" (mx.ExtendCSharpTypeWithOutRefExtension(); mx) x.Date - check "dfeweeon5" (x.ExtendCSharpTypeWithInRefExtension()) x.Year + check "dfeweeon5" (mx.ExtendCSharpTypeWithInRefExtension()) x.Year let ToFSharpFunc() = diff --git a/tests/fsharp/tests.fs b/tests/fsharp/tests.fs index 824b244aaf2..eb1306f90c9 100644 --- a/tests/fsharp/tests.fs +++ b/tests/fsharp/tests.fs @@ -190,29 +190,27 @@ module CoreTests = end begin - use testOkFile = fileguard cfg "test.ok" - fsi cfg "" ["test.fsx"] - - testOkFile.CheckExists() - end + use testOkFile = fileguard cfg "test2.ok" - begin + fsc cfg "%s -o:test2.exe -g" cfg.fsc_flags ["test2.fsx"] - use testOkFile = fileguard cfg "test.ok" + singleNegTest cfg "test2" - fsiAnyCpu cfg "" ["test.fsx"] + exec cfg ("." ++ "test2.exe") "" testOkFile.CheckExists() end begin - use testOkFile = fileguard cfg "test2.ok" + csc cfg """/langversion:7.2 /nologo /target:library /out:cslib3.dll""" ["cslib3.cs"] - fsc cfg "%s -o:test2.exe -g" cfg.fsc_flags ["test2.fsx"] + use testOkFile = fileguard cfg "test3.ok" - singleNegTest cfg "test2" + fsc cfg "%s -r:cslib3.dll -o:test3.exe -g" cfg.fsc_flags ["test3.fsx"] - exec cfg ("." ++ "test2.exe") "" + singleNegTest { cfg with fsc_flags = sprintf "%s -r:cslib3.dll" cfg.fsc_flags } "test3" + + exec cfg ("." ++ "test3.exe") "" testOkFile.CheckExists() end From 2a0e1b39478ca24469e570e8648f211b2d22c8b2 Mon Sep 17 00:00:00 2001 From: Will Smith Date: Tue, 7 Aug 2018 21:29:41 -0700 Subject: [PATCH 026/160] Disallow optional type extensions on byref types (#5472) * Disallow optional type extensions on byref types * Normalizing test names --- .../FSharp.Compiler.Private/FSComp.fs | 4 + .../FSharp.Compiler.Private/FSComp.resx | 3 + src/fsharp/FSComp.txt | 3 +- src/fsharp/TypeChecker.fs | 7 +- src/fsharp/xlf/FSComp.txt.cs.xlf | 5 ++ src/fsharp/xlf/FSComp.txt.de.xlf | 5 ++ src/fsharp/xlf/FSComp.txt.en.xlf | 5 ++ src/fsharp/xlf/FSComp.txt.es.xlf | 5 ++ src/fsharp/xlf/FSComp.txt.fr.xlf | 5 ++ src/fsharp/xlf/FSComp.txt.it.xlf | 5 ++ src/fsharp/xlf/FSComp.txt.ja.xlf | 5 ++ src/fsharp/xlf/FSComp.txt.ko.xlf | 5 ++ src/fsharp/xlf/FSComp.txt.pl.xlf | 5 ++ src/fsharp/xlf/FSComp.txt.pt-BR.xlf | 5 ++ src/fsharp/xlf/FSComp.txt.ru.xlf | 5 ++ src/fsharp/xlf/FSComp.txt.tr.xlf | 5 ++ src/fsharp/xlf/FSComp.txt.zh-Hans.xlf | 5 ++ src/fsharp/xlf/FSComp.txt.zh-Hant.xlf | 5 ++ tests/fsharp/core/byrefs/test.bsl | 6 ++ tests/fsharp/core/byrefs/test.fsx | 89 +++++++++++-------- tests/fsharp/core/byrefs/test2.bsl | 2 +- tests/fsharp/core/byrefs/test2.fsx | 8 +- 22 files changed, 146 insertions(+), 46 deletions(-) diff --git a/src/buildfromsource/FSharp.Compiler.Private/FSComp.fs b/src/buildfromsource/FSharp.Compiler.Private/FSComp.fs index 41b2c5d0a52..ab3331587b6 100644 --- a/src/buildfromsource/FSharp.Compiler.Private/FSComp.fs +++ b/src/buildfromsource/FSharp.Compiler.Private/FSComp.fs @@ -4354,6 +4354,9 @@ type internal SR private() = /// Cannot call the extension member as it requires the value to be mutable or a byref type due to the extending type being used as a byref. /// (Originally from ..\FSComp.txt:1442) static member tcCannotCallExtensionMemberInrefToByref() = (3237, GetStringFunc("tcCannotCallExtensionMemberInrefToByref",",,,") ) + /// Byref types are not allowed to have optional type extensions. + /// (Originally from ..\FSComp.txt:1443) + static member tcByrefsMayNotHaveTypeExtensions() = (3238, GetStringFunc("tcByrefsMayNotHaveTypeExtensions",",,,") ) /// Call this method once to validate that all known resources are valid; throws if not static member RunStartupValidation() = @@ -5770,4 +5773,5 @@ type internal SR private() = ignore(GetString("chkNoSpanLikeValueFromExpression")) ignore(GetString("tastCantTakeAddressOfExpression")) ignore(GetString("tcCannotCallExtensionMemberInrefToByref")) + ignore(GetString("tcByrefsMayNotHaveTypeExtensions")) () diff --git a/src/buildfromsource/FSharp.Compiler.Private/FSComp.resx b/src/buildfromsource/FSharp.Compiler.Private/FSComp.resx index 40750aba5ba..9ada3d07cef 100644 --- a/src/buildfromsource/FSharp.Compiler.Private/FSComp.resx +++ b/src/buildfromsource/FSharp.Compiler.Private/FSComp.resx @@ -4357,4 +4357,7 @@ Cannot call the extension member as it requires the value to be mutable or a byref type due to the extending type being used as a byref. + + Byref types are not allowed to have optional type extensions. + \ No newline at end of file diff --git a/src/fsharp/FSComp.txt b/src/fsharp/FSComp.txt index 6d94078f60e..caf37e8b23b 100644 --- a/src/fsharp/FSComp.txt +++ b/src/fsharp/FSComp.txt @@ -1439,4 +1439,5 @@ notAFunctionButMaybeDeclaration,"This value is not a function and cannot be appl 3234,chkNoSpanLikeVariable,"The Span or IsByRefLike variable '%s' cannot be used at this point. This is to ensure the address of the local value does not escape its scope." 3235,chkNoSpanLikeValueFromExpression,"A Span or IsByRefLike value returned from the expression cannot be used at ths point. This is to ensure the address of the local value does not escape its scope." 3236,tastCantTakeAddressOfExpression,"Cannot take the address of the value returned from the expression. Assign the returned value to a let-bound value before taking the address." -3237,tcCannotCallExtensionMemberInrefToByref,"Cannot call the extension member as it requires the value to be mutable or a byref type due to the extending type being used as a byref." \ No newline at end of file +3237,tcCannotCallExtensionMemberInrefToByref,"Cannot call the extension member as it requires the value to be mutable or a byref type due to the extending type being used as a byref." +3238,tcByrefsMayNotHaveTypeExtensions,"Byref types are not allowed to have optional type extensions." diff --git a/src/fsharp/TypeChecker.fs b/src/fsharp/TypeChecker.fs index 1f6e64e5068..5086970e546 100755 --- a/src/fsharp/TypeChecker.fs +++ b/src/fsharp/TypeChecker.fs @@ -16319,9 +16319,14 @@ module TcDeclarations = let tyDeclRange = synTyconInfo.Range let (ComponentInfo(_, typars, cs, longPath, _, _, _, _)) = synTyconInfo let declKind, tcref, declaredTyconTypars = ComputeTyconDeclKind tyconOpt isAtOriginalTyconDefn cenv envForDecls false tyDeclRange typars cs longPath - let newslotsOK = (if isAtOriginalTyconDefn && tcref.IsFSharpObjectModelTycon then NewSlotsOK else NoNewSlots) + let newslotsOK = (if isAtOriginalTyconDefn && tcref.IsFSharpObjectModelTycon then NewSlotsOK else NoNewSlots) + + if (declKind = ExtrinsicExtensionBinding) && isByrefTyconRef cenv.g tcref then + error(Error(FSComp.SR.tcByrefsMayNotHaveTypeExtensions(), tyDeclRange)) + if not (isNil members) && tcref.IsTypeAbbrev then errorR(Error(FSComp.SR.tcTypeAbbreviationsCannotHaveAugmentations(), tyDeclRange)) + MutRecDefnsPhase2DataForTycon(tyconOpt, innerParent, declKind, tcref, baseValOpt, safeInitInfo, declaredTyconTypars, members, tyDeclRange, newslotsOK, fixupFinalAttrs)) // By now we've established the full contents of type definitions apart from their diff --git a/src/fsharp/xlf/FSComp.txt.cs.xlf b/src/fsharp/xlf/FSComp.txt.cs.xlf index d2d83bbdec9..1be7da368dd 100644 --- a/src/fsharp/xlf/FSComp.txt.cs.xlf +++ b/src/fsharp/xlf/FSComp.txt.cs.xlf @@ -7062,6 +7062,11 @@ Cannot call the extension member as it requires the value to be mutable or a byref type due to the extending type being used as a byref. + + Byref types are not allowed to have optional type extensions. + Byref types are not allowed to have optional type extensions. + + \ No newline at end of file diff --git a/src/fsharp/xlf/FSComp.txt.de.xlf b/src/fsharp/xlf/FSComp.txt.de.xlf index 4853adb8cfe..ea2e83c3185 100644 --- a/src/fsharp/xlf/FSComp.txt.de.xlf +++ b/src/fsharp/xlf/FSComp.txt.de.xlf @@ -7062,6 +7062,11 @@ Cannot call the extension member as it requires the value to be mutable or a byref type due to the extending type being used as a byref. + + Byref types are not allowed to have optional type extensions. + Byref types are not allowed to have optional type extensions. + + \ No newline at end of file diff --git a/src/fsharp/xlf/FSComp.txt.en.xlf b/src/fsharp/xlf/FSComp.txt.en.xlf index 9db0c5bd31d..6da776f802e 100644 --- a/src/fsharp/xlf/FSComp.txt.en.xlf +++ b/src/fsharp/xlf/FSComp.txt.en.xlf @@ -7062,6 +7062,11 @@ Cannot call the extension member as it requires the value to be mutable or a byref type due to the extending type being used as a byref. + + Byref types are not allowed to have optional type extensions. + Byref types are not allowed to have optional type extensions. + + \ No newline at end of file diff --git a/src/fsharp/xlf/FSComp.txt.es.xlf b/src/fsharp/xlf/FSComp.txt.es.xlf index dcfd7de5e07..e864ee33fb9 100644 --- a/src/fsharp/xlf/FSComp.txt.es.xlf +++ b/src/fsharp/xlf/FSComp.txt.es.xlf @@ -7062,6 +7062,11 @@ Cannot call the extension member as it requires the value to be mutable or a byref type due to the extending type being used as a byref. + + Byref types are not allowed to have optional type extensions. + Byref types are not allowed to have optional type extensions. + + \ No newline at end of file diff --git a/src/fsharp/xlf/FSComp.txt.fr.xlf b/src/fsharp/xlf/FSComp.txt.fr.xlf index 6e771a8724c..28fcdc0d15a 100644 --- a/src/fsharp/xlf/FSComp.txt.fr.xlf +++ b/src/fsharp/xlf/FSComp.txt.fr.xlf @@ -7062,6 +7062,11 @@ Cannot call the extension member as it requires the value to be mutable or a byref type due to the extending type being used as a byref. + + Byref types are not allowed to have optional type extensions. + Byref types are not allowed to have optional type extensions. + + \ No newline at end of file diff --git a/src/fsharp/xlf/FSComp.txt.it.xlf b/src/fsharp/xlf/FSComp.txt.it.xlf index 28a8da4bfdc..66dac167cae 100644 --- a/src/fsharp/xlf/FSComp.txt.it.xlf +++ b/src/fsharp/xlf/FSComp.txt.it.xlf @@ -7062,6 +7062,11 @@ Cannot call the extension member as it requires the value to be mutable or a byref type due to the extending type being used as a byref. + + Byref types are not allowed to have optional type extensions. + Byref types are not allowed to have optional type extensions. + + \ No newline at end of file diff --git a/src/fsharp/xlf/FSComp.txt.ja.xlf b/src/fsharp/xlf/FSComp.txt.ja.xlf index 60e547f4984..98cb75f2181 100644 --- a/src/fsharp/xlf/FSComp.txt.ja.xlf +++ b/src/fsharp/xlf/FSComp.txt.ja.xlf @@ -7062,6 +7062,11 @@ Cannot call the extension member as it requires the value to be mutable or a byref type due to the extending type being used as a byref. + + Byref types are not allowed to have optional type extensions. + Byref types are not allowed to have optional type extensions. + + \ No newline at end of file diff --git a/src/fsharp/xlf/FSComp.txt.ko.xlf b/src/fsharp/xlf/FSComp.txt.ko.xlf index 9a731b6724c..5bc38cc3e1f 100644 --- a/src/fsharp/xlf/FSComp.txt.ko.xlf +++ b/src/fsharp/xlf/FSComp.txt.ko.xlf @@ -7062,6 +7062,11 @@ Cannot call the extension member as it requires the value to be mutable or a byref type due to the extending type being used as a byref. + + Byref types are not allowed to have optional type extensions. + Byref types are not allowed to have optional type extensions. + + \ No newline at end of file diff --git a/src/fsharp/xlf/FSComp.txt.pl.xlf b/src/fsharp/xlf/FSComp.txt.pl.xlf index 2a8a59fac8c..ea0f73a70eb 100644 --- a/src/fsharp/xlf/FSComp.txt.pl.xlf +++ b/src/fsharp/xlf/FSComp.txt.pl.xlf @@ -7062,6 +7062,11 @@ Cannot call the extension member as it requires the value to be mutable or a byref type due to the extending type being used as a byref. + + Byref types are not allowed to have optional type extensions. + Byref types are not allowed to have optional type extensions. + + \ No newline at end of file diff --git a/src/fsharp/xlf/FSComp.txt.pt-BR.xlf b/src/fsharp/xlf/FSComp.txt.pt-BR.xlf index 6b5e24ae388..1c7d8b90ec9 100644 --- a/src/fsharp/xlf/FSComp.txt.pt-BR.xlf +++ b/src/fsharp/xlf/FSComp.txt.pt-BR.xlf @@ -7062,6 +7062,11 @@ Cannot call the extension member as it requires the value to be mutable or a byref type due to the extending type being used as a byref. + + Byref types are not allowed to have optional type extensions. + Byref types are not allowed to have optional type extensions. + + \ No newline at end of file diff --git a/src/fsharp/xlf/FSComp.txt.ru.xlf b/src/fsharp/xlf/FSComp.txt.ru.xlf index c04e61a3e05..2192e651203 100644 --- a/src/fsharp/xlf/FSComp.txt.ru.xlf +++ b/src/fsharp/xlf/FSComp.txt.ru.xlf @@ -7062,6 +7062,11 @@ Cannot call the extension member as it requires the value to be mutable or a byref type due to the extending type being used as a byref. + + Byref types are not allowed to have optional type extensions. + Byref types are not allowed to have optional type extensions. + + \ No newline at end of file diff --git a/src/fsharp/xlf/FSComp.txt.tr.xlf b/src/fsharp/xlf/FSComp.txt.tr.xlf index 0f8ad5a38fd..1427f12c083 100644 --- a/src/fsharp/xlf/FSComp.txt.tr.xlf +++ b/src/fsharp/xlf/FSComp.txt.tr.xlf @@ -7062,6 +7062,11 @@ Cannot call the extension member as it requires the value to be mutable or a byref type due to the extending type being used as a byref. + + Byref types are not allowed to have optional type extensions. + Byref types are not allowed to have optional type extensions. + + \ No newline at end of file diff --git a/src/fsharp/xlf/FSComp.txt.zh-Hans.xlf b/src/fsharp/xlf/FSComp.txt.zh-Hans.xlf index 48aeeb3bf4c..39e42fdcb83 100644 --- a/src/fsharp/xlf/FSComp.txt.zh-Hans.xlf +++ b/src/fsharp/xlf/FSComp.txt.zh-Hans.xlf @@ -7062,6 +7062,11 @@ Cannot call the extension member as it requires the value to be mutable or a byref type due to the extending type being used as a byref. + + Byref types are not allowed to have optional type extensions. + Byref types are not allowed to have optional type extensions. + + \ No newline at end of file diff --git a/src/fsharp/xlf/FSComp.txt.zh-Hant.xlf b/src/fsharp/xlf/FSComp.txt.zh-Hant.xlf index 014fd1dddd0..479ee739ab8 100644 --- a/src/fsharp/xlf/FSComp.txt.zh-Hant.xlf +++ b/src/fsharp/xlf/FSComp.txt.zh-Hant.xlf @@ -7062,6 +7062,11 @@ Cannot call the extension member as it requires the value to be mutable or a byref type due to the extending type being used as a byref. + + Byref types are not allowed to have optional type extensions. + Byref types are not allowed to have optional type extensions. + + \ No newline at end of file diff --git a/tests/fsharp/core/byrefs/test.bsl b/tests/fsharp/core/byrefs/test.bsl index 835868db916..a61c51f9624 100644 --- a/tests/fsharp/core/byrefs/test.bsl +++ b/tests/fsharp/core/byrefs/test.bsl @@ -53,3 +53,9 @@ test.fsx(85,22,85,23): typecheck error FS0001: This expression was expected to h 'inref' but here has type 'System.DateTime' + +test.fsx(88,10,88,15): typecheck error FS3238: Byref types are not allowed to have optional type extensions. + +test.fsx(92,10,92,15): typecheck error FS3238: Byref types are not allowed to have optional type extensions. + +test.fsx(96,10,96,16): typecheck error FS3238: Byref types are not allowed to have optional type extensions. diff --git a/tests/fsharp/core/byrefs/test.fsx b/tests/fsharp/core/byrefs/test.fsx index e2a85f718f4..f3089319267 100644 --- a/tests/fsharp/core/byrefs/test.fsx +++ b/tests/fsharp/core/byrefs/test.fsx @@ -85,6 +85,17 @@ module ByrefNegativeTests = let v = C.M(w) // not allowed check "cweweoiwe51btw" v w + type byref<'T> with + + member this.Test() = 1 + + type inref<'T> with + + member this.Test() = 1 + + type outref<'T> with + + member this.Test() = 1 #endif // Test a simple ref argument @@ -1158,119 +1169,119 @@ module ByrefReturnMemberTests = member __.P = f (0, &x) // check recursive functions - module BeefModuleGeneric = + module TestNameModuleGeneric = - let rec beef (unused: 'T) id (data: byref) : unit = + let rec testValue (unused: 'T) id (data: byref) : unit = if id = 10 then data <- 3uy else - beef unused (id + 1) &data + testValue unused (id + 1) &data let Test() = let mutable x = 0uy - beef "unused" 0 &x + testValue "unused" 0 &x check "vruoer" x 3uy Test() - module BeefModuleNonGeneric = + module TestNameModuleNonGeneric = - let rec beef id (data: byref) : unit = + let rec testValue id (data: byref) : unit = if id = 10 then data <- 3uy else - beef (id + 1) &data + testValue (id + 1) &data let Test() = let mutable x = 0uy - beef 0 &x + testValue 0 &x check "vruoer3r" x 3uy Test() - module BeefModuleNonGenericSubsume = + module TestNameModuleNonGenericSubsume = - let rec beef id (data: byref) (y: System.IComparable) : unit = + let rec testValue id (data: byref) (y: System.IComparable) : unit = if id = 10 then data <- 3uy else - beef (id + 1) &data y + testValue (id + 1) &data y let Test() = let mutable x = 0uy - beef 0 &x Unchecked.defaultof + testValue 0 &x Unchecked.defaultof check "vruoer3r" x 3uy Test() - type GenericBeefRecursive() = + type GenericTestNameRecursive() = - let rec beef unused id (data: byref) : unit = - if id = 10 then data <- 3uy else beef unused (id + 1) &data + let rec testValue unused id (data: byref) : unit = + if id = 10 then data <- 3uy else testValue unused (id + 1) &data - static do GenericBeefRecursive().Test() + static do GenericTestNameRecursive().Test() member __.Test() = let mutable x = 0uy - beef "unused" 0 &x + testValue "unused" 0 &x check "vruoer3rv" x 3uy let mutable z = 0uy - beef 6L 0 &z + testValue 6L 0 &z check "vruoer3rvwqf" z 3uy - type NonGenericBeefRecursiveInClass() = + type NonGenericTestNameRecursiveInClass() = - let rec beef id (data: byref) : unit = + let rec testValue id (data: byref) : unit = if id = 10 then data <- 3uy else - beef (id + 1) &data + testValue (id + 1) &data - static do NonGenericBeefRecursiveInClass().Test() + static do NonGenericTestNameRecursiveInClass().Test() member __.Test() = let mutable x = 0uy - beef 0 &x + testValue 0 &x check "vruoer3rvvremtys" x 3uy - type NonGenericBeefRecursiveInClassSubsume() = + type NonGenericTestNameRecursiveInClassSubsume() = - let rec beef id (data: byref) (y:System.IComparable) : unit = + let rec testValue id (data: byref) (y:System.IComparable) : unit = if id = 10 then data <- 3uy else - beef (id + 1) &data y + testValue (id + 1) &data y - static do NonGenericBeefRecursiveInClassSubsume().Test() + static do NonGenericTestNameRecursiveInClassSubsume().Test() member __.Test() = let mutable x = 0uy - beef 0 &x Unchecked.defaultof + testValue 0 &x Unchecked.defaultof check "vruoer3rvvremtys" x 3uy - type StaticGenericBeefRecursiveInClass() = + type StaticGenericTestNameRecursiveInClass() = - static let rec beef unused id (data: byref) : unit = - if id = 10 then data <- 3uy else beef unused (id + 1) &data + static let rec testValue unused id (data: byref) : unit = + if id = 10 then data <- 3uy else testValue unused (id + 1) &data - static do StaticGenericBeefRecursiveInClass.Test() + static do StaticGenericTestNameRecursiveInClass.Test() static member Test() = let mutable x = 0uy - beef "unused" 0 &x + testValue "unused" 0 &x check "vruoer3rv" x 3uy let mutable z = 0uy - beef 6L 0 &z + testValue 6L 0 &z check "vruoer3rvwqfgw" z 3uy - type StaticNonGenericBeefRecursiveInClass() = + type StaticNonGenericTestNameRecursiveInClass() = - static let rec beef id (data: byref) : unit = - if id = 10 then data <- 3uy else beef (id + 1) &data + static let rec testValue id (data: byref) : unit = + if id = 10 then data <- 3uy else testValue (id + 1) &data - static do StaticNonGenericBeefRecursiveInClass.Test() + static do StaticNonGenericTestNameRecursiveInClass.Test() static member Test() = let mutable x = 0uy - beef 0 &x + testValue 0 &x check "vruoer3rvvrebae" x 3uy module TestInRefMutation = diff --git a/tests/fsharp/core/byrefs/test2.bsl b/tests/fsharp/core/byrefs/test2.bsl index 5cdb952a471..df229cdf893 100644 --- a/tests/fsharp/core/byrefs/test2.bsl +++ b/tests/fsharp/core/byrefs/test2.bsl @@ -27,4 +27,4 @@ test2.fsx(93,17,93,29): typecheck error FS0425: The type of a first-class functi test2.fsx(112,53,112,54): typecheck error FS3209: The address of the variable 'x' or a related expression cannot be used at this point. This is to ensure the address of the local value does not escape its scope. -test2.fsx(124,33,124,34): typecheck error FS3209: The address of the variable 'x' or a related expression cannot be used at this point. This is to ensure the address of the local value does not escape its scope. +test2.fsx(124,41,124,42): typecheck error FS3209: The address of the variable 'x' or a related expression cannot be used at this point. This is to ensure the address of the local value does not escape its scope. diff --git a/tests/fsharp/core/byrefs/test2.fsx b/tests/fsharp/core/byrefs/test2.fsx index a65471c145e..d58121beca4 100644 --- a/tests/fsharp/core/byrefs/test2.fsx +++ b/tests/fsharp/core/byrefs/test2.fsx @@ -100,7 +100,7 @@ module NegativeTests = type Test() = - member __.Beef() = + member __.TestMethod() = let mutable a = Unchecked.defaultof let obj = { new ByRefInterface with @@ -118,10 +118,10 @@ module NegativeTests = obj.Test(&x, &y) |> ignore a - type Beef = delegate of unit-> byref - let testBeef () = + type TestDelegate = delegate of unit-> byref + let testFunction () = let mutable x = 1 - let f = Beef(fun () -> &x) // is not allowed + let f = TestDelegate(fun () -> &x) // is not allowed () #endif From f6a057c26f0e96a47ee994cccb12195094608e62 Mon Sep 17 00:00:00 2001 From: Will Smith Date: Tue, 7 Aug 2018 23:49:38 -0700 Subject: [PATCH 027/160] Fixed overloading for inref/outref/byref from passing (#5467) * Fixed overloading for inref/outref/byref from passing * Normalizing test names --- src/fsharp/infos.fs | 10 ++++++++-- tests/fsharp/core/byrefs/test2.bsl | 6 ++++++ tests/fsharp/core/byrefs/test2.fsx | 16 ++++++++++++++++ 3 files changed, 30 insertions(+), 2 deletions(-) diff --git a/src/fsharp/infos.fs b/src/fsharp/infos.fs index ea2d29149bc..0ea4ec4d854 100755 --- a/src/fsharp/infos.fs +++ b/src/fsharp/infos.fs @@ -2470,6 +2470,10 @@ type EventInfo = //------------------------------------------------------------------------- // Helpers associated with getting and comparing method signatures +/// Strips inref and outref to be a byref. +let stripByrefTy g ty = + if isByrefTy g ty then mkByrefTy g (destByrefTy g ty) + else ty /// Represents the information about the compiled form of a method signature. Used when analyzing implementation /// relations between members and abstract slots. @@ -2493,7 +2497,8 @@ let CompiledSigOfMeth g amap m (minfo:MethInfo) = CompiledSig(vargtys,vrty,formalMethTypars,fmtpinst) -/// Used to hide/filter members from super classes based on signature +/// Used to hide/filter members from super classes based on signature +/// Inref and outref parameter types will be treated as a byref type for equivalency. let MethInfosEquivByNameAndPartialSig erasureFlag ignoreFinal g amap m (minfo:MethInfo) (minfo2:MethInfo) = (minfo.LogicalName = minfo2.LogicalName) && (minfo.GenericArity = minfo2.GenericArity) && @@ -2504,7 +2509,8 @@ let MethInfosEquivByNameAndPartialSig erasureFlag ignoreFinal g amap m (minfo:Me let fminst2 = generalizeTypars formalMethTypars2 let argtys = minfo.GetParamTypes(amap, m, fminst) let argtys2 = minfo2.GetParamTypes(amap, m, fminst2) - (argtys,argtys2) ||> List.lengthsEqAndForall2 (List.lengthsEqAndForall2 (typeAEquivAux erasureFlag g (TypeEquivEnv.FromEquivTypars formalMethTypars formalMethTypars2))) + (argtys,argtys2) ||> List.lengthsEqAndForall2 (List.lengthsEqAndForall2 (fun ty1 ty2 -> + typeAEquivAux erasureFlag g (TypeEquivEnv.FromEquivTypars formalMethTypars formalMethTypars2) (stripByrefTy g ty1) (stripByrefTy g ty2))) /// Used to hide/filter members from super classes based on signature let PropInfosEquivByNameAndPartialSig erasureFlag g amap m (pinfo:PropInfo) (pinfo2:PropInfo) = diff --git a/tests/fsharp/core/byrefs/test2.bsl b/tests/fsharp/core/byrefs/test2.bsl index df229cdf893..704cd4613eb 100644 --- a/tests/fsharp/core/byrefs/test2.bsl +++ b/tests/fsharp/core/byrefs/test2.bsl @@ -28,3 +28,9 @@ test2.fsx(93,17,93,29): typecheck error FS0425: The type of a first-class functi test2.fsx(112,53,112,54): typecheck error FS3209: The address of the variable 'x' or a related expression cannot be used at this point. This is to ensure the address of the local value does not escape its scope. test2.fsx(124,41,124,42): typecheck error FS3209: The address of the variable 'x' or a related expression cannot be used at this point. This is to ensure the address of the local value does not escape its scope. + +test2.fsx(133,23,133,33): typecheck error FS0438: Duplicate method. The method 'TestMethod' has the same name and signature as another method in type 'NegativeTests.TestNegativeOverloading'. + +test2.fsx(131,23,131,33): typecheck error FS0438: Duplicate method. The method 'TestMethod' has the same name and signature as another method in type 'NegativeTests.TestNegativeOverloading'. + +test2.fsx(129,23,129,33): typecheck error FS0438: Duplicate method. The method 'TestMethod' has the same name and signature as another method in type 'NegativeTests.TestNegativeOverloading'. diff --git a/tests/fsharp/core/byrefs/test2.fsx b/tests/fsharp/core/byrefs/test2.fsx index d58121beca4..163bdf54dbb 100644 --- a/tests/fsharp/core/byrefs/test2.fsx +++ b/tests/fsharp/core/byrefs/test2.fsx @@ -123,6 +123,14 @@ module NegativeTests = let mutable x = 1 let f = TestDelegate(fun () -> &x) // is not allowed () + + type TestNegativeOverloading() = + + static member TestMethod(dt: byref) = () + + static member TestMethod(dt: inref) = () + + static member TestMethod(dt: outref) = () #endif module Tests = @@ -138,6 +146,14 @@ module Tests = () () + type TestPositiveOverloading() = + + static member TestMethod(dt: byref) = () + + static member TestMethod(dt: inref) = () + + static member TestMethod(dt: outref) = () + let aa = if !failures then (stdout.WriteLine "Test Failed"; exit 1) else (stdout.WriteLine "Test Passed"; From 632ebf170108ee47f005367e352720d3f0debf9d Mon Sep 17 00:00:00 2001 From: "Brett V. Forsgren" Date: Fri, 10 Aug 2018 17:24:15 -0700 Subject: [PATCH 028/160] remove unnecessary build step --- .vsts-signed.yaml | 7 ------- 1 file changed, 7 deletions(-) diff --git a/.vsts-signed.yaml b/.vsts-signed.yaml index 6d5193b38c0..83973b32d27 100644 --- a/.vsts-signed.yaml +++ b/.vsts-signed.yaml @@ -44,13 +44,6 @@ steps: msbuildArguments: '/t:Build /p:ExpectedFeedUrl=$(PB_PublishBlobFeedUrl) /p:AccountKey=$(PB_PublishBlobFeedKey) /p:ManifestBranch=$(SourceBranch) /p:ManifestCommit=$(SourceVersion) /p:ManifestBuildId=$(OfficialBuildId)' condition: and(succeeded(), contains(variables['PB_PublishType'], 'blob')) -# Run BinSkim -- task: securedevelopmentteam.vss-secure-development-tools.build-task-binskim.BinSkim@3 - displayName: Run BinSkim - inputs: - arguments: 'analyze "$(MSBuildConfiguration)\*.dll" "$(MSBuildConfiguration)\*.exe" --recurse --output "$(MSBuildConfiguration)\artifacts"' - continueOnError: true - # Create static drop - task: PublishBuildArtifacts@1 displayName: Create static drop From d31e16f0ab17ed8a579b54cf1585f18f472bd873 Mon Sep 17 00:00:00 2001 From: "Kevin Ransom (msft)" Date: Thu, 16 Aug 2018 21:43:46 -0700 Subject: [PATCH 029/160] Fix ngen of compiler (#5525) --- .../Swix/Microsoft.FSharp.Compiler/Files.swr | 36 ++++++++------ .../VisualFSharpFull/VisualFSharpFull.csproj | 49 +++++++++++++++++++ 2 files changed, 71 insertions(+), 14 deletions(-) diff --git a/setup/Swix/Microsoft.FSharp.Compiler/Files.swr b/setup/Swix/Microsoft.FSharp.Compiler/Files.swr index daa7eae6d65..46855bd5f64 100644 --- a/setup/Swix/Microsoft.FSharp.Compiler/Files.swr +++ b/setup/Swix/Microsoft.FSharp.Compiler/Files.swr @@ -4,30 +4,38 @@ package name=Microsoft.FSharp.Compiler version=$(FSharpPackageVersion) folder "InstallDir:Common7\IDE\CommonExtensions\Microsoft\FSharp" - file source="$(BinariesFolder)\net40\bin\fsc.exe" vs.file.ngen=yes + + file source=$(BinariesFolder)\net40\bin\fsc.exe vs.file.ngen=yes vs.file.ngenArchitecture=All vs.file.ngenPriority=2 vs.file.ngenApplication="[installDir]\Common7\IDE\CommonExtensions\Microsoft\FSharp\fsc.exe" file source="$(BinariesFolder)\net40\bin\fsc.exe.config" - file source="$(BinariesFolder)\net40\bin\FSharp.Build.dll" vs.file.ngen=yes - file source="$(BinariesFolder)\net40\bin\FSharp.Compiler.Interactive.Settings.dll" vs.file.ngen=yes - file source="$(BinariesFolder)\net40\bin\FSharp.Compiler.Private.dll" vs.file.ngen=yes - file source="$(BinariesFolder)\net40\bin\FSharp.Compiler.Server.Shared.dll" vs.file.ngen=yes - file source="$(BinariesFolder)\net40\bin\FSharp.Core.dll" vs.file.ngen=yes - file source="$(BinariesFolder)\net40\bin\FSharp.Core.optdata" - file source="$(BinariesFolder)\net40\bin\FSharp.Core.sigdata" - file source="$(PackagesFolder)\Microsoft.VisualFSharp.Type.Providers.Redist.$(MicrosoftVisualFSharpTypeProvidersRedistPackageVersion)\content\4.3.0.0\FSharp.Data.TypeProviders.dll" vs.file.ngen=yes - file source="$(BinariesFolder)\net40\bin\fsi.exe" vs.file.ngen=yes + + file source=$(BinariesFolder)\net40\bin\fsi.exe vs.file.ngen=yes vs.file.ngenArchitecture=X86 vs.file.ngenPriority=2 vs.file.ngenApplication="[installDir]\Common7\IDE\CommonExtensions\Microsoft\FSharp\fsi.exe" file source="$(BinariesFolder)\net40\bin\fsi.exe.config" - file source="$(BinariesFolder)\net40\bin\fsiAnyCpu.exe" vs.file.ngen=yes + + file source="$(BinariesFolder)\net40\bin\fsiAnyCpu.exe" vs.file.ngen=yes vs.file.ngenArchitecture=X64 vs.file.ngenPriority=2 vs.file.ngenApplication="[installDir]\Common7\IDE\CommonExtensions\Microsoft\FSharp\fsiAnyCpu.exe" file source="$(BinariesFolder)\net40\bin\fsiAnyCpu.exe.config" + + file source="$(BinariesFolder)\net40\bin\FSharp.Compiler.Interactive.Settings.dll" vs.file.ngen=yes vs.file.ngenArchitecture=All vs.file.ngenPriority=2 + file source="$(BinariesFolder)\net40\bin\FSharp.Compiler.Private.dll" vs.file.ngen=yes vs.file.ngenArchitecture=All vs.file.ngenPriority=2 + file source="$(BinariesFolder)\net40\bin\FSharp.Compiler.Server.Shared.dll" vs.file.ngen=yes vs.file.ngenArchitecture=All vs.file.ngenPriority=2 + + file source="$(BinariesFolder)\net40\bin\FSharp.Core.dll" vs.file.ngen=yes vs.file.ngenArchitecture=All vs.file.ngenPriority=2 + file source="$(BinariesFolder)\net40\bin\FSharp.Core.optdata" + file source="$(BinariesFolder)\net40\bin\FSharp.Core.sigdata" + + file source="$(BinariesFolder)\net40\bin\FSharp.Build.dll" vs.file.ngen=yes vs.file.ngenArchitecture=All vs.file.ngenPriority=2 + + file source="$(PackagesFolder)\Microsoft.VisualFSharp.Type.Providers.Redist.$(MicrosoftVisualFSharpTypeProvidersRedistPackageVersion)\content\4.3.0.0\FSharp.Data.TypeProviders.dll" file source="$(BinariesFolder)\net40\bin\Microsoft.Build.Conversion.Core.dll" file source="$(BinariesFolder)\net40\bin\Microsoft.Build.dll" file source="$(BinariesFolder)\net40\bin\Microsoft.Build.Engine.dll" file source="$(BinariesFolder)\net40\bin\Microsoft.Build.Framework.dll" file source="$(BinariesFolder)\net40\bin\Microsoft.Build.Tasks.Core.dll" file source="$(BinariesFolder)\net40\bin\Microsoft.Build.Utilities.Core.dll" - file source="$(BinariesFolder)\net40\bin\Microsoft.FSharp.NetSdk.props" - file source="$(BinariesFolder)\net40\bin\Microsoft.FSharp.NetSdk.targets" - file source="$(BinariesFolder)\net40\bin\Microsoft.FSharp.Targets" file source="$(BinariesFolder)\net40\bin\Microsoft.Portable.FSharp.Targets" file source="$(BinariesFolder)\net40\bin\System.Collections.Immutable.dll" file source="$(BinariesFolder)\net40\bin\System.Reflection.Metadata.dll" file source="$(BinariesFolder)\net40\bin\System.ValueTuple.dll" + file source="$(BinariesFolder)\net40\bin\Microsoft.FSharp.NetSdk.props" + file source="$(BinariesFolder)\net40\bin\Microsoft.FSharp.NetSdk.targets" + file source="$(BinariesFolder)\net40\bin\Microsoft.FSharp.Overrides.NetSdk.targets" + file source="$(BinariesFolder)\net40\bin\Microsoft.FSharp.Targets" diff --git a/vsintegration/Vsix/VisualFSharpFull/VisualFSharpFull.csproj b/vsintegration/Vsix/VisualFSharpFull/VisualFSharpFull.csproj index 71c698df422..e38a8f8cabe 100644 --- a/vsintegration/Vsix/VisualFSharpFull/VisualFSharpFull.csproj +++ b/vsintegration/Vsix/VisualFSharpFull/VisualFSharpFull.csproj @@ -36,6 +36,9 @@ FSharp.Build BuiltProjectOutputGroup%3bGetCopyToOutputDirectoryItems%3b DebugSymbolsProjectOutputGroup%3b + true + All + 2 True @@ -43,6 +46,9 @@ FSharp.Compiler.Interactive.Settings BuiltProjectOutputGroup%3bGetCopyToOutputDirectoryItems%3b DebugSymbolsProjectOutputGroup%3b + true + All + 2 True @@ -50,6 +56,9 @@ FSharp.Compiler.Server.Shared BuiltProjectOutputGroup%3bGetCopyToOutputDirectoryItems%3b DebugSymbolsProjectOutputGroup%3b + true + All + 2 True @@ -57,6 +66,9 @@ FSharp.Compiler.Private BuiltProjectOutputGroup%3bGetCopyToOutputDirectoryItems%3b DebugSymbolsProjectOutputGroup%3b + true + All + 2 True @@ -64,6 +76,9 @@ FSharp.Core BuiltProjectOutputGroup%3bGetCopyToOutputDirectoryItems%3b DebugSymbolsProjectOutputGroup%3b + true + All + 2 True @@ -71,6 +86,10 @@ FsiAnyCPU BuiltProjectOutputGroup%3bGetCopyToOutputDirectoryItems%3b DebugSymbolsProjectOutputGroup%3b + true + [installDir]\Common7\IDE\CommonExtensions\Microsoft\FSharp\fsiAnyCpu.exe + X64 + 2 True @@ -78,6 +97,10 @@ Fsi BuiltProjectOutputGroup%3bGetCopyToOutputDirectoryItems%3b DebugSymbolsProjectOutputGroup%3b + true + [installDir]\Common7\IDE\CommonExtensions\Microsoft\FSharp\fsi.exe + X86 + 2 True @@ -85,6 +108,10 @@ fsc BuiltProjectOutputGroup%3bGetCopyToOutputDirectoryItems%3b DebugSymbolsProjectOutputGroup%3b + true + [installDir]\Common7\IDE\CommonExtensions\Microsoft\FSharp\fsc.exe + All + 2 True @@ -92,6 +119,9 @@ FSharp.Editor BuiltProjectOutputGroup%3bGetCopyToOutputDirectoryItems%3bPkgDefProjectOutputGroup%3b DebugSymbolsProjectOutputGroup%3b + true + All + 2 True @@ -106,6 +136,9 @@ FSharp.LanguageService.Base BuiltProjectOutputGroup%3bGetCopyToOutputDirectoryItems%3bPkgDefProjectOutputGroup%3b DebugSymbolsProjectOutputGroup%3b + true + All + 2 True @@ -113,6 +146,9 @@ FSharp.LanguageService BuiltProjectOutputGroup%3bGetCopyToOutputDirectoryItems%3bPkgDefProjectOutputGroup%3b DebugSymbolsProjectOutputGroup%3b + true + All + 2 True @@ -120,6 +156,9 @@ ProjectSystem.Base BuiltProjectOutputGroup%3bGetCopyToOutputDirectoryItems%3bPkgDefProjectOutputGroup%3b DebugSymbolsProjectOutputGroup%3b + true + All + 2 True @@ -127,6 +166,9 @@ ProjectSystem BuiltProjectOutputGroup%3bGetCopyToOutputDirectoryItems%3bPkgDefProjectOutputGroup%3b DebugSymbolsProjectOutputGroup%3b + true + All + 2 True @@ -134,6 +176,9 @@ FSharp.PropertiesPages BuiltProjectOutputGroup%3bGetCopyToOutputDirectoryItems%3bPkgDefProjectOutputGroup%3b DebugSymbolsProjectOutputGroup%3b + true + All + 2 True @@ -141,8 +186,12 @@ FSharp.VS.FSI BuiltProjectOutputGroup%3bGetCopyToOutputDirectoryItems%3bPkgDefProjectOutputGroup%3b DebugSymbolsProjectOutputGroup%3b + true + All + 2 True + {6ba13aa4-c25f-480f-856b-8e8000299a72} AppConfig From 12df32249cca8c00826d639a8403e13d53860ac1 Mon Sep 17 00:00:00 2001 From: "Brett V. Forsgren" Date: Wed, 22 Aug 2018 15:42:46 -0700 Subject: [PATCH 030/160] create the F# SDK package from all existing NuGet packages Also fix a bug where we were mis-packing the current FSharp.Core 4.5 as 4.4.3. --- setup/Swix/Microsoft.FSharp.SDK/Files.swr | 48 +++++++++---------- .../Microsoft.FSharp.SDK.swixproj | 1 - setup/packages.config | 2 + 3 files changed, 26 insertions(+), 25 deletions(-) diff --git a/setup/Swix/Microsoft.FSharp.SDK/Files.swr b/setup/Swix/Microsoft.FSharp.SDK/Files.swr index 271db6961cd..228bc933437 100644 --- a/setup/Swix/Microsoft.FSharp.SDK/Files.swr +++ b/setup/Swix/Microsoft.FSharp.SDK/Files.swr @@ -17,10 +17,10 @@ folder "InstallDir:Common7\IDE\CommonExtensions\Microsoft\FSharpSdk" file source="$(PackagesFolder)\Microsoft.VisualFSharp.Core.Redist.1.0.0\content\.NETCore\3.7.4.0\FSharp.Core.sigdata" file source="$(PackagesFolder)\Microsoft.VisualFSharp.Core.Redist.1.0.0\content\.NETCore\3.7.4.0\FSharp.Core.xml" folder "3.7.41.0" - file source="$(BinariesFolder)\profiles\portable-net45+netcore45\FSharp.Core.dll" - file source="$(BinariesFolder)\profiles\portable-net45+netcore45\FSharp.Core.optdata" - file source="$(BinariesFolder)\profiles\portable-net45+netcore45\FSharp.Core.sigdata" - file source="$(BinariesFolder)\profiles\portable-net45+netcore45\FSharp.Core.xml" + file source="$(PackagesFolder)\Microsoft.Portable.FSharp.Core.10.1.0\lib\profiles\portable-net45+netcore45\FSharp.Core.dll" + file source="$(PackagesFolder)\Microsoft.Portable.FSharp.Core.10.1.0\lib\profiles\portable-net45+netcore45\FSharp.Core.optdata" + file source="$(PackagesFolder)\Microsoft.Portable.FSharp.Core.10.1.0\lib\profiles\portable-net45+netcore45\FSharp.Core.sigdata" + file source="$(PackagesFolder)\Microsoft.Portable.FSharp.Core.10.1.0\lib\profiles\portable-net45+netcore45\FSharp.Core.xml" folder "3.78.3.1" file source="$(PackagesFolder)\Microsoft.VisualFSharp.Core.Redist.1.0.0\content\.NETCore\3.78.3.1\FSharp.Core.dll" file source="$(PackagesFolder)\Microsoft.VisualFSharp.Core.Redist.1.0.0\content\.NETCore\3.78.3.1\FSharp.Core.optdata" @@ -32,10 +32,10 @@ folder "InstallDir:Common7\IDE\CommonExtensions\Microsoft\FSharpSdk" file source="$(PackagesFolder)\Microsoft.VisualFSharp.Core.Redist.1.0.0\content\.NETCore\3.78.4.0\FSharp.Core.sigdata" file source="$(PackagesFolder)\Microsoft.VisualFSharp.Core.Redist.1.0.0\content\.NETCore\3.78.4.0\FSharp.Core.xml" folder "3.78.41.0" - file source="$(BinariesFolder)\profiles\portable-net45+netcore45+wp8\FSharp.Core.dll" - file source="$(BinariesFolder)\profiles\portable-net45+netcore45+wp8\FSharp.Core.optdata" - file source="$(BinariesFolder)\profiles\portable-net45+netcore45+wp8\FSharp.Core.sigdata" - file source="$(BinariesFolder)\profiles\portable-net45+netcore45+wp8\FSharp.Core.xml" + file source="$(PackagesFolder)\Microsoft.Portable.FSharp.Core.10.1.0\lib\profiles\portable-net45+netcore45+wp8\FSharp.Core.dll" + file source="$(PackagesFolder)\Microsoft.Portable.FSharp.Core.10.1.0\lib\profiles\portable-net45+netcore45+wp8\FSharp.Core.optdata" + file source="$(PackagesFolder)\Microsoft.Portable.FSharp.Core.10.1.0\lib\profiles\portable-net45+netcore45+wp8\FSharp.Core.sigdata" + file source="$(PackagesFolder)\Microsoft.Portable.FSharp.Core.10.1.0\lib\profiles\portable-net45+netcore45+wp8\FSharp.Core.xml" folder "3.259.3.1" file source="$(PackagesFolder)\Microsoft.VisualFSharp.Core.Redist.1.0.0\content\.NETCore\3.259.3.1\FSharp.Core.dll" file source="$(PackagesFolder)\Microsoft.VisualFSharp.Core.Redist.1.0.0\content\.NETCore\3.259.3.1\FSharp.Core.optdata" @@ -47,10 +47,10 @@ folder "InstallDir:Common7\IDE\CommonExtensions\Microsoft\FSharpSdk" file source="$(PackagesFolder)\Microsoft.VisualFSharp.Core.Redist.1.0.0\content\.NETCore\3.259.4.0\FSharp.Core.sigdata" file source="$(PackagesFolder)\Microsoft.VisualFSharp.Core.Redist.1.0.0\content\.NETCore\3.259.4.0\FSharp.Core.xml" folder "3.259.41.0" - file source="$(BinariesFolder)\profiles\portable-net45+netcore45+wpa81+wp8\FSharp.Core.dll" - file source="$(BinariesFolder)\profiles\portable-net45+netcore45+wpa81+wp8\FSharp.Core.optdata" - file source="$(BinariesFolder)\profiles\portable-net45+netcore45+wpa81+wp8\FSharp.Core.sigdata" - file source="$(BinariesFolder)\profiles\portable-net45+netcore45+wpa81+wp8\FSharp.Core.xml" + file source="$(PackagesFolder)\Microsoft.Portable.FSharp.Core.10.1.0\lib\profiles\portable-net45+netcore45+wpa81+wp8\FSharp.Core.dll" + file source="$(PackagesFolder)\Microsoft.Portable.FSharp.Core.10.1.0\lib\profiles\portable-net45+netcore45+wpa81+wp8\FSharp.Core.optdata" + file source="$(PackagesFolder)\Microsoft.Portable.FSharp.Core.10.1.0\lib\profiles\portable-net45+netcore45+wpa81+wp8\FSharp.Core.sigdata" + file source="$(PackagesFolder)\Microsoft.Portable.FSharp.Core.10.1.0\lib\profiles\portable-net45+netcore45+wpa81+wp8\FSharp.Core.xml" folder ".NETFramework\v4.0" folder "4.3.0.0" @@ -69,15 +69,15 @@ folder "InstallDir:Common7\IDE\CommonExtensions\Microsoft\FSharpSdk" file source="$(PackagesFolder)\Microsoft.VisualFSharp.Core.Redist.1.0.0\content\.NETFramework\v4.0\4.4.0.0\FSharp.Core.sigdata" file source="$(PackagesFolder)\Microsoft.VisualFSharp.Core.Redist.1.0.0\content\.NETFramework\v4.0\4.4.0.0\FSharp.Core.xml" folder "4.4.1.0" - file source="$(BinariesFolder)\versions\4.4.1.0\FSharp.Core.dll" - file source="$(BinariesFolder)\versions\4.4.1.0\FSharp.Core.optdata" - file source="$(BinariesFolder)\versions\4.4.1.0\FSharp.Core.sigdata" - file source="$(BinariesFolder)\versions\4.4.1.0\FSharp.Core.xml" + file source="$(PackagesFolder)\Microsoft.Portable.FSharp.Core.10.1.0\lib\versions\4.4.1.0\FSharp.Core.dll" + file source="$(PackagesFolder)\Microsoft.Portable.FSharp.Core.10.1.0\lib\versions\4.4.1.0\FSharp.Core.optdata" + file source="$(PackagesFolder)\Microsoft.Portable.FSharp.Core.10.1.0\lib\versions\4.4.1.0\FSharp.Core.sigdata" + file source="$(PackagesFolder)\Microsoft.Portable.FSharp.Core.10.1.0\lib\versions\4.4.1.0\FSharp.Core.xml" folder "4.4.3.0" - file source="$(BinariesFolder)\net40\bin\FSharp.Core.dll" - file source="$(BinariesFolder)\net40\bin\FSharp.Core.optdata" - file source="$(BinariesFolder)\net40\bin\FSharp.Core.sigdata" - file source="$(BinariesFolder)\net40\bin\FSharp.Core.xml" + file source="$(PackagesFolder)\FSharp.Core.4.3.4\lib\net45\FSharp.Core.dll" + file source="$(PackagesFolder)\FSharp.Core.4.3.4\lib\net45\FSharp.Core.optdata" + file source="$(PackagesFolder)\FSharp.Core.4.3.4\lib\net45\FSharp.Core.sigdata" + file source="$(PackagesFolder)\FSharp.Core.4.3.4\lib\net45\FSharp.Core.xml" folder ".NETPortable" folder "2.3.5.0" @@ -96,7 +96,7 @@ folder "InstallDir:Common7\IDE\CommonExtensions\Microsoft\FSharpSdk" file source="$(PackagesFolder)\Microsoft.VisualFSharp.Core.Redist.1.0.0\content\.NETPortable\3.47.4.0\FSharp.Core.sigdata" file source="$(PackagesFolder)\Microsoft.VisualFSharp.Core.Redist.1.0.0\content\.NETPortable\3.47.4.0\FSharp.Core.xml" folder "3.47.41.0" - file source="$(BinariesFolder)\profiles\portable-net45+sl5+netcore45\FSharp.Core.dll" - file source="$(BinariesFolder)\profiles\portable-net45+sl5+netcore45\FSharp.Core.optdata" - file source="$(BinariesFolder)\profiles\portable-net45+sl5+netcore45\FSharp.Core.sigdata" - file source="$(BinariesFolder)\profiles\portable-net45+sl5+netcore45\FSharp.Core.xml" + file source="$(PackagesFolder)\Microsoft.Portable.FSharp.Core.10.1.0\lib\profiles\portable-net45+sl5+netcore45\FSharp.Core.dll" + file source="$(PackagesFolder)\Microsoft.Portable.FSharp.Core.10.1.0\lib\profiles\portable-net45+sl5+netcore45\FSharp.Core.optdata" + file source="$(PackagesFolder)\Microsoft.Portable.FSharp.Core.10.1.0\lib\profiles\portable-net45+sl5+netcore45\FSharp.Core.sigdata" + file source="$(PackagesFolder)\Microsoft.Portable.FSharp.Core.10.1.0\lib\profiles\portable-net45+sl5+netcore45\FSharp.Core.xml" diff --git a/setup/Swix/Microsoft.FSharp.SDK/Microsoft.FSharp.SDK.swixproj b/setup/Swix/Microsoft.FSharp.SDK/Microsoft.FSharp.SDK.swixproj index bde4a368d4f..9256eadc32f 100644 --- a/setup/Swix/Microsoft.FSharp.SDK/Microsoft.FSharp.SDK.swixproj +++ b/setup/Swix/Microsoft.FSharp.SDK/Microsoft.FSharp.SDK.swixproj @@ -18,7 +18,6 @@ - $(PackagePreprocessorDefinitions);BinariesFolder=$(BinariesFolder) $(PackagePreprocessorDefinitions);PackagesFolder=$(PackagesFolder) $(PackagePreprocessorDefinitions);FSharpPackageVersion=$(FSharpPackageVersion) diff --git a/setup/packages.config b/setup/packages.config index 930e870e4bf..938236f7d99 100644 --- a/setup/packages.config +++ b/setup/packages.config @@ -11,4 +11,6 @@ + + From c71aa9ffed4b209b8aad6fc63c104f3373fa2f8e Mon Sep 17 00:00:00 2001 From: Will Smith Date: Wed, 29 Aug 2018 11:19:26 -0700 Subject: [PATCH 031/160] Fixed crash for unapplied byref extension methods; also disallowing them. (#5492) * Fixed crash. Disallowing unapplied byref exstension methods. Updated some erorr messages. * Updated some tests * Quick update on method name * Updated buildfromsource * Updated error message * Renamed method --- .../FSharp.Compiler.Private/FSComp.fs | 10 +++++-- .../FSharp.Compiler.Private/FSComp.resx | 7 +++-- src/fsharp/FSComp.txt | 3 +- src/fsharp/MethodCalls.fs | 28 ++++--------------- src/fsharp/PostInferenceChecks.fs | 2 -- src/fsharp/TypeChecker.fs | 3 +- src/fsharp/infos.fs | 8 ++++++ src/fsharp/xlf/FSComp.txt.cs.xlf | 15 ++++++---- src/fsharp/xlf/FSComp.txt.de.xlf | 15 ++++++---- src/fsharp/xlf/FSComp.txt.en.xlf | 15 ++++++---- src/fsharp/xlf/FSComp.txt.es.xlf | 15 ++++++---- src/fsharp/xlf/FSComp.txt.fr.xlf | 15 ++++++---- src/fsharp/xlf/FSComp.txt.it.xlf | 15 ++++++---- src/fsharp/xlf/FSComp.txt.ja.xlf | 15 ++++++---- src/fsharp/xlf/FSComp.txt.ko.xlf | 15 ++++++---- src/fsharp/xlf/FSComp.txt.pl.xlf | 15 ++++++---- src/fsharp/xlf/FSComp.txt.pt-BR.xlf | 15 ++++++---- src/fsharp/xlf/FSComp.txt.ru.xlf | 15 ++++++---- src/fsharp/xlf/FSComp.txt.tr.xlf | 15 ++++++---- src/fsharp/xlf/FSComp.txt.zh-Hans.xlf | 15 ++++++---- src/fsharp/xlf/FSComp.txt.zh-Hant.xlf | 15 ++++++---- tests/fsharp/core/byrefs/test3.bsl | 16 ++++++++--- tests/fsharp/core/byrefs/test3.fsx | 8 ++++++ 23 files changed, 190 insertions(+), 105 deletions(-) diff --git a/src/buildfromsource/FSharp.Compiler.Private/FSComp.fs b/src/buildfromsource/FSharp.Compiler.Private/FSComp.fs index ab3331587b6..efc9b760570 100644 --- a/src/buildfromsource/FSharp.Compiler.Private/FSComp.fs +++ b/src/buildfromsource/FSharp.Compiler.Private/FSComp.fs @@ -4351,12 +4351,15 @@ type internal SR private() = /// Cannot take the address of the value returned from the expression. Assign the returned value to a let-bound value before taking the address. /// (Originally from ..\FSComp.txt:1441) static member tastCantTakeAddressOfExpression() = (3236, GetStringFunc("tastCantTakeAddressOfExpression",",,,") ) - /// Cannot call the extension member as it requires the value to be mutable or a byref type due to the extending type being used as a byref. + /// Cannot call the byref extension method '%s. The first parameter requires the value to be mutable or a non-readonly byref type. /// (Originally from ..\FSComp.txt:1442) - static member tcCannotCallExtensionMemberInrefToByref() = (3237, GetStringFunc("tcCannotCallExtensionMemberInrefToByref",",,,") ) + static member tcCannotCallExtensionMethodInrefToByref(a0 : System.String) = (3237, GetStringFunc("tcCannotCallExtensionMethodInrefToByref",",,,%s,,,") a0) /// Byref types are not allowed to have optional type extensions. /// (Originally from ..\FSComp.txt:1443) static member tcByrefsMayNotHaveTypeExtensions() = (3238, GetStringFunc("tcByrefsMayNotHaveTypeExtensions",",,,") ) + /// Cannot partially apply the extension method '%s' because the first parameter is a byref type. + /// (Originally from ..\FSComp.txt:1444) + static member tcCannotPartiallyApplyExtensionMethodForByref(a0 : System.String) = (3239, GetStringFunc("tcCannotPartiallyApplyExtensionMethodForByref",",,,%s,,,") a0) /// Call this method once to validate that all known resources are valid; throws if not static member RunStartupValidation() = @@ -5772,6 +5775,7 @@ type internal SR private() = ignore(GetString("chkNoSpanLikeVariable")) ignore(GetString("chkNoSpanLikeValueFromExpression")) ignore(GetString("tastCantTakeAddressOfExpression")) - ignore(GetString("tcCannotCallExtensionMemberInrefToByref")) + ignore(GetString("tcCannotCallExtensionMethodInrefToByref")) ignore(GetString("tcByrefsMayNotHaveTypeExtensions")) + ignore(GetString("tcCannotPartiallyApplyExtensionMethodForByref")) () diff --git a/src/buildfromsource/FSharp.Compiler.Private/FSComp.resx b/src/buildfromsource/FSharp.Compiler.Private/FSComp.resx index 9ada3d07cef..572268e5555 100644 --- a/src/buildfromsource/FSharp.Compiler.Private/FSComp.resx +++ b/src/buildfromsource/FSharp.Compiler.Private/FSComp.resx @@ -4354,10 +4354,13 @@ Cannot take the address of the value returned from the expression. Assign the returned value to a let-bound value before taking the address. - - Cannot call the extension member as it requires the value to be mutable or a byref type due to the extending type being used as a byref. + + Cannot call the byref extension method '{0}. The first parameter requires the value to be mutable or a non-readonly byref type. Byref types are not allowed to have optional type extensions. + + Cannot partially apply the extension method '{0}' because the first parameter is a byref type. + \ No newline at end of file diff --git a/src/fsharp/FSComp.txt b/src/fsharp/FSComp.txt index caf37e8b23b..253fa2e04f9 100644 --- a/src/fsharp/FSComp.txt +++ b/src/fsharp/FSComp.txt @@ -1439,5 +1439,6 @@ notAFunctionButMaybeDeclaration,"This value is not a function and cannot be appl 3234,chkNoSpanLikeVariable,"The Span or IsByRefLike variable '%s' cannot be used at this point. This is to ensure the address of the local value does not escape its scope." 3235,chkNoSpanLikeValueFromExpression,"A Span or IsByRefLike value returned from the expression cannot be used at ths point. This is to ensure the address of the local value does not escape its scope." 3236,tastCantTakeAddressOfExpression,"Cannot take the address of the value returned from the expression. Assign the returned value to a let-bound value before taking the address." -3237,tcCannotCallExtensionMemberInrefToByref,"Cannot call the extension member as it requires the value to be mutable or a byref type due to the extending type being used as a byref." +3237,tcCannotCallExtensionMethodInrefToByref,"Cannot call the byref extension method '%s. The first parameter requires the value to be mutable or a non-readonly byref type." 3238,tcByrefsMayNotHaveTypeExtensions,"Byref types are not allowed to have optional type extensions." +3239,tcCannotPartiallyApplyExtensionMethodForByref,"Cannot partially apply the extension method '%s' because the first parameter is a byref type." diff --git a/src/fsharp/MethodCalls.fs b/src/fsharp/MethodCalls.fs index cf8ec878fdb..193f9f9af81 100644 --- a/src/fsharp/MethodCalls.fs +++ b/src/fsharp/MethodCalls.fs @@ -598,28 +598,12 @@ let TakeObjAddrForMethodCall g amap (minfo:MethInfo) isMutable m objArgs f = // Check to see if the extension member uses the extending type as a byref. // If so, make sure we don't allow readonly/immutable values to be passed byref from an extension member. // An inref will work though. - if mustTakeAddress && isReadOnly && minfo.IsExtensionMember then - let tyOpt = - match minfo with - // For F# defined methods. - | FSMeth(_, _, vref, _) -> - let ty, _ = destFunTy g vref.Type - Some(ty) - - // For IL methods, defined outside of F#. - | ILMeth(_, info, _) -> - let paramTypes = info.GetRawArgTypes(amap, m, minfo.FormalMethodInst) - match paramTypes with - | [] -> failwith "impossible" - | ty :: _ -> Some(ty) - - | _ -> None - - match tyOpt with - | Some(ty) -> - if isByrefTy g ty && not (isInByrefTy g ty) then - errorR(Error(FSComp.SR.tcCannotCallExtensionMemberInrefToByref(), m)) - | _ -> () + if isReadOnly && mustTakeAddress && minfo.IsExtensionMember then + minfo.TryObjArgByrefType(amap, m, minfo.FormalMethodInst) + |> Option.iter (fun ty -> + if not (isInByrefTy g ty) then + errorR(Error(FSComp.SR.tcCannotCallExtensionMethodInrefToByref(minfo.DisplayName), m))) + wrap, [objArgExpr'] diff --git a/src/fsharp/PostInferenceChecks.fs b/src/fsharp/PostInferenceChecks.fs index 68309091b32..bd213dbadea 100644 --- a/src/fsharp/PostInferenceChecks.fs +++ b/src/fsharp/PostInferenceChecks.fs @@ -1776,8 +1776,6 @@ let CheckModuleBinding cenv env (TBind(v,e,_) as bind) = MethInfosEquivByNameAndSig EraseAll true g cenv.amap v.Range minfo1 minfo2 then errorR(Duplicate(kind,v.DisplayName,v.Range))) - - // Properties get 'get_X', only if there are no args // Properties get 'get_X' match v.ValReprInfo with diff --git a/src/fsharp/TypeChecker.fs b/src/fsharp/TypeChecker.fs index 5086970e546..a2e53099b6c 100755 --- a/src/fsharp/TypeChecker.fs +++ b/src/fsharp/TypeChecker.fs @@ -9808,10 +9808,11 @@ and TcMethodApplication let objArgPreBinder, objArgs = match objArgs, lambdaVars with | [objArg], Some _ -> + if finalCalledMethInfo.IsExtensionMember && finalCalledMethInfo.ObjArgNeedsAddress(cenv.amap, mMethExpr) then + error(Error(FSComp.SR.tcCannotPartiallyApplyExtensionMethodForByref(finalCalledMethInfo.DisplayName), mMethExpr)) let objArgTy = tyOfExpr cenv.g objArg let v, ve = mkCompGenLocal mMethExpr "objectArg" objArgTy (fun body -> mkCompGenLet mMethExpr v objArg body), [ve] - | _ -> emptyPreBinder, objArgs diff --git a/src/fsharp/infos.fs b/src/fsharp/infos.fs index 0ea4ec4d854..6ac34fefb76 100755 --- a/src/fsharp/infos.fs +++ b/src/fsharp/infos.fs @@ -1595,6 +1595,14 @@ type MethInfo = | _ -> x.DeclaringTyconRef.Typars(m) + /// Tries to get the object arg type if it's a byref type. + member x.TryObjArgByrefType(amap, m, minst) = + x.GetObjArgTypes(amap, m, minst) + |> List.tryHead + |> Option.bind (fun ty -> + if isByrefTy x.TcGlobals ty then Some(ty) + else None) + //------------------------------------------------------------------------- // ILFieldInfo diff --git a/src/fsharp/xlf/FSComp.txt.cs.xlf b/src/fsharp/xlf/FSComp.txt.cs.xlf index 1be7da368dd..1f282750b6f 100644 --- a/src/fsharp/xlf/FSComp.txt.cs.xlf +++ b/src/fsharp/xlf/FSComp.txt.cs.xlf @@ -7057,16 +7057,21 @@ Adresa hodnoty vrácená výrazem nejde převzít. Před převzetím adresy přiřaďte vrácenou hodnotu hodnotě s vazbou na klauzuli Let. - - Cannot call the extension member as it requires the value to be mutable or a byref type due to the extending type being used as a byref. - Cannot call the extension member as it requires the value to be mutable or a byref type due to the extending type being used as a byref. - - Byref types are not allowed to have optional type extensions. Byref types are not allowed to have optional type extensions. + + Cannot call the byref extension method '{0}. The first parameter requires the value to be mutable or a non-readonly byref type. + Cannot call the byref extension method '{0}. The first parameter requires the value to be mutable or a non-readonly byref type. + + + + Cannot partially apply the extension method '{0}' because the first parameter is a byref type. + Cannot partially apply the extension method '{0}' because the first parameter is a byref type. + + \ No newline at end of file diff --git a/src/fsharp/xlf/FSComp.txt.de.xlf b/src/fsharp/xlf/FSComp.txt.de.xlf index ea2e83c3185..47541cb2c59 100644 --- a/src/fsharp/xlf/FSComp.txt.de.xlf +++ b/src/fsharp/xlf/FSComp.txt.de.xlf @@ -7057,16 +7057,21 @@ Die Adresse des über den Ausdruck zurückgegebenen Werts kann nicht abgerufen werden. Weisen Sie den zurückgegebenen Wert einem let-bound-Wert zu, bevor Sie die Adresse abrufen. - - Cannot call the extension member as it requires the value to be mutable or a byref type due to the extending type being used as a byref. - Cannot call the extension member as it requires the value to be mutable or a byref type due to the extending type being used as a byref. - - Byref types are not allowed to have optional type extensions. Byref types are not allowed to have optional type extensions. + + Cannot call the byref extension method '{0}. The first parameter requires the value to be mutable or a non-readonly byref type. + Cannot call the byref extension method '{0}. The first parameter requires the value to be mutable or a non-readonly byref type. + + + + Cannot partially apply the extension method '{0}' because the first parameter is a byref type. + Cannot partially apply the extension method '{0}' because the first parameter is a byref type. + + \ No newline at end of file diff --git a/src/fsharp/xlf/FSComp.txt.en.xlf b/src/fsharp/xlf/FSComp.txt.en.xlf index 6da776f802e..377dd80396b 100644 --- a/src/fsharp/xlf/FSComp.txt.en.xlf +++ b/src/fsharp/xlf/FSComp.txt.en.xlf @@ -7057,16 +7057,21 @@ Cannot take the address of the value returned from the expression. Assign the returned value to a let-bound value before taking the address. - - Cannot call the extension member as it requires the value to be mutable or a byref type due to the extending type being used as a byref. - Cannot call the extension member as it requires the value to be mutable or a byref type due to the extending type being used as a byref. - - Byref types are not allowed to have optional type extensions. Byref types are not allowed to have optional type extensions. + + Cannot call the byref extension method '{0}. The first parameter requires the value to be mutable or a non-readonly byref type. + Cannot call the byref extension method '{0}. The first parameter requires the value to be mutable or a non-readonly byref type. + + + + Cannot partially apply the extension method '{0}' because the first parameter is a byref type. + Cannot partially apply the extension method '{0}' because the first parameter is a byref type. + + \ No newline at end of file diff --git a/src/fsharp/xlf/FSComp.txt.es.xlf b/src/fsharp/xlf/FSComp.txt.es.xlf index e864ee33fb9..a5933c20eeb 100644 --- a/src/fsharp/xlf/FSComp.txt.es.xlf +++ b/src/fsharp/xlf/FSComp.txt.es.xlf @@ -7057,16 +7057,21 @@ No se puede tomar la dirección del valor devuelto de la expresión. Asigne el valor devuelto a un valor enlazado con let antes de tomar la dirección. - - Cannot call the extension member as it requires the value to be mutable or a byref type due to the extending type being used as a byref. - Cannot call the extension member as it requires the value to be mutable or a byref type due to the extending type being used as a byref. - - Byref types are not allowed to have optional type extensions. Byref types are not allowed to have optional type extensions. + + Cannot call the byref extension method '{0}. The first parameter requires the value to be mutable or a non-readonly byref type. + Cannot call the byref extension method '{0}. The first parameter requires the value to be mutable or a non-readonly byref type. + + + + Cannot partially apply the extension method '{0}' because the first parameter is a byref type. + Cannot partially apply the extension method '{0}' because the first parameter is a byref type. + + \ No newline at end of file diff --git a/src/fsharp/xlf/FSComp.txt.fr.xlf b/src/fsharp/xlf/FSComp.txt.fr.xlf index 28fcdc0d15a..52fd97a0c6a 100644 --- a/src/fsharp/xlf/FSComp.txt.fr.xlf +++ b/src/fsharp/xlf/FSComp.txt.fr.xlf @@ -7057,16 +7057,21 @@ Impossible de prendre l'adresse de la valeur retournée par l'expression. Assignez la valeur retournée à une valeur liée à let avant de prendre l'adresse. - - Cannot call the extension member as it requires the value to be mutable or a byref type due to the extending type being used as a byref. - Cannot call the extension member as it requires the value to be mutable or a byref type due to the extending type being used as a byref. - - Byref types are not allowed to have optional type extensions. Byref types are not allowed to have optional type extensions. + + Cannot call the byref extension method '{0}. The first parameter requires the value to be mutable or a non-readonly byref type. + Cannot call the byref extension method '{0}. The first parameter requires the value to be mutable or a non-readonly byref type. + + + + Cannot partially apply the extension method '{0}' because the first parameter is a byref type. + Cannot partially apply the extension method '{0}' because the first parameter is a byref type. + + \ No newline at end of file diff --git a/src/fsharp/xlf/FSComp.txt.it.xlf b/src/fsharp/xlf/FSComp.txt.it.xlf index 66dac167cae..a536fa3d02d 100644 --- a/src/fsharp/xlf/FSComp.txt.it.xlf +++ b/src/fsharp/xlf/FSComp.txt.it.xlf @@ -7057,16 +7057,21 @@ Non è possibile accettare l'indirizzo del valore restituito dall'espressione. Assegnare il valore restituito a un valore associato a let prima di accettare l'indirizzo. - - Cannot call the extension member as it requires the value to be mutable or a byref type due to the extending type being used as a byref. - Cannot call the extension member as it requires the value to be mutable or a byref type due to the extending type being used as a byref. - - Byref types are not allowed to have optional type extensions. Byref types are not allowed to have optional type extensions. + + Cannot call the byref extension method '{0}. The first parameter requires the value to be mutable or a non-readonly byref type. + Cannot call the byref extension method '{0}. The first parameter requires the value to be mutable or a non-readonly byref type. + + + + Cannot partially apply the extension method '{0}' because the first parameter is a byref type. + Cannot partially apply the extension method '{0}' because the first parameter is a byref type. + + \ No newline at end of file diff --git a/src/fsharp/xlf/FSComp.txt.ja.xlf b/src/fsharp/xlf/FSComp.txt.ja.xlf index 98cb75f2181..40cfe615f3b 100644 --- a/src/fsharp/xlf/FSComp.txt.ja.xlf +++ b/src/fsharp/xlf/FSComp.txt.ja.xlf @@ -7057,16 +7057,21 @@ 式から返された値のアドレスを取得できません。アドレスを取得する前に、let でバインドされた値に戻り値を割り当ててください。 - - Cannot call the extension member as it requires the value to be mutable or a byref type due to the extending type being used as a byref. - Cannot call the extension member as it requires the value to be mutable or a byref type due to the extending type being used as a byref. - - Byref types are not allowed to have optional type extensions. Byref types are not allowed to have optional type extensions. + + Cannot call the byref extension method '{0}. The first parameter requires the value to be mutable or a non-readonly byref type. + Cannot call the byref extension method '{0}. The first parameter requires the value to be mutable or a non-readonly byref type. + + + + Cannot partially apply the extension method '{0}' because the first parameter is a byref type. + Cannot partially apply the extension method '{0}' because the first parameter is a byref type. + + \ No newline at end of file diff --git a/src/fsharp/xlf/FSComp.txt.ko.xlf b/src/fsharp/xlf/FSComp.txt.ko.xlf index 5bc38cc3e1f..feaca0362e6 100644 --- a/src/fsharp/xlf/FSComp.txt.ko.xlf +++ b/src/fsharp/xlf/FSComp.txt.ko.xlf @@ -7057,16 +7057,21 @@ 식에서 반환된 값의 주소를 가져올 수 없습니다. 주소를 가져오기 전에 반환된 값을 let 바인딩 값에 할당하세요. - - Cannot call the extension member as it requires the value to be mutable or a byref type due to the extending type being used as a byref. - Cannot call the extension member as it requires the value to be mutable or a byref type due to the extending type being used as a byref. - - Byref types are not allowed to have optional type extensions. Byref types are not allowed to have optional type extensions. + + Cannot call the byref extension method '{0}. The first parameter requires the value to be mutable or a non-readonly byref type. + Cannot call the byref extension method '{0}. The first parameter requires the value to be mutable or a non-readonly byref type. + + + + Cannot partially apply the extension method '{0}' because the first parameter is a byref type. + Cannot partially apply the extension method '{0}' because the first parameter is a byref type. + + \ No newline at end of file diff --git a/src/fsharp/xlf/FSComp.txt.pl.xlf b/src/fsharp/xlf/FSComp.txt.pl.xlf index ea0f73a70eb..7e9511069d5 100644 --- a/src/fsharp/xlf/FSComp.txt.pl.xlf +++ b/src/fsharp/xlf/FSComp.txt.pl.xlf @@ -7057,16 +7057,21 @@ Nie można uzyskać adresu wartości zwróconej przez wyrażenie. Przypisz zwróconą wartość do wartości powiązanej za pomocą instrukcji let przed uzyskaniem adresu. - - Cannot call the extension member as it requires the value to be mutable or a byref type due to the extending type being used as a byref. - Cannot call the extension member as it requires the value to be mutable or a byref type due to the extending type being used as a byref. - - Byref types are not allowed to have optional type extensions. Byref types are not allowed to have optional type extensions. + + Cannot call the byref extension method '{0}. The first parameter requires the value to be mutable or a non-readonly byref type. + Cannot call the byref extension method '{0}. The first parameter requires the value to be mutable or a non-readonly byref type. + + + + Cannot partially apply the extension method '{0}' because the first parameter is a byref type. + Cannot partially apply the extension method '{0}' because the first parameter is a byref type. + + \ No newline at end of file diff --git a/src/fsharp/xlf/FSComp.txt.pt-BR.xlf b/src/fsharp/xlf/FSComp.txt.pt-BR.xlf index 1c7d8b90ec9..663e12233f2 100644 --- a/src/fsharp/xlf/FSComp.txt.pt-BR.xlf +++ b/src/fsharp/xlf/FSComp.txt.pt-BR.xlf @@ -7057,16 +7057,21 @@ Não é possível obter o endereço do valor retornado da expressão. Atribua o valor retornado a um valor associado a let antes de obter o endereço. - - Cannot call the extension member as it requires the value to be mutable or a byref type due to the extending type being used as a byref. - Cannot call the extension member as it requires the value to be mutable or a byref type due to the extending type being used as a byref. - - Byref types are not allowed to have optional type extensions. Byref types are not allowed to have optional type extensions. + + Cannot call the byref extension method '{0}. The first parameter requires the value to be mutable or a non-readonly byref type. + Cannot call the byref extension method '{0}. The first parameter requires the value to be mutable or a non-readonly byref type. + + + + Cannot partially apply the extension method '{0}' because the first parameter is a byref type. + Cannot partially apply the extension method '{0}' because the first parameter is a byref type. + + \ No newline at end of file diff --git a/src/fsharp/xlf/FSComp.txt.ru.xlf b/src/fsharp/xlf/FSComp.txt.ru.xlf index 2192e651203..9ebafb77bb5 100644 --- a/src/fsharp/xlf/FSComp.txt.ru.xlf +++ b/src/fsharp/xlf/FSComp.txt.ru.xlf @@ -7057,16 +7057,21 @@ Невозможно получить адрес значения, возвращенного из выражения. Используйте возвращенное значение в качестве значения с привязкой let, прежде чем получить адрес. - - Cannot call the extension member as it requires the value to be mutable or a byref type due to the extending type being used as a byref. - Cannot call the extension member as it requires the value to be mutable or a byref type due to the extending type being used as a byref. - - Byref types are not allowed to have optional type extensions. Byref types are not allowed to have optional type extensions. + + Cannot call the byref extension method '{0}. The first parameter requires the value to be mutable or a non-readonly byref type. + Cannot call the byref extension method '{0}. The first parameter requires the value to be mutable or a non-readonly byref type. + + + + Cannot partially apply the extension method '{0}' because the first parameter is a byref type. + Cannot partially apply the extension method '{0}' because the first parameter is a byref type. + + \ No newline at end of file diff --git a/src/fsharp/xlf/FSComp.txt.tr.xlf b/src/fsharp/xlf/FSComp.txt.tr.xlf index 1427f12c083..89e56a2e44d 100644 --- a/src/fsharp/xlf/FSComp.txt.tr.xlf +++ b/src/fsharp/xlf/FSComp.txt.tr.xlf @@ -7057,16 +7057,21 @@ İfadeden döndürülen değerin adresi alınamaz. Adresi almadan önce, döndürülen değeri let ile bağlanmış bir değere atayın. - - Cannot call the extension member as it requires the value to be mutable or a byref type due to the extending type being used as a byref. - Cannot call the extension member as it requires the value to be mutable or a byref type due to the extending type being used as a byref. - - Byref types are not allowed to have optional type extensions. Byref types are not allowed to have optional type extensions. + + Cannot call the byref extension method '{0}. The first parameter requires the value to be mutable or a non-readonly byref type. + Cannot call the byref extension method '{0}. The first parameter requires the value to be mutable or a non-readonly byref type. + + + + Cannot partially apply the extension method '{0}' because the first parameter is a byref type. + Cannot partially apply the extension method '{0}' because the first parameter is a byref type. + + \ No newline at end of file diff --git a/src/fsharp/xlf/FSComp.txt.zh-Hans.xlf b/src/fsharp/xlf/FSComp.txt.zh-Hans.xlf index 39e42fdcb83..c24dfd3e93b 100644 --- a/src/fsharp/xlf/FSComp.txt.zh-Hans.xlf +++ b/src/fsharp/xlf/FSComp.txt.zh-Hans.xlf @@ -7057,16 +7057,21 @@ 无法采用从表达式返回的地址值。在采用地址前将返回值分配给 let 绑定值。 - - Cannot call the extension member as it requires the value to be mutable or a byref type due to the extending type being used as a byref. - Cannot call the extension member as it requires the value to be mutable or a byref type due to the extending type being used as a byref. - - Byref types are not allowed to have optional type extensions. Byref types are not allowed to have optional type extensions. + + Cannot call the byref extension method '{0}. The first parameter requires the value to be mutable or a non-readonly byref type. + Cannot call the byref extension method '{0}. The first parameter requires the value to be mutable or a non-readonly byref type. + + + + Cannot partially apply the extension method '{0}' because the first parameter is a byref type. + Cannot partially apply the extension method '{0}' because the first parameter is a byref type. + + \ No newline at end of file diff --git a/src/fsharp/xlf/FSComp.txt.zh-Hant.xlf b/src/fsharp/xlf/FSComp.txt.zh-Hant.xlf index 479ee739ab8..6c99ebdef17 100644 --- a/src/fsharp/xlf/FSComp.txt.zh-Hant.xlf +++ b/src/fsharp/xlf/FSComp.txt.zh-Hant.xlf @@ -7057,16 +7057,21 @@ 無法使用運算式傳回值的位址。在使用位址前,先將傳回值指派給以 let 繫結的值。 - - Cannot call the extension member as it requires the value to be mutable or a byref type due to the extending type being used as a byref. - Cannot call the extension member as it requires the value to be mutable or a byref type due to the extending type being used as a byref. - - Byref types are not allowed to have optional type extensions. Byref types are not allowed to have optional type extensions. + + Cannot call the byref extension method '{0}. The first parameter requires the value to be mutable or a non-readonly byref type. + Cannot call the byref extension method '{0}. The first parameter requires the value to be mutable or a non-readonly byref type. + + + + Cannot partially apply the extension method '{0}' because the first parameter is a byref type. + Cannot partially apply the extension method '{0}' because the first parameter is a byref type. + + \ No newline at end of file diff --git a/tests/fsharp/core/byrefs/test3.bsl b/tests/fsharp/core/byrefs/test3.bsl index 86843df0a70..6fe9b7ec397 100644 --- a/tests/fsharp/core/byrefs/test3.bsl +++ b/tests/fsharp/core/byrefs/test3.bsl @@ -1,5 +1,5 @@ -test3.fsx(39,18,39,28): typecheck error FS3237: Cannot call the extension member as it requires the value to be mutable or a byref type due to the extending type being used as a byref. +test3.fsx(39,18,39,28): typecheck error FS3237: Cannot call the byref extension method 'Test2. The first parameter requires the value to be mutable or a non-readonly byref type. test3.fsx(40,9,40,11): typecheck error FS0001: Type mismatch. Expecting a 'byref' @@ -7,8 +7,16 @@ but given a 'inref' The type 'ByRefKinds.InOut' does not match the type 'ByRefKinds.In' -test3.fsx(44,9,44,20): typecheck error FS3237: Cannot call the extension member as it requires the value to be mutable or a byref type due to the extending type being used as a byref. +test3.fsx(44,9,44,20): typecheck error FS3237: Cannot call the byref extension method 'Change. The first parameter requires the value to be mutable or a non-readonly byref type. -test3.fsx(49,19,49,30): typecheck error FS3237: Cannot call the extension member as it requires the value to be mutable or a byref type due to the extending type being used as a byref. +test3.fsx(49,19,49,30): typecheck error FS3237: Cannot call the byref extension method 'Test2. The first parameter requires the value to be mutable or a non-readonly byref type. -test3.fsx(55,9,55,21): typecheck error FS3237: Cannot call the extension member as it requires the value to be mutable or a byref type due to the extending type being used as a byref. +test3.fsx(55,9,55,21): typecheck error FS3237: Cannot call the byref extension method 'Change. The first parameter requires the value to be mutable or a non-readonly byref type. + +test3.fsx(59,17,59,29): typecheck error FS3239: Cannot partially apply the extension method 'NotChange' because the first parameter is a byref type. + +test3.fsx(60,17,60,24): typecheck error FS3239: Cannot partially apply the extension method 'Test' because the first parameter is a byref type. + +test3.fsx(61,17,61,26): typecheck error FS3239: Cannot partially apply the extension method 'Change' because the first parameter is a byref type. + +test3.fsx(62,17,62,25): typecheck error FS3239: Cannot partially apply the extension method 'Test2' because the first parameter is a byref type. diff --git a/tests/fsharp/core/byrefs/test3.fsx b/tests/fsharp/core/byrefs/test3.fsx index 47e95f2e652..5cc0f379da8 100644 --- a/tests/fsharp/core/byrefs/test3.fsx +++ b/tests/fsharp/core/byrefs/test3.fsx @@ -54,6 +54,14 @@ module Negatives = let dtr = &dt dtr.Change() // should fail + let test5 () = + let dt = DateTime.Now + let x = dt.NotChange // should fail + let y = dt.Test // should fail + let z = dt.Change // should fail + let w = dt.Test2 // should fail + () + #endif module Positives = From 1ac49af301ab2cb9077f49817dd6c546ad636e66 Mon Sep 17 00:00:00 2001 From: Will Smith Date: Wed, 29 Aug 2018 11:38:15 -0700 Subject: [PATCH 032/160] Showing a better error message when trying to take an address of an operation (#5542) * Showing a better error message when trying to take an address of an operation * Updated tests/baseline\ * Updated baselines * Code cleanup --- src/fsharp/TastOps.fs | 15 +++++++++++---- tests/fsharp/core/byrefs/test.bsl | 10 ++++++++++ tests/fsharp/core/byrefs/test.fsx | 22 ++++++++++++++++++++++ tests/fsharp/typecheck/sigs/neg106.bsl | 10 ++++++++++ tests/fsharp/typecheck/sigs/neg106.vsbsl | 10 ++++++++++ 5 files changed, 63 insertions(+), 4 deletions(-) diff --git a/src/fsharp/TastOps.fs b/src/fsharp/TastOps.fs index 7212334f040..942b949f57c 100644 --- a/src/fsharp/TastOps.fs +++ b/src/fsharp/TastOps.fs @@ -5863,16 +5863,23 @@ let rec mkExprAddrOfExprAux g mustTakeAddress useReadonlyForGenericArrayAddress let ty = tyOfExpr g expr if isStructTy g ty then match mut with - | NeverMutates -> () - | AddressOfOp -> - // we get an inref - errorR(Error(FSComp.SR.tastCantTakeAddressOfExpression(), m)) + | NeverMutates + | AddressOfOp -> () | DefinitelyMutates -> // Give a nice error message for mutating something we can't take the address of errorR(Error(FSComp.SR.tastInvalidMutationOfConstant(), m)) | PossiblyMutates -> // Warn on defensive copy of something we can't take the address of warning(DefensiveCopyWarning(FSComp.SR.tastValueHasBeenCopied(), m)) + + match mut with + | NeverMutates + | DefinitelyMutates + | PossiblyMutates -> () + | AddressOfOp -> + // we get an inref + errorR(Error(FSComp.SR.tastCantTakeAddressOfExpression(), m)) + // Take a defensive copy let tmp, _ = match mut with diff --git a/tests/fsharp/core/byrefs/test.bsl b/tests/fsharp/core/byrefs/test.bsl index a61c51f9624..71542c8be42 100644 --- a/tests/fsharp/core/byrefs/test.bsl +++ b/tests/fsharp/core/byrefs/test.bsl @@ -59,3 +59,13 @@ test.fsx(88,10,88,15): typecheck error FS3238: Byref types are not allowed to ha test.fsx(92,10,92,15): typecheck error FS3238: Byref types are not allowed to have optional type extensions. test.fsx(96,10,96,16): typecheck error FS3238: Byref types are not allowed to have optional type extensions. + +test.fsx(114,21,114,36): typecheck error FS3236: Cannot take the address of the value returned from the expression. Assign the returned value to a let-bound value before taking the address. + +test.fsx(114,21,114,36): typecheck error FS0001: Type mismatch. Expecting a + 'byref' +but given a + 'inref' +The type 'ByRefKinds.InOut' does not match the type 'ByRefKinds.In' + +test.fsx(119,21,119,29): typecheck error FS3236: Cannot take the address of the value returned from the expression. Assign the returned value to a let-bound value before taking the address. diff --git a/tests/fsharp/core/byrefs/test.fsx b/tests/fsharp/core/byrefs/test.fsx index f3089319267..0eba848ec2f 100644 --- a/tests/fsharp/core/byrefs/test.fsx +++ b/tests/fsharp/core/byrefs/test.fsx @@ -96,6 +96,28 @@ module ByrefNegativeTests = type outref<'T> with member this.Test() = 1 + + module CantTakeAddressOfExpressionReturningReferenceType = + open System.Collections.Concurrent + open System.Collections.Generic + + let test1 () = + let aggregator = + new ConcurrentDictionary< + string, ConcurrentDictionary> + >() + + for kvp in aggregator do + for kvpInner in kvp.Value do + kvp.Value.TryRemove( + kvpInner.Key, + &kvpInner.Value) + |> ignore + + let test2 () = + let x = KeyValuePair(1, [||]) + let y = &x.Value + () #endif // Test a simple ref argument diff --git a/tests/fsharp/typecheck/sigs/neg106.bsl b/tests/fsharp/typecheck/sigs/neg106.bsl index 41e3aa68b52..e07dd731fbb 100644 --- a/tests/fsharp/typecheck/sigs/neg106.bsl +++ b/tests/fsharp/typecheck/sigs/neg106.bsl @@ -149,6 +149,8 @@ The type 'ByRefKinds.Out' does not match the type 'ByRefKinds.In' neg106.fs(102,37,102,40): typecheck error FS0072: Lookup on object of indeterminate type based on information prior to this program point. A type annotation may be needed prior to this program point to constrain the type of the object. This may allow the lookup to be resolved. +neg106.fs(102,36,102,40): typecheck error FS3236: Cannot take the address of the value returned from the expression. Assign the returned value to a let-bound value before taking the address. + neg106.fs(102,36,102,40): typecheck error FS0001: Type mismatch. Expecting a 'outref<'a>' but given a @@ -163,6 +165,8 @@ The type 'ByRefKinds.InOut' does not match the type 'ByRefKinds.In' neg106.fs(112,39,112,42): typecheck error FS0072: Lookup on object of indeterminate type based on information prior to this program point. A type annotation may be needed prior to this program point to constrain the type of the object. This may allow the lookup to be resolved. +neg106.fs(112,38,112,42): typecheck error FS3236: Cannot take the address of the value returned from the expression. Assign the returned value to a let-bound value before taking the address. + neg106.fs(112,38,112,42): typecheck error FS0001: Type mismatch. Expecting a 'byref<'a>' but given a @@ -177,6 +181,8 @@ The type 'ByRefKinds.Out' does not match the type 'ByRefKinds.In' neg106.fs(122,39,122,42): typecheck error FS0072: Lookup on object of indeterminate type based on information prior to this program point. A type annotation may be needed prior to this program point to constrain the type of the object. This may allow the lookup to be resolved. +neg106.fs(122,38,122,42): typecheck error FS3236: Cannot take the address of the value returned from the expression. Assign the returned value to a let-bound value before taking the address. + neg106.fs(122,38,122,42): typecheck error FS0001: Type mismatch. Expecting a 'outref<'a>' but given a @@ -191,6 +197,8 @@ The type 'ByRefKinds.InOut' does not match the type 'ByRefKinds.In' neg106.fs(132,39,132,42): typecheck error FS0072: Lookup on object of indeterminate type based on information prior to this program point. A type annotation may be needed prior to this program point to constrain the type of the object. This may allow the lookup to be resolved. +neg106.fs(132,38,132,42): typecheck error FS3236: Cannot take the address of the value returned from the expression. Assign the returned value to a let-bound value before taking the address. + neg106.fs(132,38,132,42): typecheck error FS0001: Type mismatch. Expecting a 'byref<'a>' but given a @@ -205,6 +213,8 @@ The type 'ByRefKinds.Out' does not match the type 'ByRefKinds.In' neg106.fs(142,39,142,42): typecheck error FS0072: Lookup on object of indeterminate type based on information prior to this program point. A type annotation may be needed prior to this program point to constrain the type of the object. This may allow the lookup to be resolved. +neg106.fs(142,38,142,42): typecheck error FS3236: Cannot take the address of the value returned from the expression. Assign the returned value to a let-bound value before taking the address. + neg106.fs(142,38,142,42): typecheck error FS0001: Type mismatch. Expecting a 'outref<'a>' but given a diff --git a/tests/fsharp/typecheck/sigs/neg106.vsbsl b/tests/fsharp/typecheck/sigs/neg106.vsbsl index 41e3aa68b52..e07dd731fbb 100644 --- a/tests/fsharp/typecheck/sigs/neg106.vsbsl +++ b/tests/fsharp/typecheck/sigs/neg106.vsbsl @@ -149,6 +149,8 @@ The type 'ByRefKinds.Out' does not match the type 'ByRefKinds.In' neg106.fs(102,37,102,40): typecheck error FS0072: Lookup on object of indeterminate type based on information prior to this program point. A type annotation may be needed prior to this program point to constrain the type of the object. This may allow the lookup to be resolved. +neg106.fs(102,36,102,40): typecheck error FS3236: Cannot take the address of the value returned from the expression. Assign the returned value to a let-bound value before taking the address. + neg106.fs(102,36,102,40): typecheck error FS0001: Type mismatch. Expecting a 'outref<'a>' but given a @@ -163,6 +165,8 @@ The type 'ByRefKinds.InOut' does not match the type 'ByRefKinds.In' neg106.fs(112,39,112,42): typecheck error FS0072: Lookup on object of indeterminate type based on information prior to this program point. A type annotation may be needed prior to this program point to constrain the type of the object. This may allow the lookup to be resolved. +neg106.fs(112,38,112,42): typecheck error FS3236: Cannot take the address of the value returned from the expression. Assign the returned value to a let-bound value before taking the address. + neg106.fs(112,38,112,42): typecheck error FS0001: Type mismatch. Expecting a 'byref<'a>' but given a @@ -177,6 +181,8 @@ The type 'ByRefKinds.Out' does not match the type 'ByRefKinds.In' neg106.fs(122,39,122,42): typecheck error FS0072: Lookup on object of indeterminate type based on information prior to this program point. A type annotation may be needed prior to this program point to constrain the type of the object. This may allow the lookup to be resolved. +neg106.fs(122,38,122,42): typecheck error FS3236: Cannot take the address of the value returned from the expression. Assign the returned value to a let-bound value before taking the address. + neg106.fs(122,38,122,42): typecheck error FS0001: Type mismatch. Expecting a 'outref<'a>' but given a @@ -191,6 +197,8 @@ The type 'ByRefKinds.InOut' does not match the type 'ByRefKinds.In' neg106.fs(132,39,132,42): typecheck error FS0072: Lookup on object of indeterminate type based on information prior to this program point. A type annotation may be needed prior to this program point to constrain the type of the object. This may allow the lookup to be resolved. +neg106.fs(132,38,132,42): typecheck error FS3236: Cannot take the address of the value returned from the expression. Assign the returned value to a let-bound value before taking the address. + neg106.fs(132,38,132,42): typecheck error FS0001: Type mismatch. Expecting a 'byref<'a>' but given a @@ -205,6 +213,8 @@ The type 'ByRefKinds.Out' does not match the type 'ByRefKinds.In' neg106.fs(142,39,142,42): typecheck error FS0072: Lookup on object of indeterminate type based on information prior to this program point. A type annotation may be needed prior to this program point to constrain the type of the object. This may allow the lookup to be resolved. +neg106.fs(142,38,142,42): typecheck error FS3236: Cannot take the address of the value returned from the expression. Assign the returned value to a let-bound value before taking the address. + neg106.fs(142,38,142,42): typecheck error FS0001: Type mismatch. Expecting a 'outref<'a>' but given a From 40646943c494aca1d1ab6ab7cd0be5fcd54f4a4f Mon Sep 17 00:00:00 2001 From: Will Smith Date: Wed, 29 Aug 2018 11:39:23 -0700 Subject: [PATCH 033/160] Fixed byref extension methods from not showing up in completions (#5552) --- src/fsharp/ConstraintSolver.fs | 1 + .../UnitTests/CompletionProviderTests.fs | 28 +++++++++++++++++++ 2 files changed, 29 insertions(+) diff --git a/src/fsharp/ConstraintSolver.fs b/src/fsharp/ConstraintSolver.fs index 3334acc48bb..081a6839d4a 100644 --- a/src/fsharp/ConstraintSolver.fs +++ b/src/fsharp/ConstraintSolver.fs @@ -2765,6 +2765,7 @@ let IsApplicableMethApprox g amap m (minfo:MethInfo) availObjTy = let minst = FreshenMethInfo m minfo match minfo.GetObjArgTypes(amap, m, minst) with | [reqdObjTy] -> + let reqdObjTy = if isByrefTy g reqdObjTy then destByrefTy g reqdObjTy else reqdObjTy // This is to support byref extension methods. TryD (fun () -> SolveTypeSubsumesType csenv 0 m NoTrace None reqdObjTy availObjTy ++ (fun () -> ResultD true)) (fun _err -> ResultD false) |> CommitOperationResult diff --git a/vsintegration/tests/UnitTests/CompletionProviderTests.fs b/vsintegration/tests/UnitTests/CompletionProviderTests.fs index ac9502edc61..55da859f273 100644 --- a/vsintegration/tests/UnitTests/CompletionProviderTests.fs +++ b/vsintegration/tests/UnitTests/CompletionProviderTests.fs @@ -602,6 +602,34 @@ module M2 = """ VerifyCompletionList(fileContents, " Ext", ["Extensions"; "ExtraTopLevelOperators"], []) +[] +let ``Byref Extension Methods`` () = + let fileContents = """ +module Extensions = + open System + open System.Runtime.CompilerServices + + [] + type Message = Message of String + + [] + type MessageExtensions private () = + let (|Message|) (Message message) = message + + [] + static member Print (Message message : Message) = + printfn "%s" message + + [] + static member PrintRef (Message message : inref) = + printfn "%s" message + + let wrappedMessage = Message "Hello World" + + wrappedMessage. +""" + VerifyCompletionList(fileContents, "wrappedMessage.", ["PrintRef"], []) + #if EXE ShouldDisplaySystemNamespace() #endif From 392a6f6ac1cdfa93e2e7cdebd10d386c1f64e295 Mon Sep 17 00:00:00 2001 From: Will Smith Date: Wed, 29 Aug 2018 13:08:03 -0700 Subject: [PATCH 034/160] Stop UnifyTypes recovery in TcDelayed (#5524) * Stop UnifyTypes recovery in TcDelayed * Added test * Added baseline * Added neg108 test --- src/fsharp/TypeChecker.fs | 2 +- tests/fsharp/tests.fs | 3 +++ tests/fsharp/typecheck/sigs/neg108.bsl | 5 +++++ tests/fsharp/typecheck/sigs/neg108.fs | 7 +++++++ 4 files changed, 16 insertions(+), 1 deletion(-) create mode 100644 tests/fsharp/typecheck/sigs/neg108.bsl create mode 100644 tests/fsharp/typecheck/sigs/neg108.fs diff --git a/src/fsharp/TypeChecker.fs b/src/fsharp/TypeChecker.fs index a2e53099b6c..03d16c82ee7 100755 --- a/src/fsharp/TypeChecker.fs +++ b/src/fsharp/TypeChecker.fs @@ -8448,7 +8448,7 @@ and TcDelayed cenv overallTy env tpenv mExpr expr exprty (atomicFlag:ExprAtomicF match delayed with | [] | DelayedDot :: _ -> - UnifyTypesAndRecover cenv env mExpr overallTy exprty + UnifyTypes cenv env mExpr overallTy exprty expr.Expr, tpenv // expr.M(args) where x.M is a .NET method or index property // expr.M(args) where x.M is a .NET method or index property diff --git a/tests/fsharp/tests.fs b/tests/fsharp/tests.fs index eb1306f90c9..98e37756568 100644 --- a/tests/fsharp/tests.fs +++ b/tests/fsharp/tests.fs @@ -2393,6 +2393,9 @@ module TypecheckTests = [] let ``type check neg107`` () = singleNegTest (testConfig "typecheck/sigs") "neg107" + [] + let ``type check neg108`` () = singleNegTest (testConfig "typecheck/sigs") "neg108" + [] let ``type check neg103`` () = singleNegTest (testConfig "typecheck/sigs") "neg103" diff --git a/tests/fsharp/typecheck/sigs/neg108.bsl b/tests/fsharp/typecheck/sigs/neg108.bsl new file mode 100644 index 00000000000..d29ee5e1a75 --- /dev/null +++ b/tests/fsharp/typecheck/sigs/neg108.bsl @@ -0,0 +1,5 @@ + +neg108.fs(4,19,4,23): typecheck error FS0001: This expression was expected to have type + 'Test' +but here has type + 'Unit -> Test' diff --git a/tests/fsharp/typecheck/sigs/neg108.fs b/tests/fsharp/typecheck/sigs/neg108.fs new file mode 100644 index 00000000000..d356032b7d6 --- /dev/null +++ b/tests/fsharp/typecheck/sigs/neg108.fs @@ -0,0 +1,7 @@ +module Neg108 + +type Test = Test of Unit +let test : Test = Test + + + From 6d3a2c652de01a9c375ec2acef6ead2c23671f89 Mon Sep 17 00:00:00 2001 From: Will Smith Date: Wed, 29 Aug 2018 13:18:13 -0700 Subject: [PATCH 035/160] More byref error fixes (#5535) * Prevent invalid byref types when declaring functions/methods * Fixed abstract slot not erroring on invalid types with byrefs * Added tests * Added more tests * Added more tests, updated baselines, renamed NoneInner to NoInnerByRef and it only checks for byref * More tests. Updated baseline. Trying to error on functions/methods that are invalid. * Updating vs baseline * Fixed baseline * Updated baselines. Simplified checking a type. * Prevent crash * Fixing some issues * Updated baselines. Make checks a bit simpler * Small cleanup * Fixed build * Quick update * Trying to fix build * Updated neg107 baselines * Added more descriptive error messages for checking declared functions/methods for byrefs * Updated buildfromsource * Fixed merge * Fixed build --- .../FSharp.Compiler.Private/FSComp.fs | 8 ++ .../FSharp.Compiler.Private/FSComp.resx | 6 + src/fsharp/FSComp.txt | 2 + src/fsharp/PostInferenceChecks.fs | 127 ++++++++++++++---- src/fsharp/xlf/FSComp.txt.cs.xlf | 10 ++ src/fsharp/xlf/FSComp.txt.de.xlf | 10 ++ src/fsharp/xlf/FSComp.txt.en.xlf | 10 ++ src/fsharp/xlf/FSComp.txt.es.xlf | 10 ++ src/fsharp/xlf/FSComp.txt.fr.xlf | 10 ++ src/fsharp/xlf/FSComp.txt.it.xlf | 10 ++ src/fsharp/xlf/FSComp.txt.ja.xlf | 10 ++ src/fsharp/xlf/FSComp.txt.ko.xlf | 10 ++ src/fsharp/xlf/FSComp.txt.pl.xlf | 10 ++ src/fsharp/xlf/FSComp.txt.pt-BR.xlf | 10 ++ src/fsharp/xlf/FSComp.txt.ru.xlf | 10 ++ src/fsharp/xlf/FSComp.txt.tr.xlf | 10 ++ src/fsharp/xlf/FSComp.txt.zh-Hans.xlf | 10 ++ src/fsharp/xlf/FSComp.txt.zh-Hant.xlf | 10 ++ tests/fsharp/core/byrefs/test2.bsl | 94 +++++++++++++ tests/fsharp/core/byrefs/test2.fsx | 118 ++++++++++++++++ tests/fsharp/core/span/test2.bsl | 10 ++ tests/fsharp/single-test.fs | 8 +- tests/fsharp/tests.fs | 2 +- tests/fsharp/typecheck/sigs/neg107.bsl | 32 +++++ tests/fsharp/typecheck/sigs/neg107.vsbsl | 32 +++++ tests/fsharp/typecheck/sigs/neg63.bsl | 6 + tests/fsharp/typecheck/sigs/neg63.fs | 14 +- tests/fsharp/typecheck/sigs/neg_byref_1.bsl | 2 + tests/fsharp/typecheck/sigs/neg_byref_16.bsl | 4 + tests/fsharp/typecheck/sigs/neg_byref_2.bsl | 2 + tests/fsharp/typecheck/sigs/neg_byref_20.bsl | 2 + tests/fsharp/typecheck/sigs/neg_byref_23.bsl | 4 + tests/fsharp/typecheck/sigs/neg_byref_3.bsl | 8 ++ tests/fsharp/typecheck/sigs/neg_byref_5.bsl | 2 + tests/fsharp/typecheck/sigs/neg_byref_6.bsl | 2 + tests/fsharp/typecheck/sigs/neg_byref_7.bsl | 4 + tests/fsharp/typecheck/sigs/neg_byref_8.bsl | 4 + 37 files changed, 590 insertions(+), 43 deletions(-) diff --git a/src/buildfromsource/FSharp.Compiler.Private/FSComp.fs b/src/buildfromsource/FSharp.Compiler.Private/FSComp.fs index efc9b760570..03d9d43f508 100644 --- a/src/buildfromsource/FSharp.Compiler.Private/FSComp.fs +++ b/src/buildfromsource/FSharp.Compiler.Private/FSComp.fs @@ -4360,6 +4360,12 @@ type internal SR private() = /// Cannot partially apply the extension method '%s' because the first parameter is a byref type. /// (Originally from ..\FSComp.txt:1444) static member tcCannotPartiallyApplyExtensionMethodForByref(a0 : System.String) = (3239, GetStringFunc("tcCannotPartiallyApplyExtensionMethodForByref",",,,%s,,,") a0) + /// The parameter '%s' has an invalid type '%s'. This is not permitted by the rules of Common IL. + /// (Originally from ..\FSComp.txt:1444) + static member chkInvalidFunctionParameterType(a0 : System.String, a1 : System.String) = (3300, GetStringFunc("chkInvalidFunctionParameterType",",,,%s,,,%s,,,") a0 a1) + /// The function or method has an invalid return type '%s'. This is not permitted by the rules of Common IL. + /// (Originally from ..\FSComp.txt:1445) + static member chkInvalidFunctionReturnType(a0 : System.String) = (3301, GetStringFunc("chkInvalidFunctionReturnType",",,,%s,,,") a0) /// Call this method once to validate that all known resources are valid; throws if not static member RunStartupValidation() = @@ -5778,4 +5784,6 @@ type internal SR private() = ignore(GetString("tcCannotCallExtensionMethodInrefToByref")) ignore(GetString("tcByrefsMayNotHaveTypeExtensions")) ignore(GetString("tcCannotPartiallyApplyExtensionMethodForByref")) + ignore(GetString("chkInvalidFunctionParameterType")) + ignore(GetString("chkInvalidFunctionReturnType")) () diff --git a/src/buildfromsource/FSharp.Compiler.Private/FSComp.resx b/src/buildfromsource/FSharp.Compiler.Private/FSComp.resx index 572268e5555..0741482b25a 100644 --- a/src/buildfromsource/FSharp.Compiler.Private/FSComp.resx +++ b/src/buildfromsource/FSharp.Compiler.Private/FSComp.resx @@ -4363,4 +4363,10 @@ Cannot partially apply the extension method '{0}' because the first parameter is a byref type. + + The parameter '{0}' has an invalid type '{1}'. This is not permitted by the rules of Common IL. + + + The function or method has an invalid return type '{0}'. This is not permitted by the rules of Common IL. + \ No newline at end of file diff --git a/src/fsharp/FSComp.txt b/src/fsharp/FSComp.txt index 253fa2e04f9..08135780b0b 100644 --- a/src/fsharp/FSComp.txt +++ b/src/fsharp/FSComp.txt @@ -1442,3 +1442,5 @@ notAFunctionButMaybeDeclaration,"This value is not a function and cannot be appl 3237,tcCannotCallExtensionMethodInrefToByref,"Cannot call the byref extension method '%s. The first parameter requires the value to be mutable or a non-readonly byref type." 3238,tcByrefsMayNotHaveTypeExtensions,"Byref types are not allowed to have optional type extensions." 3239,tcCannotPartiallyApplyExtensionMethodForByref,"Cannot partially apply the extension method '%s' because the first parameter is a byref type." +3300,chkInvalidFunctionParameterType,"The parameter '%s' has an invalid type '%s'. This is not permitted by the rules of Common IL." +3301,chkInvalidFunctionReturnType,"The function or method has an invalid return type '%s'. This is not permitted by the rules of Common IL." diff --git a/src/fsharp/PostInferenceChecks.fs b/src/fsharp/PostInferenceChecks.fs index bd213dbadea..831ba33f944 100644 --- a/src/fsharp/PostInferenceChecks.fs +++ b/src/fsharp/PostInferenceChecks.fs @@ -106,7 +106,10 @@ type env = external : bool /// Current return scope of the expr. - returnScope : int } + returnScope : int + + /// Are we in an app expression (Expr.App)? + isInAppExpr: bool } let BindTypar env (tp:Typar) = { env with @@ -334,7 +337,14 @@ let rec CheckTypeDeep ((visitTy,visitTyconRefOpt,visitAppTyOpt,visitTraitSolutio match visitTyconRefOpt with | Some visitTyconRef -> visitTyconRef isInner tcref | None -> () - CheckTypesDeep f g env tinst + + // If it's a 'byref<'T>', don't check 'T as an inner. This allows byref>. + // 'byref>' is invalid and gets checked in visitAppTy. + if isByrefTyconRef g tcref then + CheckTypesDeepNoInner f g env tinst + else + CheckTypesDeep f g env tinst + match visitAppTyOpt with | Some visitAppTy -> visitAppTy (tcref, tinst) | None -> () @@ -352,6 +362,9 @@ let rec CheckTypeDeep ((visitTy,visitTyconRefOpt,visitAppTyOpt,visitTraitSolutio and CheckTypesDeep f g env tys = tys |> List.iter (CheckTypeDeep f g env true) +and CheckTypesDeepNoInner f g env tys = + tys |> List.iter (CheckTypeDeep f g env false) + and CheckTypeConstraintDeep f g env x = match x with | TyparConstraint.CoercesTo(ty,_) -> CheckTypeDeep f g env true ty @@ -475,7 +488,10 @@ let WarnOnWrongTypeForAccess (cenv:cenv) env objName valAcc m ty = [] type PermitByRefType = /// Don't permit any byref or byref-like types - | None + | None + + /// Don't permit any byref or byref-like types on inner types. + | NoInnerByRefLike /// Permit only a Span or IsByRefLike type | SpanLike @@ -552,7 +568,7 @@ let rec mkArgsForAppliedExpr isBaseCall argsl x = | _ -> [] /// Check types occurring in the TAST. -let CheckType permitByRefLike (cenv:cenv) env m ty = +let CheckTypeAux permitByRefLike (cenv:cenv) env m ty onInnerByrefError = if cenv.reportErrors then let visitTyar (env,tp) = if not (env.boundTypars.ContainsKey tp) then @@ -561,13 +577,17 @@ let CheckType permitByRefLike (cenv:cenv) env m ty = else errorR (Error(FSComp.SR.checkNotSufficientlyGenericBecauseOfScope(tp.DisplayName),m)) - let visitTyconRef _isInner tcref = + let visitTyconRef isInner tcref = + + let isInnerByRefLike = isInner && isByrefLikeTyconRef cenv.g m tcref match permitByRefLike with | PermitByRefType.None when isByrefLikeTyconRef cenv.g m tcref -> errorR(Error(FSComp.SR.chkErrorUseOfByref(), m)) - | PermitByRefType.SpanLike when isByrefTyconRef cenv.g tcref -> - errorR(Error(FSComp.SR.chkErrorUseOfByref(), m)) + | PermitByRefType.NoInnerByRefLike when isInnerByRefLike -> + onInnerByrefError () + | PermitByRefType.SpanLike when isByrefTyconRef cenv.g tcref || isInnerByRefLike -> + onInnerByrefError () | _ -> () if tyconRefEq cenv.g cenv.g.system_Void_tcref tcref then @@ -595,6 +615,8 @@ let CheckType permitByRefLike (cenv:cenv) env m ty = CheckTypeDeep (ignore, Some visitTyconRef, Some visitAppTy, Some visitTraitSolution, Some visitTyar) cenv.g env false ty +let CheckType permitByRefLike cenv env m ty = + CheckTypeAux permitByRefLike cenv env m ty (fun () -> errorR(Error(FSComp.SR.chkErrorUseOfByref(), m))) /// Check types occurring in TAST (like CheckType) and additionally reject any byrefs. /// The additional byref checks are to catch "byref instantiations" - one place were byref are not permitted. @@ -606,12 +628,18 @@ let CheckTypePermitSpanLike (cenv:cenv) env m ty = CheckType PermitByRefType.Spa /// Check types occurring in TAST but allow all byrefs. Only used on internally-generated types let CheckTypePermitAllByrefs (cenv:cenv) env m ty = CheckType PermitByRefType.All cenv env m ty +/// Check types ocurring in TAST but disallow inner types to be byref or byref-like types. +let CheckTypeNoInnerByrefs cenv env m ty = CheckType PermitByRefType.NoInnerByRefLike cenv env m ty + let CheckTypeInstNoByrefs cenv env m tyargs = tyargs |> List.iter (CheckTypeNoByrefs cenv env m) let CheckTypeInstPermitAllByrefs cenv env m tyargs = tyargs |> List.iter (CheckTypePermitAllByrefs cenv env m) +let CheckTypeInstNoInnerByrefs cenv env m tyargs = + tyargs |> List.iter (CheckTypeNoInnerByrefs cenv env m) + /// Applied functions get wrapped in coerce nodes for subsumption coercions let (|OptionalCoerce|) = function | Expr.Op(TOp.Coerce _, _, [Expr.App(f, _, _, [], _)], _) -> f @@ -663,7 +691,10 @@ and CheckValRef (cenv:cenv) (env:env) v m (context: PermitByRefExpr) = if context.Disallow && isByrefLikeTy cenv.g m v.Type then errorR(Error(FSComp.SR.chkNoByrefAtThisPoint(v.DisplayName), m)) - CheckTypePermitAllByrefs cenv env m v.Type // the byref checks are done at the actual binding of the value + if env.isInAppExpr then + CheckTypePermitAllByrefs cenv env m v.Type // we do checks for byrefs elsewhere + else + CheckTypeNoInnerByrefs cenv env m v.Type /// Check a use of a value and CheckValUse (cenv: cenv) (env: env) (vref: ValRef, vFlags, m) (context: PermitByRefExpr) = @@ -857,6 +888,7 @@ and CheckExpr (cenv:cenv) (env:env) origExpr (context:PermitByRefExpr) : Limit = match expr with | Expr.Sequential (e1,e2,dir,_,_) -> CheckExprNoByrefs cenv env e1 + match dir with | NormalSeq -> CheckExpr cenv env e2 context // carry context into _;RHS (normal sequencing only) @@ -879,7 +911,7 @@ and CheckExpr (cenv:cenv) (env:env) origExpr (context:PermitByRefExpr) : Limit = CheckExpr cenv env body context | Expr.Const (_,m,ty) -> - CheckTypePermitAllByrefs cenv env m ty + CheckTypeNoInnerByrefs cenv env m ty NoLimit | Expr.Val (vref,vFlags,m) -> @@ -930,9 +962,13 @@ and CheckExpr (cenv:cenv) (env:env) origExpr (context:PermitByRefExpr) : Limit = errorR(Error(FSComp.SR.tcCannotCallAbstractBaseMember(v.DisplayName),m)) NoLimit else + let env = { env with isInAppExpr = true } + let returnTy = tyOfExpr g expr + CheckValRef cenv env v m PermitByRefExpr.No CheckValRef cenv env baseVal m PermitByRefExpr.No CheckTypeInstNoByrefs cenv env m tyargs + CheckTypeNoInnerByrefs cenv env m returnTy CheckExprs cenv env rest (mkArgsForAppliedExpr true rest f) // Allow base calls to IL methods @@ -973,12 +1009,20 @@ and CheckExpr (cenv:cenv) (env:env) origExpr (context:PermitByRefExpr) : Limit = // Allow '%expr' in quotations | Expr.App(Expr.Val(vref,_,_),_,tinst,[arg],m) when isSpliceOperator g vref && env.quote -> - CheckTypeInstPermitAllByrefs cenv env m tinst // it's the splice operator, a byref instantiation is allowed + CheckTypeInstNoInnerByrefs cenv env m tinst // it's the splice operator, a byref instantiation is allowed CheckExprNoByrefs cenv env arg NoLimit // Check an application | Expr.App(f,_fty,tyargs,argsl,m) -> + let returnTy = tyOfExpr g expr + + // This is to handle recursive cases. Don't check 'returnTy' again if we are still inside a app expression. + if not env.isInAppExpr then + CheckTypeNoInnerByrefs cenv env m returnTy + + let env = { env with isInAppExpr = true } + CheckTypeInstNoByrefs cenv env m tyargs CheckExprNoByrefs cenv env f @@ -987,7 +1031,6 @@ and CheckExpr (cenv:cenv) (env:env) origExpr (context:PermitByRefExpr) : Limit = | Expr.Val(vref, _, _) when vref.IsInstanceMember && not argsl.IsEmpty -> true | _ -> false - let returnTy = tyOfExpr g expr let contexts = mkArgsForAppliedExpr false argsl f if hasReceiver then CheckCallWithReceiver cenv env m returnTy argsl contexts context @@ -1010,7 +1053,7 @@ and CheckExpr (cenv:cenv) (env:env) origExpr (context:PermitByRefExpr) : Limit = NoLimit | Expr.Match(_,_,dtree,targets,m,ty) -> - CheckTypePermitAllByrefs cenv env m ty // computed byrefs allowed at each branch + CheckTypeNoInnerByrefs cenv env m ty // computed byrefs allowed at each branch CheckDecisionTree cenv env dtree CheckDecisionTreeTargets cenv env targets context @@ -1065,7 +1108,7 @@ and CheckExprOp cenv env (op,tyargs,args,m) context expr = CheckExprsNoByRefLike cenv env [e1;e2] | TOp.TryFinally _,[_],[Expr.Lambda(_,_,_,[_],e1,_,_); Expr.Lambda(_,_,_,[_],e2,_,_)] -> - CheckTypeInstPermitAllByrefs cenv env m tyargs // result of a try/finally can be a byref + CheckTypeInstNoInnerByrefs cenv env m tyargs // result of a try/finally can be a byref ctorLimitedZoneCheck() let limit = CheckExpr cenv env e1 context // result of a try/finally can be a byref if in a position where the overall expression is can be a byref CheckExprNoByrefs cenv env e2 @@ -1076,7 +1119,7 @@ and CheckExprOp cenv env (op,tyargs,args,m) context expr = CheckExprsNoByRefLike cenv env [e1;e2;e3] | TOp.TryCatch _,[_],[Expr.Lambda(_,_,_,[_],e1,_,_); Expr.Lambda(_,_,_,[_],_e2,_,_); Expr.Lambda(_,_,_,[_],e3,_,_)] -> - CheckTypeInstPermitAllByrefs cenv env m tyargs // result of a try/catch can be a byref + CheckTypeInstNoInnerByrefs cenv env m tyargs // result of a try/catch can be a byref ctorLimitedZoneCheck() let limit1 = CheckExpr cenv env e1 context // result of a try/catch can be a byref if in a position where the overall expression is can be a byref // [(* e2; -- don't check filter body - duplicates logic in 'catch' body *) e3] @@ -1087,7 +1130,7 @@ and CheckExprOp cenv env (op,tyargs,args,m) context expr = CheckTypeInstNoByrefs cenv env m tyargs CheckTypeInstNoByrefs cenv env m enclTypeArgs CheckTypeInstNoByrefs cenv env m methTypeArgs - CheckTypeInstPermitAllByrefs cenv env m tys // permit byref returns + CheckTypeInstNoInnerByrefs cenv env m tys // permit byref returns let hasReceiver = (methRef.CallingConv.IsInstance || methRef.CallingConv.IsInstanceExplicit) && @@ -1263,7 +1306,7 @@ and CheckExprOp cenv env (op,tyargs,args,m) context expr = CheckExpr cenv env obj context | TOp.ILAsm (instrs,tys),_,_ -> - CheckTypeInstPermitAllByrefs cenv env m tys + CheckTypeInstNoInnerByrefs cenv env m tys CheckTypeInstNoByrefs cenv env m tyargs match instrs,args with // Write a .NET instance field @@ -1323,7 +1366,7 @@ and CheckExprOp cenv env (op,tyargs,args,m) context expr = CheckTypeInstNoByrefs cenv env m tyargs CheckExprsNoByRefLike cenv env args -and CheckLambdas isTop (memInfo: ValMemberInfo option) cenv env inlined topValInfo alwaysCheckNoReraise e m ety context = +and CheckLambdas isTop (memInfo: ValMemberInfo option) cenv env inlined topValInfo alwaysCheckNoReraise e mOrig ety context = let g = cenv.g // The topValInfo here says we are _guaranteeing_ to compile a function value // as a .NET method with precisely the corresponding argument counts. @@ -1353,7 +1396,28 @@ and CheckLambdas isTop (memInfo: ValMemberInfo option) cenv env inlined topValIn // any byRef arguments are considered used, as they may be 'out's restArgs |> List.iter (fun arg -> if isByrefTy g arg.Type then arg.SetHasBeenReferenced()) - syntacticArgs |> List.iter (CheckValSpec cenv env) + let permitByRefType = + if isTop then + PermitByRefType.NoInnerByRefLike + else + PermitByRefType.None + + // Check argument types + syntacticArgs + |> List.iter (fun arg -> + CheckValSpecAux permitByRefType cenv env arg (fun () -> + if arg.IsCompilerGenerated then + errorR(Error(FSComp.SR.chkErrorUseOfByref(), arg.Range)) + else + errorR(Error(FSComp.SR.chkInvalidFunctionParameterType(arg.DisplayName, NicePrint.minimalStringOfType cenv.denv arg.Type), arg.Range)) + ) + ) + + // Check return type + CheckTypeAux permitByRefType cenv env mOrig bodyty (fun () -> + errorR(Error(FSComp.SR.chkInvalidFunctionReturnType(NicePrint.minimalStringOfType cenv.denv bodyty), mOrig)) + ) + syntacticArgs |> List.iter (BindVal cenv env) // Trigger a test hook @@ -1393,8 +1457,10 @@ and CheckLambdas isTop (memInfo: ValMemberInfo option) cenv env inlined topValIn // This path is for expression bindings that are not actually lambdas | _ -> + let m = mOrig // Permit byrefs for let x = ... - CheckTypePermitAllByrefs cenv env m ety + CheckTypeNoInnerByrefs cenv env m ety + let limit = if not inlined && (isByrefLikeTy g m ety || isNativePtrTy g ety) then // allow byref to occur as RHS of byref binding. @@ -1441,7 +1507,7 @@ and CheckDecisionTreeTargets cenv env targets context = and CheckDecisionTreeTarget cenv env context (TTarget(vs,e,_)) = BindVals cenv env vs - vs |> List.iter (CheckValSpec cenv env) + vs |> List.iter (CheckValSpec PermitByRefType.All cenv env) CheckExpr cenv env e context and CheckDecisionTree cenv env x = @@ -1461,11 +1527,11 @@ and CheckDecisionTreeSwitch cenv env (e,cases,dflt,m) = and CheckDecisionTreeTest cenv env m discrim = match discrim with - | DecisionTreeTest.UnionCase (_,tinst) -> CheckTypeInstPermitAllByrefs cenv env m tinst - | DecisionTreeTest.ArrayLength (_,ty) -> CheckTypePermitAllByrefs cenv env m ty + | DecisionTreeTest.UnionCase (_,tinst) -> CheckTypeInstNoInnerByrefs cenv env m tinst + | DecisionTreeTest.ArrayLength (_,ty) -> CheckTypeNoInnerByrefs cenv env m ty | DecisionTreeTest.Const _ -> () | DecisionTreeTest.IsNull -> () - | DecisionTreeTest.IsInst (srcTy,tgtTy) -> CheckTypePermitAllByrefs cenv env m srcTy; CheckTypePermitAllByrefs cenv env m tgtTy + | DecisionTreeTest.IsInst (srcTy,tgtTy) -> CheckTypeNoInnerByrefs cenv env m srcTy; CheckTypeNoInnerByrefs cenv env m tgtTy | DecisionTreeTest.ActivePatternCase (exp,_,_,_,_) -> CheckExprNoByrefs cenv env exp and CheckAttrib cenv env (Attrib(_,_,args,props,_,_,_)) = @@ -1549,10 +1615,13 @@ and CheckValInfo cenv env (ValReprInfo(_,args,ret)) = and CheckArgInfo cenv env (argInfo : ArgReprInfo) = CheckAttribs cenv env argInfo.Attribs -and CheckValSpec cenv env (v:Val) = +and CheckValSpecAux permitByRefLike cenv env (v:Val) onInnerByrefError = v.Attribs |> CheckAttribs cenv env v.ValReprInfo |> Option.iter (CheckValInfo cenv env) - v.Type |> CheckTypePermitAllByrefs cenv env v.Range + CheckTypeAux permitByRefLike cenv env v.Range v.Type onInnerByrefError + +and CheckValSpec permitByRefLike cenv env v = + CheckValSpecAux permitByRefLike cenv env v (fun () -> errorR(Error(FSComp.SR.chkErrorUseOfByref(), v.Range))) and AdjustAccess isHidden (cpath: unit -> CompilationPath) access = if isHidden then @@ -1583,7 +1652,6 @@ and CheckBinding cenv env alwaysCheckNoReraise context (TBind(v,bindRhs,_) as bi let nm = v.DisplayName errorR(Error(FSComp.SR.chkMemberUsedInInvalidWay(nm, nm, stringOfRange m), v.Range)) - // Byrefs allowed for x in 'let x = ...' v.Type |> CheckTypePermitAllByrefs cenv env v.Range v.Attribs |> CheckAttribs cenv env v.ValReprInfo |> Option.iter (CheckValInfo cenv env) @@ -2053,8 +2121,8 @@ let CheckEntityDefn cenv env (tycon:Entity) = let env = BindTypars g env tps for argtys in argtysl do for (argty, _) in argtys do - CheckTypePermitAllByrefs cenv env m argty - CheckTypePermitAllByrefs cenv env m rty + CheckTypeNoInnerByrefs cenv env vref.Range argty + CheckTypeNoInnerByrefs cenv env vref.Range rty | None -> () @@ -2213,7 +2281,8 @@ let CheckTopImpl (g,amap,reportErrors,infoReader,internalsVisibleToPaths,viewCcu boundTypars= TyparMap.Empty reflect=false external=false - returnScope = 0 } + returnScope = 0 + isInAppExpr = false } CheckModuleExpr cenv env mexpr CheckAttribs cenv env extraAttribs diff --git a/src/fsharp/xlf/FSComp.txt.cs.xlf b/src/fsharp/xlf/FSComp.txt.cs.xlf index 1f282750b6f..8399e9aa75c 100644 --- a/src/fsharp/xlf/FSComp.txt.cs.xlf +++ b/src/fsharp/xlf/FSComp.txt.cs.xlf @@ -7062,6 +7062,16 @@ Byref types are not allowed to have optional type extensions. + + The parameter '{0}' has an invalid type '{1}'. This is not permitted by the rules of Common IL. + The parameter '{0}' has an invalid type '{1}'. This is not permitted by the rules of Common IL. + + + + The function or method has an invalid return type '{0}'. This is not permitted by the rules of Common IL. + The function or method has an invalid return type '{0}'. This is not permitted by the rules of Common IL. + + Cannot call the byref extension method '{0}. The first parameter requires the value to be mutable or a non-readonly byref type. Cannot call the byref extension method '{0}. The first parameter requires the value to be mutable or a non-readonly byref type. diff --git a/src/fsharp/xlf/FSComp.txt.de.xlf b/src/fsharp/xlf/FSComp.txt.de.xlf index 47541cb2c59..afa58d4bef5 100644 --- a/src/fsharp/xlf/FSComp.txt.de.xlf +++ b/src/fsharp/xlf/FSComp.txt.de.xlf @@ -7062,6 +7062,16 @@ Byref types are not allowed to have optional type extensions. + + The parameter '{0}' has an invalid type '{1}'. This is not permitted by the rules of Common IL. + The parameter '{0}' has an invalid type '{1}'. This is not permitted by the rules of Common IL. + + + + The function or method has an invalid return type '{0}'. This is not permitted by the rules of Common IL. + The function or method has an invalid return type '{0}'. This is not permitted by the rules of Common IL. + + Cannot call the byref extension method '{0}. The first parameter requires the value to be mutable or a non-readonly byref type. Cannot call the byref extension method '{0}. The first parameter requires the value to be mutable or a non-readonly byref type. diff --git a/src/fsharp/xlf/FSComp.txt.en.xlf b/src/fsharp/xlf/FSComp.txt.en.xlf index 377dd80396b..84b45ed7fc1 100644 --- a/src/fsharp/xlf/FSComp.txt.en.xlf +++ b/src/fsharp/xlf/FSComp.txt.en.xlf @@ -7062,6 +7062,16 @@ Byref types are not allowed to have optional type extensions. + + The parameter '{0}' has an invalid type '{1}'. This is not permitted by the rules of Common IL. + The parameter '{0}' has an invalid type '{1}'. This is not permitted by the rules of Common IL. + + + + The function or method has an invalid return type '{0}'. This is not permitted by the rules of Common IL. + The function or method has an invalid return type '{0}'. This is not permitted by the rules of Common IL. + + Cannot call the byref extension method '{0}. The first parameter requires the value to be mutable or a non-readonly byref type. Cannot call the byref extension method '{0}. The first parameter requires the value to be mutable or a non-readonly byref type. diff --git a/src/fsharp/xlf/FSComp.txt.es.xlf b/src/fsharp/xlf/FSComp.txt.es.xlf index a5933c20eeb..11cb00df84b 100644 --- a/src/fsharp/xlf/FSComp.txt.es.xlf +++ b/src/fsharp/xlf/FSComp.txt.es.xlf @@ -7062,6 +7062,16 @@ Byref types are not allowed to have optional type extensions. + + The parameter '{0}' has an invalid type '{1}'. This is not permitted by the rules of Common IL. + The parameter '{0}' has an invalid type '{1}'. This is not permitted by the rules of Common IL. + + + + The function or method has an invalid return type '{0}'. This is not permitted by the rules of Common IL. + The function or method has an invalid return type '{0}'. This is not permitted by the rules of Common IL. + + Cannot call the byref extension method '{0}. The first parameter requires the value to be mutable or a non-readonly byref type. Cannot call the byref extension method '{0}. The first parameter requires the value to be mutable or a non-readonly byref type. diff --git a/src/fsharp/xlf/FSComp.txt.fr.xlf b/src/fsharp/xlf/FSComp.txt.fr.xlf index 52fd97a0c6a..28bf771e2d5 100644 --- a/src/fsharp/xlf/FSComp.txt.fr.xlf +++ b/src/fsharp/xlf/FSComp.txt.fr.xlf @@ -7062,6 +7062,16 @@ Byref types are not allowed to have optional type extensions. + + The parameter '{0}' has an invalid type '{1}'. This is not permitted by the rules of Common IL. + The parameter '{0}' has an invalid type '{1}'. This is not permitted by the rules of Common IL. + + + + The function or method has an invalid return type '{0}'. This is not permitted by the rules of Common IL. + The function or method has an invalid return type '{0}'. This is not permitted by the rules of Common IL. + + Cannot call the byref extension method '{0}. The first parameter requires the value to be mutable or a non-readonly byref type. Cannot call the byref extension method '{0}. The first parameter requires the value to be mutable or a non-readonly byref type. diff --git a/src/fsharp/xlf/FSComp.txt.it.xlf b/src/fsharp/xlf/FSComp.txt.it.xlf index a536fa3d02d..1736dad5bba 100644 --- a/src/fsharp/xlf/FSComp.txt.it.xlf +++ b/src/fsharp/xlf/FSComp.txt.it.xlf @@ -7062,6 +7062,16 @@ Byref types are not allowed to have optional type extensions. + + The parameter '{0}' has an invalid type '{1}'. This is not permitted by the rules of Common IL. + The parameter '{0}' has an invalid type '{1}'. This is not permitted by the rules of Common IL. + + + + The function or method has an invalid return type '{0}'. This is not permitted by the rules of Common IL. + The function or method has an invalid return type '{0}'. This is not permitted by the rules of Common IL. + + Cannot call the byref extension method '{0}. The first parameter requires the value to be mutable or a non-readonly byref type. Cannot call the byref extension method '{0}. The first parameter requires the value to be mutable or a non-readonly byref type. diff --git a/src/fsharp/xlf/FSComp.txt.ja.xlf b/src/fsharp/xlf/FSComp.txt.ja.xlf index 40cfe615f3b..a96b750bb5e 100644 --- a/src/fsharp/xlf/FSComp.txt.ja.xlf +++ b/src/fsharp/xlf/FSComp.txt.ja.xlf @@ -7062,6 +7062,16 @@ Byref types are not allowed to have optional type extensions. + + The parameter '{0}' has an invalid type '{1}'. This is not permitted by the rules of Common IL. + The parameter '{0}' has an invalid type '{1}'. This is not permitted by the rules of Common IL. + + + + The function or method has an invalid return type '{0}'. This is not permitted by the rules of Common IL. + The function or method has an invalid return type '{0}'. This is not permitted by the rules of Common IL. + + Cannot call the byref extension method '{0}. The first parameter requires the value to be mutable or a non-readonly byref type. Cannot call the byref extension method '{0}. The first parameter requires the value to be mutable or a non-readonly byref type. diff --git a/src/fsharp/xlf/FSComp.txt.ko.xlf b/src/fsharp/xlf/FSComp.txt.ko.xlf index feaca0362e6..02bdabada87 100644 --- a/src/fsharp/xlf/FSComp.txt.ko.xlf +++ b/src/fsharp/xlf/FSComp.txt.ko.xlf @@ -7062,6 +7062,16 @@ Byref types are not allowed to have optional type extensions. + + The parameter '{0}' has an invalid type '{1}'. This is not permitted by the rules of Common IL. + The parameter '{0}' has an invalid type '{1}'. This is not permitted by the rules of Common IL. + + + + The function or method has an invalid return type '{0}'. This is not permitted by the rules of Common IL. + The function or method has an invalid return type '{0}'. This is not permitted by the rules of Common IL. + + Cannot call the byref extension method '{0}. The first parameter requires the value to be mutable or a non-readonly byref type. Cannot call the byref extension method '{0}. The first parameter requires the value to be mutable or a non-readonly byref type. diff --git a/src/fsharp/xlf/FSComp.txt.pl.xlf b/src/fsharp/xlf/FSComp.txt.pl.xlf index 7e9511069d5..8dde36da4c2 100644 --- a/src/fsharp/xlf/FSComp.txt.pl.xlf +++ b/src/fsharp/xlf/FSComp.txt.pl.xlf @@ -7062,6 +7062,16 @@ Byref types are not allowed to have optional type extensions. + + The parameter '{0}' has an invalid type '{1}'. This is not permitted by the rules of Common IL. + The parameter '{0}' has an invalid type '{1}'. This is not permitted by the rules of Common IL. + + + + The function or method has an invalid return type '{0}'. This is not permitted by the rules of Common IL. + The function or method has an invalid return type '{0}'. This is not permitted by the rules of Common IL. + + Cannot call the byref extension method '{0}. The first parameter requires the value to be mutable or a non-readonly byref type. Cannot call the byref extension method '{0}. The first parameter requires the value to be mutable or a non-readonly byref type. diff --git a/src/fsharp/xlf/FSComp.txt.pt-BR.xlf b/src/fsharp/xlf/FSComp.txt.pt-BR.xlf index 663e12233f2..c3357c079ae 100644 --- a/src/fsharp/xlf/FSComp.txt.pt-BR.xlf +++ b/src/fsharp/xlf/FSComp.txt.pt-BR.xlf @@ -7062,6 +7062,16 @@ Byref types are not allowed to have optional type extensions. + + The parameter '{0}' has an invalid type '{1}'. This is not permitted by the rules of Common IL. + The parameter '{0}' has an invalid type '{1}'. This is not permitted by the rules of Common IL. + + + + The function or method has an invalid return type '{0}'. This is not permitted by the rules of Common IL. + The function or method has an invalid return type '{0}'. This is not permitted by the rules of Common IL. + + Cannot call the byref extension method '{0}. The first parameter requires the value to be mutable or a non-readonly byref type. Cannot call the byref extension method '{0}. The first parameter requires the value to be mutable or a non-readonly byref type. diff --git a/src/fsharp/xlf/FSComp.txt.ru.xlf b/src/fsharp/xlf/FSComp.txt.ru.xlf index 9ebafb77bb5..af8a812a968 100644 --- a/src/fsharp/xlf/FSComp.txt.ru.xlf +++ b/src/fsharp/xlf/FSComp.txt.ru.xlf @@ -7062,6 +7062,16 @@ Byref types are not allowed to have optional type extensions. + + The parameter '{0}' has an invalid type '{1}'. This is not permitted by the rules of Common IL. + The parameter '{0}' has an invalid type '{1}'. This is not permitted by the rules of Common IL. + + + + The function or method has an invalid return type '{0}'. This is not permitted by the rules of Common IL. + The function or method has an invalid return type '{0}'. This is not permitted by the rules of Common IL. + + Cannot call the byref extension method '{0}. The first parameter requires the value to be mutable or a non-readonly byref type. Cannot call the byref extension method '{0}. The first parameter requires the value to be mutable or a non-readonly byref type. diff --git a/src/fsharp/xlf/FSComp.txt.tr.xlf b/src/fsharp/xlf/FSComp.txt.tr.xlf index 89e56a2e44d..d7f55a56de9 100644 --- a/src/fsharp/xlf/FSComp.txt.tr.xlf +++ b/src/fsharp/xlf/FSComp.txt.tr.xlf @@ -7062,6 +7062,16 @@ Byref types are not allowed to have optional type extensions. + + The parameter '{0}' has an invalid type '{1}'. This is not permitted by the rules of Common IL. + The parameter '{0}' has an invalid type '{1}'. This is not permitted by the rules of Common IL. + + + + The function or method has an invalid return type '{0}'. This is not permitted by the rules of Common IL. + The function or method has an invalid return type '{0}'. This is not permitted by the rules of Common IL. + + Cannot call the byref extension method '{0}. The first parameter requires the value to be mutable or a non-readonly byref type. Cannot call the byref extension method '{0}. The first parameter requires the value to be mutable or a non-readonly byref type. diff --git a/src/fsharp/xlf/FSComp.txt.zh-Hans.xlf b/src/fsharp/xlf/FSComp.txt.zh-Hans.xlf index c24dfd3e93b..ed0d6bfe422 100644 --- a/src/fsharp/xlf/FSComp.txt.zh-Hans.xlf +++ b/src/fsharp/xlf/FSComp.txt.zh-Hans.xlf @@ -7062,6 +7062,16 @@ Byref types are not allowed to have optional type extensions. + + The parameter '{0}' has an invalid type '{1}'. This is not permitted by the rules of Common IL. + The parameter '{0}' has an invalid type '{1}'. This is not permitted by the rules of Common IL. + + + + The function or method has an invalid return type '{0}'. This is not permitted by the rules of Common IL. + The function or method has an invalid return type '{0}'. This is not permitted by the rules of Common IL. + + Cannot call the byref extension method '{0}. The first parameter requires the value to be mutable or a non-readonly byref type. Cannot call the byref extension method '{0}. The first parameter requires the value to be mutable or a non-readonly byref type. diff --git a/src/fsharp/xlf/FSComp.txt.zh-Hant.xlf b/src/fsharp/xlf/FSComp.txt.zh-Hant.xlf index 6c99ebdef17..f0b9be6cd54 100644 --- a/src/fsharp/xlf/FSComp.txt.zh-Hant.xlf +++ b/src/fsharp/xlf/FSComp.txt.zh-Hant.xlf @@ -7062,6 +7062,16 @@ Byref types are not allowed to have optional type extensions. + + The parameter '{0}' has an invalid type '{1}'. This is not permitted by the rules of Common IL. + The parameter '{0}' has an invalid type '{1}'. This is not permitted by the rules of Common IL. + + + + The function or method has an invalid return type '{0}'. This is not permitted by the rules of Common IL. + The function or method has an invalid return type '{0}'. This is not permitted by the rules of Common IL. + + Cannot call the byref extension method '{0}. The first parameter requires the value to be mutable or a non-readonly byref type. Cannot call the byref extension method '{0}. The first parameter requires the value to be mutable or a non-readonly byref type. diff --git a/tests/fsharp/core/byrefs/test2.bsl b/tests/fsharp/core/byrefs/test2.bsl index 704cd4613eb..c6af427d7ce 100644 --- a/tests/fsharp/core/byrefs/test2.bsl +++ b/tests/fsharp/core/byrefs/test2.bsl @@ -1,4 +1,10 @@ +test2.fsx(181,9,181,22): typecheck warning FS0193: This expression is a function value, i.e. is missing arguments. Its type is byref -> unit. + +test2.fsx(199,9,199,20): typecheck warning FS0193: This expression is a function value, i.e. is missing arguments. Its type is int -> byref -> unit. + +test2.fsx(214,9,214,24): typecheck warning FS0193: This expression is a function value, i.e. is missing arguments. Its type is inref * int -> unit. + test2.fsx(29,18,29,19): typecheck error FS3209: The address of the variable 'y' or a related expression cannot be used at this point. This is to ensure the address of the local value does not escape its scope. test2.fsx(36,18,36,19): typecheck error FS3209: The address of the variable 'z' or a related expression cannot be used at this point. This is to ensure the address of the local value does not escape its scope. @@ -19,6 +25,10 @@ test2.fsx(79,14,79,29): typecheck error FS3228: The address of a value returned test2.fsx(87,14,87,29): typecheck error FS3228: The address of a value returned from the expression cannot be used at this point. This is to ensure the address of the local value does not escape its scope. +test2.fsx(93,13,93,14): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. + +test2.fsx(93,17,93,29): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. + test2.fsx(93,28,93,29): typecheck error FS0421: The address of the variable 'x' cannot be used at this point test2.fsx(93,17,93,29): typecheck error FS0425: The type of a first-class function cannot contain byrefs @@ -34,3 +44,87 @@ test2.fsx(133,23,133,33): typecheck error FS0438: Duplicate method. The method ' test2.fsx(131,23,131,33): typecheck error FS0438: Duplicate method. The method 'TestMethod' has the same name and signature as another method in type 'NegativeTests.TestNegativeOverloading'. test2.fsx(129,23,129,33): typecheck error FS0438: Duplicate method. The method 'TestMethod' has the same name and signature as another method in type 'NegativeTests.TestNegativeOverloading'. + +test2.fsx(137,18,137,22): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. + +test2.fsx(137,18,137,22): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. + +test2.fsx(139,18,139,23): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. + +test2.fsx(141,9,141,14): typecheck error FS3301: The function or method has an invalid return type '(byref * int)'. This is not permitted by the rules of Common IL. + +test2.fsx(141,34,141,39): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. + +test2.fsx(141,35,141,36): typecheck error FS0418: The byref typed value 'x' cannot be used at this point + +test2.fsx(143,9,143,14): typecheck error FS3301: The function or method has an invalid return type '(byref -> unit)'. This is not permitted by the rules of Common IL. + +test2.fsx(145,14,145,15): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. + +test2.fsx(147,17,147,18): typecheck error FS3300: The parameter 'x' has an invalid type '((byref -> unit) * int)'. This is not permitted by the rules of Common IL. + +test2.fsx(149,17,149,18): typecheck error FS3300: The parameter 'x' has an invalid type '(byref -> unit)'. This is not permitted by the rules of Common IL. + +test2.fsx(149,41,149,42): typecheck error FS3300: The parameter 'y' has an invalid type '(byref * int)'. This is not permitted by the rules of Common IL. + +test2.fsx(155,36,155,39): typecheck error FS3300: The parameter 'tup' has an invalid type '(inref * int)'. This is not permitted by the rules of Common IL. + +test2.fsx(156,13,156,33): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. + +test2.fsx(158,37,158,38): typecheck error FS3300: The parameter 'x' has an invalid type '(byref -> unit)'. This is not permitted by the rules of Common IL. + +test2.fsx(160,37,160,38): typecheck error FS3300: The parameter 'x' has an invalid type 'byref option'. This is not permitted by the rules of Common IL. + +test2.fsx(162,17,162,18): typecheck error FS3300: The parameter 'x' has an invalid type 'byref option'. This is not permitted by the rules of Common IL. + +test2.fsx(167,13,167,14): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. + +test2.fsx(167,17,167,30): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. + +test2.fsx(170,9,170,15): typecheck error FS3301: The function or method has an invalid return type '(byref -> unit)'. This is not permitted by the rules of Common IL. + +test2.fsx(171,9,171,22): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. + +test2.fsx(174,13,174,14): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. + +test2.fsx(176,13,176,26): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. + +test2.fsx(181,9,181,22): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. + +test2.fsx(185,13,185,14): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. + +test2.fsx(185,17,185,28): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. + +test2.fsx(188,9,188,15): typecheck error FS3301: The function or method has an invalid return type '(int -> byref -> unit)'. This is not permitted by the rules of Common IL. + +test2.fsx(189,9,189,20): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. + +test2.fsx(192,13,192,14): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. + +test2.fsx(194,13,194,24): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. + +test2.fsx(199,9,199,20): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. + +test2.fsx(203,13,203,14): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. + +test2.fsx(203,17,203,32): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. + +test2.fsx(203,17,203,32): typecheck error FS0425: The type of a first-class function cannot contain byrefs + +test2.fsx(207,13,207,14): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. + +test2.fsx(209,13,209,28): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. + +test2.fsx(214,9,214,24): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. + +test2.fsx(217,9,217,15): typecheck error FS3301: The function or method has an invalid return type '(byref * int)'. This is not permitted by the rules of Common IL. + +test2.fsx(219,10,219,15): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. + +test2.fsx(219,11,219,12): typecheck error FS0421: The address of the variable 'x' cannot be used at this point + +test2.fsx(222,9,222,18): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. + +test2.fsx(226,13,226,14): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. + +test2.fsx(226,17,226,26): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. diff --git a/tests/fsharp/core/byrefs/test2.fsx b/tests/fsharp/core/byrefs/test2.fsx index 163bdf54dbb..ab7ec8cd730 100644 --- a/tests/fsharp/core/byrefs/test2.fsx +++ b/tests/fsharp/core/byrefs/test2.fsx @@ -131,6 +131,101 @@ module NegativeTests = static member TestMethod(dt: inref) = () static member TestMethod(dt: outref) = () + + type NegativeInterface = + + abstract Test : (byref * byref) -> byref + + abstract Test2 : (byref -> unit) -> unit + + let test8 (x: byref) = (&x, 1) + + let test9 (x: byref) = + printfn "test9" + fun (y: byref) -> () + + let test10 (x: (byref -> unit) * int) = () + + let test11 (x: byref -> unit) (y: byref * int) = () + + type StaticTest private () = + + static member Test (x: inref, y: int) = () + + static member NegativeTest(tup) = + StaticTest.Test(tup) + + static member NegativeTest2(x: byref -> unit) = () + + static member NegativeTest3(x: byref option) = () + + let test12 (x: byref option) = () + + let testHelper1 (x: int) (y: byref) = () + + let test13 () = + let x = testHelper1 1 + () + + let test14 () = + testHelper1 1 + + let test15 () = + let x = + printfn "test" + testHelper1 1 + () + + let test16 () = + let x = 1 + testHelper1 1 + () + + let test17 () = + let x = testHelper1 + () + + let test18 () = + testHelper1 + + let test19 () = + let x = + printfn "test" + testHelper1 + () + + let test20 () = + let x = 1 + testHelper1 + () + + let test21 () = + let x = StaticTest.Test + () + + let test22 () = + let x = + printfn "test" + StaticTest.Test + () + + let test23 () = + let x = 1 + StaticTest.Test + () + + let test24 () : byref * int = + let mutable x = 1 + (&x, 1) + + let test25 () = + test24 () + () + + let test26 () = + let x = test24 () + () + #endif module Tests = @@ -154,6 +249,29 @@ module Tests = static member TestMethod(dt: outref) = () + type PositiveInterface = + + abstract Test : byref * byref -> byref + + // This looks like it should fail, but its sig is 'val test2 : x: byref -> y: byref -> unit' + // unless a signature tells it otherwise, e.g. 'val test2 : (byref -> byref) -> unit' + let test2 (x: byref) = + fun (y: byref) -> () + + type StaticTest private () = + + static member Test (x: byref, y: int) = () + + static member Test2 (x: inref, y: int) = () + + // This passes because tup becomes 'int ref * int', which is valid and produces valid code. + // We include this to test current behavior with inference and byrefs. + static member PositiveTest(tup) = + StaticTest.Test(tup) + + let test3 () = + StaticTest.Test2 // is passing, but probably shouldn't be + let aa = if !failures then (stdout.WriteLine "Test Failed"; exit 1) else (stdout.WriteLine "Test Passed"; diff --git a/tests/fsharp/core/span/test2.bsl b/tests/fsharp/core/span/test2.bsl index 0011c8ebc2e..2a8ede5932b 100644 --- a/tests/fsharp/core/span/test2.bsl +++ b/tests/fsharp/core/span/test2.bsl @@ -1,6 +1,10 @@ +test2.fsx(79,17,79,18): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. + test2.fsx(79,21,79,35): typecheck error FS0406: The byref-typed variable 'test' is used in an invalid way. Byrefs cannot be captured by closures or passed to inner functions. +test2.fsx(79,21,79,35): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. + test2.fsx(79,21,79,35): typecheck error FS0406: The byref-typed variable 'test' is used in an invalid way. Byrefs cannot be captured by closures or passed to inner functions. test2.fsx(79,31,79,35): typecheck error FS0418: The byref typed value 'test' cannot be used at this point @@ -55,6 +59,8 @@ test2.fsx(199,13,199,19): typecheck error FS3229: This value can't be assigned b test2.fsx(204,26,204,27): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. +test2.fsx(204,26,204,27): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. + test2.fsx(204,26,204,27): typecheck error FS0406: The byref-typed variable 'inputSequence' is used in an invalid way. Byrefs cannot be captured by closures or passed to inner functions. test2.fsx(204,26,204,27): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. @@ -65,6 +71,10 @@ test2.fsx(204,26,204,27): typecheck error FS0412: A type instantiation involves test2.fsx(204,26,204,27): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. +test2.fsx(204,26,204,27): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. + +test2.fsx(204,26,204,27): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. + test2.fsx(209,13,209,18): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. test2.fsx(208,14,208,18): typecheck error FS0437: A type would store a byref typed value. This is not permitted by Common IL. diff --git a/tests/fsharp/single-test.fs b/tests/fsharp/single-test.fs index 1b1fad560ef..89c7c44d838 100644 --- a/tests/fsharp/single-test.fs +++ b/tests/fsharp/single-test.fs @@ -212,11 +212,15 @@ let singleNegTest (cfg: TestConfig) testname = log "Negative typechecker testing: %s" testname - fscAppendErrExpectFail cfg (sprintf "%s.err" testname) """%s --vserrors --warnaserror --nologo --maxerrors:10000 -a -o:%s.dll""" cfg.fsc_flags testname sources + let warnaserror = + if cfg.fsc_flags.Contains("--warnaserror-") then String.Empty + else "--warnaserror" + + fscAppendErrExpectFail cfg (sprintf "%s.err" testname) """%s --vserrors %s --nologo --maxerrors:10000 -a -o:%s.dll""" cfg.fsc_flags warnaserror testname sources let diff = fsdiff cfg (sprintf "%s.err" testname) (sprintf "%s.bsl" testname) - fscAppendErrExpectFail cfg (sprintf "%s.vserr" testname) "%s --test:ContinueAfterParseFailure --vserrors --warnaserror --nologo --maxerrors:10000 -a -o:%s.dll" cfg.fsc_flags testname sources + fscAppendErrExpectFail cfg (sprintf "%s.vserr" testname) "%s --test:ContinueAfterParseFailure --vserrors %s --nologo --maxerrors:10000 -a -o:%s.dll" cfg.fsc_flags warnaserror testname sources let vbslDiff = fsdiff cfg (sprintf "%s.vserr" testname) VSBSLFILE diff --git a/tests/fsharp/tests.fs b/tests/fsharp/tests.fs index 98e37756568..175695102c2 100644 --- a/tests/fsharp/tests.fs +++ b/tests/fsharp/tests.fs @@ -194,7 +194,7 @@ module CoreTests = fsc cfg "%s -o:test2.exe -g" cfg.fsc_flags ["test2.fsx"] - singleNegTest cfg "test2" + singleNegTest { cfg with fsc_flags = sprintf "%s --warnaserror-" cfg.fsc_flags } "test2" exec cfg ("." ++ "test2.exe") "" diff --git a/tests/fsharp/typecheck/sigs/neg107.bsl b/tests/fsharp/typecheck/sigs/neg107.bsl index f511b6af3ca..718566256af 100644 --- a/tests/fsharp/typecheck/sigs/neg107.bsl +++ b/tests/fsharp/typecheck/sigs/neg107.bsl @@ -3,16 +3,28 @@ neg107.fsx(26,48,26,59): typecheck error FS0406: The byref-typed variable 'a' is neg107.fsx(27,69,27,80): typecheck error FS0406: The byref-typed variable 'a' is used in an invalid way. Byrefs cannot be captured by closures or passed to inner functions. +neg107.fsx(28,13,28,25): typecheck error FS3301: The function or method has an invalid return type '(unit -> Span)'. This is not permitted by the rules of Common IL. + +neg107.fsx(28,43,28,59): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. + neg107.fsx(28,43,28,59): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. +neg107.fsx(28,47,28,58): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. + neg107.fsx(28,47,28,58): typecheck error FS0406: The byref-typed variable 'a' is used in an invalid way. Byrefs cannot be captured by closures or passed to inner functions. neg107.fsx(28,57,28,58): typecheck error FS0418: The byref typed value 'a' cannot be used at this point neg107.fsx(28,47,28,58): typecheck error FS0425: The type of a first-class function cannot contain byrefs +neg107.fsx(29,13,29,25): typecheck error FS3301: The function or method has an invalid return type '(unit -> ReadOnlySpan)'. This is not permitted by the rules of Common IL. + +neg107.fsx(29,51,29,67): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. + neg107.fsx(29,51,29,67): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. +neg107.fsx(29,55,29,66): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. + neg107.fsx(29,55,29,66): typecheck error FS0406: The byref-typed variable 'a' is used in an invalid way. Byrefs cannot be captured by closures or passed to inner functions. neg107.fsx(29,65,29,66): typecheck error FS0418: The byref typed value 'a' cannot be used at this point @@ -27,10 +39,18 @@ neg107.fsx(32,70,32,75): typecheck error FS0406: The byref-typed variable 'a' is neg107.fsx(32,78,32,86): typecheck error FS0406: The byref-typed variable 'a' is used in an invalid way. Byrefs cannot be captured by closures or passed to inner functions. +neg107.fsx(33,13,33,30): typecheck error FS3301: The function or method has an invalid return type 'Async>'. This is not permitted by the rules of Common IL. + +neg107.fsx(33,48,33,53): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. + +neg107.fsx(33,48,33,53): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. + neg107.fsx(33,48,33,53): typecheck error FS0406: The byref-typed variable 'a' is used in an invalid way. Byrefs cannot be captured by closures or passed to inner functions. neg107.fsx(33,48,33,53): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. +neg107.fsx(33,56,33,64): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. + neg107.fsx(33,56,33,64): typecheck error FS0406: The byref-typed variable 'a' is used in an invalid way. Byrefs cannot be captured by closures or passed to inner functions. neg107.fsx(33,56,33,64): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. @@ -39,10 +59,18 @@ neg107.fsx(33,56,33,64): typecheck error FS0425: The type of a first-class funct neg107.fsx(33,48,33,53): typecheck error FS0425: The type of a first-class function cannot contain byrefs +neg107.fsx(34,13,34,30): typecheck error FS3301: The function or method has an invalid return type 'Async>'. This is not permitted by the rules of Common IL. + +neg107.fsx(34,56,34,61): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. + +neg107.fsx(34,56,34,61): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. + neg107.fsx(34,56,34,61): typecheck error FS0406: The byref-typed variable 'a' is used in an invalid way. Byrefs cannot be captured by closures or passed to inner functions. neg107.fsx(34,56,34,61): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. +neg107.fsx(34,64,34,72): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. + neg107.fsx(34,64,34,72): typecheck error FS0406: The byref-typed variable 'a' is used in an invalid way. Byrefs cannot be captured by closures or passed to inner functions. neg107.fsx(34,64,34,72): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. @@ -51,6 +79,10 @@ neg107.fsx(34,64,34,72): typecheck error FS0425: The type of a first-class funct neg107.fsx(34,56,34,61): typecheck error FS0425: The type of a first-class function cannot contain byrefs +neg107.fsx(37,33,37,34): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. + +neg107.fsx(37,33,37,34): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. + neg107.fsx(37,33,37,34): typecheck error FS0425: The type of a first-class function cannot contain byrefs neg107.fsx(37,33,37,34): typecheck error FS0425: The type of a first-class function cannot contain byrefs diff --git a/tests/fsharp/typecheck/sigs/neg107.vsbsl b/tests/fsharp/typecheck/sigs/neg107.vsbsl index f511b6af3ca..718566256af 100644 --- a/tests/fsharp/typecheck/sigs/neg107.vsbsl +++ b/tests/fsharp/typecheck/sigs/neg107.vsbsl @@ -3,16 +3,28 @@ neg107.fsx(26,48,26,59): typecheck error FS0406: The byref-typed variable 'a' is neg107.fsx(27,69,27,80): typecheck error FS0406: The byref-typed variable 'a' is used in an invalid way. Byrefs cannot be captured by closures or passed to inner functions. +neg107.fsx(28,13,28,25): typecheck error FS3301: The function or method has an invalid return type '(unit -> Span)'. This is not permitted by the rules of Common IL. + +neg107.fsx(28,43,28,59): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. + neg107.fsx(28,43,28,59): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. +neg107.fsx(28,47,28,58): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. + neg107.fsx(28,47,28,58): typecheck error FS0406: The byref-typed variable 'a' is used in an invalid way. Byrefs cannot be captured by closures or passed to inner functions. neg107.fsx(28,57,28,58): typecheck error FS0418: The byref typed value 'a' cannot be used at this point neg107.fsx(28,47,28,58): typecheck error FS0425: The type of a first-class function cannot contain byrefs +neg107.fsx(29,13,29,25): typecheck error FS3301: The function or method has an invalid return type '(unit -> ReadOnlySpan)'. This is not permitted by the rules of Common IL. + +neg107.fsx(29,51,29,67): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. + neg107.fsx(29,51,29,67): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. +neg107.fsx(29,55,29,66): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. + neg107.fsx(29,55,29,66): typecheck error FS0406: The byref-typed variable 'a' is used in an invalid way. Byrefs cannot be captured by closures or passed to inner functions. neg107.fsx(29,65,29,66): typecheck error FS0418: The byref typed value 'a' cannot be used at this point @@ -27,10 +39,18 @@ neg107.fsx(32,70,32,75): typecheck error FS0406: The byref-typed variable 'a' is neg107.fsx(32,78,32,86): typecheck error FS0406: The byref-typed variable 'a' is used in an invalid way. Byrefs cannot be captured by closures or passed to inner functions. +neg107.fsx(33,13,33,30): typecheck error FS3301: The function or method has an invalid return type 'Async>'. This is not permitted by the rules of Common IL. + +neg107.fsx(33,48,33,53): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. + +neg107.fsx(33,48,33,53): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. + neg107.fsx(33,48,33,53): typecheck error FS0406: The byref-typed variable 'a' is used in an invalid way. Byrefs cannot be captured by closures or passed to inner functions. neg107.fsx(33,48,33,53): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. +neg107.fsx(33,56,33,64): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. + neg107.fsx(33,56,33,64): typecheck error FS0406: The byref-typed variable 'a' is used in an invalid way. Byrefs cannot be captured by closures or passed to inner functions. neg107.fsx(33,56,33,64): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. @@ -39,10 +59,18 @@ neg107.fsx(33,56,33,64): typecheck error FS0425: The type of a first-class funct neg107.fsx(33,48,33,53): typecheck error FS0425: The type of a first-class function cannot contain byrefs +neg107.fsx(34,13,34,30): typecheck error FS3301: The function or method has an invalid return type 'Async>'. This is not permitted by the rules of Common IL. + +neg107.fsx(34,56,34,61): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. + +neg107.fsx(34,56,34,61): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. + neg107.fsx(34,56,34,61): typecheck error FS0406: The byref-typed variable 'a' is used in an invalid way. Byrefs cannot be captured by closures or passed to inner functions. neg107.fsx(34,56,34,61): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. +neg107.fsx(34,64,34,72): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. + neg107.fsx(34,64,34,72): typecheck error FS0406: The byref-typed variable 'a' is used in an invalid way. Byrefs cannot be captured by closures or passed to inner functions. neg107.fsx(34,64,34,72): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. @@ -51,6 +79,10 @@ neg107.fsx(34,64,34,72): typecheck error FS0425: The type of a first-class funct neg107.fsx(34,56,34,61): typecheck error FS0425: The type of a first-class function cannot contain byrefs +neg107.fsx(37,33,37,34): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. + +neg107.fsx(37,33,37,34): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. + neg107.fsx(37,33,37,34): typecheck error FS0425: The type of a first-class function cannot contain byrefs neg107.fsx(37,33,37,34): typecheck error FS0425: The type of a first-class function cannot contain byrefs diff --git a/tests/fsharp/typecheck/sigs/neg63.bsl b/tests/fsharp/typecheck/sigs/neg63.bsl index 8898a017253..194fbe88771 100644 --- a/tests/fsharp/typecheck/sigs/neg63.bsl +++ b/tests/fsharp/typecheck/sigs/neg63.bsl @@ -1,6 +1,8 @@ neg63.fs(6,8,6,14): typecheck error FS3155: A quotation may not involve an assignment to or taking the address of a captured local variable +neg63.fs(9,5,9,13): typecheck error FS3301: The function or method has an invalid return type 'Quotations.Expr>'. This is not permitted by the rules of Common IL. + neg63.fs(11,9,11,10): typecheck error FS0421: The address of the variable 'x' cannot be used at this point neg63.fs(11,9,11,10): typecheck error FS3155: A quotation may not involve an assignment to or taking the address of a captured local variable @@ -12,3 +14,7 @@ neg63.fs(14,8,14,9): typecheck error FS3155: A quotation may not involve an assi neg63.fs(18,6,18,7): typecheck error FS3209: The address of the variable 'x' or a related expression cannot be used at this point. This is to ensure the address of the local value does not escape its scope. neg63.fs(26,6,26,10): typecheck error FS3209: The address of the variable 'addr' or a related expression cannot be used at this point. This is to ensure the address of the local value does not escape its scope. + +neg63.fs(30,24,30,25): typecheck error FS3232: Struct members cannot return the address of fields of the struct by reference + +neg63.fs(30,24,30,25): typecheck error FS3232: Struct members cannot return the address of fields of the struct by reference diff --git a/tests/fsharp/typecheck/sigs/neg63.fs b/tests/fsharp/typecheck/sigs/neg63.fs index bf8b25cac8e..8f22c5468e1 100644 --- a/tests/fsharp/typecheck/sigs/neg63.fs +++ b/tests/fsharp/typecheck/sigs/neg63.fs @@ -1,7 +1,7 @@ module Test -let negTest1() = +let negTest1() = let mutable x = 0 <@ x <- 1 @> @@ -25,14 +25,6 @@ let negTest5() = let addr = &x &addr -type Struct(initial:int) = - let mutable x = initial +[] +type Struct(x:int) = member __.AddrX = &x - member __.IncrX() = x <- x + 1 - -let posTest6(iterator: byref) = - iterator.AddrX - -let negTest7() = - let mutable iterator = Struct(0) - iterator.AddrX diff --git a/tests/fsharp/typecheck/sigs/neg_byref_1.bsl b/tests/fsharp/typecheck/sigs/neg_byref_1.bsl index 3428aa81d88..ce415d11765 100644 --- a/tests/fsharp/typecheck/sigs/neg_byref_1.bsl +++ b/tests/fsharp/typecheck/sigs/neg_byref_1.bsl @@ -1,4 +1,6 @@ neg_byref_1.fs(2,5,2,8): typecheck error FS0431: A byref typed value would be stored here. Top-level let-bound byref values are not permitted. +neg_byref_1.fs(2,5,2,8): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. + neg_byref_1.fs(2,11,2,13): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. diff --git a/tests/fsharp/typecheck/sigs/neg_byref_16.bsl b/tests/fsharp/typecheck/sigs/neg_byref_16.bsl index 529156816da..d7964e54120 100644 --- a/tests/fsharp/typecheck/sigs/neg_byref_16.bsl +++ b/tests/fsharp/typecheck/sigs/neg_byref_16.bsl @@ -1,4 +1,8 @@ +neg_byref_16.fs(3,5,3,6): typecheck error FS3301: The function or method has an invalid return type '('a -> bool -> byref * 'a)'. This is not permitted by the rules of Common IL. + +neg_byref_16.fs(3,33,3,42): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. + neg_byref_16.fs(3,33,3,42): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. neg_byref_16.fs(3,40,3,41): typecheck error FS0421: The address of the variable 'a' cannot be used at this point diff --git a/tests/fsharp/typecheck/sigs/neg_byref_2.bsl b/tests/fsharp/typecheck/sigs/neg_byref_2.bsl index ce1fb78ab1b..a53bcefc4f3 100644 --- a/tests/fsharp/typecheck/sigs/neg_byref_2.bsl +++ b/tests/fsharp/typecheck/sigs/neg_byref_2.bsl @@ -1,4 +1,6 @@ neg_byref_2.fs(2,5,2,8): typecheck error FS0431: A byref typed value would be stored here. Top-level let-bound byref values are not permitted. +neg_byref_2.fs(2,5,2,8): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. + neg_byref_2.fs(2,11,2,15): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. diff --git a/tests/fsharp/typecheck/sigs/neg_byref_20.bsl b/tests/fsharp/typecheck/sigs/neg_byref_20.bsl index eecb7fcc8f5..408b36c3df4 100644 --- a/tests/fsharp/typecheck/sigs/neg_byref_20.bsl +++ b/tests/fsharp/typecheck/sigs/neg_byref_20.bsl @@ -1,2 +1,4 @@ neg_byref_20.fs(2,2,2,21): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. + +neg_byref_20.fs(2,2,2,21): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. diff --git a/tests/fsharp/typecheck/sigs/neg_byref_23.bsl b/tests/fsharp/typecheck/sigs/neg_byref_23.bsl index ca76f5bcc5e..a21c9e02d5e 100644 --- a/tests/fsharp/typecheck/sigs/neg_byref_23.bsl +++ b/tests/fsharp/typecheck/sigs/neg_byref_23.bsl @@ -1,2 +1,6 @@ neg_byref_23.fs(4,5,4,6): typecheck error FS0431: A byref typed value would be stored here. Top-level let-bound byref values are not permitted. + +neg_byref_23.fs(4,5,4,6): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. + +neg_byref_23.fs(4,9,4,10): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. diff --git a/tests/fsharp/typecheck/sigs/neg_byref_3.bsl b/tests/fsharp/typecheck/sigs/neg_byref_3.bsl index fb8ccdd71f9..48fb07c7f7e 100644 --- a/tests/fsharp/typecheck/sigs/neg_byref_3.bsl +++ b/tests/fsharp/typecheck/sigs/neg_byref_3.bsl @@ -1,6 +1,14 @@ neg_byref_3.fs(2,5,2,8): typecheck error FS0431: A byref typed value would be stored here. Top-level let-bound byref values are not permitted. +neg_byref_3.fs(2,5,2,8): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. + +neg_byref_3.fs(2,11,2,22): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. + neg_byref_3.fs(2,11,2,22): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. +neg_byref_3.fs(3,5,3,6): typecheck error FS3301: The function or method has an invalid return type '(byref list -> int)'. This is not permitted by the rules of Common IL. + +neg_byref_3.fs(3,11,3,22): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. + neg_byref_3.fs(3,11,3,22): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. diff --git a/tests/fsharp/typecheck/sigs/neg_byref_5.bsl b/tests/fsharp/typecheck/sigs/neg_byref_5.bsl index d60bde983ab..9364c2b9b44 100644 --- a/tests/fsharp/typecheck/sigs/neg_byref_5.bsl +++ b/tests/fsharp/typecheck/sigs/neg_byref_5.bsl @@ -1,4 +1,6 @@ neg_byref_5.fs(2,5,2,9): typecheck error FS0431: A byref typed value would be stored here. Top-level let-bound byref values are not permitted. +neg_byref_5.fs(2,5,2,9): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. + neg_byref_5.fs(2,12,2,16): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. diff --git a/tests/fsharp/typecheck/sigs/neg_byref_6.bsl b/tests/fsharp/typecheck/sigs/neg_byref_6.bsl index 18c5efe534e..465bfaa5657 100644 --- a/tests/fsharp/typecheck/sigs/neg_byref_6.bsl +++ b/tests/fsharp/typecheck/sigs/neg_byref_6.bsl @@ -1,4 +1,6 @@ neg_byref_6.fs(2,5,2,9): typecheck error FS0431: A byref typed value would be stored here. Top-level let-bound byref values are not permitted. +neg_byref_6.fs(2,5,2,9): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. + neg_byref_6.fs(2,12,2,17): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. diff --git a/tests/fsharp/typecheck/sigs/neg_byref_7.bsl b/tests/fsharp/typecheck/sigs/neg_byref_7.bsl index 11f25ecb6d4..cbe7789b3a1 100644 --- a/tests/fsharp/typecheck/sigs/neg_byref_7.bsl +++ b/tests/fsharp/typecheck/sigs/neg_byref_7.bsl @@ -1,4 +1,8 @@ +neg_byref_7.fs(2,31,2,35): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. + +neg_byref_7.fs(2,31,2,35): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. + neg_byref_7.fs(2,38,2,43): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. neg_byref_7.fs(2,38,2,43): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. diff --git a/tests/fsharp/typecheck/sigs/neg_byref_8.bsl b/tests/fsharp/typecheck/sigs/neg_byref_8.bsl index d0665ef6b9a..d39ae5771d1 100644 --- a/tests/fsharp/typecheck/sigs/neg_byref_8.bsl +++ b/tests/fsharp/typecheck/sigs/neg_byref_8.bsl @@ -1,4 +1,8 @@ +neg_byref_8.fs(2,31,2,35): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. + +neg_byref_8.fs(2,31,2,35): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. + neg_byref_8.fs(2,38,2,43): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. neg_byref_8.fs(2,38,2,43): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. From dbc718cb21dbd4b928200f2eebe706d3b33a84e6 Mon Sep 17 00:00:00 2001 From: "Kevin Ransom (msft)" Date: Thu, 6 Sep 2018 10:40:33 -0700 Subject: [PATCH 036/160] Cherrypick Fix CI build to 15.9 (#5588) * create the F# SDK package from all existing NuGet packages Also fix a bug where we were mis-packing the current FSharp.Core 4.5 as 4.4.3. * Merge --- build.cmd | 2 +- build/targets/PackageVersions.props | 2 +- fcs/FSharp.Compiler.Service.Tests/App.config | 4 ++ packages.config | 6 +++ setup/Swix/Microsoft.FSharp.SDK/Files.swr | 48 +++++++++--------- .../Microsoft.FSharp.SDK.swixproj | 1 - setup/packages.config | 2 + tests/service/data/FSharp.Data.DesignTime.dll | Bin 1452544 -> 2305024 bytes tests/service/data/FSharp.Data.dll | Bin 714240 -> 971264 bytes .../Tests.ProjectSystem.Configs.fs | 7 +++ .../UnitTests/VisualFSharp.UnitTests.fsproj | 29 +++++++++++ 11 files changed, 74 insertions(+), 27 deletions(-) diff --git a/build.cmd b/build.cmd index 941609ab144..68964e7c843 100644 --- a/build.cmd +++ b/build.cmd @@ -1,5 +1,5 @@ rem Copyright (c) Microsoft Corporation. All Rights Reserved. See License.txt in the project root for license information. -@if "%_echo%"=="" echo off +@if "%_echo%"=="" echo off setlocal enableDelayedExpansion diff --git a/build/targets/PackageVersions.props b/build/targets/PackageVersions.props index b3c6197206d..392bd91726b 100644 --- a/build/targets/PackageVersions.props +++ b/build/targets/PackageVersions.props @@ -17,7 +17,7 @@ $(RoslynPackageVersion) - 15.6.85 + 15.8.166 $(MicrosoftBuildOverallPackagesVersion) $(MicrosoftBuildOverallPackagesVersion) $(MicrosoftBuildOverallPackagesVersion) diff --git a/fcs/FSharp.Compiler.Service.Tests/App.config b/fcs/FSharp.Compiler.Service.Tests/App.config index a895438e297..fb0bc6286b1 100644 --- a/fcs/FSharp.Compiler.Service.Tests/App.config +++ b/fcs/FSharp.Compiler.Service.Tests/App.config @@ -3,6 +3,10 @@ + + + + diff --git a/packages.config b/packages.config index 42c7049c7e4..004f1db58e4 100644 --- a/packages.config +++ b/packages.config @@ -26,6 +26,12 @@ + + + + + + diff --git a/setup/Swix/Microsoft.FSharp.SDK/Files.swr b/setup/Swix/Microsoft.FSharp.SDK/Files.swr index 271db6961cd..228bc933437 100644 --- a/setup/Swix/Microsoft.FSharp.SDK/Files.swr +++ b/setup/Swix/Microsoft.FSharp.SDK/Files.swr @@ -17,10 +17,10 @@ folder "InstallDir:Common7\IDE\CommonExtensions\Microsoft\FSharpSdk" file source="$(PackagesFolder)\Microsoft.VisualFSharp.Core.Redist.1.0.0\content\.NETCore\3.7.4.0\FSharp.Core.sigdata" file source="$(PackagesFolder)\Microsoft.VisualFSharp.Core.Redist.1.0.0\content\.NETCore\3.7.4.0\FSharp.Core.xml" folder "3.7.41.0" - file source="$(BinariesFolder)\profiles\portable-net45+netcore45\FSharp.Core.dll" - file source="$(BinariesFolder)\profiles\portable-net45+netcore45\FSharp.Core.optdata" - file source="$(BinariesFolder)\profiles\portable-net45+netcore45\FSharp.Core.sigdata" - file source="$(BinariesFolder)\profiles\portable-net45+netcore45\FSharp.Core.xml" + file source="$(PackagesFolder)\Microsoft.Portable.FSharp.Core.10.1.0\lib\profiles\portable-net45+netcore45\FSharp.Core.dll" + file source="$(PackagesFolder)\Microsoft.Portable.FSharp.Core.10.1.0\lib\profiles\portable-net45+netcore45\FSharp.Core.optdata" + file source="$(PackagesFolder)\Microsoft.Portable.FSharp.Core.10.1.0\lib\profiles\portable-net45+netcore45\FSharp.Core.sigdata" + file source="$(PackagesFolder)\Microsoft.Portable.FSharp.Core.10.1.0\lib\profiles\portable-net45+netcore45\FSharp.Core.xml" folder "3.78.3.1" file source="$(PackagesFolder)\Microsoft.VisualFSharp.Core.Redist.1.0.0\content\.NETCore\3.78.3.1\FSharp.Core.dll" file source="$(PackagesFolder)\Microsoft.VisualFSharp.Core.Redist.1.0.0\content\.NETCore\3.78.3.1\FSharp.Core.optdata" @@ -32,10 +32,10 @@ folder "InstallDir:Common7\IDE\CommonExtensions\Microsoft\FSharpSdk" file source="$(PackagesFolder)\Microsoft.VisualFSharp.Core.Redist.1.0.0\content\.NETCore\3.78.4.0\FSharp.Core.sigdata" file source="$(PackagesFolder)\Microsoft.VisualFSharp.Core.Redist.1.0.0\content\.NETCore\3.78.4.0\FSharp.Core.xml" folder "3.78.41.0" - file source="$(BinariesFolder)\profiles\portable-net45+netcore45+wp8\FSharp.Core.dll" - file source="$(BinariesFolder)\profiles\portable-net45+netcore45+wp8\FSharp.Core.optdata" - file source="$(BinariesFolder)\profiles\portable-net45+netcore45+wp8\FSharp.Core.sigdata" - file source="$(BinariesFolder)\profiles\portable-net45+netcore45+wp8\FSharp.Core.xml" + file source="$(PackagesFolder)\Microsoft.Portable.FSharp.Core.10.1.0\lib\profiles\portable-net45+netcore45+wp8\FSharp.Core.dll" + file source="$(PackagesFolder)\Microsoft.Portable.FSharp.Core.10.1.0\lib\profiles\portable-net45+netcore45+wp8\FSharp.Core.optdata" + file source="$(PackagesFolder)\Microsoft.Portable.FSharp.Core.10.1.0\lib\profiles\portable-net45+netcore45+wp8\FSharp.Core.sigdata" + file source="$(PackagesFolder)\Microsoft.Portable.FSharp.Core.10.1.0\lib\profiles\portable-net45+netcore45+wp8\FSharp.Core.xml" folder "3.259.3.1" file source="$(PackagesFolder)\Microsoft.VisualFSharp.Core.Redist.1.0.0\content\.NETCore\3.259.3.1\FSharp.Core.dll" file source="$(PackagesFolder)\Microsoft.VisualFSharp.Core.Redist.1.0.0\content\.NETCore\3.259.3.1\FSharp.Core.optdata" @@ -47,10 +47,10 @@ folder "InstallDir:Common7\IDE\CommonExtensions\Microsoft\FSharpSdk" file source="$(PackagesFolder)\Microsoft.VisualFSharp.Core.Redist.1.0.0\content\.NETCore\3.259.4.0\FSharp.Core.sigdata" file source="$(PackagesFolder)\Microsoft.VisualFSharp.Core.Redist.1.0.0\content\.NETCore\3.259.4.0\FSharp.Core.xml" folder "3.259.41.0" - file source="$(BinariesFolder)\profiles\portable-net45+netcore45+wpa81+wp8\FSharp.Core.dll" - file source="$(BinariesFolder)\profiles\portable-net45+netcore45+wpa81+wp8\FSharp.Core.optdata" - file source="$(BinariesFolder)\profiles\portable-net45+netcore45+wpa81+wp8\FSharp.Core.sigdata" - file source="$(BinariesFolder)\profiles\portable-net45+netcore45+wpa81+wp8\FSharp.Core.xml" + file source="$(PackagesFolder)\Microsoft.Portable.FSharp.Core.10.1.0\lib\profiles\portable-net45+netcore45+wpa81+wp8\FSharp.Core.dll" + file source="$(PackagesFolder)\Microsoft.Portable.FSharp.Core.10.1.0\lib\profiles\portable-net45+netcore45+wpa81+wp8\FSharp.Core.optdata" + file source="$(PackagesFolder)\Microsoft.Portable.FSharp.Core.10.1.0\lib\profiles\portable-net45+netcore45+wpa81+wp8\FSharp.Core.sigdata" + file source="$(PackagesFolder)\Microsoft.Portable.FSharp.Core.10.1.0\lib\profiles\portable-net45+netcore45+wpa81+wp8\FSharp.Core.xml" folder ".NETFramework\v4.0" folder "4.3.0.0" @@ -69,15 +69,15 @@ folder "InstallDir:Common7\IDE\CommonExtensions\Microsoft\FSharpSdk" file source="$(PackagesFolder)\Microsoft.VisualFSharp.Core.Redist.1.0.0\content\.NETFramework\v4.0\4.4.0.0\FSharp.Core.sigdata" file source="$(PackagesFolder)\Microsoft.VisualFSharp.Core.Redist.1.0.0\content\.NETFramework\v4.0\4.4.0.0\FSharp.Core.xml" folder "4.4.1.0" - file source="$(BinariesFolder)\versions\4.4.1.0\FSharp.Core.dll" - file source="$(BinariesFolder)\versions\4.4.1.0\FSharp.Core.optdata" - file source="$(BinariesFolder)\versions\4.4.1.0\FSharp.Core.sigdata" - file source="$(BinariesFolder)\versions\4.4.1.0\FSharp.Core.xml" + file source="$(PackagesFolder)\Microsoft.Portable.FSharp.Core.10.1.0\lib\versions\4.4.1.0\FSharp.Core.dll" + file source="$(PackagesFolder)\Microsoft.Portable.FSharp.Core.10.1.0\lib\versions\4.4.1.0\FSharp.Core.optdata" + file source="$(PackagesFolder)\Microsoft.Portable.FSharp.Core.10.1.0\lib\versions\4.4.1.0\FSharp.Core.sigdata" + file source="$(PackagesFolder)\Microsoft.Portable.FSharp.Core.10.1.0\lib\versions\4.4.1.0\FSharp.Core.xml" folder "4.4.3.0" - file source="$(BinariesFolder)\net40\bin\FSharp.Core.dll" - file source="$(BinariesFolder)\net40\bin\FSharp.Core.optdata" - file source="$(BinariesFolder)\net40\bin\FSharp.Core.sigdata" - file source="$(BinariesFolder)\net40\bin\FSharp.Core.xml" + file source="$(PackagesFolder)\FSharp.Core.4.3.4\lib\net45\FSharp.Core.dll" + file source="$(PackagesFolder)\FSharp.Core.4.3.4\lib\net45\FSharp.Core.optdata" + file source="$(PackagesFolder)\FSharp.Core.4.3.4\lib\net45\FSharp.Core.sigdata" + file source="$(PackagesFolder)\FSharp.Core.4.3.4\lib\net45\FSharp.Core.xml" folder ".NETPortable" folder "2.3.5.0" @@ -96,7 +96,7 @@ folder "InstallDir:Common7\IDE\CommonExtensions\Microsoft\FSharpSdk" file source="$(PackagesFolder)\Microsoft.VisualFSharp.Core.Redist.1.0.0\content\.NETPortable\3.47.4.0\FSharp.Core.sigdata" file source="$(PackagesFolder)\Microsoft.VisualFSharp.Core.Redist.1.0.0\content\.NETPortable\3.47.4.0\FSharp.Core.xml" folder "3.47.41.0" - file source="$(BinariesFolder)\profiles\portable-net45+sl5+netcore45\FSharp.Core.dll" - file source="$(BinariesFolder)\profiles\portable-net45+sl5+netcore45\FSharp.Core.optdata" - file source="$(BinariesFolder)\profiles\portable-net45+sl5+netcore45\FSharp.Core.sigdata" - file source="$(BinariesFolder)\profiles\portable-net45+sl5+netcore45\FSharp.Core.xml" + file source="$(PackagesFolder)\Microsoft.Portable.FSharp.Core.10.1.0\lib\profiles\portable-net45+sl5+netcore45\FSharp.Core.dll" + file source="$(PackagesFolder)\Microsoft.Portable.FSharp.Core.10.1.0\lib\profiles\portable-net45+sl5+netcore45\FSharp.Core.optdata" + file source="$(PackagesFolder)\Microsoft.Portable.FSharp.Core.10.1.0\lib\profiles\portable-net45+sl5+netcore45\FSharp.Core.sigdata" + file source="$(PackagesFolder)\Microsoft.Portable.FSharp.Core.10.1.0\lib\profiles\portable-net45+sl5+netcore45\FSharp.Core.xml" diff --git a/setup/Swix/Microsoft.FSharp.SDK/Microsoft.FSharp.SDK.swixproj b/setup/Swix/Microsoft.FSharp.SDK/Microsoft.FSharp.SDK.swixproj index bde4a368d4f..9256eadc32f 100644 --- a/setup/Swix/Microsoft.FSharp.SDK/Microsoft.FSharp.SDK.swixproj +++ b/setup/Swix/Microsoft.FSharp.SDK/Microsoft.FSharp.SDK.swixproj @@ -18,7 +18,6 @@ - $(PackagePreprocessorDefinitions);BinariesFolder=$(BinariesFolder) $(PackagePreprocessorDefinitions);PackagesFolder=$(PackagesFolder) $(PackagePreprocessorDefinitions);FSharpPackageVersion=$(FSharpPackageVersion) diff --git a/setup/packages.config b/setup/packages.config index 930e870e4bf..938236f7d99 100644 --- a/setup/packages.config +++ b/setup/packages.config @@ -11,4 +11,6 @@ + + diff --git a/tests/service/data/FSharp.Data.DesignTime.dll b/tests/service/data/FSharp.Data.DesignTime.dll index fca7289ce562acdd1a3c88b34cd6f31d21fc376e..db2a3317bbc7c85fc26c767fe3390f33ab738eb2 100644 GIT binary patch literal 2305024 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

CAw+gU#zaUekUJrH(D6 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

kE3gw0bXM3-N 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%0Dx7$gUDt8h7>JB7;uEg27CNJ|P0RekZ|cdF`1 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 z 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�BeuH7Y)#lKJ8|p%R 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%0DDdE2Hz0>wkmb4?@Td3pr&FF1_J9ktkgmoR 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 b9;E{RyFTBp<}Ft*%>CcR_W$QrB=CO#d3Z8u literal 714240 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

Z&KF)G?rgRW(_P<1^n&~)D5k#m|u{;(WsEVb2j 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%0AU6PlO@nP7693u&Ykn-m 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 diff --git a/vsintegration/tests/UnitTests/LegacyProjectSystem/Tests.ProjectSystem.Configs.fs b/vsintegration/tests/UnitTests/LegacyProjectSystem/Tests.ProjectSystem.Configs.fs index 806140621f6..ff06f80bac6 100644 --- a/vsintegration/tests/UnitTests/LegacyProjectSystem/Tests.ProjectSystem.Configs.fs +++ b/vsintegration/tests/UnitTests/LegacyProjectSystem/Tests.ProjectSystem.Configs.fs @@ -13,6 +13,7 @@ open NUnit.Framework // VS namespaces open Microsoft.VisualStudio open Microsoft.VisualStudio.Shell.Interop +open Microsoft.VisualStudio.FSharp open Microsoft.VisualStudio.FSharp.ProjectSystem // Internal unittest namespaces @@ -22,6 +23,12 @@ open UnitTests.TestLib.Utils.FilesystemHelpers open UnitTests.TestLib.ProjectSystem +[] +type public AssemblyResolverTestFixture () = + + [] + member public __.Init () = AssemblyResolver.addResolver () + [][] type Config() = inherit TheTests() diff --git a/vsintegration/tests/UnitTests/VisualFSharp.UnitTests.fsproj b/vsintegration/tests/UnitTests/VisualFSharp.UnitTests.fsproj index bf4cd4ed026..f34e1d2ed5b 100644 --- a/vsintegration/tests/UnitTests/VisualFSharp.UnitTests.fsproj +++ b/vsintegration/tests/UnitTests/VisualFSharp.UnitTests.fsproj @@ -208,6 +208,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From 07c50ae4320a5ee1a805e85df275fd22f0c286c5 Mon Sep 17 00:00:00 2001 From: "Kevin Ransom (msft)" Date: Wed, 5 Sep 2018 20:47:07 -0700 Subject: [PATCH 037/160] Fixes #5504 - 15.8 Internal MSBuild Error (#5557) --- .../src/FSharp.ProjectSystem.Base/Project/ProjectNode.cs | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/vsintegration/src/FSharp.ProjectSystem.Base/Project/ProjectNode.cs b/vsintegration/src/FSharp.ProjectSystem.Base/Project/ProjectNode.cs index c69c4a12295..47aa6d184ec 100644 --- a/vsintegration/src/FSharp.ProjectSystem.Base/Project/ProjectNode.cs +++ b/vsintegration/src/FSharp.ProjectSystem.Base/Project/ProjectNode.cs @@ -3235,12 +3235,9 @@ internal virtual BuildSubmission DoMSBuildSubmission(BuildKind buildKind, string this.SetHostObject("CoreCompile", "Fsc", this); // Do the actual Build - var loggerList = new System.Collections.Generic.List(this.buildEngine.Loggers); - if (buildLogger != null) - loggerList.Add(buildLogger); - if (myDebugLogger != null) - loggerList.Add(myDebugLogger); - + var loggerList = new System.Collections.Generic.List(); + if (buildLogger != null) loggerList.Add(buildLogger); + if (myDebugLogger != null) loggerList.Add(myDebugLogger); loggers = loggerList.ToArray(); var ba = new BuildAccessorAccess(buildKind, accessor); From 78654a12e1e0cad9acd9557d24049f14b33bd927 Mon Sep 17 00:00:00 2001 From: "Brett V. Forsgren" Date: Fri, 10 Aug 2018 17:25:20 -0700 Subject: [PATCH 038/160] remove unnecessary build step --- .vsts-signed.yaml | 7 ------- 1 file changed, 7 deletions(-) diff --git a/.vsts-signed.yaml b/.vsts-signed.yaml index 6d5193b38c0..83973b32d27 100644 --- a/.vsts-signed.yaml +++ b/.vsts-signed.yaml @@ -44,13 +44,6 @@ steps: msbuildArguments: '/t:Build /p:ExpectedFeedUrl=$(PB_PublishBlobFeedUrl) /p:AccountKey=$(PB_PublishBlobFeedKey) /p:ManifestBranch=$(SourceBranch) /p:ManifestCommit=$(SourceVersion) /p:ManifestBuildId=$(OfficialBuildId)' condition: and(succeeded(), contains(variables['PB_PublishType'], 'blob')) -# Run BinSkim -- task: securedevelopmentteam.vss-secure-development-tools.build-task-binskim.BinSkim@3 - displayName: Run BinSkim - inputs: - arguments: 'analyze "$(MSBuildConfiguration)\*.dll" "$(MSBuildConfiguration)\*.exe" --recurse --output "$(MSBuildConfiguration)\artifacts"' - continueOnError: true - # Create static drop - task: PublishBuildArtifacts@1 displayName: Create static drop From 5af881064ac6ba4e161325b4ea547ccd0afd993d Mon Sep 17 00:00:00 2001 From: Will Smith Date: Tue, 11 Sep 2018 14:33:08 -0700 Subject: [PATCH 039/160] Fixed hard crash in VS when specific F# code is used. (#5617) * Fixed hard crash in VS by simply not re-raising exceptions when parsing in our service layer * Using instance instead of static errorlogger --- src/fsharp/service/service.fs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/fsharp/service/service.fs b/src/fsharp/service/service.fs index a69926301d4..c26bd15e371 100644 --- a/src/fsharp/service/service.fs +++ b/src/fsharp/service/service.fs @@ -1598,7 +1598,7 @@ module internal Parser = let isExe = options.IsExe try Some (ParseInput(lexfun, errHandler.ErrorLogger, lexbuf, None, fileName, (isLastCompiland, isExe))) with e -> - errHandler.ErrorLogger.ErrorR(e) + errHandler.ErrorLogger.StopProcessingRecovery e Range.range0 // don't re-raise any exceptions, we must return None. None) errHandler.CollectedDiagnostics, parseResult, errHandler.AnyErrors From da58319dbdf430bb1024afffbfb6a7a361eda585 Mon Sep 17 00:00:00 2001 From: "Brett V. Forsgren" Date: Tue, 11 Sep 2018 15:34:29 -0700 Subject: [PATCH 040/160] update nightly package publish options --- .vsts-signed.yaml | 2 +- setup/publish-assets.ps1 | 5 +---- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/.vsts-signed.yaml b/.vsts-signed.yaml index 83973b32d27..df4e8a6bd5f 100644 --- a/.vsts-signed.yaml +++ b/.vsts-signed.yaml @@ -34,7 +34,7 @@ steps: inputs: scriptName: 'setup\publish-assets.ps1' arguments: '-binariesPath $(MSBuildConfiguration) -branchName $(Build.SourceBranch) -apiKey $(FSharp.MyGetApiKey)' - condition: and(succeeded(), contains(variables['PB_PublishType'], 'myget'), in(variables['Build.SourceBranchName'], 'master', 'dev15.7', 'dev15.8')) + condition: and(succeeded(), contains(variables['PB_PublishType'], 'myget')) # Publish packages to Azure Blob Storage - task: MSBuild@1 diff --git a/setup/publish-assets.ps1 b/setup/publish-assets.ps1 index 4232cef6e49..29604698b4c 100644 --- a/setup/publish-assets.ps1 +++ b/setup/publish-assets.ps1 @@ -30,12 +30,9 @@ try { "master" { $requestUrl = "https://dotnet.myget.org/F/fsharp/vsix/upload" } - "dev15.7" { + "dev15.9" { $requestUrl = "https://dotnet.myget.org/F/fsharp-preview/vsix/upload" } - "dev15.8" { - $requestUrl = "https://dotnet.myget.org/F/fsharp-dev15-8-preview/vsix/upload" - } default { Write-Host "Branch [$branchName] is not supported for publishing." exit 0 # non-fatal From e956ec546aeaa37f0f99265f242747a7a8fad532 Mon Sep 17 00:00:00 2001 From: "Brett V. Forsgren" Date: Mon, 10 Sep 2018 15:23:28 -0700 Subject: [PATCH 041/160] temporarily disable CI part `Linux release_fcs` --- .vsts-pr.yaml | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/.vsts-pr.yaml b/.vsts-pr.yaml index 67f78e6df0e..0d7262e418a 100644 --- a/.vsts-pr.yaml +++ b/.vsts-pr.yaml @@ -8,9 +8,10 @@ phases: release_default: _command: ./mono/cibuild.sh _args: release - release_fcs: - _command: ./fcs/build.sh - _args: Build + # disabled until it can be properly fixed + #release_fcs: + # _command: ./fcs/build.sh + # _args: Build steps: - script: $(_command) $(_args) - task: PublishBuildArtifacts@1 From 65bcdfdec8f2cf3815377aea26a514a87e9a02ae Mon Sep 17 00:00:00 2001 From: Jason Imison Date: Sat, 28 Jul 2018 02:01:18 +0100 Subject: [PATCH 042/160] Treat pinvokes like abstract methods for debugging (#5404) We need a row to be recorded in the MethodDebugInformation table. Fixes #4637 --- src/absil/ilwrite.fs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/absil/ilwrite.fs b/src/absil/ilwrite.fs index 37b85145a84..d28348bf860 100644 --- a/src/absil/ilwrite.fs +++ b/src/absil/ilwrite.fs @@ -2526,7 +2526,8 @@ let GenMethodDefAsRow cenv env midx (md: ILMethodDef) = SequencePoints=seqpoints } cenv.AddCode code addr - | MethodBody.Abstract -> + | MethodBody.Abstract + | MethodBody.PInvoke _ -> // Now record the PDB record for this method - we write this out later. if cenv.generatePdb then cenv.pdbinfo.Add From 3adfc9dc3fd3230b12ec396d5c6d9f094540c9b5 Mon Sep 17 00:00:00 2001 From: Don Syme Date: Wed, 12 Sep 2018 19:15:58 +0100 Subject: [PATCH 043/160] void fix for TPSDK (#5621) --- src/fsharp/ExtensionTyping.fs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/fsharp/ExtensionTyping.fs b/src/fsharp/ExtensionTyping.fs index 2f3eb3aafb2..0d86ca58a05 100755 --- a/src/fsharp/ExtensionTyping.fs +++ b/src/fsharp/ExtensionTyping.fs @@ -428,7 +428,7 @@ module internal ExtensionTyping = member __.GetGenericArguments() = x.GetGenericArguments() |> ProvidedType.CreateArray ctxt member __.ApplyStaticArguments(provider: ITypeProvider, fullTypePathAfterArguments, staticArgs: obj[]) = provider.ApplyStaticArguments(x, fullTypePathAfterArguments, staticArgs) |> ProvidedType.Create ctxt - member __.IsVoid = (typeof.Equals(x)) + member __.IsVoid = (typeof.Equals(x) || (x.Namespace = "System" && x.Name = "Void")) member __.IsGenericParameter = x.IsGenericParameter member __.IsValueType = x.IsValueType member __.IsByRef = x.IsByRef From f3181b490eed5fbe92104c702c3d6a3e75c791a0 Mon Sep 17 00:00:00 2001 From: "Kevin Ransom (msft)" Date: Tue, 18 Sep 2018 11:30:14 -0700 Subject: [PATCH 044/160] Rename output overrides file (#5663) --- setup/Swix/Microsoft.FSharp.Dependencies/Files.swr | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup/Swix/Microsoft.FSharp.Dependencies/Files.swr b/setup/Swix/Microsoft.FSharp.Dependencies/Files.swr index 69d151d0e5b..546c2deb050 100644 --- a/setup/Swix/Microsoft.FSharp.Dependencies/Files.swr +++ b/setup/Swix/Microsoft.FSharp.Dependencies/Files.swr @@ -7,7 +7,7 @@ folder "InstallDir:MSBuild\Microsoft\VisualStudio\v15.0\FSharp" file "Microsoft.FSharp.targets" source="$(BinariesFolder)\setup\resources\Microsoft.FSharp.Shim.targets" file "Microsoft.Portable.FSharp.targets" source="$(BinariesFolder)\setup\resources\Microsoft.Portable.FSharp.Shim.targets" file "Microsoft.FSharp.NetSdk.targets" source="$(BinariesFolder)\setup\resources\Microsoft.FSharp.NetSdk.Shim.targets" - file "Microsoft.FSharp.NetSdk.Overrides.targets" source="$(BinariesFolder)\setup\resources\Microsoft.FSharp.Overrides.NetSdk.Shim.targets" + file "Microsoft.FSharp.Overrides.NetSdk.targets" source="$(BinariesFolder)\setup\resources\Microsoft.FSharp.Overrides.NetSdk.Shim.targets" file "Microsoft.FSharp.NetSdk.props" source="$(BinariesFolder)\setup\resources\Microsoft.FSharp.NetSdk.Shim.props" folder "InstallDir:Common7\IDE\PublicAssemblies" From 331647ceb467f1f9523ff59e60324af045fd78a9 Mon Sep 17 00:00:00 2001 From: "Kevin Ransom (msft)" Date: Fri, 14 Sep 2018 19:46:26 -0700 Subject: [PATCH 045/160] Fix codegen for StructValueTuple when aliased (#5645) * Fix codegen for StructValueTuple when aliased * Simplify * Add regression test for codegen --- src/fsharp/TastOps.fs | 3 +- .../Tuples/ValueTupleAliasConstructor.fs | 3 + .../Tuples/ValueTupleAliasConstructor.il.bsl | 88 +++++++++++++++++++ .../Source/CodeGen/EmittedIL/Tuples/env.lst | 5 +- 4 files changed, 96 insertions(+), 3 deletions(-) create mode 100644 tests/fsharpqa/Source/CodeGen/EmittedIL/Tuples/ValueTupleAliasConstructor.fs create mode 100644 tests/fsharpqa/Source/CodeGen/EmittedIL/Tuples/ValueTupleAliasConstructor.il.bsl diff --git a/src/fsharp/TastOps.fs b/src/fsharp/TastOps.fs index 942b949f57c..9d791c5dcbf 100644 --- a/src/fsharp/TastOps.fs +++ b/src/fsharp/TastOps.fs @@ -805,6 +805,7 @@ let argsOfAppTy g ty = ty |> stripTyEqns g |> (function TType_app(_, tinst) -> let tryDestTyparTy g ty = ty |> stripTyEqns g |> (function TType_var v -> Some v | _ -> None) let tryDestFunTy g ty = ty |> stripTyEqns g |> (function TType_fun (tyv, tau) -> Some(tyv, tau) | _ -> None) let tryDestAppTy g ty = ty |> stripTyEqns g |> (function TType_app(tcref, _) -> Some tcref | _ -> None) + let tryAnyParTy g ty = ty |> stripTyEqns g |> (function TType_var v -> Some v | TType_measure unt when isUnitParMeasure g unt -> Some(destUnitParMeasure g unt) | _ -> None) let (|AppTy|_|) g ty = ty |> stripTyEqns g |> (function TType_app(tcref, tinst) -> Some (tcref, tinst) | _ -> None) let (|RefTupleTy|_|) g ty = ty |> stripTyEqns g |> (function TType_tuple(tupInfo, tys) when not (evalTupInfoIsStruct tupInfo) -> Some tys | _ -> None) @@ -1729,7 +1730,7 @@ let isStructTy g ty = | Some tcref -> let tycon = tcref.Deref tycon.IsStructRecordOrUnionTycon || tycon.IsStructOrEnumTycon - | _ -> false + | _ -> isStructTupleTy g ty let isRefTy g ty = not (isStructOrEnumTyconTy g ty) && diff --git a/tests/fsharpqa/Source/CodeGen/EmittedIL/Tuples/ValueTupleAliasConstructor.fs b/tests/fsharpqa/Source/CodeGen/EmittedIL/Tuples/ValueTupleAliasConstructor.fs new file mode 100644 index 00000000000..a35f1cfef59 --- /dev/null +++ b/tests/fsharpqa/Source/CodeGen/EmittedIL/Tuples/ValueTupleAliasConstructor.fs @@ -0,0 +1,3 @@ +open System +type Node = (struct (int* int)) +let _ = new Node(2,2) diff --git a/tests/fsharpqa/Source/CodeGen/EmittedIL/Tuples/ValueTupleAliasConstructor.il.bsl b/tests/fsharpqa/Source/CodeGen/EmittedIL/Tuples/ValueTupleAliasConstructor.il.bsl new file mode 100644 index 00000000000..768deb722a1 --- /dev/null +++ b/tests/fsharpqa/Source/CodeGen/EmittedIL/Tuples/ValueTupleAliasConstructor.il.bsl @@ -0,0 +1,88 @@ + +// Microsoft (R) .NET Framework IL Disassembler. Version 4.6.1055.0 +// Copyright (c) Microsoft Corporation. All rights reserved. + + + +// Metadata version: v4.0.30319 +.assembly extern mscorlib +{ + .publickeytoken = (B7 7A 5C 56 19 34 E0 89 ) // .z\V.4.. + .ver 4:0:0:0 +} +.assembly extern FSharp.Core +{ + .publickeytoken = (B0 3F 5F 7F 11 D5 0A 3A ) // .?_....: + .ver 4:5:0:0 +} +.assembly extern System.ValueTuple +{ + .publickeytoken = (CC 7B 13 FF CD 2D DD 51 ) // .{...-.Q + .ver 4:0:1:0 +} +.assembly ValueTupleAliasConstructor +{ + .custom instance void [FSharp.Core]Microsoft.FSharp.Core.FSharpInterfaceDataVersionAttribute::.ctor(int32, + int32, + int32) = ( 01 00 02 00 00 00 00 00 00 00 00 00 00 00 00 00 ) + + // --- The following custom attribute is added automatically, do not uncomment ------- + // .custom instance void [mscorlib]System.Diagnostics.DebuggableAttribute::.ctor(valuetype [mscorlib]System.Diagnostics.DebuggableAttribute/DebuggingModes) = ( 01 00 01 00 00 00 00 00 ) + + .hash algorithm 0x00008004 + .ver 0:0:0:0 +} +.mresource public FSharpSignatureData.ValueTupleAliasConstructor +{ + // Offset: 0x00000000 Length: 0x000001EA +} +.mresource public FSharpOptimizationData.ValueTupleAliasConstructor +{ + // Offset: 0x000001F0 Length: 0x00000061 +} +.module ValueTupleAliasConstructor.exe +// MVID: {5B9C53DD-A8CF-BB34-A745-0383DD539C5B} +.imagebase 0x00400000 +.file alignment 0x00000200 +.stackreserve 0x00100000 +.subsystem 0x0003 // WINDOWS_CUI +.corflags 0x00000001 // ILONLY +// Image base: 0x01B00000 + + +// =============== CLASS MEMBERS DECLARATION =================== + +.class public abstract auto ansi sealed ValueTupleAliasConstructor + extends [mscorlib]System.Object +{ + .custom instance void [FSharp.Core]Microsoft.FSharp.Core.CompilationMappingAttribute::.ctor(valuetype [FSharp.Core]Microsoft.FSharp.Core.SourceConstructFlags) = ( 01 00 07 00 00 00 00 00 ) +} // end of class ValueTupleAliasConstructor + +.class private abstract auto ansi sealed ''.$ValueTupleAliasConstructor + extends [mscorlib]System.Object +{ + .field static assembly int32 init@ + .custom instance void [mscorlib]System.Diagnostics.DebuggerBrowsableAttribute::.ctor(valuetype [mscorlib]System.Diagnostics.DebuggerBrowsableState) = ( 01 00 00 00 00 00 00 00 ) + .custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 ) + .custom instance void [mscorlib]System.Diagnostics.DebuggerNonUserCodeAttribute::.ctor() = ( 01 00 00 00 ) + .method public static void main@() cil managed + { + .entrypoint + // Code size 9 (0x9) + .maxstack 8 + .language '{AB4F38C9-B6E6-43BA-BE3B-58080B2CCCE3}', '{994B45C4-E6E9-11D2-903F-00C04FA302A1}', '{5A869D0B-6611-11D3-BD2A-0000F80849BD}' + .line 3,3 : 9,22 'c:\\kevinransom\\visualfsharp\\tests\\fsharpqa\\Source\\CodeGen\\EmittedIL\\Tuples\\ValueTupleAliasConstructor.fs' + IL_0000: ldc.i4.2 + IL_0001: ldc.i4.2 + IL_0002: newobj instance void valuetype [System.ValueTuple]System.ValueTuple`2::.ctor(!0, + !1) + IL_0007: pop + IL_0008: ret + } // end of method $ValueTupleAliasConstructor::main@ + +} // end of class ''.$ValueTupleAliasConstructor + + +// ============================================================= + +// *********** DISASSEMBLY COMPLETE *********************** diff --git a/tests/fsharpqa/Source/CodeGen/EmittedIL/Tuples/env.lst b/tests/fsharpqa/Source/CodeGen/EmittedIL/Tuples/env.lst index 82897d13532..4b444e3886b 100644 --- a/tests/fsharpqa/Source/CodeGen/EmittedIL/Tuples/env.lst +++ b/tests/fsharpqa/Source/CodeGen/EmittedIL/Tuples/env.lst @@ -1,13 +1,14 @@ - SOURCE=Tuple01.fs SCFLAGS="-g --test:EmitFeeFeeAs100001 --optimize-" COMPILE_ONLY=1 POSTCMD="..\\CompareIL.cmd Tuple01.exe" # Tuple01.fs + SOURCE=Tuple01.fs SCFLAGS="-g --test:EmitFeeFeeAs100001 --optimize-" COMPILE_ONLY=1 POSTCMD="..\\CompareIL.cmd Tuple01.exe" # Tuple01.fs SOURCE=Tuple02.fs SCFLAGS="-g --test:EmitFeeFeeAs100001 --optimize-" COMPILE_ONLY=1 POSTCMD="..\\CompareIL.cmd Tuple02.exe" # Tuple02.fs - SOURCE=Tuple03.fs SCFLAGS="-g --test:EmitFeeFeeAs100001 --optimize-" COMPILE_ONLY=1 POSTCMD="..\\CompareIL.cmd Tuple03.exe" # Tuple03.fs - SOURCE=Tuple04.fs SCFLAGS="-g --test:EmitFeeFeeAs100001 --optimize-" COMPILE_ONLY=1 POSTCMD="..\\CompareIL.cmd Tuple04.exe" # Tuple04.fs - SOURCE=Tuple05.fs SCFLAGS="-g --test:EmitFeeFeeAs100001 --optimize-" COMPILE_ONLY=1 POSTCMD="..\\CompareIL.cmd Tuple05.exe" # Tuple05.fs - SOURCE=Tuple06.fs SCFLAGS="-g --test:EmitFeeFeeAs100001 --optimize-" COMPILE_ONLY=1 POSTCMD="..\\CompareIL.cmd Tuple06.exe" # Tuple06.fs - SOURCE=Tuple07.fs SCFLAGS="-g --test:EmitFeeFeeAs100001 --optimize-" COMPILE_ONLY=1 POSTCMD="..\\CompareIL.cmd Tuple07.exe" # Tuple07.fs - - SOURCE=Tuple08.fs SCFLAGS="-g --test:EmitFeeFeeAs100001 --optimize-" COMPILE_ONLY=1 POSTCMD="..\\CompareIL.cmd Tuple08.exe" # Tuple08.fs - SOURCE=TupleMonster.fs SCFLAGS="-g --test:EmitFeeFeeAs100001 --optimize-" COMPILE_ONLY=1 POSTCMD="..\\CompareIL.cmd TupleMonster.exe" # TupleMonster.fs - SOURCE=TupleElimination.fs SCFLAGS="-g --test:EmitFeeFeeAs100001 --optimize+" COMPILE_ONLY=1 POSTCMD="..\\CompareIL.cmd TupleElimination.exe" # TupleElimination.fs - + + SOURCE=ValueTupleAliasConstructor.fs SCFLAGS="-g --test:EmitFeeFeeAs100001 --optimize+" COMPILE_ONLY=1 POSTCMD="..\\CompareIL.cmd ValueTupleAliasConstructor.exe" # ValueTupleAliasConstructor.fs - From 0cb0d04ee6881443419c4f84d7e509abc523b8b9 Mon Sep 17 00:00:00 2001 From: Steffen Forkmann Date: Thu, 20 Sep 2018 06:33:58 +0200 Subject: [PATCH 046/160] Do not use weird implementation of contains (#5672) --- src/absil/illib.fs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/absil/illib.fs b/src/absil/illib.fs index b2fd979a55e..c628700af21 100644 --- a/src/absil/illib.fs +++ b/src/absil/illib.fs @@ -469,8 +469,7 @@ module String = let r = s.LastIndexOf(c) if r = -1 then indexNotFound() else r - let contains (s:string) (c:char) = - s.IndexOf(c,0,String.length s) <> -1 + let contains (s:string) (c:char) = s.IndexOf(c) <> -1 let order = LanguagePrimitives.FastGenericComparer From 047d67565fa233b5464ba06e23899093054359bc Mon Sep 17 00:00:00 2001 From: Phillip Carter Date: Wed, 19 Sep 2018 21:35:48 -0700 Subject: [PATCH 047/160] Add MatchBang to BlockStructureService functions (#5668) --- .../src/FSharp.Editor/Structure/BlockStructureService.fs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/vsintegration/src/FSharp.Editor/Structure/BlockStructureService.fs b/vsintegration/src/FSharp.Editor/Structure/BlockStructureService.fs index 5c219e16aef..af3341351a6 100644 --- a/vsintegration/src/FSharp.Editor/Structure/BlockStructureService.fs +++ b/vsintegration/src/FSharp.Editor/Structure/BlockStructureService.fs @@ -34,6 +34,7 @@ module internal BlockStructure = | Scope.Member -> BlockTypes.Member | Scope.LetOrUse | Scope.Match + | Scope.MatchBang | Scope.MatchClause | Scope.EnumCase | Scope.UnionCase @@ -92,6 +93,7 @@ module internal BlockStructure = | Scope.Match | Scope.MatchClause | Scope.MatchLambda + | Scope.MatchBang | Scope.ThenInIfThenElse | Scope.ElseInIfThenElse | Scope.TryWith From 92247b886e4c3f8e637948de84b6d10f97b2b894 Mon Sep 17 00:00:00 2001 From: Steffen Forkmann Date: Fri, 21 Sep 2018 01:13:23 +0200 Subject: [PATCH 048/160] Reduce comparisons for GenericEqualityERFast (#4492) --- src/fsharp/FSharp.Core/prim-types.fs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/fsharp/FSharp.Core/prim-types.fs b/src/fsharp/FSharp.Core/prim-types.fs index 7710318f50b..753a75204dc 100644 --- a/src/fsharp/FSharp.Core/prim-types.fs +++ b/src/fsharp/FSharp.Core/prim-types.fs @@ -1576,15 +1576,15 @@ namespace Microsoft.FSharp.Core when 'T : nativeint = (# "ceq" x y : bool #) when 'T : unativeint = (# "ceq" x y : bool #) when 'T : float = - if not (# "ceq" x x : bool #) && not (# "ceq" y y : bool #) then + if (# "ceq" x y : bool #) then true else - (# "ceq" x y : bool #) + not (# "ceq" x x : bool #) && not (# "ceq" y y : bool #) when 'T : float32 = - if not (# "ceq" x x : bool #) && not (# "ceq" y y : bool #) then + if (# "ceq" x y : bool #) then true else - (# "ceq" x y : bool #) + not (# "ceq" x x : bool #) && not (# "ceq" y y : bool #) when 'T : char = (# "ceq" x y : bool #) when 'T : string = System.String.Equals((# "" x : string #),(# "" y : string #)) when 'T : decimal = System.Decimal.op_Equality((# "" x:decimal #), (# "" y:decimal #)) From 36f6957573737eeb8ae6a1710aa47a21b0a31ecf Mon Sep 17 00:00:00 2001 From: "Kevin Ransom (msft)" Date: Fri, 21 Sep 2018 08:27:42 -0700 Subject: [PATCH 049/160] Add test case for #4492 (#5684) --- .../comparebsl.cmd | 8 ++ .../StructFieldEqualityComparison/env.lst | 1 + .../floatsanddoubles.exe.bsl | 112 ++++++++++++++++++ .../floatsanddoubles.fs | 39 ++++++ tests/fsharpqa/Source/test.lst | 2 +- 5 files changed, 161 insertions(+), 1 deletion(-) create mode 100644 tests/fsharpqa/Source/Conformance/StructFieldEqualityComparison/comparebsl.cmd create mode 100644 tests/fsharpqa/Source/Conformance/StructFieldEqualityComparison/env.lst create mode 100644 tests/fsharpqa/Source/Conformance/StructFieldEqualityComparison/floatsanddoubles.exe.bsl create mode 100644 tests/fsharpqa/Source/Conformance/StructFieldEqualityComparison/floatsanddoubles.fs diff --git a/tests/fsharpqa/Source/Conformance/StructFieldEqualityComparison/comparebsl.cmd b/tests/fsharpqa/Source/Conformance/StructFieldEqualityComparison/comparebsl.cmd new file mode 100644 index 00000000000..b2b96bdc187 --- /dev/null +++ b/tests/fsharpqa/Source/Conformance/StructFieldEqualityComparison/comparebsl.cmd @@ -0,0 +1,8 @@ +REM == %1 --> assembly + +%1 > %1.out + +echo ..\..\..\testenv\bin\ILComparer.exe "%1.bsl" "%1.out" +..\..\..\testenv\bin\ILComparer.exe "%1.bsl" "%1.out" +exit /b %ERRORLEVEL% + diff --git a/tests/fsharpqa/Source/Conformance/StructFieldEqualityComparison/env.lst b/tests/fsharpqa/Source/Conformance/StructFieldEqualityComparison/env.lst new file mode 100644 index 00000000000..3be25082cca --- /dev/null +++ b/tests/fsharpqa/Source/Conformance/StructFieldEqualityComparison/env.lst @@ -0,0 +1 @@ + SOURCE=floatsanddoubles.fs SCFLAGS="-g --out:floatsanddoubles.exe" COMPILE_ONLY=1 POSTCMD="comparebsl.cmd floatsanddoubles.exe" # floatsanddoubles.fs diff --git a/tests/fsharpqa/Source/Conformance/StructFieldEqualityComparison/floatsanddoubles.exe.bsl b/tests/fsharpqa/Source/Conformance/StructFieldEqualityComparison/floatsanddoubles.exe.bsl new file mode 100644 index 00000000000..d8a704c0362 --- /dev/null +++ b/tests/fsharpqa/Source/Conformance/StructFieldEqualityComparison/floatsanddoubles.exe.bsl @@ -0,0 +1,112 @@ +Doubles: Epsilon = Epsilon is: true Values 0.000000 = 0.000000 +Doubles: Epsilon = MinValue is: false Values 0.000000 = -179769313486232000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.000000 +Doubles: Epsilon = MaxValue is: false Values 0.000000 = 179769313486232000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.000000 +Doubles: Epsilon = NegativeInfinity is: false Values 0.000000 = -Infinity +Doubles: Epsilon = PositiveInfinity is: false Values 0.000000 = Infinity +Doubles: Epsilon = NaN is: false Values 0.000000 = NaN +Doubles: Epsilon = Number is: false Values 0.000000 = 7.000000 + +Doubles: MinValue = Epsilon is: false Values -179769313486232000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.000000 = 0.000000 +Doubles: MinValue = MinValue is: true Values -179769313486232000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.000000 = -179769313486232000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.000000 +Doubles: MinValue = MaxValue is: false Values -179769313486232000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.000000 = 179769313486232000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.000000 +Doubles: MinValue = NegativeInfinity is: false Values -179769313486232000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.000000 = -Infinity +Doubles: MinValue = PositiveInfinity is: false Values -179769313486232000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.000000 = Infinity +Doubles: MinValue = NaN is: false Values -179769313486232000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.000000 = NaN +Doubles: MinValue = Number is: false Values -179769313486232000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.000000 = 7.000000 + +Doubles: MaxValue = Epsilon is: false Values 179769313486232000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.000000 = 0.000000 +Doubles: MaxValue = MinValue is: false Values 179769313486232000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.000000 = -179769313486232000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.000000 +Doubles: MaxValue = MaxValue is: true Values 179769313486232000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.000000 = 179769313486232000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.000000 +Doubles: MaxValue = NegativeInfinity is: false Values 179769313486232000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.000000 = -Infinity +Doubles: MaxValue = PositiveInfinity is: false Values 179769313486232000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.000000 = Infinity +Doubles: MaxValue = NaN is: false Values 179769313486232000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.000000 = NaN +Doubles: MaxValue = Number is: false Values 179769313486232000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.000000 = 7.000000 + +Doubles: NegativeInfinity = Epsilon is: false Values -Infinity = 0.000000 +Doubles: NegativeInfinity = MinValue is: false Values -Infinity = -179769313486232000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.000000 +Doubles: NegativeInfinity = MaxValue is: false Values -Infinity = 179769313486232000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.000000 +Doubles: NegativeInfinity = NegativeInfinity is: true Values -Infinity = -Infinity +Doubles: NegativeInfinity = PositiveInfinity is: false Values -Infinity = Infinity +Doubles: NegativeInfinity = NaN is: false Values -Infinity = NaN +Doubles: NegativeInfinity = Number is: false Values -Infinity = 7.000000 + +Doubles: PositiveInfinity = Epsilon is: false Values Infinity = 0.000000 +Doubles: PositiveInfinity = MinValue is: false Values Infinity = -179769313486232000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.000000 +Doubles: PositiveInfinity = MaxValue is: false Values Infinity = 179769313486232000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.000000 +Doubles: PositiveInfinity = NegativeInfinity is: false Values Infinity = -Infinity +Doubles: PositiveInfinity = PositiveInfinity is: true Values Infinity = Infinity +Doubles: PositiveInfinity = NaN is: false Values Infinity = NaN +Doubles: PositiveInfinity = Number is: false Values Infinity = 7.000000 + +Doubles: NaN = Epsilon is: false Values NaN = 0.000000 +Doubles: NaN = MinValue is: false Values NaN = -179769313486232000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.000000 +Doubles: NaN = MaxValue is: false Values NaN = 179769313486232000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.000000 +Doubles: NaN = NegativeInfinity is: false Values NaN = -Infinity +Doubles: NaN = PositiveInfinity is: false Values NaN = Infinity +Doubles: NaN = NaN is: true Values NaN = NaN +Doubles: NaN = Number is: false Values NaN = 7.000000 + +Doubles: Number = Epsilon is: false Values 7.000000 = 0.000000 +Doubles: Number = MinValue is: false Values 7.000000 = -179769313486232000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.000000 +Doubles: Number = MaxValue is: false Values 7.000000 = 179769313486232000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.000000 +Doubles: Number = NegativeInfinity is: false Values 7.000000 = -Infinity +Doubles: Number = PositiveInfinity is: false Values 7.000000 = Infinity +Doubles: Number = NaN is: false Values 7.000000 = NaN +Doubles: Number = Number is: true Values 7.000000 = 7.000000 + +Floats: Epsilon = Epsilon is: true Values 0.000000 = 0.000000 +Floats: Epsilon = MinValue is: false Values 0.000000 = -179769313486232000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.000000 +Floats: Epsilon = MaxValue is: false Values 0.000000 = 179769313486232000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.000000 +Floats: Epsilon = NegativeInfinity is: false Values 0.000000 = -Infinity +Floats: Epsilon = PositiveInfinity is: false Values 0.000000 = Infinity +Floats: Epsilon = NaN is: false Values 0.000000 = NaN +Floats: Epsilon = Number is: false Values 0.000000 = 7.000000 + +Floats: MinValue = Epsilon is: false Values -179769313486232000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.000000 = 0.000000 +Floats: MinValue = MinValue is: true Values -179769313486232000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.000000 = -179769313486232000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.000000 +Floats: MinValue = MaxValue is: false Values -179769313486232000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.000000 = 179769313486232000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.000000 +Floats: MinValue = NegativeInfinity is: false Values -179769313486232000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.000000 = -Infinity +Floats: MinValue = PositiveInfinity is: false Values -179769313486232000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.000000 = Infinity +Floats: MinValue = NaN is: false Values -179769313486232000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.000000 = NaN +Floats: MinValue = Number is: false Values -179769313486232000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.000000 = 7.000000 + +Floats: MaxValue = Epsilon is: false Values 179769313486232000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.000000 = 0.000000 +Floats: MaxValue = MinValue is: false Values 179769313486232000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.000000 = -179769313486232000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.000000 +Floats: MaxValue = MaxValue is: true Values 179769313486232000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.000000 = 179769313486232000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.000000 +Floats: MaxValue = NegativeInfinity is: false Values 179769313486232000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.000000 = -Infinity +Floats: MaxValue = PositiveInfinity is: false Values 179769313486232000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.000000 = Infinity +Floats: MaxValue = NaN is: false Values 179769313486232000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.000000 = NaN +Floats: MaxValue = Number is: false Values 179769313486232000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.000000 = 7.000000 + +Floats: NegativeInfinity = Epsilon is: false Values -Infinity = 0.000000 +Floats: NegativeInfinity = MinValue is: false Values -Infinity = -179769313486232000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.000000 +Floats: NegativeInfinity = MaxValue is: false Values -Infinity = 179769313486232000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.000000 +Floats: NegativeInfinity = NegativeInfinity is: true Values -Infinity = -Infinity +Floats: NegativeInfinity = PositiveInfinity is: false Values -Infinity = Infinity +Floats: NegativeInfinity = NaN is: false Values -Infinity = NaN +Floats: NegativeInfinity = Number is: false Values -Infinity = 7.000000 + +Floats: PositiveInfinity = Epsilon is: false Values Infinity = 0.000000 +Floats: PositiveInfinity = MinValue is: false Values Infinity = -179769313486232000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.000000 +Floats: PositiveInfinity = MaxValue is: false Values Infinity = 179769313486232000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.000000 +Floats: PositiveInfinity = NegativeInfinity is: false Values Infinity = -Infinity +Floats: PositiveInfinity = PositiveInfinity is: true Values Infinity = Infinity +Floats: PositiveInfinity = NaN is: false Values Infinity = NaN +Floats: PositiveInfinity = Number is: false Values Infinity = 7.000000 + +Floats: NaN = Epsilon is: false Values NaN = 0.000000 +Floats: NaN = MinValue is: false Values NaN = -179769313486232000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.000000 +Floats: NaN = MaxValue is: false Values NaN = 179769313486232000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.000000 +Floats: NaN = NegativeInfinity is: false Values NaN = -Infinity +Floats: NaN = PositiveInfinity is: false Values NaN = Infinity +Floats: NaN = NaN is: true Values NaN = NaN +Floats: NaN = Number is: false Values NaN = 7.000000 + +Floats: Number = Epsilon is: false Values 7.000000 = 0.000000 +Floats: Number = MinValue is: false Values 7.000000 = -179769313486232000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.000000 +Floats: Number = MaxValue is: false Values 7.000000 = 179769313486232000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.000000 +Floats: Number = NegativeInfinity is: false Values 7.000000 = -Infinity +Floats: Number = PositiveInfinity is: false Values 7.000000 = Infinity +Floats: Number = NaN is: false Values 7.000000 = NaN +Floats: Number = Number is: true Values 7.000000 = 7.000000 + diff --git a/tests/fsharpqa/Source/Conformance/StructFieldEqualityComparison/floatsanddoubles.fs b/tests/fsharpqa/Source/Conformance/StructFieldEqualityComparison/floatsanddoubles.fs new file mode 100644 index 00000000000..b0679dbba6f --- /dev/null +++ b/tests/fsharpqa/Source/Conformance/StructFieldEqualityComparison/floatsanddoubles.fs @@ -0,0 +1,39 @@ +// =========================================================================================================================== +// Test case for GenericEqualityERFast with floats/doubles +// Ensures that matrix of values evaluate to the same values as the shipping compiler +// =========================================================================================================================== +module floatsanddoubles + +open System +open System + +type Float = + struct + val F : float + new (f:float) = { F = f } + end + +type Double = + struct + val D : double + new (d:double) = { D = d } + end + +let floats = [| Float(Double.Epsilon); Float(Double.MinValue); Float(Double.MaxValue);Float(Double.NegativeInfinity);Float(Double.PositiveInfinity);Float(Double.NaN); Float(7.0)|] +let doubles = [| Double(Double.Epsilon); Double(Double.MinValue); Double(Double.MaxValue);Double(Double.NegativeInfinity);Double(Double.PositiveInfinity);Double(Double.NaN); Double(7.0)|] +let names = [| "Epsilon"; "MinValue"; "MaxValue";"NegativeInfinity";"PositiveInfinity";"NaN";"Number" |] + +[] +let main argv = + + for i in 0 .. doubles.Length - 1 do + for j in 0 .. doubles.Length - 1 do + printfn "Doubles: %-17s = %-17s is: %-5b Values %f = %f" (names.[i]) (names.[j]) (doubles.[i].Equals(doubles.[j])) (doubles.[i].D) (doubles.[j].D) + printfn "" + + for i in 0 .. floats.Length - 1 do + for j in 0 .. floats.Length - 1 do + printfn "Floats: %-17s = %-17s is: %-5b Values %f = %f" (names.[i]) (names.[j]) (floats.[i].Equals(floats.[j])) (floats.[i].F) (floats.[j].F) + printfn "" + + 0 // return an integer exit code diff --git a/tests/fsharpqa/Source/test.lst b/tests/fsharpqa/Source/test.lst index 0f3200c9af1..67199ab1137 100644 --- a/tests/fsharpqa/Source/test.lst +++ b/tests/fsharpqa/Source/test.lst @@ -69,7 +69,6 @@ CompilerOptions01,NoMT CompilerOptions\fsi\times CompilerOptions02,NoMT CompilerOptions\fsi\exename CompilerOptions01,NoMT,Determinism CompilerOptions\fsc\determinism - Conformance01 Conformance\BasicGrammarElements\Constants Conformance01 Conformance\BasicGrammarElements\OperatorNames Conformance01 Conformance\BasicGrammarElements\PrecedenceAndOperators @@ -228,6 +227,7 @@ Conformance08 Conformance\Signatures\SignatureConformance Conformance08 Conformance\Signatures\SignatureTypes Conformance08 Conformance\SpecialAttributesAndTypes\Imported\System.ThreadStatic Conformance08 Conformance\SpecialAttributesAndTypes\Imported\CallerInfo +Conformance08 Conformance\StructFieldEqualityComparison Conformance08 Conformance\TypesAndTypeConstraints\CheckingSyntacticTypes Conformance08 Conformance\TypesAndTypeConstraints\LogicalPropertiesOfTypes Conformance08 Conformance\TypesAndTypeConstraints\TypeConstraints From 99221473785d7850928113f34f28fe8f9c0aa3d5 Mon Sep 17 00:00:00 2001 From: Eugene Auduchinok Date: Fri, 21 Sep 2018 18:39:40 +0300 Subject: [PATCH 050/160] Remove subsequent list filtering in name resolution (#5678) --- src/fsharp/NameResolution.fs | 82 +++++++++++++++++++----------------- 1 file changed, 44 insertions(+), 38 deletions(-) diff --git a/src/fsharp/NameResolution.fs b/src/fsharp/NameResolution.fs index f2300ce03cf..ac74420f370 100644 --- a/src/fsharp/NameResolution.fs +++ b/src/fsharp/NameResolution.fs @@ -3691,9 +3691,10 @@ let InfosForTyconConstructors (ncenv:NameResolver) m ad (tcref:TyconRef) = | Item.CtorGroup(nm,ctorInfos) -> let ctors = ctorInfos - |> List.filter (IsMethInfoAccessible amap m ad) - |> List.filter (MethInfoIsUnseen g m ty >> not) - match ctors with + |> List.filter (fun minfo -> + IsMethInfoAccessible amap m ad minfo && + not (MethInfoIsUnseen g m ty minfo)) + match ctors with | [] -> [] | _ -> [Item.MakeCtorGroup(nm,ctors)] | item -> @@ -3761,9 +3762,9 @@ let rec ResolvePartialLongIdentInModuleOrNamespace (ncenv: NameResolver) nenv is match plid with | [] -> let tycons = - mty.TypeDefinitions - |> List.filter (fun tcref -> not (tcref.LogicalName.Contains(","))) - |> List.filter (fun tycon -> not (IsTyconUnseen ad g ncenv.amap m (modref.NestedTyconRef tycon))) + mty.TypeDefinitions |> List.filter (fun tcref -> + not (tcref.LogicalName.Contains(",")) && + not (IsTyconUnseen ad g ncenv.amap m (modref.NestedTyconRef tcref))) let accessibleSubModules = let moduleOrNamespaces = @@ -3779,16 +3780,16 @@ let rec ResolvePartialLongIdentInModuleOrNamespace (ncenv: NameResolver) nenv is let demangledName = x.DemangledModuleOrNamespaceName notFakeContainerModule ilTyconNames demangledName && IsInterestingModuleName demangledName) |> List.map modref.NestedTyconRef - |> List.filter (IsTyconUnseen ad g ncenv.amap m >> not) - |> List.filter (EntityRefContainsSomethingAccessible ncenv m ad) + |> List.filter (fun tyref -> + not (IsTyconUnseen ad g ncenv.amap m tyref) && + EntityRefContainsSomethingAccessible ncenv m ad tyref) |> List.map ItemForModuleOrNamespaceRef // Collect up the accessible values in the module, excluding the members (mty.AllValsAndMembers |> Seq.toList |> List.choose (TryMkValRefInModRef modref) // if the assembly load set is incomplete and we get a None value here, then ignore the value - |> List.filter (fun v -> not v.IsMember) - |> List.filter (IsValUnseen ad g m >> not) + |> List.filter (fun vref -> not vref.IsMember && not (IsValUnseen ad g m vref)) |> List.map Item.Value) // Collect up the accessible discriminated union cases in the module @@ -3910,18 +3911,19 @@ let rec ResolvePartialLongIdentPrim (ncenv: NameResolver) (nenv: NameResolutionE let ilTyconNames = getFakeContainerModulesFromTyconRefs (nenv.TyconsByAccessNames(fullyQualified).Values) moduleOrNamespaceRefs - |> List.filter (fun x -> - let demangledName = x.DemangledModuleOrNamespaceName - IsInterestingModuleName demangledName && notFakeContainerModule ilTyconNames demangledName) - |> List.filter (EntityRefContainsSomethingAccessible ncenv m ad) - |> List.filter (IsTyconUnseen ad g ncenv.amap m >> not) + |> List.filter (fun modref -> + let demangledName = modref.DemangledModuleOrNamespaceName + IsInterestingModuleName demangledName && notFakeContainerModule ilTyconNames demangledName && + EntityRefContainsSomethingAccessible ncenv m ad modref && + not (IsTyconUnseen ad g ncenv.amap m modref)) |> List.map ItemForModuleOrNamespaceRef let tycons = nenv.TyconsByDemangledNameAndArity(fullyQualified).Values - |> List.filter (fun tcref -> not (tcref.LogicalName.Contains(","))) - |> List.filter (fun tcref -> not tcref.IsExceptionDecl) - |> List.filter (IsTyconUnseen ad g ncenv.amap m >> not) + |> List.filter (fun tcref -> + not (tcref.LogicalName.Contains(",")) && + not tcref.IsExceptionDecl && + not (IsTyconUnseen ad g ncenv.amap m tcref)) |> List.map (ItemOfTyconRef ncenv m) // Get all the constructors accessible from here @@ -3979,9 +3981,10 @@ let rec ResolvePartialLongIdentInModuleOrNamespaceForRecordFields (ncenv: NameRe // get record type constructors let tycons = mty.TypeDefinitions - |> List.filter (fun tcref -> not (tcref.LogicalName.Contains(","))) - |> List.filter (fun tycon -> tycon.IsRecordTycon) - |> List.filter (fun tycon -> not (IsTyconUnseen ad g ncenv.amap m (modref.NestedTyconRef tycon))) + |> List.filter (fun tcref -> + not (tcref.LogicalName.Contains(",")) && + tcref.IsRecordTycon && + not (IsTyconUnseen ad g ncenv.amap m (modref.NestedTyconRef tcref))) let accessibleSubModules = @@ -3994,12 +3997,13 @@ let rec ResolvePartialLongIdentInModuleOrNamespaceForRecordFields (ncenv: NameRe let ilTyconNames = getFakeContainerModulesFromTycons mty.TypesByAccessNames.Values moduleOrNamespaces - |> List.filter (fun x -> + |> List.filter (fun x -> let demangledName = x.DemangledModuleOrNamespaceName notFakeContainerModule ilTyconNames demangledName && IsInterestingModuleName demangledName) |> List.map modref.NestedTyconRef - |> List.filter (IsTyconUnseen ad g ncenv.amap m >> not) - |> List.filter (EntityRefContainsSomethingAccessible ncenv m ad) + |> List.filter (fun tcref -> + not (IsTyconUnseen ad g ncenv.amap m tcref) && + EntityRefContainsSomethingAccessible ncenv m ad tcref) |> List.map ItemForModuleOrNamespaceRef accessibleSubModules @@ -4066,18 +4070,19 @@ and ResolvePartialLongIdentToClassOrRecdFieldsImpl (ncenv: NameResolver) (nenv: let ilTyconNames = getFakeContainerModulesFromTyconRefs (nenv.TyconsByAccessNames(fullyQualified).Values) moduleOrNamespaceRefs - |> List.filter (fun x -> - let demangledName = x.DemangledModuleOrNamespaceName - IsInterestingModuleName demangledName && notFakeContainerModule ilTyconNames demangledName) - |> List.filter (EntityRefContainsSomethingAccessible ncenv m ad) - |> List.filter (IsTyconUnseen ad g ncenv.amap m >> not) + |> List.filter (fun modref -> + let demangledName = modref.DemangledModuleOrNamespaceName + IsInterestingModuleName demangledName && notFakeContainerModule ilTyconNames demangledName && + EntityRefContainsSomethingAccessible ncenv m ad modref && + not (IsTyconUnseen ad g ncenv.amap m modref)) |> List.map ItemForModuleOrNamespaceRef let recdTyCons = nenv.TyconsByDemangledNameAndArity(fullyQualified).Values - |> List.filter (fun tcref -> not (tcref.LogicalName.Contains(","))) - |> List.filter (fun tcref -> tcref.IsRecordTycon) - |> List.filter (IsTyconUnseen ad g ncenv.amap m >> not) + |> List.filter (fun tcref -> + not (tcref.LogicalName.Contains(",")) && + tcref.IsRecordTycon && + not (IsTyconUnseen ad g ncenv.amap m tcref)) |> List.map (ItemOfTyconRef ncenv m) let recdFields = @@ -4343,8 +4348,7 @@ let rec ResolvePartialLongIdentInModuleOrNamespaceForItem (ncenv: NameResolver) mty.AllValsAndMembers |> Seq.toList |> List.choose (TryMkValRefInModRef modref) // if the assembly load set is incomplete and we get a None value here, then ignore the value - |> List.filter (fun v -> not v.IsMember) - |> List.filter (IsValUnseen ad g m >> not) + |> List.filter (fun vref -> not vref.IsMember && not (IsValUnseen ad g m vref)) |> List.map Item.Value | Item.UnionCase _ -> // Collect up the accessible discriminated union cases in the module @@ -4384,14 +4388,16 @@ let rec ResolvePartialLongIdentInModuleOrNamespaceForItem (ncenv: NameResolver) let demangledName = x.DemangledModuleOrNamespaceName notFakeContainerModule ilTyconNames demangledName && IsInterestingModuleName demangledName) |> List.map modref.NestedTyconRef - |> List.filter (IsTyconUnseen ad g ncenv.amap m >> not) - |> List.filter (EntityRefContainsSomethingAccessible ncenv m ad) + |> List.filter (fun tcref -> + not (IsTyconUnseen ad g ncenv.amap m tcref) && + EntityRefContainsSomethingAccessible ncenv m ad tcref) |> List.map ItemForModuleOrNamespaceRef let tycons = mty.TypeDefinitions - |> List.filter (fun tcref -> not (tcref.LogicalName.Contains(","))) - |> List.filter (fun tycon -> not (IsTyconUnseen ad g ncenv.amap m (modref.NestedTyconRef tycon))) + |> List.filter (fun tcref -> + not (tcref.LogicalName.Contains(",")) && + not (IsTyconUnseen ad g ncenv.amap m (modref.NestedTyconRef tcref))) // Get all the types and .NET constructor groups accessible from here let nestedTycons = tycons |> List.map modref.NestedTyconRef From 24a432f03219b62fa647777a531bb7e70fa044e0 Mon Sep 17 00:00:00 2001 From: Phillip Carter Date: Sun, 23 Sep 2018 11:04:07 -0700 Subject: [PATCH 051/160] Update release-notes.md --- release-notes.md | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/release-notes.md b/release-notes.md index 87135456997..2c29485b580 100644 --- a/release-notes.md +++ b/release-notes.md @@ -1,7 +1,17 @@ - Copyright (c) Microsoft Corporation. All Rights Reserved. - See License.txt in the project root for license information. + +## About the release notes + +We deliver F# and F# components in Visual Studio and .NET Core releases. These can include bug fixes, new tooling features, new compiler features, performance improvements, infrastructure improvements, and new langauge versions. The most recent release of F# or any F# component will be at the top of this document. + +## Visual Studio 15.8.5 + +* Fix (#5504) - Internal MSBuild Error when building non-.NET SDK projects with MSBuild parallelism +* Fix (#5518) - Visual Studio-deployed components are not NGEN'd +* Fix ([Devcom 322883](https://developercommunity.visualstudio.com/content/problem/322883/all-net-framework-f-projects-build-to-4500-regardl.html)) - FSharp.Core 4.5.0.0 binary is deployed to FSharp.Core 4.4.3.0 location + +All other closed issues for the VS 15.8 release can be found [here](https://github.com/Microsoft/visualfsharp/milestone/14). ## F# 4.5 From ac86fdbbaf3213e7d6b2dcd5b0f2fa94bfbeebf7 Mon Sep 17 00:00:00 2001 From: Steffen Forkmann Date: Tue, 25 Sep 2018 21:04:31 +0200 Subject: [PATCH 052/160] Only compute suppressedMethNames if really needed (#5664) * Only compute suppressedMethNames if really needed * Use HashSet for addersAndRemovers * Only compute suppressedMethNames if really needed * move it to the right, sigh --- src/fsharp/NameResolution.fs | 143 ++++++++++++++++++++--------------- 1 file changed, 81 insertions(+), 62 deletions(-) diff --git a/src/fsharp/NameResolution.fs b/src/fsharp/NameResolution.fs index ac74420f370..a4cbd0279de 100644 --- a/src/fsharp/NameResolution.fs +++ b/src/fsharp/NameResolution.fs @@ -3507,13 +3507,11 @@ let ResolveCompletionsInType (ncenv: NameResolver) nenv (completionTargets: Reso yield einfo.RemoveMethod.DisplayName ] else [] - let suppressedMethNames = Zset.ofList String.order (pinfoMethNames @ einfoMethNames) - let pinfos = pinfosIncludingUnseen |> List.filter (fun x -> not (PropInfoIsUnseen m x)) - let minfoFilter (minfo:MethInfo) = + let minfoFilter (suppressedMethNames:Zset<_>) (minfo:MethInfo) = let isApplicableMeth = match completionTargets with | ResolveCompletionTargets.All x -> x @@ -3574,45 +3572,55 @@ let ResolveCompletionsInType (ncenv: NameResolver) nenv (completionTargets: Reso // REVIEW: add a name filter here in the common cases? let minfos = if completionTargets.ResolveAll then - let minfos = - AllMethInfosOfTypeInScope ncenv.InfoReader nenv (None,ad) PreferOverrides m ty - |> List.filter minfoFilter - - let minfos = - if isNil minfos then [] else - let addersAndRemovers = - let hashSet = HashSet() - for item in pinfoItems do - match item with - | Item.Event(FSEvent(_,_,addValRef,removeValRef)) -> - hashSet.Add addValRef.LogicalName |> ignore - hashSet.Add removeValRef.LogicalName |> ignore - | _ -> () - hashSet + let minfos = AllMethInfosOfTypeInScope ncenv.InfoReader nenv (None,ad) PreferOverrides m ty + if isNil minfos then + [] + else + let suppressedMethNames = Zset.ofList String.order (pinfoMethNames @ einfoMethNames) - if addersAndRemovers.Count = 0 then minfos - else minfos |> List.filter (fun minfo -> not (addersAndRemovers.Contains minfo.LogicalName)) + let minfos = + minfos + |> List.filter (minfoFilter suppressedMethNames) + + if isNil minfos then + [] + else + let minfos = + let addersAndRemovers = + let hashSet = HashSet() + for item in pinfoItems do + match item with + | Item.Event(FSEvent(_,_,addValRef,removeValRef)) -> + hashSet.Add addValRef.LogicalName |> ignore + hashSet.Add removeValRef.LogicalName |> ignore + | _ -> () + hashSet + + if addersAndRemovers.Count = 0 then minfos + else minfos |> List.filter (fun minfo -> not (addersAndRemovers.Contains minfo.LogicalName)) #if !NO_EXTENSIONTYPING - // Filter out the ones with mangled names from applying static parameters - let minfos = - let methsWithStaticParams = - minfos - |> List.filter (fun minfo -> - match minfo.ProvidedStaticParameterInfo with - | Some (_methBeforeArguments, staticParams) -> staticParams.Length <> 0 - | _ -> false) - |> List.map (fun minfo -> minfo.DisplayName) - - if methsWithStaticParams.IsEmpty then minfos - else minfos |> List.filter (fun minfo -> - let nm = minfo.LogicalName - not (nm.Contains "," && methsWithStaticParams |> List.exists (fun m -> nm.StartsWithOrdinal(m)))) + // Filter out the ones with mangled names from applying static parameters + let minfos = + let methsWithStaticParams = + minfos + |> List.filter (fun minfo -> + match minfo.ProvidedStaticParameterInfo with + | Some (_methBeforeArguments, staticParams) -> staticParams.Length <> 0 + | _ -> false) + |> List.map (fun minfo -> minfo.DisplayName) + + if methsWithStaticParams.IsEmpty then minfos + else minfos |> List.filter (fun minfo -> + let nm = minfo.LogicalName + not (nm.Contains "," && methsWithStaticParams |> List.exists (fun m -> nm.StartsWithOrdinal(m)))) #endif - minfos + minfos + + else + [] - else [] // Partition methods into overload sets let rec partitionl (l:MethInfo list) acc = match l with @@ -4185,13 +4193,12 @@ let ResolveCompletionsInTypeForItem (ncenv: NameResolver) nenv m ad statics ty ( yield einfo.AddMethod.DisplayName yield einfo.RemoveMethod.DisplayName ] - let suppressedMethNames = Zset.ofList String.order (pinfoMethNames @ einfoMethNames) let pinfos = pinfosIncludingUnseen |> List.filter (fun x -> not (PropInfoIsUnseen m x)) - let minfoFilter (minfo: MethInfo) = + let minfoFilter (suppressedMethNames:Zset<_>) (minfo: MethInfo) = // Only show the Finalize, MemberwiseClose etc. methods on System.Object for values whose static type really is // System.Object. Few of these are typically used from F#. // @@ -4242,37 +4249,49 @@ let ResolveCompletionsInTypeForItem (ncenv: NameResolver) nenv m ad statics ty ( | Item.MethodGroup _ -> // REVIEW: add a name filter here in the common cases? let minfos = - let minfos = - AllMethInfosOfTypeInScope ncenv.InfoReader nenv (None,ad) PreferOverrides m ty - |> List.filter minfoFilter - + let minfos = AllMethInfosOfTypeInScope ncenv.InfoReader nenv (None,ad) PreferOverrides m ty + if isNil minfos then [] else + + let suppressedMethNames = Zset.ofList String.order (pinfoMethNames @ einfoMethNames) let minfos = - let addersAndRemovers = - pinfoItems - |> List.collect (function Item.Event(FSEvent(_,_,addValRef,removeValRef)) -> [addValRef.LogicalName;removeValRef.LogicalName] | _ -> []) - |> set + minfos + |> List.filter (minfoFilter suppressedMethNames) - if addersAndRemovers.IsEmpty then minfos - else minfos |> List.filter (fun minfo -> not (addersAndRemovers.Contains minfo.LogicalName)) + if isNil minfos then + [] + else + let minfos = + let addersAndRemovers = + let hashSet = HashSet() + for item in pinfoItems do + match item with + | Item.Event(FSEvent(_,_,addValRef,removeValRef)) -> + hashSet.Add addValRef.LogicalName |> ignore + hashSet.Add removeValRef.LogicalName |> ignore + | _ -> () + hashSet + + if addersAndRemovers.Count = 0 then minfos + else minfos |> List.filter (fun minfo -> not (addersAndRemovers.Contains minfo.LogicalName)) #if !NO_EXTENSIONTYPING - // Filter out the ones with mangled names from applying static parameters - let minfos = - let methsWithStaticParams = - minfos - |> List.filter (fun minfo -> - match minfo.ProvidedStaticParameterInfo with - | Some (_methBeforeArguments, staticParams) -> staticParams.Length <> 0 - | _ -> false) - |> List.map (fun minfo -> minfo.DisplayName) + // Filter out the ones with mangled names from applying static parameters + let minfos = + let methsWithStaticParams = + minfos + |> List.filter (fun minfo -> + match minfo.ProvidedStaticParameterInfo with + | Some (_methBeforeArguments, staticParams) -> staticParams.Length <> 0 + | _ -> false) + |> List.map (fun minfo -> minfo.DisplayName) - if methsWithStaticParams.IsEmpty then minfos - else minfos |> List.filter (fun minfo -> - let nm = minfo.LogicalName - not (nm.Contains "," && methsWithStaticParams |> List.exists (fun m -> nm.StartsWithOrdinal(m)))) + if methsWithStaticParams.IsEmpty then minfos + else minfos |> List.filter (fun minfo -> + let nm = minfo.LogicalName + not (nm.Contains "," && methsWithStaticParams |> List.exists (fun m -> nm.StartsWithOrdinal(m)))) #endif - minfos + minfos // Partition methods into overload sets let rec partitionl (l:MethInfo list) acc = From da0b600660307c108f163e6d3cf30a9b72011553 Mon Sep 17 00:00:00 2001 From: Will Smith Date: Tue, 25 Sep 2018 21:29:16 -0700 Subject: [PATCH 053/160] Fixed referencing cross projects (#5698) * Fixed referencing cross projects * Fixed legacy project referencing CPS style project --- .../LanguageService/ProjectSitesAndFiles.fs | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/vsintegration/src/FSharp.Editor/LanguageService/ProjectSitesAndFiles.fs b/vsintegration/src/FSharp.Editor/LanguageService/ProjectSitesAndFiles.fs index 1bea848dae2..4ba8f25de27 100644 --- a/vsintegration/src/FSharp.Editor/LanguageService/ProjectSitesAndFiles.fs +++ b/vsintegration/src/FSharp.Editor/LanguageService/ProjectSitesAndFiles.fs @@ -225,7 +225,7 @@ type internal ProjectSitesAndFiles() = let getReferencesForSolutionService (solutionService:IVsSolution) = [| match referencedProjects projectSite, extraProjectInfo with - | None, Some (:? VisualStudioWorkspaceImpl as workspace) when not (isNull workspace.CurrentSolution)-> + | _, Some (:? VisualStudioWorkspaceImpl as workspace) when not (isNull workspace.CurrentSolution)-> let path = projectSite.ProjectFileName if not (String.IsNullOrWhiteSpace(path)) then match projectIdOpt with @@ -241,13 +241,15 @@ type internal ProjectSitesAndFiles() = yield Some project.Id, project.FilePath, outputPath, siteProvider | _ -> () - | (Some references), _ -> + | (Some references), Some (:? VisualStudioWorkspaceImpl as workspace) -> for p in references do match solutionService.GetProjectOfUniqueName(p.UniqueName) with | VSConstants.S_OK, (:? IProvideProjectSite as ps) -> - yield None, p.FileName, (fullOutputAssemblyPath p) |> Option.defaultValue "", ps + let path = ps.GetProjectSite().ProjectFileName + let projectId = workspace.ProjectTracker.GetOrCreateProjectIdForPath(path, projectDisplayNameOf path) + yield Some projectId, p.FileName, (fullOutputAssemblyPath p) |> Option.defaultValue "", ps | _ -> () - | None, _ -> () + | _ -> () |] let solutionService = try Some (serviceProvider.GetService(typeof) :?> IVsSolution) with _ -> None seq { match solutionService with From 72cd4398bb4936c91dfbc674eb9f846252ff4ed4 Mon Sep 17 00:00:00 2001 From: Will Smith Date: Thu, 27 Sep 2018 15:16:59 -0700 Subject: [PATCH 054/160] Small Language Service refactoring (#5687) * Started language service refactoring * Updated editor fsproj * Fixed service, should work --- .../src/FSharp.Editor/FSharp.Editor.fsproj | 5 +- .../LanguageService/FSharpCheckerProvider.fs | 86 ++++ .../FSharpProjectOptionsManager.fs | 186 ++++++++ .../LanguageService/LanguageService.fs | 438 +----------------- .../LegacyProjectWorkspaceMap.fs | 201 ++++++++ 5 files changed, 487 insertions(+), 429 deletions(-) create mode 100644 vsintegration/src/FSharp.Editor/LanguageService/FSharpCheckerProvider.fs create mode 100644 vsintegration/src/FSharp.Editor/LanguageService/FSharpProjectOptionsManager.fs create mode 100644 vsintegration/src/FSharp.Editor/LanguageService/LegacyProjectWorkspaceMap.fs diff --git a/vsintegration/src/FSharp.Editor/FSharp.Editor.fsproj b/vsintegration/src/FSharp.Editor/FSharp.Editor.fsproj index 2908a491dd8..3e011cb5d08 100644 --- a/vsintegration/src/FSharp.Editor/FSharp.Editor.fsproj +++ b/vsintegration/src/FSharp.Editor/FSharp.Editor.fsproj @@ -50,6 +50,9 @@ + + + @@ -152,7 +155,7 @@ - + diff --git a/vsintegration/src/FSharp.Editor/LanguageService/FSharpCheckerProvider.fs b/vsintegration/src/FSharp.Editor/LanguageService/FSharpCheckerProvider.fs new file mode 100644 index 00000000000..f8ffa8dae32 --- /dev/null +++ b/vsintegration/src/FSharp.Editor/LanguageService/FSharpCheckerProvider.fs @@ -0,0 +1,86 @@ +// Copyright (c) Microsoft Corporation. All Rights Reserved. See License.txt in the project root for license information. + +namespace Microsoft.VisualStudio.FSharp.Editor + +open System +open System.ComponentModel.Composition +open System.Diagnostics +open Microsoft.CodeAnalysis +open Microsoft.CodeAnalysis.Diagnostics +open Microsoft.FSharp.Compiler.SourceCodeServices +open Microsoft.VisualStudio +open Microsoft.VisualStudio.FSharp.Editor +open Microsoft.VisualStudio.LanguageServices +open Microsoft.VisualStudio.LanguageServices.Implementation.ProjectSystem +open FSharp.NativeInterop + +#nowarn "9" // NativePtr.toNativeInt + +// Exposes FSharpChecker as MEF export +[); Composition.Shared>] +type internal FSharpCheckerProvider + [] + ( + analyzerService: IDiagnosticAnalyzerService, + [)>] workspace: VisualStudioWorkspaceImpl, + settings: EditorOptions + ) = + + let tryGetMetadataSnapshot (path, timeStamp) = + try + let metadataReferenceProvider = workspace.Services.GetService() + let md = metadataReferenceProvider.GetMetadata(path, timeStamp) + let amd = (md :?> AssemblyMetadata) + let mmd = amd.GetModules().[0] + let mmr = mmd.GetMetadataReader() + + // "lifetime is timed to Metadata you got from the GetMetadata(...). As long as you hold it strongly, raw + // memory we got from metadata reader will be alive. Once you are done, just let everything go and + // let finalizer handle resource rather than calling Dispose from Metadata directly. It is shared metadata. + // You shouldn't dispose it directly." + + let objToHold = box md + + // We don't expect any ilread WeakByteFile to be created when working in Visual Studio + Debug.Assert((Microsoft.FSharp.Compiler.AbstractIL.ILBinaryReader.GetStatistics().weakByteFileCount = 0), "Expected weakByteFileCount to be zero when using F# in Visual Studio. Was there a problem reading a .NET binary?") + + Some (objToHold, NativePtr.toNativeInt mmr.MetadataPointer, mmr.MetadataLength) + with ex -> + // We catch all and let the backup routines in the F# compiler find the error + Assert.Exception(ex) + None + + + let checker = + lazy + let checker = + FSharpChecker.Create( + projectCacheSize = settings.LanguageServicePerformance.ProjectCheckCacheSize, + keepAllBackgroundResolutions = false, + // Enabling this would mean that if devenv.exe goes above 2.3GB we do a one-off downsize of the F# Compiler Service caches + (* , MaxMemory = 2300 *) + legacyReferenceResolver=Microsoft.FSharp.Compiler.MSBuildReferenceResolver.Resolver, + tryGetMetadataSnapshot = tryGetMetadataSnapshot) + + // This is one half of the bridge between the F# background builder and the Roslyn analysis engine. + // When the F# background builder refreshes the background semantic build context for a file, + // we request Roslyn to reanalyze that individual file. + checker.BeforeBackgroundFileCheck.Add(fun (fileName, _extraProjectInfo) -> + async { + try + let solution = workspace.CurrentSolution + let documentIds = solution.GetDocumentIdsWithFilePath(fileName) + if not documentIds.IsEmpty then + let documentIdsFiltered = documentIds |> Seq.filter workspace.IsDocumentOpen |> Seq.toArray + for documentId in documentIdsFiltered do + Trace.TraceInformation("{0:n3} Requesting Roslyn reanalysis of {1}", DateTime.Now.TimeOfDay.TotalSeconds, documentId) + if documentIdsFiltered.Length > 0 then + analyzerService.Reanalyze(workspace,documentIds=documentIdsFiltered) + with ex -> + Assert.Exception(ex) + } |> Async.StartImmediate + ) + checker + + member this.Checker = checker.Value + diff --git a/vsintegration/src/FSharp.Editor/LanguageService/FSharpProjectOptionsManager.fs b/vsintegration/src/FSharp.Editor/LanguageService/FSharpProjectOptionsManager.fs new file mode 100644 index 00000000000..007ca3fbe18 --- /dev/null +++ b/vsintegration/src/FSharp.Editor/LanguageService/FSharpProjectOptionsManager.fs @@ -0,0 +1,186 @@ +// Copyright (c) Microsoft Corporation. All Rights Reserved. See License.txt in the project root for license information. + +namespace Microsoft.VisualStudio.FSharp.Editor + +open System +open System.Collections.Concurrent +open System.Collections.Immutable +open System.ComponentModel.Composition +open System.IO +open System.Linq +open Microsoft.CodeAnalysis +open Microsoft.FSharp.Compiler.CompileOps +open Microsoft.FSharp.Compiler.SourceCodeServices +open Microsoft.VisualStudio +open Microsoft.VisualStudio.FSharp.Editor +open Microsoft.VisualStudio.FSharp.Editor.SiteProvider +open Microsoft.VisualStudio.LanguageServices +open Microsoft.VisualStudio.LanguageServices.Implementation.ProjectSystem +open Microsoft.VisualStudio.Shell + +/// Exposes FCS FSharpProjectOptions information management as MEF component. +// +// This service allows analyzers to get an appropriate FSharpProjectOptions value for a project or single file. +// It also allows a 'cheaper' route to get the project options relevant to parsing (e.g. the #define values). +// The main entrypoints are TryGetOptionsForDocumentOrProject and TryGetOptionsForEditingDocumentOrProject. +[); Composition.Shared>] +type internal FSharpProjectOptionsManager + [] + ( + checkerProvider: FSharpCheckerProvider, + [)>] workspace: VisualStudioWorkspaceImpl, + [)>] serviceProvider: System.IServiceProvider, + settings: EditorOptions + ) = + + // A table of information about projects, excluding single-file projects. + let projectOptionsTable = FSharpProjectOptionsTable() + + // A table of information about single-file projects. Currently we only need the load time of each such file, plus + // the original options for editing + let singleFileProjectTable = ConcurrentDictionary() + + let tryGetOrCreateProjectId (projectFileName:string) = + let projectDisplayName = projectDisplayNameOf projectFileName + Some (workspace.ProjectTracker.GetOrCreateProjectIdForPath(projectFileName, projectDisplayName)) + + /// Retrieve the projectOptionsTable + member __.FSharpOptions = projectOptionsTable + + /// Clear a project from the project table + member this.ClearInfoForProject(projectId:ProjectId) = projectOptionsTable.ClearInfoForProject(projectId) + + /// Clear a project from the single file project table + member this.ClearInfoForSingleFileProject(projectId) = + singleFileProjectTable.TryRemove(projectId) |> ignore + + /// Update a project in the single file project table + member this.AddOrUpdateSingleFileProject(projectId, data) = singleFileProjectTable.[projectId] <- data + + /// Get the exact options for a single-file script + member this.ComputeSingleFileOptions (tryGetOrCreateProjectId, fileName, loadTime, fileContents) = + async { + let extraProjectInfo = Some(box workspace) + if SourceFile.MustBeSingleFileProject(fileName) then + // NOTE: we don't use a unique stamp for single files, instead comparing options structurally. + // This is because we repeatedly recompute the options. + let optionsStamp = None + let! options, _diagnostics = checkerProvider.Checker.GetProjectOptionsFromScript(fileName, fileContents, loadTime, [| |], ?extraProjectInfo=extraProjectInfo, ?optionsStamp=optionsStamp) + // NOTE: we don't use FCS cross-project references from scripts to projects. THe projects must have been + // compiled and #r will refer to files on disk + let referencedProjectFileNames = [| |] + let site = ProjectSitesAndFiles.CreateProjectSiteForScript(fileName, referencedProjectFileNames, options) + let deps, projectOptions = ProjectSitesAndFiles.GetProjectOptionsForProjectSite(settings.LanguageServicePerformance.EnableInMemoryCrossProjectReferences, site, serviceProvider, (tryGetOrCreateProjectId fileName), fileName, options.ExtraProjectInfo, Some projectOptionsTable) + let parsingOptions, _ = checkerProvider.Checker.GetParsingOptionsFromProjectOptions(projectOptions) + return (deps, parsingOptions, projectOptions) + else + let site = ProjectSitesAndFiles.ProjectSiteOfSingleFile(fileName) + let deps, projectOptions = ProjectSitesAndFiles.GetProjectOptionsForProjectSite(settings.LanguageServicePerformance.EnableInMemoryCrossProjectReferences, site, serviceProvider, (tryGetOrCreateProjectId fileName), fileName, extraProjectInfo, Some projectOptionsTable) + let parsingOptions, _ = checkerProvider.Checker.GetParsingOptionsFromProjectOptions(projectOptions) + return (deps, parsingOptions, projectOptions) + } + + /// Update the info for a project in the project table + member this.UpdateProjectInfo(tryGetOrCreateProjectId, projectId, site, userOpName, invalidateConfig) = + Logger.Log LogEditorFunctionId.LanguageService_UpdateProjectInfo + projectOptionsTable.AddOrUpdateProject(projectId, (fun isRefresh -> + let extraProjectInfo = Some(box workspace) + let referencedProjects, projectOptions = ProjectSitesAndFiles.GetProjectOptionsForProjectSite(settings.LanguageServicePerformance.EnableInMemoryCrossProjectReferences, site, serviceProvider, Some(projectId), site.ProjectFileName, extraProjectInfo, Some projectOptionsTable) + if invalidateConfig then checkerProvider.Checker.InvalidateConfiguration(projectOptions, startBackgroundCompileIfAlreadySeen = not isRefresh, userOpName = userOpName + ".UpdateProjectInfo") + let referencedProjectIds = referencedProjects |> Array.choose tryGetOrCreateProjectId + let parsingOptions, _ = checkerProvider.Checker.GetParsingOptionsFromProjectOptions(projectOptions) + referencedProjectIds, parsingOptions, Some site, projectOptions)) + + /// Get compilation defines relevant for syntax processing. + /// Quicker then TryGetOptionsForDocumentOrProject as it doesn't need to recompute the exact project + /// options for a script. + member this.GetCompilationDefinesForEditingDocument(document:Document) = + let projectOptionsOpt = this.TryGetOptionsForProject(document.Project.Id) + let parsingOptions = + match projectOptionsOpt with + | Some (parsingOptions, _site, _projectOptions) -> parsingOptions + | _ -> { FSharpParsingOptions.Default with IsInteractive = IsScript document.Name } + CompilerEnvironment.GetCompilationDefinesForEditing parsingOptions + + /// Try and get the Options for a project + member this.TryGetOptionsForProject(projectId:ProjectId) = projectOptionsTable.TryGetOptionsForProject(projectId) + + /// Get the exact options for a document or project + member this.TryGetOptionsForDocumentOrProject(document: Document) = + async { + let projectId = document.Project.Id + + // The options for a single-file script project are re-requested each time the file is analyzed. This is because the + // single-file project may contain #load and #r references which are changing as the user edits, and we may need to re-analyze + // to determine the latest settings. FCS keeps a cache to help ensure these are up-to-date. + match singleFileProjectTable.TryGetValue(projectId) with + | true, (loadTime, _, _) -> + try + let fileName = document.FilePath + let! cancellationToken = Async.CancellationToken + let! sourceText = document.GetTextAsync(cancellationToken) |> Async.AwaitTask + // NOTE: we don't use FCS cross-project references from scripts to projects. The projects must have been + // compiled and #r will refer to files on disk. + let tryGetOrCreateProjectId _ = None + let! _referencedProjectFileNames, parsingOptions, projectOptions = this.ComputeSingleFileOptions (tryGetOrCreateProjectId, fileName, loadTime, sourceText.ToString()) + this.AddOrUpdateSingleFileProject(projectId, (loadTime, parsingOptions, projectOptions)) + return Some (parsingOptions, None, projectOptions) + with ex -> + Assert.Exception(ex) + return None + | _ -> return this.TryGetOptionsForProject(projectId) + } + + /// Get the options for a document or project relevant for syntax processing. + /// Quicker then TryGetOptionsForDocumentOrProject as it doesn't need to recompute the exact project options for a script. + member this.TryGetOptionsForEditingDocumentOrProject(document:Document) = + let projectId = document.Project.Id + match singleFileProjectTable.TryGetValue(projectId) with + | true, (_loadTime, parsingOptions, originalOptions) -> Some (parsingOptions, originalOptions) + | _ -> this.TryGetOptionsForProject(projectId) |> Option.map(fun (parsingOptions, _, projectOptions) -> parsingOptions, projectOptions) + + /// get a siteprovider + member this.ProvideProjectSiteProvider(project:Project) = provideProjectSiteProvider(workspace, project, serviceProvider, Some projectOptionsTable) + + /// Tell the checker to update the project info for the specified project id + member this.UpdateProjectInfoWithProjectId(projectId:ProjectId, userOpName, invalidateConfig) = + let hier = workspace.GetHierarchy(projectId) + match hier with + | null -> () + | h when (h.IsCapabilityMatch("CPS")) -> + let project = workspace.CurrentSolution.GetProject(projectId) + if not (isNull project) then + let siteProvider = this.ProvideProjectSiteProvider(project) + let projectSite = siteProvider.GetProjectSite() + if projectSite.CompilationSourceFiles.Length <> 0 then + this.UpdateProjectInfo(tryGetOrCreateProjectId, projectId, projectSite, userOpName, invalidateConfig) + | _ -> () + + /// Tell the checker to update the project info for the specified project id + member this.UpdateDocumentInfoWithProjectId(projectId:ProjectId, documentId:DocumentId, userOpName, invalidateConfig) = + if workspace.IsDocumentOpen(documentId) then + this.UpdateProjectInfoWithProjectId(projectId, userOpName, invalidateConfig) + + [] + /// This handles commandline change notifications from the Dotnet Project-system + /// Prior to VS 15.7 path contained path to project file, post 15.7 contains target binpath + /// binpath is more accurate because a project file can have multiple in memory projects based on configuration + member this.HandleCommandLineChanges(path:string, sources:ImmutableArray, references:ImmutableArray, options:ImmutableArray) = + use _logBlock = Logger.LogBlock(LogEditorFunctionId.LanguageService_HandleCommandLineArgs) + + let projectId = + match workspace.ProjectTracker.TryGetProjectByBinPath(path) with + | true, project -> project.Id + | false, _ -> workspace.ProjectTracker.GetOrCreateProjectIdForPath(path, projectDisplayNameOf path) + let project = workspace.ProjectTracker.GetProject(projectId) + let path = project.ProjectFilePath + let fullPath p = + if Path.IsPathRooted(p) || path = null then p + else Path.Combine(Path.GetDirectoryName(path), p) + let sourcePaths = sources |> Seq.map(fun s -> fullPath s.Path) |> Seq.toArray + let referencePaths = references |> Seq.map(fun r -> fullPath r.Reference) |> Seq.toArray + + projectOptionsTable.SetOptionsWithProjectId(projectId, sourcePaths, referencePaths, options.ToArray()) + this.UpdateProjectInfoWithProjectId(projectId, "HandleCommandLineChanges", invalidateConfig=true) + + member __.Checker = checkerProvider.Checker diff --git a/vsintegration/src/FSharp.Editor/LanguageService/LanguageService.fs b/vsintegration/src/FSharp.Editor/LanguageService/LanguageService.fs index ec29089f2d8..a91cd2634b5 100644 --- a/vsintegration/src/FSharp.Editor/LanguageService/LanguageService.fs +++ b/vsintegration/src/FSharp.Editor/LanguageService/LanguageService.fs @@ -33,6 +33,7 @@ open Microsoft.VisualStudio.LanguageServices.Implementation.ProjectSystem open Microsoft.VisualStudio.LanguageServices.Implementation.TaskList open Microsoft.VisualStudio.LanguageServices.ProjectSystem open Microsoft.VisualStudio.Shell +open Microsoft.VisualStudio.Shell.Events open Microsoft.VisualStudio.Shell.Interop open Microsoft.VisualStudio.ComponentModelHost open Microsoft.VisualStudio.Text.Outlining @@ -40,242 +41,6 @@ open FSharp.NativeInterop #nowarn "9" // NativePtr.toNativeInt -// Exposes FSharpChecker as MEF export -[); Composition.Shared>] -type internal FSharpCheckerProvider - [] - ( - analyzerService: IDiagnosticAnalyzerService, - [)>] workspace: VisualStudioWorkspaceImpl, - settings: EditorOptions - ) = - - let tryGetMetadataSnapshot (path, timeStamp) = - try - let metadataReferenceProvider = workspace.Services.GetService() - let md = metadataReferenceProvider.GetMetadata(path, timeStamp) - let amd = (md :?> AssemblyMetadata) - let mmd = amd.GetModules().[0] - let mmr = mmd.GetMetadataReader() - - // "lifetime is timed to Metadata you got from the GetMetadata(...). As long as you hold it strongly, raw - // memory we got from metadata reader will be alive. Once you are done, just let everything go and - // let finalizer handle resource rather than calling Dispose from Metadata directly. It is shared metadata. - // You shouldn't dispose it directly." - - let objToHold = box md - - // We don't expect any ilread WeakByteFile to be created when working in Visual Studio - Debug.Assert((Microsoft.FSharp.Compiler.AbstractIL.ILBinaryReader.GetStatistics().weakByteFileCount = 0), "Expected weakByteFileCount to be zero when using F# in Visual Studio. Was there a problem reading a .NET binary?") - - Some (objToHold, NativePtr.toNativeInt mmr.MetadataPointer, mmr.MetadataLength) - with ex -> - // We catch all and let the backup routines in the F# compiler find the error - Assert.Exception(ex) - None - - - let checker = - lazy - let checker = - FSharpChecker.Create( - projectCacheSize = settings.LanguageServicePerformance.ProjectCheckCacheSize, - keepAllBackgroundResolutions = false, - // Enabling this would mean that if devenv.exe goes above 2.3GB we do a one-off downsize of the F# Compiler Service caches - (* , MaxMemory = 2300 *) - legacyReferenceResolver=Microsoft.FSharp.Compiler.MSBuildReferenceResolver.Resolver, - tryGetMetadataSnapshot = tryGetMetadataSnapshot) - - // This is one half of the bridge between the F# background builder and the Roslyn analysis engine. - // When the F# background builder refreshes the background semantic build context for a file, - // we request Roslyn to reanalyze that individual file. - checker.BeforeBackgroundFileCheck.Add(fun (fileName, _extraProjectInfo) -> - async { - try - let solution = workspace.CurrentSolution - let documentIds = solution.GetDocumentIdsWithFilePath(fileName) - if not documentIds.IsEmpty then - let documentIdsFiltered = documentIds |> Seq.filter workspace.IsDocumentOpen |> Seq.toArray - for documentId in documentIdsFiltered do - Trace.TraceInformation("{0:n3} Requesting Roslyn reanalysis of {1}", DateTime.Now.TimeOfDay.TotalSeconds, documentId) - if documentIdsFiltered.Length > 0 then - analyzerService.Reanalyze(workspace,documentIds=documentIdsFiltered) - with ex -> - Assert.Exception(ex) - } |> Async.StartImmediate - ) - checker - - member this.Checker = checker.Value - - -/// Exposes FCS FSharpProjectOptions information management as MEF component. -// -// This service allows analyzers to get an appropriate FSharpProjectOptions value for a project or single file. -// It also allows a 'cheaper' route to get the project options relevant to parsing (e.g. the #define values). -// The main entrypoints are TryGetOptionsForDocumentOrProject and TryGetOptionsForEditingDocumentOrProject. -[); Composition.Shared>] -type internal FSharpProjectOptionsManager - [] - ( - checkerProvider: FSharpCheckerProvider, - [)>] workspace: VisualStudioWorkspaceImpl, - [)>] serviceProvider: System.IServiceProvider, - settings: EditorOptions - ) = - - // A table of information about projects, excluding single-file projects. - let projectOptionsTable = FSharpProjectOptionsTable() - - // A table of information about single-file projects. Currently we only need the load time of each such file, plus - // the original options for editing - let singleFileProjectTable = ConcurrentDictionary() - - let tryGetOrCreateProjectId (projectFileName:string) = - let projectDisplayName = projectDisplayNameOf projectFileName - Some (workspace.ProjectTracker.GetOrCreateProjectIdForPath(projectFileName, projectDisplayName)) - - /// Retrieve the projectOptionsTable - member __.FSharpOptions = projectOptionsTable - - /// Clear a project from the project table - member this.ClearInfoForProject(projectId:ProjectId) = projectOptionsTable.ClearInfoForProject(projectId) - - /// Clear a project from the single file project table - member this.ClearInfoForSingleFileProject(projectId) = - singleFileProjectTable.TryRemove(projectId) |> ignore - - /// Update a project in the single file project table - member this.AddOrUpdateSingleFileProject(projectId, data) = singleFileProjectTable.[projectId] <- data - - /// Get the exact options for a single-file script - member this.ComputeSingleFileOptions (tryGetOrCreateProjectId, fileName, loadTime, fileContents) = - async { - let extraProjectInfo = Some(box workspace) - if SourceFile.MustBeSingleFileProject(fileName) then - // NOTE: we don't use a unique stamp for single files, instead comparing options structurally. - // This is because we repeatedly recompute the options. - let optionsStamp = None - let! options, _diagnostics = checkerProvider.Checker.GetProjectOptionsFromScript(fileName, fileContents, loadTime, [| |], ?extraProjectInfo=extraProjectInfo, ?optionsStamp=optionsStamp) - // NOTE: we don't use FCS cross-project references from scripts to projects. THe projects must have been - // compiled and #r will refer to files on disk - let referencedProjectFileNames = [| |] - let site = ProjectSitesAndFiles.CreateProjectSiteForScript(fileName, referencedProjectFileNames, options) - let deps, projectOptions = ProjectSitesAndFiles.GetProjectOptionsForProjectSite(settings.LanguageServicePerformance.EnableInMemoryCrossProjectReferences, site, serviceProvider, (tryGetOrCreateProjectId fileName), fileName, options.ExtraProjectInfo, Some projectOptionsTable) - let parsingOptions, _ = checkerProvider.Checker.GetParsingOptionsFromProjectOptions(projectOptions) - return (deps, parsingOptions, projectOptions) - else - let site = ProjectSitesAndFiles.ProjectSiteOfSingleFile(fileName) - let deps, projectOptions = ProjectSitesAndFiles.GetProjectOptionsForProjectSite(settings.LanguageServicePerformance.EnableInMemoryCrossProjectReferences, site, serviceProvider, (tryGetOrCreateProjectId fileName), fileName, extraProjectInfo, Some projectOptionsTable) - let parsingOptions, _ = checkerProvider.Checker.GetParsingOptionsFromProjectOptions(projectOptions) - return (deps, parsingOptions, projectOptions) - } - - /// Update the info for a project in the project table - member this.UpdateProjectInfo(tryGetOrCreateProjectId, projectId, site, userOpName, invalidateConfig) = - Logger.Log LogEditorFunctionId.LanguageService_UpdateProjectInfo - projectOptionsTable.AddOrUpdateProject(projectId, (fun isRefresh -> - let extraProjectInfo = Some(box workspace) - let referencedProjects, projectOptions = ProjectSitesAndFiles.GetProjectOptionsForProjectSite(settings.LanguageServicePerformance.EnableInMemoryCrossProjectReferences, site, serviceProvider, Some(projectId), site.ProjectFileName, extraProjectInfo, Some projectOptionsTable) - if invalidateConfig then checkerProvider.Checker.InvalidateConfiguration(projectOptions, startBackgroundCompileIfAlreadySeen = not isRefresh, userOpName = userOpName + ".UpdateProjectInfo") - let referencedProjectIds = referencedProjects |> Array.choose tryGetOrCreateProjectId - let parsingOptions, _ = checkerProvider.Checker.GetParsingOptionsFromProjectOptions(projectOptions) - referencedProjectIds, parsingOptions, Some site, projectOptions)) - - /// Get compilation defines relevant for syntax processing. - /// Quicker then TryGetOptionsForDocumentOrProject as it doesn't need to recompute the exact project - /// options for a script. - member this.GetCompilationDefinesForEditingDocument(document:Document) = - let projectOptionsOpt = this.TryGetOptionsForProject(document.Project.Id) - let parsingOptions = - match projectOptionsOpt with - | Some (parsingOptions, _site, _projectOptions) -> parsingOptions - | _ -> { FSharpParsingOptions.Default with IsInteractive = IsScript document.Name } - CompilerEnvironment.GetCompilationDefinesForEditing parsingOptions - - /// Try and get the Options for a project - member this.TryGetOptionsForProject(projectId:ProjectId) = projectOptionsTable.TryGetOptionsForProject(projectId) - - /// Get the exact options for a document or project - member this.TryGetOptionsForDocumentOrProject(document: Document) = - async { - let projectId = document.Project.Id - - // The options for a single-file script project are re-requested each time the file is analyzed. This is because the - // single-file project may contain #load and #r references which are changing as the user edits, and we may need to re-analyze - // to determine the latest settings. FCS keeps a cache to help ensure these are up-to-date. - match singleFileProjectTable.TryGetValue(projectId) with - | true, (loadTime, _, _) -> - try - let fileName = document.FilePath - let! cancellationToken = Async.CancellationToken - let! sourceText = document.GetTextAsync(cancellationToken) |> Async.AwaitTask - // NOTE: we don't use FCS cross-project references from scripts to projects. The projects must have been - // compiled and #r will refer to files on disk. - let tryGetOrCreateProjectId _ = None - let! _referencedProjectFileNames, parsingOptions, projectOptions = this.ComputeSingleFileOptions (tryGetOrCreateProjectId, fileName, loadTime, sourceText.ToString()) - this.AddOrUpdateSingleFileProject(projectId, (loadTime, parsingOptions, projectOptions)) - return Some (parsingOptions, None, projectOptions) - with ex -> - Assert.Exception(ex) - return None - | _ -> return this.TryGetOptionsForProject(projectId) - } - - /// Get the options for a document or project relevant for syntax processing. - /// Quicker then TryGetOptionsForDocumentOrProject as it doesn't need to recompute the exact project options for a script. - member this.TryGetOptionsForEditingDocumentOrProject(document:Document) = - let projectId = document.Project.Id - match singleFileProjectTable.TryGetValue(projectId) with - | true, (_loadTime, parsingOptions, originalOptions) -> Some (parsingOptions, originalOptions) - | _ -> this.TryGetOptionsForProject(projectId) |> Option.map(fun (parsingOptions, _, projectOptions) -> parsingOptions, projectOptions) - - /// get a siteprovider - member this.ProvideProjectSiteProvider(project:Project) = provideProjectSiteProvider(workspace, project, serviceProvider, Some projectOptionsTable) - - /// Tell the checker to update the project info for the specified project id - member this.UpdateProjectInfoWithProjectId(projectId:ProjectId, userOpName, invalidateConfig) = - let hier = workspace.GetHierarchy(projectId) - match hier with - | null -> () - | h when (h.IsCapabilityMatch("CPS")) -> - let project = workspace.CurrentSolution.GetProject(projectId) - if not (isNull project) then - let siteProvider = this.ProvideProjectSiteProvider(project) - let projectSite = siteProvider.GetProjectSite() - if projectSite.CompilationSourceFiles.Length <> 0 then - this.UpdateProjectInfo(tryGetOrCreateProjectId, projectId, projectSite, userOpName, invalidateConfig) - | _ -> () - - /// Tell the checker to update the project info for the specified project id - member this.UpdateDocumentInfoWithProjectId(projectId:ProjectId, documentId:DocumentId, userOpName, invalidateConfig) = - if workspace.IsDocumentOpen(documentId) then - this.UpdateProjectInfoWithProjectId(projectId, userOpName, invalidateConfig) - - [] - /// This handles commandline change notifications from the Dotnet Project-system - /// Prior to VS 15.7 path contained path to project file, post 15.7 contains target binpath - /// binpath is more accurate because a project file can have multiple in memory projects based on configuration - member this.HandleCommandLineChanges(path:string, sources:ImmutableArray, references:ImmutableArray, options:ImmutableArray) = - use _logBlock = Logger.LogBlock(LogEditorFunctionId.LanguageService_HandleCommandLineArgs) - - let projectId = - match workspace.ProjectTracker.TryGetProjectByBinPath(path) with - | true, project -> project.Id - | false, _ -> workspace.ProjectTracker.GetOrCreateProjectIdForPath(path, projectDisplayNameOf path) - let project = workspace.ProjectTracker.GetProject(projectId) - let path = project.ProjectFilePath - let fullPath p = - if Path.IsPathRooted(p) || path = null then p - else Path.Combine(Path.GetDirectoryName(path), p) - let sourcePaths = sources |> Seq.map(fun s -> fullPath s.Path) |> Seq.toArray - let referencePaths = references |> Seq.map(fun r -> fullPath r.Reference) |> Seq.toArray - - projectOptionsTable.SetOptionsWithProjectId(projectId, sourcePaths, referencePaths, options.ToArray()) - this.UpdateProjectInfoWithProjectId(projectId, "HandleCommandLineChanges", invalidateConfig=true) - - member __.Checker = checkerProvider.Checker - // Used to expose FSharpChecker/ProjectInfo manager to diagnostic providers // Diagnostic providers can be executed in environment that does not use MEF so they can rely only // on services exposed by the workspace @@ -394,7 +159,7 @@ type internal FSharpPackage() as this = override this.RoslynLanguageName = FSharpConstants.FSharpLanguageName override this.CreateWorkspace() = this.ComponentModel.GetService() - override this.CreateLanguageService() = FSharpLanguageService(this) + override this.CreateLanguageService() = FSharpLanguageService(this, this.GetService(typeof) :?> IVsSolution) override this.CreateEditorFactories() = seq { yield FSharpEditorFactory(this) :> IVsEditorFactory } override this.RegisterMiscellaneousFilesWorkspaceInformation(_) = () @@ -405,7 +170,7 @@ type internal FSharpPackage() as this = GetToolWindowAsITestVFSI().GetMostRecentLines(n) [] -type internal FSharpLanguageService(package : FSharpPackage) = +type internal FSharpLanguageService(package : FSharpPackage, solution: IVsSolution) = inherit AbstractLanguageService(package) let projectInfoManager = package.ComponentModel.DefaultExportProvider.GetExport().Value @@ -423,207 +188,25 @@ type internal FSharpLanguageService(package : FSharpPackage) = project.Dispose() | _ -> () - let invalidPathChars = set (Path.GetInvalidPathChars()) - let isPathWellFormed (path: string) = not (String.IsNullOrWhiteSpace path) && path |> Seq.forall (fun c -> not (Set.contains c invalidPathChars)) - let tryGetOrCreateProjectId (workspace: VisualStudioWorkspaceImpl) (projectFileName: string) = let projectDisplayName = projectDisplayNameOf projectFileName Some (workspace.ProjectTracker.GetOrCreateProjectIdForPath(projectFileName, projectDisplayName)) - let optionsAssociation = ConditionalWeakTable() - - member private this.OnProjectAdded(projectId:ProjectId) = projectInfoManager.UpdateProjectInfoWithProjectId(projectId, "OnProjectAdded", invalidateConfig=true) - member private this.OnProjectReloaded(projectId:ProjectId) = projectInfoManager.UpdateProjectInfoWithProjectId(projectId, "OnProjectReloaded", invalidateConfig=true) - member private this.OnProjectRemoved(projectId) = projectInfoManager.ClearInfoForProject(projectId) - member private this.OnDocumentAdded(projectId:ProjectId, documentId:DocumentId) = projectInfoManager.UpdateDocumentInfoWithProjectId(projectId, documentId, "OnDocumentAdded", invalidateConfig=true) - member private this.OnDocumentReloaded(projectId:ProjectId, documentId:DocumentId) = projectInfoManager.UpdateDocumentInfoWithProjectId(projectId, documentId, "OnDocumentReloaded", invalidateConfig=true) + let mutable legacyProjectWorkspaceMap = Unchecked.defaultof override this.Initialize() = base.Initialize() - let workspaceChanged (args:WorkspaceChangeEventArgs) = - match args.Kind with - | WorkspaceChangeKind.ProjectAdded -> this.OnProjectAdded(args.ProjectId) - | WorkspaceChangeKind.ProjectReloaded -> this.OnProjectReloaded(args.ProjectId) - | WorkspaceChangeKind.ProjectRemoved -> this.OnProjectRemoved(args.ProjectId) - | WorkspaceChangeKind.DocumentAdded -> this.OnDocumentAdded(args.ProjectId, args.DocumentId) - | WorkspaceChangeKind.DocumentReloaded -> this.OnDocumentReloaded(args.ProjectId, args.DocumentId) - | WorkspaceChangeKind.DocumentRemoved - | WorkspaceChangeKind.AdditionalDocumentAdded - | WorkspaceChangeKind.AdditionalDocumentReloaded - | WorkspaceChangeKind.AdditionalDocumentRemoved - | WorkspaceChangeKind.AdditionalDocumentChanged - | WorkspaceChangeKind.DocumentInfoChanged - | WorkspaceChangeKind.DocumentChanged - | WorkspaceChangeKind.SolutionAdded - | WorkspaceChangeKind.SolutionChanged - | WorkspaceChangeKind.SolutionReloaded - | WorkspaceChangeKind.SolutionCleared - | _ -> () - this.Workspace.Options <- this.Workspace.Options.WithChangedOption(Completion.CompletionOptions.BlockForCompletionItems, FSharpConstants.FSharpLanguageName, false) this.Workspace.Options <- this.Workspace.Options.WithChangedOption(Shared.Options.ServiceFeatureOnOffOptions.ClosedFileDiagnostic, FSharpConstants.FSharpLanguageName, Nullable false) - this.Workspace.WorkspaceChanged.Add(workspaceChanged) - this.Workspace.DocumentClosed.Add <| fun args -> tryRemoveSingleFileProject args.Document.Project.Id - - Events.SolutionEvents.OnAfterCloseSolution.Add <| fun _ -> - //checkerProvider.Checker.StopBackgroundCompile() - - // FUTURE: consider enbling some or all of these to flush all caches and stop all background builds. However the operations - // are asynchronous and we need to decide if we stop everything synchronously. - //checker.ClearLanguageServiceRootCachesAndCollectAndFinalizeAllTransients() - //checkerProvider.Checker.InvalidateAll() - - singleFileProjects.Keys |> Seq.iter tryRemoveSingleFileProject - - let ctx = System.Threading.SynchronizationContext.Current - - let rec setupProjectsAfterSolutionOpen() = - async { - use openedProjects = MailboxProcessor.Start <| fun inbox -> - async { - // waits for AfterOpenSolution and then starts projects setup - do! Async.AwaitEvent Events.SolutionEvents.OnAfterOpenSolution |> Async.Ignore - while true do - let! siteProvider = inbox.Receive() - do! Async.SwitchToContext ctx - this.SetupProjectFile(siteProvider, this.Workspace, "SetupProjectsAfterSolutionOpen") - do! Async.SwitchToThreadPool() - } - - use _ = Events.SolutionEvents.OnAfterOpenProject |> Observable.subscribe ( fun args -> - match args.Hierarchy with - | :? IProvideProjectSite as siteProvider -> openedProjects.Post(siteProvider) - | _ -> () ) + this.Workspace.DocumentClosed.Add <| fun args -> tryRemoveSingleFileProject args.Document.Project.Id - do! Async.AwaitEvent Events.SolutionEvents.OnAfterCloseSolution |> Async.Ignore - do! setupProjectsAfterSolutionOpen() - } - setupProjectsAfterSolutionOpen() |> Async.StartImmediate + legacyProjectWorkspaceMap <- LegacyProjectWorkspaceMap(this.Workspace, solution, projectInfoManager, package.ComponentModel.GetService(), this.SystemServiceProvider) + legacyProjectWorkspaceMap.Initialize() let theme = package.ComponentModel.DefaultExportProvider.GetExport().Value theme.SetColors() - - /// Sync the Roslyn information for the project held in 'projectContext' to match the information given by 'site'. - /// Also sync the info in ProjectInfoManager if necessary. - member this.SyncProject(projectContext: IWorkspaceProjectContext, site: IProjectSite, workspace: VisualStudioWorkspaceImpl, forceUpdate, userOpName) = - let wellFormedFilePathSetIgnoreCase (paths: seq) = - HashSet(paths |> Seq.filter isPathWellFormed |> Seq.map (fun s -> try Path.GetFullPath(s) with _ -> s), StringComparer.OrdinalIgnoreCase) - - let mutable updated = forceUpdate - - let project = workspace.CurrentSolution.Projects |> Seq.filter (fun p -> p.Name = projectContext.DisplayName) |> Seq.exactlyOne - - // Sync the source files in projectContext. Note that these source files are __not__ maintained in order in projectContext - // as edits are made. It seems this is ok because the source file list is only used to drive roslyn per-file checking. - let updatedFiles = site.CompilationSourceFiles |> wellFormedFilePathSetIgnoreCase - let originalFiles = project.Documents |> Seq.map (fun file -> file.FilePath) |> wellFormedFilePathSetIgnoreCase - - for file in updatedFiles do - if not(originalFiles.Contains(file)) then - projectContext.AddSourceFile(file) - updated <- true - - for file in originalFiles do - if not(updatedFiles.Contains(file)) then - projectContext.RemoveSourceFile(file) - updated <- true - - let updatedRefs = site.CompilationReferences |> wellFormedFilePathSetIgnoreCase - let originalRefs = project.MetadataReferences |> Enumerable.OfType |> Seq.map (fun ref -> ref.FilePath) |> wellFormedFilePathSetIgnoreCase - - for ref in updatedRefs do - if not(originalRefs.Contains(ref)) then - projectContext.AddMetadataReference(ref, MetadataReferenceProperties.Assembly) - updated <- true - - for ref in originalRefs do - if not(updatedRefs.Contains(ref)) then - projectContext.RemoveMetadataReference(ref) - updated <- true - - // Update the project options association - let ok,originalOptions = optionsAssociation.TryGetValue(projectContext) - let updatedOptions = site.CompilationOptions - if not ok || originalOptions <> updatedOptions then - - // OK, project options have changed, try to fake out Roslyn to convince it to reparse things. - // Calling SetOptions fails because the CPS project system being used by the F# project system - // imlpementation at the moment has no command line parser installed, so we remove/add all the files - // instead. A change of flags doesn't happen very often and the remove/add is fast in any case. - //projectContext.SetOptions(String.concat " " updatedOptions) - for file in updatedFiles do - projectContext.RemoveSourceFile(file) - projectContext.AddSourceFile(file) - - // Record the last seen options as an associated value - if ok then optionsAssociation.Remove(projectContext) |> ignore - optionsAssociation.Add(projectContext, updatedOptions) - - updated <- true - - // update the cached options - if updated then - projectInfoManager.UpdateProjectInfo(tryGetOrCreateProjectId workspace, project.Id, site, userOpName + ".SyncProject", invalidateConfig=true) - - member this.SetupProjectFile(siteProvider: IProvideProjectSite, workspace: VisualStudioWorkspaceImpl, userOpName) = - let userOpName = userOpName + ".SetupProjectFile" - let rec setup (site: IProjectSite) = - let projectGuid = Guid(site.ProjectGuid) - let projectFileName = site.ProjectFileName - let projectDisplayName = projectDisplayNameOf projectFileName - - // This projectId is not guaranteed to be the same ProjectId that will actually be created once we call CreateProjectContext - // in Roslyn versions once https://github.com/dotnet/roslyn/pull/26931 is merged. Roslyn will still guarantee that once - // there is a project in the workspace with the same path, it'll return the ID of that. So this is sufficient to use - // in that case as long as we only use it to call GetProject. - let fakeProjectId = workspace.ProjectTracker.GetOrCreateProjectIdForPath(projectFileName, projectDisplayName) - - if isNull (workspace.ProjectTracker.GetProject fakeProjectId) then - let projectContextFactory = package.ComponentModel.GetService(); - - let hierarchy = - site.ProjectProvider - |> Option.map (fun p -> p :?> IVsHierarchy) - |> Option.toObj - - // Roslyn is expecting site to be an IVsHierarchy. - // It just so happens that the object that implements IProvideProjectSite is also - // an IVsHierarchy. This assertion is to ensure that the assumption holds true. - Debug.Assert(not (isNull hierarchy), "About to CreateProjectContext with a non-hierarchy site") - - let projectContext = - projectContextFactory.CreateProjectContext( - FSharpConstants.FSharpLanguageName, - projectDisplayName, - projectFileName, - projectGuid, - hierarchy, - Option.toObj site.CompilationBinOutputPath) - - // The real project ID that was actually added. See comments for fakeProjectId why this one is actually good. - let realProjectId = workspace.ProjectTracker.GetOrCreateProjectIdForPath(projectFileName, projectDisplayName) - - // Sync IProjectSite --> projectContext, and IProjectSite --> ProjectInfoManage - this.SyncProject(projectContext, site, workspace, forceUpdate=true, userOpName=userOpName) - - site.BuildErrorReporter <- Some (projectContext :?> Microsoft.VisualStudio.Shell.Interop.IVsLanguageServiceBuildErrorReporter2) - - // TODO: consider forceUpdate = false here. forceUpdate=true may be causing repeated computation? - site.AdviseProjectSiteChanges(FSharpConstants.FSharpLanguageServiceCallbackName, - AdviseProjectSiteChanges(fun () -> this.SyncProject(projectContext, site, workspace, forceUpdate=true, userOpName="AdviseProjectSiteChanges."+userOpName))) - - site.AdviseProjectSiteClosed(FSharpConstants.FSharpLanguageServiceCallbackName, - AdviseProjectSiteChanges(fun () -> - projectInfoManager.ClearInfoForProject(realProjectId) - optionsAssociation.Remove(projectContext) |> ignore - projectContext.Dispose())) - - for referencedSite in ProjectSitesAndFiles.GetReferencedProjectSites(Some realProjectId, site, this.SystemServiceProvider, Some (this.Workspace :>obj), Some projectInfoManager.FSharpOptions ) do - setup referencedSite - - setup (siteProvider.GetProjectSite()) member this.SetupStandAloneFile(fileName: string, fileContents: string, workspace: VisualStudioWorkspaceImpl, hier: IVsHierarchy) = let loadTime = DateTime.Now @@ -683,11 +266,10 @@ type internal FSharpLanguageService(package : FSharpPackage) = // CPS Projects, out-of-project file and script files don't match hier with - | :? IProvideProjectSite as siteProvider when not (IsScript(filename)) -> + | :? IProvideProjectSite as _siteProvider when not (IsScript(filename)) -> // This is the path for .fs/.fsi files in legacy projects - - this.SetupProjectFile(siteProvider, this.Workspace, "SetupNewTextView") + () | h when not (isNull h) && not (IsScript(filename)) -> let docId = this.Workspace.CurrentSolution.GetDocumentIdsWithFilePath(filename).FirstOrDefault() match docId with @@ -707,4 +289,4 @@ type internal FSharpLanguageService(package : FSharpPackage) = this.SetupStandAloneFile(filename, fileContents, this.Workspace, hier) | _ -> () - | _ -> () \ No newline at end of file + | _ -> () diff --git a/vsintegration/src/FSharp.Editor/LanguageService/LegacyProjectWorkspaceMap.fs b/vsintegration/src/FSharp.Editor/LanguageService/LegacyProjectWorkspaceMap.fs new file mode 100644 index 00000000000..dfca72cba99 --- /dev/null +++ b/vsintegration/src/FSharp.Editor/LanguageService/LegacyProjectWorkspaceMap.fs @@ -0,0 +1,201 @@ +// Copyright (c) Microsoft Corporation. All Rights Reserved. See License.txt in the project root for license information. + +namespace Microsoft.VisualStudio.FSharp.Editor + +#nowarn "40" + +open System +open System.Collections.Concurrent +open System.Collections.Generic +open System.Diagnostics +open System.IO +open System.Linq +open System.Runtime.CompilerServices +open Microsoft.CodeAnalysis +open Microsoft.VisualStudio +open Microsoft.VisualStudio.FSharp.Editor +open Microsoft.VisualStudio.FSharp.Editor.SiteProvider +open Microsoft.VisualStudio.LanguageServices.Implementation.ProjectSystem +open Microsoft.VisualStudio.LanguageServices.ProjectSystem +open Microsoft.VisualStudio.Shell.Interop + +[] +type internal LegacyProjectWorkspaceMap(workspace: VisualStudioWorkspaceImpl, + solution: IVsSolution, + projectInfoManager: FSharpProjectOptionsManager, + projectContextFactory: IWorkspaceProjectContextFactory, + serviceProvider: IServiceProvider) as this = + + let invalidPathChars = set (Path.GetInvalidPathChars()) + let optionsAssociation = ConditionalWeakTable() + let isPathWellFormed (path: string) = not (String.IsNullOrWhiteSpace path) && path |> Seq.forall (fun c -> not (Set.contains c invalidPathChars)) + + let legacyProjectLookup = ConcurrentDictionary() + + let tryGetOrCreateProjectId (workspace: VisualStudioWorkspaceImpl) (projectFileName: string) = + let projectDisplayName = projectDisplayNameOf projectFileName + Some (workspace.ProjectTracker.GetOrCreateProjectIdForPath(projectFileName, projectDisplayName)) + + member this.Initialize() = + solution.AdviseSolutionEvents(this) |> ignore + + /// Sync the Roslyn information for the project held in 'projectContext' to match the information given by 'site'. + /// Also sync the info in ProjectInfoManager if necessary. + member this.SyncLegacyProject(projectId: ProjectId, projectContext: IWorkspaceProjectContext, site: IProjectSite, workspace: VisualStudioWorkspaceImpl, forceUpdate, userOpName) = + let wellFormedFilePathSetIgnoreCase (paths: seq) = + HashSet(paths |> Seq.filter isPathWellFormed |> Seq.map (fun s -> try Path.GetFullPath(s) with _ -> s), StringComparer.OrdinalIgnoreCase) + + let mutable updated = forceUpdate + + // Sync the source files in projectContext. Note that these source files are __not__ maintained in order in projectContext + // as edits are made. It seems this is ok because the source file list is only used to drive roslyn per-file checking. + let updatedFiles = site.CompilationSourceFiles |> wellFormedFilePathSetIgnoreCase + let originalFiles = + match legacyProjectLookup.TryGetValue(projectId) with + | true, (originalFiles, _) -> originalFiles + | _ -> HashSet() + + for file in updatedFiles do + if not(originalFiles.Contains(file)) then + projectContext.AddSourceFile(file) + updated <- true + + for file in originalFiles do + if not(updatedFiles.Contains(file)) then + projectContext.RemoveSourceFile(file) + updated <- true + + let updatedRefs = site.CompilationReferences |> wellFormedFilePathSetIgnoreCase + let originalRefs = + match legacyProjectLookup.TryGetValue(projectId) with + | true, (_, originalRefs) -> originalRefs + | _ -> HashSet() + + for ref in updatedRefs do + if not(originalRefs.Contains(ref)) then + projectContext.AddMetadataReference(ref, MetadataReferenceProperties.Assembly) + updated <- true + + for ref in originalRefs do + if not(updatedRefs.Contains(ref)) then + projectContext.RemoveMetadataReference(ref) + updated <- true + + // Update the project options association + let ok,originalOptions = optionsAssociation.TryGetValue(projectContext) + let updatedOptions = site.CompilationOptions + if not ok || originalOptions <> updatedOptions then + + // OK, project options have changed, try to fake out Roslyn to convince it to reparse things. + // Calling SetOptions fails because the CPS project system being used by the F# project system + // imlpementation at the moment has no command line parser installed, so we remove/add all the files + // instead. A change of flags doesn't happen very often and the remove/add is fast in any case. + //projectContext.SetOptions(String.concat " " updatedOptions) + for file in updatedFiles do + projectContext.RemoveSourceFile(file) + projectContext.AddSourceFile(file) + + // Record the last seen options as an associated value + if ok then optionsAssociation.Remove(projectContext) |> ignore + optionsAssociation.Add(projectContext, updatedOptions) + + updated <- true + + // update the cached options + if updated then + projectInfoManager.UpdateProjectInfo(tryGetOrCreateProjectId workspace, projectId, site, userOpName + ".SyncLegacyProject", invalidateConfig=true) + + let info = (updatedFiles, updatedRefs) + legacyProjectLookup.AddOrUpdate(projectId, info, fun _ _ -> info) |> ignore + + member this.SetupLegacyProjectFile(siteProvider: IProvideProjectSite, workspace: VisualStudioWorkspaceImpl, userOpName) = + let userOpName = userOpName + ".SetupProjectFile" + let rec setup (site: IProjectSite) = + let projectGuid = Guid(site.ProjectGuid) + let projectFileName = site.ProjectFileName + let projectDisplayName = projectDisplayNameOf projectFileName + + // This projectId is not guaranteed to be the same ProjectId that will actually be created once we call CreateProjectContext + // in Roslyn versions once https://github.com/dotnet/roslyn/pull/26931 is merged. Roslyn will still guarantee that once + // there is a project in the workspace with the same path, it'll return the ID of that. So this is sufficient to use + // in that case as long as we only use it to call GetProject. + let fakeProjectId = workspace.ProjectTracker.GetOrCreateProjectIdForPath(projectFileName, projectDisplayName) + + if isNull (workspace.ProjectTracker.GetProject fakeProjectId) then + let hierarchy = + site.ProjectProvider + |> Option.map (fun p -> p :?> IVsHierarchy) + |> Option.toObj + + // Roslyn is expecting site to be an IVsHierarchy. + // It just so happens that the object that implements IProvideProjectSite is also + // an IVsHierarchy. This assertion is to ensure that the assumption holds true. + Debug.Assert(not (isNull hierarchy), "About to CreateProjectContext with a non-hierarchy site") + + let projectContext = + projectContextFactory.CreateProjectContext( + FSharpConstants.FSharpLanguageName, + projectDisplayName, + projectFileName, + projectGuid, + hierarchy, + Option.toObj site.CompilationBinOutputPath) + + // The real project ID that was actually added. See comments for fakeProjectId why this one is actually good. + let realProjectId = workspace.ProjectTracker.GetOrCreateProjectIdForPath(projectFileName, projectDisplayName) + + // Sync IProjectSite --> projectContext, and IProjectSite --> ProjectInfoManage + this.SyncLegacyProject(realProjectId, projectContext, site, workspace, forceUpdate=true, userOpName=userOpName) + + site.BuildErrorReporter <- Some (projectContext :?> Microsoft.VisualStudio.Shell.Interop.IVsLanguageServiceBuildErrorReporter2) + + // TODO: consider forceUpdate = false here. forceUpdate=true may be causing repeated computation? + site.AdviseProjectSiteChanges(FSharpConstants.FSharpLanguageServiceCallbackName, + AdviseProjectSiteChanges(fun () -> this.SyncLegacyProject(realProjectId, projectContext, site, workspace, forceUpdate=true, userOpName="AdviseProjectSiteChanges."+userOpName))) + + site.AdviseProjectSiteClosed(FSharpConstants.FSharpLanguageServiceCallbackName, + AdviseProjectSiteChanges(fun () -> + projectInfoManager.ClearInfoForProject(realProjectId) + optionsAssociation.Remove(projectContext) |> ignore + projectContext.Dispose())) + + for referencedSite in ProjectSitesAndFiles.GetReferencedProjectSites(Some realProjectId, site, serviceProvider, Some (workspace :>obj), Some projectInfoManager.FSharpOptions ) do + setup referencedSite + + setup (siteProvider.GetProjectSite()) + + interface IVsSolutionEvents with + + member __.OnAfterCloseSolution(_) = VSConstants.S_OK + + member __.OnAfterLoadProject(_, _) = VSConstants.S_OK + + member __.OnAfterOpenProject(hier, _) = + match hier with + | :? IProvideProjectSite as siteProvider -> + this.SetupLegacyProjectFile(siteProvider, workspace, "LegacyProjectWorkspaceMap.Initialize") + | _ -> () + VSConstants.S_OK + + member __.OnAfterOpenSolution(_, _) = VSConstants.S_OK + + member __.OnBeforeCloseProject(hier, _) = + match hier with + | :? IProvideProjectSite as siteProvider -> + let site = siteProvider.GetProjectSite() + let projectFileName = site.ProjectFileName + let projectDisplayName = projectDisplayNameOf projectFileName + let projectId = workspace.ProjectTracker.GetOrCreateProjectIdForPath(projectFileName, projectDisplayName) + legacyProjectLookup.TryRemove(projectId) |> ignore + | _ -> () + VSConstants.S_OK + + member __.OnBeforeCloseSolution(_) = VSConstants.S_OK + + member __.OnBeforeUnloadProject(_, _) = VSConstants.S_OK + + member __.OnQueryCloseProject(_, _, _) = VSConstants.S_OK + + member __.OnQueryCloseSolution(_, _) = VSConstants.S_OK + + member __.OnQueryUnloadProject(_, _) = VSConstants.S_OK \ No newline at end of file From 18958cad761d8dabc5cbc5ba287c2b8de527c666 Mon Sep 17 00:00:00 2001 From: "Kevin Ransom (msft)" Date: Thu, 27 Sep 2018 15:17:16 -0700 Subject: [PATCH 055/160] Ensure that compiler path is set during Design Time build (#5700) * Ensure that compiler path is set during Design Time build * both build types --- .../FSharp.Editor/Build/SetGlobalPropertiesForSdkProjects.fs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/vsintegration/src/FSharp.Editor/Build/SetGlobalPropertiesForSdkProjects.fs b/vsintegration/src/FSharp.Editor/Build/SetGlobalPropertiesForSdkProjects.fs index f1c49af7496..dde8fbc04bc 100644 --- a/vsintegration/src/FSharp.Editor/Build/SetGlobalPropertiesForSdkProjects.fs +++ b/vsintegration/src/FSharp.Editor/Build/SetGlobalPropertiesForSdkProjects.fs @@ -13,7 +13,8 @@ open Microsoft.VisualStudio.ProjectSystem.Build // We can't use well-known constants here because `string + string` isn't a valid constant expression in F#. [] -[] +[] +[] type internal SetGlobalPropertiesForSdkProjects [] ( From d65b561336170938c44b1a8782a4580132b2e2ea Mon Sep 17 00:00:00 2001 From: Phillip Carter Date: Thu, 27 Sep 2018 15:17:32 -0700 Subject: [PATCH 056/160] Refactor indexer code fix (#5692) --- .../FSharp.Editor/CodeFix/FixIndexerAccess.fs | 21 ++++++++++--------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/vsintegration/src/FSharp.Editor/CodeFix/FixIndexerAccess.fs b/vsintegration/src/FSharp.Editor/CodeFix/FixIndexerAccess.fs index b1b9b5e6879..7c9442c2d81 100644 --- a/vsintegration/src/FSharp.Editor/CodeFix/FixIndexerAccess.fs +++ b/vsintegration/src/FSharp.Editor/CodeFix/FixIndexerAccess.fs @@ -33,17 +33,18 @@ type internal FSharpFixIndexerAccessCodeFixProvider() = let diagnostics = ImmutableArray.Create diagnostic let span,replacement = try - let span = ref context.Span - + let mutable span = context.Span + + let notStartOfBracket (span: TextSpan) = + let t = TextSpan(span.Start, span.Length + 1) + let s = sourceText.GetSubText(t).ToString() + s.[s.Length-1] <> '[' + // skip all braces and blanks until we find [ - while - (!span).End < sourceText.Length && - let t = TextSpan((!span).Start,(!span).Length + 1) - let s = sourceText.GetSubText(t).ToString() - s.[s.Length-1] <> '[' do - span := TextSpan((!span).Start,(!span).Length + 1) - - !span,sourceText.GetSubText(!span).ToString() + while span.End < sourceText.Length && notStartOfBracket span do + span <- TextSpan(span.Start, span.Length + 1) + + span,sourceText.GetSubText(span).ToString() with | _ -> context.Span,sourceText.GetSubText(context.Span).ToString() From 7f7ef16c685e00143a58e37e479eca9e59d34ecc Mon Sep 17 00:00:00 2001 From: Robert Jeppesen Date: Fri, 28 Sep 2018 18:02:06 +0200 Subject: [PATCH 057/160] Optimize ListSet.setify (#5706) --- src/fsharp/lib.fs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/fsharp/lib.fs b/src/fsharp/lib.fs index 3d5e854aff8..18404ba377d 100755 --- a/src/fsharp/lib.fs +++ b/src/fsharp/lib.fs @@ -226,9 +226,8 @@ module ListSet = | (h::t) -> if contains f h l1 then h::intersect f l1 t else intersect f l1 t | [] -> [] - (* NOTE: quadratic! *) // Note: if duplicates appear, keep the ones toward the _front_ of the list - let setify f l = List.foldBack (insert f) (List.rev l) [] |> List.rev + let setify f l = List.fold (fun acc x -> insert f x acc) [] l |> List.rev let hasDuplicates f l = match l with From 6f2cb0d14fa61bde92c12a0dbfae0b7f421c5c46 Mon Sep 17 00:00:00 2001 From: Steffen Forkmann Date: Mon, 1 Oct 2018 15:55:19 +0200 Subject: [PATCH 058/160] We only need to check for mangledGenericTypeNameSym once (#5633) * We only need to check for mangledGenericTypeNameSym once * ShortCut name checking * Reduce number of LastIndexOf calls * Reduce number of LastIndexOf calls * Reduce number of LastIndexOf calls * Incorporate feedback * Use PrettyNaming.DemangleGenericTypeName instead of ungenericizeTypeName * Remove couple of double checks * Update illib.fs --- src/absil/il.fs | 28 ++++------------------ src/absil/il.fsi | 3 --- src/absil/illib.fs | 12 +--------- src/fsharp/CompileOps.fs | 10 ++++---- src/fsharp/NameResolution.fs | 32 ++++++++++++++----------- src/fsharp/NicePrint.fs | 6 ++--- src/fsharp/PrettyNaming.fs | 46 ++++++++++++++++++++---------------- src/fsharp/tast.fs | 7 +++--- 8 files changed, 62 insertions(+), 82 deletions(-) diff --git a/src/absil/il.fs b/src/absil/il.fs index c2314418fe4..b1bf2fdf920 100644 --- a/src/absil/il.fs +++ b/src/absil/il.fs @@ -154,12 +154,11 @@ let unsplitTypeName (ns, n) = | [] -> String.concat "." ns + "." + n | _ -> n -let splitTypeNameRightAux nm = - if String.contains nm '.' then - let idx = String.rindex nm '.' - let s1, s2 = splitNameAt nm idx - Some s1, s2 - else None, nm +let splitTypeNameRightAux (nm:string) = + let idx = nm.LastIndexOf '.' + if idx = -1 then None, nm else + let s1, s2 = splitNameAt nm idx + Some s1, s2 let splitTypeNameRight nm = memoizeNamespaceRightTable.GetOrAdd(nm, splitTypeNameRightAux) @@ -4189,23 +4188,6 @@ let resolveILMethodRef td mref = resolveILMethodRefWithRescope id td mref let mkRefToILModule m = ILModuleRef.Create(m.Name, true, None) - -let ungenericizeTypeName n = - let sym = '`' - if - String.contains n sym && - (* check what comes after the symbol is a number *) - (let m = String.rindex n sym - let res = ref (m < n.Length - 1) - for i = m + 1 to n.Length - 1 do - res := !res && n.[i] >= '0' && n.[i] <= '9' - !res) - then - let pos = String.rindex n sym - String.sub n 0 pos - else n - - type ILEventRef = { erA: ILTypeRef; erB: string } static member Create(a, b) = {erA=a;erB=b} diff --git a/src/absil/il.fsi b/src/absil/il.fsi index 6ed4d42aa33..3362f53d619 100644 --- a/src/absil/il.fsi +++ b/src/absil/il.fsi @@ -1540,9 +1540,6 @@ val typeNameForGlobalFunctions: string val isTypeNameForGlobalFunctions: string -> bool -val ungenericizeTypeName: string -> string (* e.g. List`1 --> List *) - - // ==================================================================== // PART 2 // diff --git a/src/absil/illib.fs b/src/absil/illib.fs index c628700af21..b9ec8eaee68 100644 --- a/src/absil/illib.fs +++ b/src/absil/illib.fs @@ -452,23 +452,13 @@ type String with member inline x.EndsWithOrdinal(value) = x.EndsWith(value, StringComparison.Ordinal) -module String = - let indexNotFound() = raise (new KeyNotFoundException("An index for the character was not found in the string")) - +module String = let make (n: int) (c: char) : string = new String(c, n) let get (str:string) i = str.[i] let sub (s:string) (start:int) (len:int) = s.Substring(start,len) - let index (s:string) (c:char) = - let r = s.IndexOf(c) - if r = -1 then indexNotFound() else r - - let rindex (s:string) (c:char) = - let r = s.LastIndexOf(c) - if r = -1 then indexNotFound() else r - let contains (s:string) (c:char) = s.IndexOf(c) <> -1 let order = LanguagePrimitives.FastGenericComparer diff --git a/src/fsharp/CompileOps.fs b/src/fsharp/CompileOps.fs index d54373c5548..3517d044284 100644 --- a/src/fsharp/CompileOps.fs +++ b/src/fsharp/CompileOps.fs @@ -2609,13 +2609,13 @@ type TcConfigBuilder = member tcConfigB.RemoveReferencedAssemblyByPath (m, path) = tcConfigB.referencedDLLs <- tcConfigB.referencedDLLs |> List.filter (fun ar-> ar.Range <> m || ar.Text <> path) - static member SplitCommandLineResourceInfo ri = - if String.contains ri ',' then - let p = String.index ri ',' + static member SplitCommandLineResourceInfo (ri:string) = + let p = ri.IndexOf ',' + if p <> -1 then let file = String.sub ri 0 p let rest = String.sub ri (p+1) (String.length ri - p - 1) - if String.contains rest ',' then - let p = String.index rest ',' + let p = rest.IndexOf ',' + if p <> -1 then let name = String.sub rest 0 p+".resources" let pubpri = String.sub rest (p+1) (rest.Length - p - 1) if pubpri = "public" then file, name, ILResourceAccess.Public diff --git a/src/fsharp/NameResolution.fs b/src/fsharp/NameResolution.fs index a4cbd0279de..43f7c297ca6 100644 --- a/src/fsharp/NameResolution.fs +++ b/src/fsharp/NameResolution.fs @@ -985,10 +985,8 @@ type TypeNameResolutionStaticArgsInfo = // Get the first possible mangled name of the type, assuming the args are generic args member x.MangledNameForType nm = - if IsMangledGenericName nm || x.NumStaticArgs = 0 then nm - else nm+"`"+string x.NumStaticArgs - - + if x.NumStaticArgs = 0 || TryDemangleGenericNameAndPos nm <> ValueNone then nm + else nm + "`" + string x.NumStaticArgs [] /// Represents information which guides name resolution of types. @@ -1018,7 +1016,11 @@ let LookupTypeNameInEntityHaveArity nm (staticResInfo: TypeNameResolutionStaticA /// Unqualified lookups of type names where the number of generic arguments is known /// from context, e.g. List. Rebindings due to 'open' may have rebound identifiers. let LookupTypeNameInEnvHaveArity fq nm numTyArgs (nenv:NameResolutionEnv) = - let key = if IsMangledGenericName nm then DecodeGenericTypeName nm else NameArityPair(nm,numTyArgs) + let key = + match TryDemangleGenericNameAndPos nm with + | ValueSome pos -> DecodeGenericTypeName pos nm + | _ -> NameArityPair(nm,numTyArgs) + match nenv.TyconsByDemangledNameAndArity(fq).TryFind(key) with | Some res -> Some res | None -> nenv.TyconsByAccessNames(fq).TryFind nm |> Option.map List.head @@ -1041,15 +1043,17 @@ let LookupTypeNameInEnvHaveArity fq nm numTyArgs (nenv:NameResolutionEnv) = // also be used to qualify access if needed, though this is almost never needed. let LookupTypeNameNoArity nm (byDemangledNameAndArity: LayeredMap) (byAccessNames: LayeredMultiMap) = - if IsMangledGenericName nm then - match byDemangledNameAndArity.TryFind (DecodeGenericTypeName nm) with - | Some res -> [res] - | None -> - match byAccessNames.TryFind nm with - | Some res -> res - | None -> [] - else - byAccessNames.[nm] + match TryDemangleGenericNameAndPos nm with + | ValueSome pos -> + let demangled = DecodeGenericTypeName pos nm + match byDemangledNameAndArity.TryFind demangled with + | Some res -> [res] + | None -> + match byAccessNames.TryFind nm with + | Some res -> res + | None -> [] + | _ -> + byAccessNames.[nm] /// Qualified lookup of type names in the environment let LookupTypeNameInEnvNoArity fq nm (nenv: NameResolutionEnv) = diff --git a/src/fsharp/NicePrint.fs b/src/fsharp/NicePrint.fs index ca5fd8c674c..c4ed19f1ee0 100755 --- a/src/fsharp/NicePrint.fs +++ b/src/fsharp/NicePrint.fs @@ -102,7 +102,7 @@ module private PrintIL = open Microsoft.FSharp.Compiler.AbstractIL.IL let fullySplitILTypeRef (tref:ILTypeRef) = - (List.collect IL.splitNamespace (tref.Enclosing @ [IL.ungenericizeTypeName tref.Name])) + (List.collect IL.splitNamespace (tref.Enclosing @ [PrettyNaming.DemangleGenericTypeName tref.Name])) let layoutILTypeRefName denv path = let path = @@ -193,7 +193,7 @@ module private PrintIL = let args = signatur.ArgTypes |> List.map (layoutILType denv ilTyparSubst) let res = match cons with - | Some className -> layoutILTypeRefName denv (SplitNamesForILPath (ungenericizeTypeName className)) ^^ (pruneParms className ilTyparSubst |> paramsL) // special case for constructor return-type (viz., the class itself) + | Some className -> layoutILTypeRefName denv (SplitNamesForILPath (PrettyNaming.DemangleGenericTypeName className)) ^^ (pruneParms className ilTyparSubst |> paramsL) // special case for constructor return-type (viz., the class itself) | None -> signatur.ReturnType |> layoutILType denv ilTyparSubst match args with | [] -> WordL.structUnit ^^ WordL.arrow ^^ res @@ -226,7 +226,7 @@ module private PrintIL = // return type be passed along as the `cons` parameter.) let res = match cons with - | Some className -> layoutILTypeRefName denv (SplitNamesForILPath (ungenericizeTypeName className)) ^^ (pruneParms className ilTyparSubst |> paramsL) // special case for constructor return-type (viz., the class itself) + | Some className -> layoutILTypeRefName denv (SplitNamesForILPath (PrettyNaming.DemangleGenericTypeName className)) ^^ (pruneParms className ilTyparSubst |> paramsL) // special case for constructor return-type (viz., the class itself) | None -> retType |> layoutILType denv ilTyparSubst match parameters with | [] -> WordL.structUnit ^^ WordL.arrow ^^ res diff --git a/src/fsharp/PrettyNaming.fs b/src/fsharp/PrettyNaming.fs index 4756eddc5f6..923be2ccea3 100755 --- a/src/fsharp/PrettyNaming.fs +++ b/src/fsharp/PrettyNaming.fs @@ -484,30 +484,36 @@ module public Microsoft.FSharp.Compiler.PrettyNaming let [] private mangledGenericTypeNameSym = '`' - let IsMangledGenericName (n:string) = - n.IndexOf mangledGenericTypeNameSym <> -1 && + let TryDemangleGenericNameAndPos (n:string) = (* check what comes after the symbol is a number *) - let m = n.LastIndexOf mangledGenericTypeNameSym - let mutable res = m < n.Length - 1 - for i = m + 1 to n.Length - 1 do - res <- res && n.[i] >= '0' && n.[i] <= '9' - res + let pos = n.LastIndexOf mangledGenericTypeNameSym + if pos = -1 then ValueNone else + let mutable res = pos < n.Length - 1 + let mutable i = pos + 1 + while res && i < n.Length do + let char = n.[i] + if not (char >= '0' && char <= '9') then + res <- false + i <- i + 1 + if res then + ValueSome pos + else + ValueNone type NameArityPair = NameArityPair of string * int - let DecodeGenericTypeName n = - if IsMangledGenericName n then - let pos = n.LastIndexOf mangledGenericTypeNameSym - let res = n.Substring(0,pos) - let num = n.Substring(pos+1,n.Length - pos - 1) - NameArityPair(res, int32 num) - else NameArityPair(n,0) - - let DemangleGenericTypeName n = - if IsMangledGenericName n then - let pos = n.LastIndexOf mangledGenericTypeNameSym - n.Substring(0,pos) - else n + let DecodeGenericTypeName pos (mangledName:string) = + let res = mangledName.Substring(0,pos) + let num = mangledName.Substring(pos+1,mangledName.Length - pos - 1) + NameArityPair(res, int32 num) + + let DemangleGenericTypeNameWithPos pos (mangledName:string) = + mangledName.Substring(0,pos) + + let DemangleGenericTypeName (mangledName:string) = + match TryDemangleGenericNameAndPos mangledName with + | ValueSome pos -> DemangleGenericTypeNameWithPos pos mangledName + | _ -> mangledName let private chopStringTo (s:string) (c:char) = match s.IndexOf c with diff --git a/src/fsharp/tast.fs b/src/fsharp/tast.fs index 53b253b1ab7..726d4d1ee04 100644 --- a/src/fsharp/tast.fs +++ b/src/fsharp/tast.fs @@ -480,10 +480,11 @@ let KeyTyconByDemangledNameAndArity nm (typars: _ list) x = /// Generic types can be accessed either by 'List' or 'List`1'. This lists both keys. The second form should really be deprecated. let KeyTyconByAccessNames nm x = - if IsMangledGenericName nm then - let dnm = DemangleGenericTypeName nm + match TryDemangleGenericNameAndPos nm with + | ValueSome pos -> + let dnm = DemangleGenericTypeNameWithPos pos nm [| KeyValuePair(nm,x); KeyValuePair(dnm,x) |] - else + | _ -> [| KeyValuePair(nm,x) |] type ModuleOrNamespaceKind = From ede79027d1acc62d65c83566d45fe217cb08af23 Mon Sep 17 00:00:00 2001 From: Theodore Tsirpanis <12659251+teo-tsirpanis@users.noreply.github.com> Date: Mon, 1 Oct 2018 17:36:42 +0300 Subject: [PATCH 059/160] Add uint16's literal suffix as a valid numeric literal in a compiler error (#5712) --- src/buildfromsource/FSharp.Compiler.Private/FSComp.resx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/buildfromsource/FSharp.Compiler.Private/FSComp.resx b/src/buildfromsource/FSharp.Compiler.Private/FSComp.resx index be8589241b4..a56052a1e9d 100644 --- a/src/buildfromsource/FSharp.Compiler.Private/FSComp.resx +++ b/src/buildfromsource/FSharp.Compiler.Private/FSComp.resx @@ -3082,7 +3082,7 @@ This number is outside the allowable range for 32-bit floats - This is not a valid numeric literal. Valid numeric literals include 1, 0x1, 0b0001 (int), 1u (uint32), 1L (int64), 1UL (uint64), 1s (int16), 1y (sbyte), 1uy (byte), 1.0 (float), 1.0f (float32), 1.0m (decimal), 1I (BigInteger). + This is not a valid numeric literal. Valid numeric literals include 1, 0x1, 0b0001 (int), 1u (uint32), 1L (int64), 1UL (uint64), 1s (int16), 1us (uint16), 1y (sbyte), 1uy (byte), 1.0 (float), 1.0f (float32), 1.0m (decimal), 1I (BigInteger). This is not a valid byte literal @@ -4360,4 +4360,4 @@ This type does not inherit Attribute, it will not work correctly with other .NET languages. - \ No newline at end of file + From e8a7d3daa5e28bab7ad2f371d68ddd95df8f3b5a Mon Sep 17 00:00:00 2001 From: Robert Jeppesen Date: Mon, 1 Oct 2018 17:17:57 +0200 Subject: [PATCH 060/160] Fix #5027: Set VisualFsharpFull VSIX to be default startup project on a fresh clone (#5710) --- VisualFSharp.sln | 56 +++++++++++++++++++----------------------------- 1 file changed, 22 insertions(+), 34 deletions(-) diff --git a/VisualFSharp.sln b/VisualFSharp.sln index e6bcc50bbd2..ea9bbe592d7 100644 --- a/VisualFSharp.sln +++ b/VisualFSharp.sln @@ -1,14 +1,13 @@  Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 15 -VisualStudioVersion = 15.0.27130.2036 +VisualStudioVersion = 15.0.28010.2036 MinimumVisualStudioVersion = 10.0.40219.1 +Project("{6EC3EE1D-3C4E-46DD-8F32-0CC8E7565705}") = "FSharp.VS.FSI", "vsintegration\src\FSharp.VS.FSI\FSharp.VS.FSI.fsproj", "{991DCF75-C2EB-42B6-9A0D-AA1D2409D519}" +EndProject Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "FSharp.Compiler.Private", "src\fsharp\FSharp.Compiler.Private\FSharp.Compiler.Private.fsproj", "{2E4D67B4-522D-4CF7-97E4-BA940F0B18F3}" EndProject -Project("{6EC3EE1D-3C4E-46DD-8F32-0CC8E7565705}") = "FSharp.VS.FSI", "vsintegration\src\FSharp.VS.FSI\FSharp.VS.FSI.fsproj", "{991DCF75-C2EB-42B6-9A0D-AA1D2409D519}" - ProjectSection(ProjectDependencies) = postProject - {2E4D67B4-522D-4CF7-97E4-BA940F0B18F3} = {2E4D67B4-522D-4CF7-97E4-BA940F0B18F3} - EndProjectSection +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "VisualFSharpFull", "vsintegration\Vsix\VisualFSharpFull\VisualFSharpFull.csproj", "{59ADCE46-9740-4079-834D-9A03A3494EBC}" EndProject Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "FSharp.Compiler.Server.Shared", "src\fsharp\FSharp.Compiler.Server.Shared\FSharp.Compiler.Server.Shared.fsproj", "{D5870CF0-ED51-4CBC-B3D7-6F56DA84AC06}" EndProject @@ -65,14 +64,8 @@ EndProject Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "FSharp.Compiler.Interactive.Settings", "src\fsharp\FSharp.Compiler.Interactive.Settings\FSharp.Compiler.Interactive.Settings.fsproj", "{649FA588-F02E-457C-9FCF-87E46407481E}" EndProject Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "FsiAnyCPU", "src\fsharp\fsiAnyCpu\FsiAnyCPU.fsproj", "{8B3E283D-B5FE-4055-9D80-7E3A32F3967B}" - ProjectSection(ProjectDependencies) = postProject - {649FA588-F02E-457C-9FCF-87E46407481E} = {649FA588-F02E-457C-9FCF-87E46407481E} - EndProjectSection EndProject Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "Fsi", "src\fsharp\fsi\Fsi.fsproj", "{D0E98C0D-490B-4C61-9329-0862F6E87645}" - ProjectSection(ProjectDependencies) = postProject - {649FA588-F02E-457C-9FCF-87E46407481E} = {649FA588-F02E-457C-9FCF-87E46407481E} - EndProjectSection EndProject Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "FSharp.Tests.FSharpSuite", "tests\fsharp\FSharp.Tests.FSharpSuite.fsproj", "{C163E892-5BF7-4B59-AA99-B0E8079C67C4}" EndProject @@ -115,10 +108,6 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TextFile", "vsintegration\I EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "XMLFile", "vsintegration\ItemTemplates\XMLFile\XMLFile.csproj", "{1FB1DD07-06AA-45B4-B5AC-20FF5BEE98B6}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Vsix", "Vsix", "{141F6C23-E1B1-4D89-9F10-F0B8AD58E71F}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "VisualFSharpFull", "vsintegration\Vsix\VisualFSharpFull\VisualFSharpFull.csproj", "{59ADCE46-9740-4079-834D-9A03A3494EBC}" -EndProject Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "HostedCompilerServer", "tests\fsharpqa\testenv\src\HostedCompilerServer\HostedCompilerServer.fsproj", "{4239EFEA-E746-446A-BF7A-51FCBAB13946}" EndProject Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "ILComparer", "tests\fsharpqa\testenv\src\ILComparer\ILComparer.fsproj", "{2E60864A-E3FF-4BCC-810F-DC7C34E6B236}" @@ -155,14 +144,6 @@ Global Release|x86 = Release|x86 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution - {2E4D67B4-522D-4CF7-97E4-BA940F0B18F3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {2E4D67B4-522D-4CF7-97E4-BA940F0B18F3}.Debug|Any CPU.Build.0 = Debug|Any CPU - {2E4D67B4-522D-4CF7-97E4-BA940F0B18F3}.Debug|x86.ActiveCfg = Debug|Any CPU - {2E4D67B4-522D-4CF7-97E4-BA940F0B18F3}.Debug|x86.Build.0 = Debug|Any CPU - {2E4D67B4-522D-4CF7-97E4-BA940F0B18F3}.Release|Any CPU.ActiveCfg = Release|Any CPU - {2E4D67B4-522D-4CF7-97E4-BA940F0B18F3}.Release|Any CPU.Build.0 = Release|Any CPU - {2E4D67B4-522D-4CF7-97E4-BA940F0B18F3}.Release|x86.ActiveCfg = Release|Any CPU - {2E4D67B4-522D-4CF7-97E4-BA940F0B18F3}.Release|x86.Build.0 = Release|Any CPU {991DCF75-C2EB-42B6-9A0D-AA1D2409D519}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {991DCF75-C2EB-42B6-9A0D-AA1D2409D519}.Debug|Any CPU.Build.0 = Debug|Any CPU {991DCF75-C2EB-42B6-9A0D-AA1D2409D519}.Debug|x86.ActiveCfg = Debug|Any CPU @@ -171,6 +152,22 @@ Global {991DCF75-C2EB-42B6-9A0D-AA1D2409D519}.Release|Any CPU.Build.0 = Release|Any CPU {991DCF75-C2EB-42B6-9A0D-AA1D2409D519}.Release|x86.ActiveCfg = Release|Any CPU {991DCF75-C2EB-42B6-9A0D-AA1D2409D519}.Release|x86.Build.0 = Release|Any CPU + {2E4D67B4-522D-4CF7-97E4-BA940F0B18F3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {2E4D67B4-522D-4CF7-97E4-BA940F0B18F3}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2E4D67B4-522D-4CF7-97E4-BA940F0B18F3}.Debug|x86.ActiveCfg = Debug|Any CPU + {2E4D67B4-522D-4CF7-97E4-BA940F0B18F3}.Debug|x86.Build.0 = Debug|Any CPU + {2E4D67B4-522D-4CF7-97E4-BA940F0B18F3}.Release|Any CPU.ActiveCfg = Release|Any CPU + {2E4D67B4-522D-4CF7-97E4-BA940F0B18F3}.Release|Any CPU.Build.0 = Release|Any CPU + {2E4D67B4-522D-4CF7-97E4-BA940F0B18F3}.Release|x86.ActiveCfg = Release|Any CPU + {2E4D67B4-522D-4CF7-97E4-BA940F0B18F3}.Release|x86.Build.0 = Release|Any CPU + {59ADCE46-9740-4079-834D-9A03A3494EBC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {59ADCE46-9740-4079-834D-9A03A3494EBC}.Debug|Any CPU.Build.0 = Debug|Any CPU + {59ADCE46-9740-4079-834D-9A03A3494EBC}.Debug|x86.ActiveCfg = Debug|Any CPU + {59ADCE46-9740-4079-834D-9A03A3494EBC}.Debug|x86.Build.0 = Debug|Any CPU + {59ADCE46-9740-4079-834D-9A03A3494EBC}.Release|Any CPU.ActiveCfg = Release|Any CPU + {59ADCE46-9740-4079-834D-9A03A3494EBC}.Release|Any CPU.Build.0 = Release|Any CPU + {59ADCE46-9740-4079-834D-9A03A3494EBC}.Release|x86.ActiveCfg = Release|Any CPU + {59ADCE46-9740-4079-834D-9A03A3494EBC}.Release|x86.Build.0 = Release|Any CPU {D5870CF0-ED51-4CBC-B3D7-6F56DA84AC06}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {D5870CF0-ED51-4CBC-B3D7-6F56DA84AC06}.Debug|Any CPU.Build.0 = Debug|Any CPU {D5870CF0-ED51-4CBC-B3D7-6F56DA84AC06}.Debug|x86.ActiveCfg = Debug|Any CPU @@ -483,14 +480,6 @@ Global {1FB1DD07-06AA-45B4-B5AC-20FF5BEE98B6}.Release|Any CPU.Build.0 = Release|Any CPU {1FB1DD07-06AA-45B4-B5AC-20FF5BEE98B6}.Release|x86.ActiveCfg = Release|Any CPU {1FB1DD07-06AA-45B4-B5AC-20FF5BEE98B6}.Release|x86.Build.0 = Release|Any CPU - {59ADCE46-9740-4079-834D-9A03A3494EBC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {59ADCE46-9740-4079-834D-9A03A3494EBC}.Debug|Any CPU.Build.0 = Debug|Any CPU - {59ADCE46-9740-4079-834D-9A03A3494EBC}.Debug|x86.ActiveCfg = Debug|Any CPU - {59ADCE46-9740-4079-834D-9A03A3494EBC}.Debug|x86.Build.0 = Debug|Any CPU - {59ADCE46-9740-4079-834D-9A03A3494EBC}.Release|Any CPU.ActiveCfg = Release|Any CPU - {59ADCE46-9740-4079-834D-9A03A3494EBC}.Release|Any CPU.Build.0 = Release|Any CPU - {59ADCE46-9740-4079-834D-9A03A3494EBC}.Release|x86.ActiveCfg = Release|Any CPU - {59ADCE46-9740-4079-834D-9A03A3494EBC}.Release|x86.Build.0 = Release|Any CPU {4239EFEA-E746-446A-BF7A-51FCBAB13946}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {4239EFEA-E746-446A-BF7A-51FCBAB13946}.Debug|Any CPU.Build.0 = Debug|Any CPU {4239EFEA-E746-446A-BF7A-51FCBAB13946}.Debug|x86.ActiveCfg = Debug|Any CPU @@ -584,8 +573,9 @@ Global HideSolutionNode = FALSE EndGlobalSection GlobalSection(NestedProjects) = preSolution - {2E4D67B4-522D-4CF7-97E4-BA940F0B18F3} = {3881429D-A97A-49EB-B7AE-A82BA5FE9C77} {991DCF75-C2EB-42B6-9A0D-AA1D2409D519} = {4C7B48D7-19AF-4AE7-9D1D-3BB289D5480D} + {2E4D67B4-522D-4CF7-97E4-BA940F0B18F3} = {3881429D-A97A-49EB-B7AE-A82BA5FE9C77} + {59ADCE46-9740-4079-834D-9A03A3494EBC} = {4C7B48D7-19AF-4AE7-9D1D-3BB289D5480D} {D5870CF0-ED51-4CBC-B3D7-6F56DA84AC06} = {B8DDA694-7939-42E3-95E5-265C2217C142} {DED3BBD7-53F4-428A-8C9F-27968E768605} = {3058BC79-8E79-4645-B05D-48CC182FA8A6} {EE85AAB7-CDA0-4C4E-BDA0-A64CCC413E3F} = {4C7B48D7-19AF-4AE7-9D1D-3BB289D5480D} @@ -629,8 +619,6 @@ Global {E3FDD4AC-46B6-4B9F-B672-317D1202CC50} = {F6DAEE9A-8BE1-4C4A-BC83-09215517C7DA} {D11FC318-8F5D-4C8C-9287-AB40A016D13C} = {F6DAEE9A-8BE1-4C4A-BC83-09215517C7DA} {1FB1DD07-06AA-45B4-B5AC-20FF5BEE98B6} = {F6DAEE9A-8BE1-4C4A-BC83-09215517C7DA} - {141F6C23-E1B1-4D89-9F10-F0B8AD58E71F} = {4C7B48D7-19AF-4AE7-9D1D-3BB289D5480D} - {59ADCE46-9740-4079-834D-9A03A3494EBC} = {141F6C23-E1B1-4D89-9F10-F0B8AD58E71F} {4239EFEA-E746-446A-BF7A-51FCBAB13946} = {CFE3259A-2D30-4EB0-80D5-E8B5F3D01449} {2E60864A-E3FF-4BCC-810F-DC7C34E6B236} = {CFE3259A-2D30-4EB0-80D5-E8B5F3D01449} {D086C8C6-D00D-4C3B-9AB2-A4286C9F5922} = {4C7B48D7-19AF-4AE7-9D1D-3BB289D5480D} From 51e89fc904bd31822d31f3b216418bace03763d1 Mon Sep 17 00:00:00 2001 From: Steffen Forkmann Date: Tue, 2 Oct 2018 16:20:38 +0200 Subject: [PATCH 061/160] Update FSharp.Core in FCS (#5718) --- .../FSharp.Compiler.Service.Tests.fsproj | 2 +- fcs/FSharp.Compiler.Service/FSharp.Compiler.Service.fsproj | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/fcs/FSharp.Compiler.Service.Tests/FSharp.Compiler.Service.Tests.fsproj b/fcs/FSharp.Compiler.Service.Tests/FSharp.Compiler.Service.Tests.fsproj index 55283b0065d..8d09c3a26f1 100644 --- a/fcs/FSharp.Compiler.Service.Tests/FSharp.Compiler.Service.Tests.fsproj +++ b/fcs/FSharp.Compiler.Service.Tests/FSharp.Compiler.Service.Tests.fsproj @@ -72,7 +72,7 @@ - + diff --git a/fcs/FSharp.Compiler.Service/FSharp.Compiler.Service.fsproj b/fcs/FSharp.Compiler.Service/FSharp.Compiler.Service.fsproj index 54ca43c2cf4..a16f39b084c 100644 --- a/fcs/FSharp.Compiler.Service/FSharp.Compiler.Service.fsproj +++ b/fcs/FSharp.Compiler.Service/FSharp.Compiler.Service.fsproj @@ -1,4 +1,4 @@ - + $(MSBuildProjectDirectory)\..\..\src @@ -635,7 +635,7 @@ - + From acbca82a9ec752cb292ff19b160e50fe163078b6 Mon Sep 17 00:00:00 2001 From: Steffen Forkmann Date: Tue, 2 Oct 2018 16:22:20 +0200 Subject: [PATCH 062/160] Reduce allocations by favoring TryGetValue over TryFind (#5715) * Remove old TryGetValue * Reduce use of TryFind * Reduce allocations in TcPatBindingName * Reduce some allocations in NameResolution * Reduce some allocations in TypeChecker * Use latest FSharp.Core in FCS * Update FSharp.Core in FCS --- src/absil/illib.fs | 12 +-- src/fsharp/NameResolution.fs | 159 +++++++++++++++++----------------- src/fsharp/NameResolution.fsi | 3 - src/fsharp/TypeChecker.fs | 54 ++++++------ src/fsharp/tast.fs | 28 +++--- 5 files changed, 123 insertions(+), 133 deletions(-) diff --git a/src/absil/illib.fs b/src/absil/illib.fs index b9ec8eaee68..9c1ca6506ca 100644 --- a/src/absil/illib.fs +++ b/src/absil/illib.fs @@ -1123,7 +1123,7 @@ module NameMap = [] module NameMultiMap = let existsInRange f (m: NameMultiMap<'T>) = NameMap.exists (fun _ l -> List.exists f l) m - let find v (m: NameMultiMap<'T>) = match Map.tryFind v m with None -> [] | Some r -> r + let find v (m: NameMultiMap<'T>) = match m.TryGetValue v with true, r -> r | _ -> [] let add v x (m: NameMultiMap<'T>) = NameMap.add v (x :: find v m) m let range (m: NameMultiMap<'T>) = Map.foldBack (fun _ x sofar -> x @ sofar) m [] let rangeReversingEachBucket (m: NameMultiMap<'T>) = Map.foldBack (fun _ x sofar -> List.rev x @ sofar) m [] @@ -1137,7 +1137,7 @@ module NameMultiMap = [] module MultiMap = let existsInRange f (m: MultiMap<_,_>) = Map.exists (fun _ l -> List.exists f l) m - let find v (m: MultiMap<_,_>) = match Map.tryFind v m with None -> [] | Some r -> r + let find v (m: MultiMap<_,_>) = match m.TryGetValue v with true, r -> r | _ -> [] let add v x (m: MultiMap<_,_>) = Map.add v (x :: find v m) m let range (m: MultiMap<_,_>) = Map.foldBack (fun _ x sofar -> x @ sofar) m [] let empty : MultiMap<_,_> = Map.empty @@ -1148,11 +1148,6 @@ type LayeredMap<'Key,'Value when 'Key : comparison> = Map<'Key,'Value> type Map<'Key,'Value when 'Key : comparison> with static member Empty : Map<'Key,'Value> = Map.empty - member m.TryGetValue (key,res:byref<'Value>) = - match m.TryFind key with - | None -> false - | Some r -> res <- r; true - member x.Values = [ for (KeyValue(_,v)) in x -> v ] member x.AddAndMarkAsCollapsible (kvs: _[]) = (x,kvs) ||> Array.fold (fun x (KeyValue(k,v)) -> x.Add(k,v)) member x.LinearTryModifyThenLaterFlatten (key, f: 'Value option -> 'Value) = x.Add (key, f (x.TryFind key)) @@ -1162,12 +1157,13 @@ type Map<'Key,'Value when 'Key : comparison> with [] type LayeredMultiMap<'Key,'Value when 'Key : equality and 'Key : comparison>(contents : LayeredMap<'Key,'Value list>) = member x.Add (k,v) = LayeredMultiMap(contents.Add(k,v :: x.[k])) - member x.Item with get k = match contents.TryFind k with None -> [] | Some l -> l + member x.Item with get k = match contents.TryGetValue k with true, l -> l | _ -> [] member x.AddAndMarkAsCollapsible (kvs: _[]) = let x = (x,kvs) ||> Array.fold (fun x (KeyValue(k,v)) -> x.Add(k,v)) x.MarkAsCollapsible() member x.MarkAsCollapsible() = LayeredMultiMap(contents.MarkAsCollapsible()) member x.TryFind k = contents.TryFind k + member x.TryGetValue k = contents.TryGetValue k member x.Values = contents.Values |> List.concat static member Empty : LayeredMultiMap<'Key,'Value> = LayeredMultiMap LayeredMap.Empty diff --git a/src/fsharp/NameResolution.fs b/src/fsharp/NameResolution.fs index 43f7c297ca6..2ce5cb57891 100644 --- a/src/fsharp/NameResolution.fs +++ b/src/fsharp/NameResolution.fs @@ -693,9 +693,6 @@ let private AddPartsOfTyconRefToNameEnv bulkAddMode ownDefinition (g:TcGlobals) eIndexedExtensionMembers = eIndexedExtensionMembers eUnindexedExtensionMembers = eUnindexedExtensionMembers } -let TryFindPatternByName name {ePatItems = patternMap} = - NameMap.tryFind name patternMap - /// Add a set of type definitions to the name resolution environment let AddTyconRefsToNameEnv bulkAddMode ownDefinition g amap m root nenv tcrefs = if isNil tcrefs then nenv else @@ -1009,9 +1006,9 @@ type TypeNameResolutionInfo = /// be used to qualify access if needed let LookupTypeNameInEntityHaveArity nm (staticResInfo: TypeNameResolutionStaticArgsInfo) (mty:ModuleOrNamespaceType) = let attempt1 = mty.TypesByMangledName.TryFind (staticResInfo.MangledNameForType nm) - match attempt1 with - | Some _ as r -> r + match attempt1 with | None -> mty.TypesByMangledName.TryFind nm + | _ -> attempt1 /// Unqualified lookups of type names where the number of generic arguments is known /// from context, e.g. List. Rebindings due to 'open' may have rebound identifiers. @@ -1021,9 +1018,9 @@ let LookupTypeNameInEnvHaveArity fq nm numTyArgs (nenv:NameResolutionEnv) = | ValueSome pos -> DecodeGenericTypeName pos nm | _ -> NameArityPair(nm,numTyArgs) - match nenv.TyconsByDemangledNameAndArity(fq).TryFind(key) with - | Some res -> Some res + match nenv.TyconsByDemangledNameAndArity(fq).TryFind key with | None -> nenv.TyconsByAccessNames(fq).TryFind nm |> Option.map List.head + | res -> res /// Implements unqualified lookups of type names where the number of generic arguments is NOT known /// from context. @@ -1042,16 +1039,16 @@ let LookupTypeNameInEnvHaveArity fq nm numTyArgs (nenv:NameResolutionEnv) = // In theory the full names such as ``RecordType`1`` can // also be used to qualify access if needed, though this is almost never needed. -let LookupTypeNameNoArity nm (byDemangledNameAndArity: LayeredMap) (byAccessNames: LayeredMultiMap) = +let LookupTypeNameNoArity nm (byDemangledNameAndArity: LayeredMap) (byAccessNames: LayeredMultiMap) = match TryDemangleGenericNameAndPos nm with | ValueSome pos -> let demangled = DecodeGenericTypeName pos nm - match byDemangledNameAndArity.TryFind demangled with - | Some res -> [res] - | None -> - match byAccessNames.TryFind nm with - | Some res -> res - | None -> [] + match byDemangledNameAndArity.TryGetValue demangled with + | true, res -> [res] + | _ -> + match byAccessNames.TryGetValue nm with + | true, res -> res + | _ -> [] | _ -> byAccessNames.[nm] @@ -1850,15 +1847,15 @@ let rec ResolveLongIndentAsModuleOrNamespace sink atMostOne amap m first fullyQu let occurence = if isOpenDecl then ItemOccurence.Open else ItemOccurence.Use CallNameResolutionSink sink (m, nenv, item, item, emptyTyparInst, occurence, nenv.DisplayEnv, ad) - match moduleOrNamespaces.TryFind id.idText with - | Some modrefs -> + match moduleOrNamespaces.TryGetValue id.idText with + | true, modrefs -> /// Look through the sub-namespaces and/or modules let rec look depth (modref: ModuleOrNamespaceRef) (mty:ModuleOrNamespaceType) (lid:Ident list) = match lid with | [] -> success (depth,modref,mty) | id :: rest -> - match mty.ModulesAndNamespacesByDemangledName.TryFind id.idText with - | Some mspec -> + match mty.ModulesAndNamespacesByDemangledName.TryGetValue id.idText with + | true, mspec -> let subref = modref.NestedTyconRef mspec if IsEntityAccessible amap m ad subref then notifyNameResolution subref id.idRange @@ -1874,7 +1871,7 @@ let rec ResolveLongIndentAsModuleOrNamespace sink atMostOne amap m first fullyQu look 1 modref modref.ModuleOrNamespaceType rest else raze (namespaceNotFound.Force())) - | None -> raze (namespaceNotFound.Force()) + | _ -> raze (namespaceNotFound.Force()) let ResolveLongIndentAsModuleOrNamespaceThen sink atMostOne amap m fullyQualified (nenv:NameResolutionEnv) ad id rest isOpenDecl f = @@ -2261,12 +2258,12 @@ let (|AccessibleEntityRef|_|) amap m ad (modref: ModuleOrNamespaceRef) mspec = let rec ResolveExprLongIdentInModuleOrNamespace (ncenv:NameResolver) nenv (typeNameResInfo: TypeNameResolutionInfo) ad resInfo depth m modref (mty:ModuleOrNamespaceType) (id:Ident) (rest :Ident list) = // resInfo records the modules or namespaces actually relevant to a resolution let m = unionRanges m id.idRange - match mty.AllValsByLogicalName.TryFind(id.idText) with - | Some vspec when IsValAccessible ad (mkNestedValRef modref vspec) -> + match mty.AllValsByLogicalName.TryGetValue id.idText with + | true, vspec when IsValAccessible ad (mkNestedValRef modref vspec) -> success(resInfo,Item.Value (mkNestedValRef modref vspec),rest) | _-> - match mty.ExceptionDefinitionsByDemangledName.TryFind(id.idText) with - | Some excon when IsTyconReprAccessible ncenv.amap m ad (modref.NestedTyconRef excon) -> + match mty.ExceptionDefinitionsByDemangledName.TryGetValue id.idText with + | true, excon when IsTyconReprAccessible ncenv.amap m ad (modref.NestedTyconRef excon) -> success (resInfo,Item.ExnCase (modref.NestedTyconRef excon),rest) | _ -> // Something in a discriminated union without RequireQualifiedAccess attribute? @@ -2312,8 +2309,8 @@ let rec ResolveExprLongIdentInModuleOrNamespace (ncenv:NameResolver) nenv (typeN let moduleSearch() = match rest with | id2::rest2 -> - match mty.ModulesAndNamespacesByDemangledName.TryFind(id.idText) with - | Some(AccessibleEntityRef ncenv.amap m ad modref submodref) -> + match mty.ModulesAndNamespacesByDemangledName.TryGetValue id.idText with + | true, AccessibleEntityRef ncenv.amap m ad modref submodref -> let resInfo = resInfo.AddEntity(id.idRange,submodref) OneResult (ResolveExprLongIdentInModuleOrNamespace ncenv nenv typeNameResInfo ad resInfo (depth+1) m submodref submodref.ModuleOrNamespaceType id2 rest2) @@ -2398,10 +2395,10 @@ let rec ResolveExprLongIdentPrim sink (ncenv:NameResolver) first fullyQualified let typeError = ref None // Single identifier. Lookup the unqualified names in the environment let envSearch = - match nenv.eUnqualifiedItems.TryFind(id.idText) with + match nenv.eUnqualifiedItems.TryGetValue id.idText with // The name is a type name and it has not been clobbered by some other name - | Some (Item.UnqualifiedType tcrefs) -> + | true, Item.UnqualifiedType tcrefs -> // Do not use type names from the environment if an explicit type instantiation is // given and the number of type parameters do not match @@ -2418,9 +2415,9 @@ let rec ResolveExprLongIdentPrim sink (ncenv:NameResolver) first fullyQualified Some(item,rest) | Exception e -> typeError := Some e; None - | Some res -> + | true, res -> Some (FreshenUnqualifiedItem ncenv m res, []) - | None -> + | _ -> None match envSearch with @@ -2502,8 +2499,8 @@ let rec ResolveExprLongIdentPrim sink (ncenv:NameResolver) first fullyQualified match fullyQualified with | FullyQualified -> false | _ -> - match nenv.eUnqualifiedItems.TryFind(nm) with - | Some(Item.Value _) -> true + match nenv.eUnqualifiedItems.TryGetValue nm with + | true, Item.Value _ -> true | _ -> false if ValIsInEnv id.idText then @@ -2534,10 +2531,10 @@ let rec ResolveExprLongIdentPrim sink (ncenv:NameResolver) first fullyQualified | FullyQualified -> NoResultsOrUsefulErrors | OpenQualified -> - match nenv.eUnqualifiedItems.TryFind id.idText with - | Some (Item.UnqualifiedType _) - | None -> NoResultsOrUsefulErrors - | Some res -> OneSuccess (resInfo,FreshenUnqualifiedItem ncenv m res,rest) + match nenv.eUnqualifiedItems.TryGetValue id.idText with + | true, Item.UnqualifiedType _ + | false, _ -> NoResultsOrUsefulErrors + | true, res -> OneSuccess (resInfo,FreshenUnqualifiedItem ncenv m res,rest) moduleSearch ad () +++ tyconSearch ad +++ envSearch @@ -2601,17 +2598,17 @@ let rec ResolvePatternLongIdentInModuleOrNamespace (ncenv:NameResolver) nenv num let ucinfo = FreshenUnionCaseRef ncenv m ucref success (resInfo,Item.UnionCase(ucinfo,showDeprecated),rest) | _ -> - match mty.ExceptionDefinitionsByDemangledName.TryFind(id.idText) with - | Some exnc when IsEntityAccessible ncenv.amap m ad (modref.NestedTyconRef exnc) -> + match mty.ExceptionDefinitionsByDemangledName.TryGetValue id.idText with + | true, exnc when IsEntityAccessible ncenv.amap m ad (modref.NestedTyconRef exnc) -> success (resInfo,Item.ExnCase (modref.NestedTyconRef exnc),rest) | _ -> // An active pattern constructor in a module - match (ActivePatternElemsOfModuleOrNamespace modref).TryFind(id.idText) with - | Some ( APElemRef(_,vref,_) as apref) when IsValAccessible ad vref -> + match (ActivePatternElemsOfModuleOrNamespace modref).TryGetValue id.idText with + | true, (APElemRef(_,vref,_) as apref) when IsValAccessible ad vref -> success (resInfo,Item.ActivePatternCase apref,rest) | _ -> - match mty.AllValsByLogicalName.TryFind(id.idText) with - | Some vspec when IsValAccessible ad (mkNestedValRef modref vspec) -> + match mty.AllValsByLogicalName.TryGetValue id.idText with + | true, vspec when IsValAccessible ad (mkNestedValRef modref vspec) -> success(resInfo,Item.Value (mkNestedValRef modref vspec),rest) | _ -> let tcrefs = lazy ( @@ -2641,8 +2638,8 @@ let rec ResolvePatternLongIdentInModuleOrNamespace (ncenv:NameResolver) nenv num let moduleSearch() = match rest with | id2::rest2 -> - match mty.ModulesAndNamespacesByDemangledName.TryFind(id.idText) with - | Some(AccessibleEntityRef ncenv.amap m ad modref submodref) -> + match mty.ModulesAndNamespacesByDemangledName.TryGetValue id.idText with + | true, AccessibleEntityRef ncenv.amap m ad modref submodref -> let resInfo = resInfo.AddEntity(id.idRange,submodref) OneResult (ResolvePatternLongIdentInModuleOrNamespace ncenv nenv numTyArgsOpt ad resInfo (depth+1) m submodref submodref.ModuleOrNamespaceType id2 rest2) | _ -> @@ -2689,8 +2686,8 @@ let rec ResolvePatternLongIdentPrim sink (ncenv:NameResolver) fullyQualified war // Single identifiers in patterns - bind to constructors and active patterns // For the special case of // let C = x - match nenv.ePatItems.TryFind(id.idText) with - | Some res when not newDef -> FreshenUnqualifiedItem ncenv m res + match nenv.ePatItems.TryGetValue id.idText with + | true, res when not newDef -> FreshenUnqualifiedItem ncenv m res | _ -> // Single identifiers in patterns - variable bindings if not newDef && @@ -2836,8 +2833,8 @@ let rec private ResolveTypeLongIdentInModuleOrNamespace sink nenv (ncenv:NameRes | id2::rest2 -> let m = unionRanges m id.idRange let modulSearch = - match modref.ModuleOrNamespaceType.ModulesAndNamespacesByDemangledName.TryFind(id.idText) with - | Some(AccessibleEntityRef ncenv.amap m ad modref submodref) -> + match modref.ModuleOrNamespaceType.ModulesAndNamespacesByDemangledName.TryGetValue id.idText with + | true, AccessibleEntityRef ncenv.amap m ad modref submodref -> let item = Item.ModuleOrNamespaces [submodref] CallNameResolutionSink sink (id.idRange, nenv, item, item, emptyTyparInst, ItemOccurence.Use, nenv.DisplayEnv, ad) let resInfo = resInfo.AddEntity(id.idRange,submodref) @@ -3002,8 +2999,8 @@ let rec ResolveFieldInModuleOrNamespace (ncenv:NameResolver) nenv ad (resInfo:Re let modulSearch() = match rest with | id2::rest2 -> - match modref.ModuleOrNamespaceType.ModulesAndNamespacesByDemangledName.TryFind(id.idText) with - | Some(AccessibleEntityRef ncenv.amap m ad modref submodref) -> + match modref.ModuleOrNamespaceType.ModulesAndNamespacesByDemangledName.TryGetValue id.idText with + | true, AccessibleEntityRef ncenv.amap m ad modref submodref -> let resInfo = resInfo.AddEntity(id.idRange,submodref) ResolveFieldInModuleOrNamespace ncenv nenv ad resInfo (depth+1) m submodref submodref.ModuleOrNamespaceType id2 rest2 |> OneResult @@ -3037,9 +3034,9 @@ let SuggestLabelsOfRelatedRecords g (nenv:NameResolutionEnv) (id:Ident) (allFiel else let possibleRecords = [for fld in givenFields do - match Map.tryFind fld nenv.eFieldLabels with - | None -> () - | Some recordTypes -> yield! (recordTypes |> List.map (fun r -> r.TyconRef.DisplayName, fld)) ] + match nenv.eFieldLabels.TryGetValue fld with + | true, recordTypes -> yield! (recordTypes |> List.map (fun r -> r.TyconRef.DisplayName, fld)) + | _ -> () ] |> List.groupBy fst |> List.map (fun (r,fields) -> r, fields |> List.map snd) |> List.filter (fun (_,fields) -> givenFields.IsSubsetOf fields) @@ -3177,8 +3174,8 @@ let private ResolveExprDotLongIdent (ncenv:NameResolver) m ad nenv ty (id:Ident) if isAppTy ncenv.g ty then NoResultsOrUsefulErrors else - match nenv.eFieldLabels |> Map.tryFind id.idText with - | Some(rfref :: _) -> + match nenv.eFieldLabels.TryGetValue id.idText with + | true, rfref :: _ -> // NOTE (instantiationGenerator cleanup): we need to freshen here because we don't know the type. // But perhaps the caller should freshen?? let item = FreshenRecdFieldRef ncenv m rfref @@ -3415,17 +3412,17 @@ let rec PartialResolveLookupInModuleOrNamespaceAsModuleOrNamespaceThen f plid (m match plid with | [] -> f modref | id:: rest -> - match mty.ModulesAndNamespacesByDemangledName.TryFind(id) with - | Some mty -> PartialResolveLookupInModuleOrNamespaceAsModuleOrNamespaceThen f rest (modref.NestedTyconRef mty) - | None -> [] + match mty.ModulesAndNamespacesByDemangledName.TryGetValue id with + | true, mty -> PartialResolveLookupInModuleOrNamespaceAsModuleOrNamespaceThen f rest (modref.NestedTyconRef mty) + | _ -> [] let PartialResolveLongIndentAsModuleOrNamespaceThen (nenv:NameResolutionEnv) plid f = - match plid with + match plid with | id:: rest -> - match Map.tryFind id nenv.eModulesAndNamespaces with - | Some modrefs -> + match nenv.eModulesAndNamespaces.TryGetValue id with + | true, modrefs -> List.collect (PartialResolveLookupInModuleOrNamespaceAsModuleOrNamespaceThen f rest) modrefs - | None -> + | _ -> [] | [] -> [] @@ -3834,8 +3831,8 @@ let rec ResolvePartialLongIdentInModuleOrNamespace (ncenv: NameResolver) nenv is | id :: rest -> - (match mty.ModulesAndNamespacesByDemangledName.TryFind(id) with - | Some mspec -> + (match mty.ModulesAndNamespacesByDemangledName.TryGetValue id with + | true, mspec -> let nested = modref.NestedTyconRef mspec if IsTyconUnseenObsoleteSpec ad g ncenv.amap m nested allowObsolete then [] else let allowObsolete = allowObsolete && not (isNil rest) @@ -3859,16 +3856,16 @@ let TryToResolveLongIdentAsType (ncenv: NameResolver) (nenv: NameResolutionEnv) | Some id -> // Look for values called 'id' that accept the dot-notation let ty = - match nenv.eUnqualifiedItems |> Map.tryFind id with + match nenv.eUnqualifiedItems.TryGetValue id with // v.lookup : member of a value - | Some v -> + | true, v -> match v with | Item.Value x -> let ty = x.Type let ty = if x.BaseOrThisInfo = CtorThisVal && isRefCellTy g ty then destRefCellTy g ty else ty Some ty | _ -> None - | None -> None + | _ -> None match ty with | Some _ -> ty @@ -3958,16 +3955,16 @@ let rec ResolvePartialLongIdentPrim (ncenv: NameResolver) (nenv: NameResolutionE []) // Look for values called 'id' that accept the dot-notation let values, isItemVal = - (match nenv.eUnqualifiedItems |> Map.tryFind id with + (match nenv.eUnqualifiedItems.TryGetValue id with // v.lookup : member of a value - | Some v -> + | true, v -> match v with | Item.Value x -> let ty = x.Type let ty = if x.BaseOrThisInfo = CtorThisVal && isRefCellTy g ty then destRefCellTy g ty else ty (ResolvePartialLongIdentInType ncenv nenv isApplicableMeth m ad false rest ty), true | _ -> [], false - | None -> [], false) + | _ -> [], false) let staticSometingInType = [ if not isItemVal then @@ -4033,8 +4030,8 @@ let rec ResolvePartialLongIdentInModuleOrNamespaceForRecordFields (ncenv: NameRe ] | id :: rest -> - (match mty.ModulesAndNamespacesByDemangledName.TryFind(id) with - | Some mspec -> + (match mty.ModulesAndNamespacesByDemangledName.TryGetValue id with + | true, mspec -> let nested = modref.NestedTyconRef mspec if IsTyconUnseenObsoleteSpec ad g ncenv.amap m nested allowObsolete then [] else let allowObsolete = allowObsolete && not (isNil rest) @@ -4429,8 +4426,8 @@ let rec ResolvePartialLongIdentInModuleOrNamespaceForItem (ncenv: NameResolver) | id :: rest -> - match mty.ModulesAndNamespacesByDemangledName.TryFind id with - | Some mspec -> + match mty.ModulesAndNamespacesByDemangledName.TryGetValue id with + | true, mspec -> let nested = modref.NestedTyconRef mspec if not (IsTyconUnseenObsoleteSpec ad g ncenv.amap m nested true) then yield! ResolvePartialLongIdentInModuleOrNamespaceForItem ncenv nenv m ad nested rest item @@ -4447,20 +4444,20 @@ let rec PartialResolveLookupInModuleOrNamespaceAsModuleOrNamespaceThenLazy f pli match plid with | [] -> f modref | id :: rest -> - match mty.ModulesAndNamespacesByDemangledName.TryFind id with - | Some mty -> + match mty.ModulesAndNamespacesByDemangledName.TryGetValue id with + | true, mty -> PartialResolveLookupInModuleOrNamespaceAsModuleOrNamespaceThenLazy f rest (modref.NestedTyconRef mty) - | None -> Seq.empty + | _ -> Seq.empty let PartialResolveLongIndentAsModuleOrNamespaceThenLazy (nenv:NameResolutionEnv) plid f = seq { match plid with | id :: rest -> - match Map.tryFind id nenv.eModulesAndNamespaces with - | Some modrefs -> + match nenv.eModulesAndNamespaces.TryGetValue id with + | true, modrefs -> for modref in modrefs do yield! PartialResolveLookupInModuleOrNamespaceAsModuleOrNamespaceThenLazy f rest modref - | None -> () + | _ -> () | [] -> () } @@ -4533,8 +4530,8 @@ let rec GetCompletionForItem (ncenv: NameResolver) (nenv: NameResolutionEnv) m a else Seq.empty) // Look for values called 'id' that accept the dot-notation - match Map.tryFind id nenv.eUnqualifiedItems with - | Some (Item.Value x) -> + match nenv.eUnqualifiedItems.TryGetValue id with + | true, Item.Value x -> let ty = x.Type let ty = if x.BaseOrThisInfo = CtorThisVal && isRefCellTy g ty then destRefCellTy g ty else ty yield! ResolvePartialLongIdentInTypeForItem ncenv nenv m ad false rest item ty diff --git a/src/fsharp/NameResolution.fsi b/src/fsharp/NameResolution.fsi index 8a1ae97f009..f381d1088dc 100755 --- a/src/fsharp/NameResolution.fsi +++ b/src/fsharp/NameResolution.fsi @@ -166,9 +166,6 @@ type FullyQualifiedFlag = [] type BulkAdd = Yes | No -/// Lookup patterns in name resolution environment -val internal TryFindPatternByName : string -> NameResolutionEnv -> Item option - /// Add extra items to the environment for Visual Studio, e.g. static members val internal AddFakeNamedValRefToNameEnv : string -> NameResolutionEnv -> ValRef -> NameResolutionEnv diff --git a/src/fsharp/TypeChecker.fs b/src/fsharp/TypeChecker.fs index ecbeaf06b46..61cf1098cf6 100755 --- a/src/fsharp/TypeChecker.fs +++ b/src/fsharp/TypeChecker.fs @@ -4470,9 +4470,9 @@ and TcTyparOrMeasurePar optKind cenv (env:TcEnv) newOk tpenv (Typar(id, _, _) as // CallNameResolutionSink cenv.tcSink (tp.Range.StartRange, env.NameEnv, item, item, ItemOccurence.UseInType, env.DisplayEnv, env.eAccessRights) res, tpenv let key = id.idText - match env.eNameResEnv.eTypars.TryFind key with - | Some res -> checkRes res - | None -> + match env.eNameResEnv.eTypars.TryGetValue key with + | true, res -> checkRes res + | _ -> match TryFindUnscopedTypar key tpenv with | Some res -> checkRes res | None -> @@ -5101,17 +5101,17 @@ and TcPatBindingName cenv env id ty isMemberThis vis1 topValData (inlineFlag, de let names = Map.add id.idText (PrelimValScheme1(id, declaredTypars, ty, topValData, None, isMutable, inlineFlag, baseOrThis, argAttribs, vis, compgen)) names let takenNames = Set.add id.idText takenNames (fun (TcPatPhase2Input (values, isLeftMost)) -> - let (vspec, typeScheme) = - match values.TryFind id.idText with - | Some value -> - let name = id.idText + let (vspec, typeScheme) = + let name = id.idText + match values.TryGetValue name with + | true, value -> if not (String.IsNullOrEmpty name) && Char.IsLower(name.[0]) then - match TryFindPatternByName name env.eNameResEnv with - | Some (Item.Value vref) when vref.LiteralValue.IsSome -> - warning(Error(FSComp.SR.checkLowercaseLiteralBindingInPattern(id.idText), id.idRange)) - | Some _ | None -> () + match env.eNameResEnv.ePatItems.TryGetValue name with + | true, Item.Value vref when vref.LiteralValue.IsSome -> + warning(Error(FSComp.SR.checkLowercaseLiteralBindingInPattern name, id.idRange)) + | _ -> () value - | None -> error(Error(FSComp.SR.tcNameNotBoundInPattern(id.idText), id.idRange)) + | _ -> error(Error(FSComp.SR.tcNameNotBoundInPattern name, id.idRange)) // isLeftMost indicates we are processing the left-most path through a disjunctive or pattern. // For those binding locations, CallNameResolutionSink is called in MakeAndPublishValue, like all other bindings @@ -5198,10 +5198,10 @@ and TcPat warnOnUpper cenv env topValInfo vFlags (tpenv, names, takenNames) ty p // matching error (UnionPatternsBindDifferentNames m) names1 |> Map.iter (fun _ (PrelimValScheme1(id1, _, ty1, _, _, _, _, _, _, _, _)) -> - match Map.tryFind id1.idText names2 with - | None -> () - | Some (PrelimValScheme1(_, _, ty2, _, _, _, _, _, _, _, _)) -> - UnifyTypes cenv env m ty1 ty2) + match names2.TryGetValue id1.idText with + | true, PrelimValScheme1(_, _, ty2, _, _, _, _, _, _, _, _) -> + UnifyTypes cenv env m ty1 ty2 + | _ -> ()) (fun values -> TPat_disjs ([pat1' values;pat2' values.RightPath], m)), (tpenv, names1, takenNames1) | SynPat.Ands (pats, m) -> @@ -5442,9 +5442,9 @@ and TcPat warnOnUpper cenv env topValInfo vFlags (tpenv, names, takenNames) ty p let ftys = fields |> List.map (fun fsp -> actualTyOfRecdField inst fsp, fsp) let fldsmap', acc = ((tpenv, names, takenNames), ftys) ||> List.mapFold (fun s (ty, fsp) -> - match Map.tryFind fsp.rfield_id.idText fldsmap with - | Some v -> TcPat warnOnUpper cenv env None vFlags s ty v - | None -> (fun _ -> TPat_wild m), s) + match fldsmap.TryGetValue fsp.rfield_id.idText with + | true, v -> TcPat warnOnUpper cenv env None vFlags s ty v + | _ -> (fun _ -> TPat_wild m), s) (fun values -> TPat_recd (tcref, tinst, List.map (fun f -> f values) fldsmap', m)), acc @@ -11598,10 +11598,10 @@ and TcIncrementalLetRecGeneralization cenv scopem // pathological situations let freeInUncheckedRecBinds = lazy ((emptyFreeTyvars, cenv.recUses.Contents) ||> Map.fold (fun acc vStamp _ -> - match Map.tryFind vStamp uncheckedRecBindsTable with - | Some fwdBind -> - accFreeInType CollectAllNoCaching fwdBind.RecBindingInfo.Val.Type acc - | None -> + match uncheckedRecBindsTable.TryGetValue vStamp with + | true, fwdBind -> + accFreeInType CollectAllNoCaching fwdBind.RecBindingInfo.Val.Type acc + | _ -> acc)) let rec loop (preGeneralizationRecBinds: PreGeneralizationRecursiveBinding list, @@ -16024,12 +16024,12 @@ module TcDeclarations = else let isInSameModuleOrNamespace = - match envForDecls.eModuleOrNamespaceTypeAccumulator.Value.TypesByMangledName.TryFind(tcref.LogicalName) with - | Some tycon -> (tyconOrder.Compare(tcref.Deref, tycon) = 0) - | None -> + match envForDecls.eModuleOrNamespaceTypeAccumulator.Value.TypesByMangledName.TryGetValue tcref.LogicalName with + | true, tycon -> tyconOrder.Compare(tcref.Deref, tycon) = 0 + | _ -> //false // There is a special case we allow when compiling FSharp.Core.dll which permits interface implementations across namespace fragments - (cenv.g.compilingFslib && tcref.LogicalName.StartsWithOrdinal("Tuple`")) + cenv.g.compilingFslib && tcref.LogicalName.StartsWithOrdinal("Tuple`") let nReqTypars = reqTypars.Length diff --git a/src/fsharp/tast.fs b/src/fsharp/tast.fs index 726d4d1ee04..cfe84ee6db5 100644 --- a/src/fsharp/tast.fs +++ b/src/fsharp/tast.fs @@ -3046,13 +3046,12 @@ and static member TryDerefEntityPath(ccu: CcuThunk, path:string[], i:int, entity:Entity) = if i >= path.Length then ValueSome entity else - let next = entity.ModuleOrNamespaceType.AllEntitiesByCompiledAndLogicalMangledNames.TryFind(path.[i]) - match next with - | Some res -> NonLocalEntityRef.TryDerefEntityPath(ccu, path, (i+1), res) + match entity.ModuleOrNamespaceType.AllEntitiesByCompiledAndLogicalMangledNames.TryGetValue path.[i] with + | true, res -> NonLocalEntityRef.TryDerefEntityPath(ccu, path, (i+1), res) #if !NO_EXTENSIONTYPING - | None -> NonLocalEntityRef.TryDerefEntityPathViaProvidedType(ccu, path, i, entity) + | _ -> NonLocalEntityRef.TryDerefEntityPathViaProvidedType(ccu, path, i, entity) #else - | None -> ValueNone + | _ -> ValueNone #endif #if !NO_EXTENSIONTYPING @@ -4199,9 +4198,10 @@ and /// Try to resolve a path into the CCU by referencing the .NET/CLI type forwarder table of the CCU member ccu.TryForward(nlpath:string[],item:string) : EntityRef option = ccu.EnsureDerefable(nlpath) - match ccu.TypeForwarders.TryFind(nlpath,item) with - | Some entity -> Some(entity.Force()) - | None -> None + let key = nlpath,item + match ccu.TypeForwarders.TryGetValue key with + | true, entity -> Some(entity.Force()) + | _ -> None //printfn "trying to forward %A::%s from ccu '%s', res = '%A'" p n ccu.AssemblyName res.IsSome /// Used to make forward calls into the type/assembly loader when comparing member signatures during linking @@ -5719,13 +5719,13 @@ let CombineCcuContentFragments m l = let tab2 = mty2.AllEntitiesByLogicalMangledName let entities = [ for e1 in mty1.AllEntities do - match tab2.TryFind e1.LogicalName with - | Some e2 -> yield CombineEntites path e1 e2 - | None -> yield e1 + match tab2.TryGetValue e1.LogicalName with + | true, e2 -> yield CombineEntites path e1 e2 + | _ -> yield e1 for e2 in mty2.AllEntities do - match tab1.TryFind e2.LogicalName with - | Some _ -> () - | None -> yield e2 ] + match tab1.TryGetValue e2.LogicalName with + | true, _ -> () + | _ -> yield e2 ] let vals = QueueList.append mty1.AllValsAndMembers mty2.AllValsAndMembers From bd501a7cec3ef1275541587775223dac7857e395 Mon Sep 17 00:00:00 2001 From: Will Smith Date: Tue, 2 Oct 2018 07:23:13 -0700 Subject: [PATCH 063/160] Fixed tooling issues when changing solutions (#5721) --- .../src/FSharp.Editor/LanguageService/ProjectSitesAndFiles.fs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vsintegration/src/FSharp.Editor/LanguageService/ProjectSitesAndFiles.fs b/vsintegration/src/FSharp.Editor/LanguageService/ProjectSitesAndFiles.fs index 4ba8f25de27..e9ce1769584 100644 --- a/vsintegration/src/FSharp.Editor/LanguageService/ProjectSitesAndFiles.fs +++ b/vsintegration/src/FSharp.Editor/LanguageService/ProjectSitesAndFiles.fs @@ -225,7 +225,7 @@ type internal ProjectSitesAndFiles() = let getReferencesForSolutionService (solutionService:IVsSolution) = [| match referencedProjects projectSite, extraProjectInfo with - | _, Some (:? VisualStudioWorkspaceImpl as workspace) when not (isNull workspace.CurrentSolution)-> + | None, Some (:? VisualStudioWorkspaceImpl as workspace) when not (isNull workspace.CurrentSolution)-> let path = projectSite.ProjectFileName if not (String.IsNullOrWhiteSpace(path)) then match projectIdOpt with From 496c70d09e902d72c426c15079830b31d78e3cac Mon Sep 17 00:00:00 2001 From: Steffen Forkmann Date: Tue, 2 Oct 2018 16:25:19 +0200 Subject: [PATCH 064/160] Remove second internal ValueOption (#5717) * Remove second internal ValueOption * Update FSharp.Core in FCS * Cleanup --- src/absil/illib.fs | 10 ++-------- src/fsharp/NameResolution.fs | 2 +- src/fsharp/Optimizer.fs | 2 +- src/fsharp/QuotationTranslator.fs | 2 +- src/fsharp/symbols/Symbols.fs | 16 ++++++++-------- src/fsharp/tast.fs | 16 ++++++++-------- 6 files changed, 21 insertions(+), 27 deletions(-) diff --git a/src/absil/illib.fs b/src/absil/illib.fs index 9c1ca6506ca..ab92a747b5e 100644 --- a/src/absil/illib.fs +++ b/src/absil/illib.fs @@ -432,18 +432,12 @@ module List = let existsSquared f xss = xss |> List.exists (fun xs -> xs |> List.exists (fun x -> f x)) let mapiFoldSquared f z xss = mapFoldSquared f z (xss |> mapiSquared (fun i j x -> (i,j,x))) -[] -type ValueOption<'T> = - | ValueSome of 'T - | ValueNone - member x.IsSome = match x with ValueSome _ -> true | ValueNone -> false - member x.IsNone = match x with ValueSome _ -> false | ValueNone -> true - member x.Value = match x with ValueSome r -> r | ValueNone -> failwith "ValueOption.Value: value is None" - [] module ValueOption = let inline ofOption x = match x with Some x -> ValueSome x | None -> ValueNone let inline bind f x = match x with ValueSome x -> f x | ValueNone -> ValueNone + let inline isSome x = match x with ValueSome _ -> true | ValueNone -> false + let inline isNone x = match x with ValueSome _ -> false | ValueNone -> true type String with member inline x.StartsWithOrdinal(value) = diff --git a/src/fsharp/NameResolution.fs b/src/fsharp/NameResolution.fs index 2ce5cb57891..de3cea9b02f 100644 --- a/src/fsharp/NameResolution.fs +++ b/src/fsharp/NameResolution.fs @@ -1097,7 +1097,7 @@ let AddEntityForProvidedType (amap: Import.ImportMap, modref: ModuleOrNamespaceR let tycon = Construct.NewProvidedTycon(resolutionEnvironment, st, importProvidedType, isSuppressRelocate, m) modref.ModuleOrNamespaceType.AddProvidedTypeEntity(tycon) let tcref = modref.NestedTyconRef tycon - System.Diagnostics.Debug.Assert modref.TryDeref.IsSome + System.Diagnostics.Debug.Assert(ValueOption.isSome modref.TryDeref) tcref diff --git a/src/fsharp/Optimizer.fs b/src/fsharp/Optimizer.fs index b2baed1a7a4..023961820d6 100644 --- a/src/fsharp/Optimizer.fs +++ b/src/fsharp/Optimizer.fs @@ -3090,7 +3090,7 @@ and OptimizeBinding cenv isRec env (TBind(vref, expr, spBind)) = | None -> false | Some mbrTyconRef -> // Check we can deref system_MarshalByRefObject_tcref. When compiling against the Silverlight mscorlib we can't - if mbrTyconRef.TryDeref.IsSome then + if ValueOption.isSome mbrTyconRef.TryDeref then // Check if this is a subtype of MarshalByRefObject assert (cenv.g.system_MarshalByRefObject_ty.IsSome) ExistsSameHeadTypeInHierarchy cenv.g cenv.amap vref.Range (generalizedTyconRef tcref) cenv.g.system_MarshalByRefObject_ty.Value diff --git a/src/fsharp/QuotationTranslator.fs b/src/fsharp/QuotationTranslator.fs index 9c7bc53e333..d37be61d8d8 100644 --- a/src/fsharp/QuotationTranslator.fs +++ b/src/fsharp/QuotationTranslator.fs @@ -66,7 +66,7 @@ type QuotationGenerationScope = static member ComputeQuotationFormat g = let deserializeExValRef = ValRefForIntrinsic g.deserialize_quoted_FSharp_40_plus_info - if deserializeExValRef.TryDeref.IsSome then + if ValueOption.isSome deserializeExValRef.TryDeref then QuotationSerializationFormat.FSharp_40_Plus else QuotationSerializationFormat.FSharp_20_Plus diff --git a/src/fsharp/symbols/Symbols.fs b/src/fsharp/symbols/Symbols.fs index 00e3c6a303c..104d998fda7 100644 --- a/src/fsharp/symbols/Symbols.fs +++ b/src/fsharp/symbols/Symbols.fs @@ -86,7 +86,7 @@ module Impl = let entityIsUnresolved(entity:EntityRef) = match entity with | ERefNonLocal(NonLocalEntityRef(ccu, _)) -> - ccu.IsUnresolvedReference && entity.TryDeref.IsNone + ccu.IsUnresolvedReference && ValueOption.isNone entity.TryDeref | _ -> false let checkEntityIsResolved(entity:EntityRef) = @@ -754,10 +754,10 @@ and FSharpUnionCase(cenv, v: UnionCaseRef) = let isUnresolved() = - entityIsUnresolved v.TyconRef || v.TryUnionCase.IsNone + entityIsUnresolved v.TyconRef || ValueOption.isNone v.TryUnionCase let checkIsResolved() = checkEntityIsResolved v.TyconRef - if v.TryUnionCase.IsNone then + if ValueOption.isNone v.TryUnionCase then invalidOp (sprintf "The union case '%s' could not be found in the target type" v.CaseName) member __.IsUnresolved = @@ -854,18 +854,18 @@ and FSharpField(cenv: SymbolEnv, d: FSharpFieldData) = let isUnresolved() = entityIsUnresolved d.DeclaringTyconRef || match d with - | RecdOrClass v -> v.TryRecdField.IsNone - | Union (v, _) -> v.TryUnionCase.IsNone + | RecdOrClass v -> ValueOption.isNone v.TryRecdField + | Union (v, _) -> ValueOption.isNone v.TryUnionCase | ILField _ -> false let checkIsResolved() = checkEntityIsResolved d.DeclaringTyconRef match d with | RecdOrClass v -> - if v.TryRecdField.IsNone then + if ValueOption.isNone v.TryRecdField then invalidOp (sprintf "The record field '%s' could not be found in the target type" v.FieldName) | Union (v, _) -> - if v.TryUnionCase.IsNone then + if ValueOption.isNone v.TryUnionCase then invalidOp (sprintf "The union case '%s' could not be found in the target type" v.CaseName) | ILField _ -> () @@ -1331,7 +1331,7 @@ and FSharpMemberOrFunctionOrValue(cenv, d:FSharpMemberOrValData, item) = let isUnresolved() = match fsharpInfo() with | None -> false - | Some v -> v.TryDeref.IsNone + | Some v -> ValueOption.isNone v.TryDeref let checkIsResolved() = if isUnresolved() then diff --git a/src/fsharp/tast.fs b/src/fsharp/tast.fs index cfe84ee6db5..334891b79fb 100644 --- a/src/fsharp/tast.fs +++ b/src/fsharp/tast.fs @@ -3260,7 +3260,7 @@ and ValueSome tcr.binding /// Is the destination assembly available? - member tcr.CanDeref = tcr.TryDeref.IsSome + member tcr.CanDeref = ValueOption.isSome tcr.TryDeref /// Gets the data indicating the compiled representation of a type or module in terms of Abstract IL data structures. member x.CompiledRepresentation = x.Deref.CompiledRepresentation @@ -3811,7 +3811,7 @@ and | None -> error(InternalError(sprintf "union case %s not found in type %s" x.CaseName x.TyconRef.LogicalName, x.TyconRef.Range)) /// Try to dereference the reference - member x.TryUnionCase = x.TyconRef.TryDeref |> ValueOption.bind (fun tcref -> tcref.GetUnionCaseByName x.CaseName |> ValueOption.ofOption) + member x.TryUnionCase = x.TyconRef.TryDeref |> ValueOption.bind (fun tcref -> tcref.GetUnionCaseByName x.CaseName |> ValueOption.ofOption) /// Get the attributes associated with the union case member x.Attribs = x.UnionCase.Attribs @@ -5447,9 +5447,9 @@ let primEntityRefEq compilingFslib fslibCcu (x : EntityRef) (y : EntityRef) = // The tcrefs may have forwarders. If they may possibly be equal then resolve them to get their canonical references // and compare those using pointer equality. (not (nonLocalRefDefinitelyNotEq x.nlr y.nlr) && - let v1 = x.TryDeref - let v2 = y.TryDeref - v1.IsSome && v2.IsSome && v1.Value === v2.Value)) then + match x.TryDeref with + | ValueSome v1 -> match y.TryDeref with ValueSome v2 -> v1 === v2 | _ -> false + | _ -> match y.TryDeref with ValueNone -> true | _ -> false)) then true else compilingFslib && fslibEntityRefEq fslibCcu x y @@ -5473,9 +5473,9 @@ let primValRefEq compilingFslib fslibCcu (x : ValRef) (y : ValRef) = else (// Use TryDeref to guard against the platforms/times when certain F# language features aren't available, // e.g. CompactFramework doesn't have support for quotations. - let v1 = x.TryDeref - let v2 = y.TryDeref - v1.IsSome && v2.IsSome && v1.Value === v2.Value) + match x.TryDeref with + | ValueSome v1 -> match y.TryDeref with ValueSome v2 -> v1 === v2 | _ -> false + | _ -> match y.TryDeref with ValueNone -> true | _ -> false) || (if compilingFslib then fslibValRefEq fslibCcu x y else false) //--------------------------------------------------------------------------- From 933352aae859ffba7667f197c483cc4b806a7238 Mon Sep 17 00:00:00 2001 From: Steffen Forkmann Date: Tue, 2 Oct 2018 16:28:29 +0200 Subject: [PATCH 065/160] Do not use length if we can pattern match (#5716) * Do not use length if we can pattern match * Check field count only once --- src/fsharp/NameResolution.fs | 3 +-- src/fsharp/TypeChecker.fs | 3 ++- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/fsharp/NameResolution.fs b/src/fsharp/NameResolution.fs index de3cea9b02f..b7271c92cf5 100644 --- a/src/fsharp/NameResolution.fs +++ b/src/fsharp/NameResolution.fs @@ -430,8 +430,7 @@ let private GetCSharpStyleIndexedExtensionMembersForTyconRef (amap:Import.Import // Method must be static, have 'Extension' attribute, must not be curried, must have at least one argument if not minfo.IsInstance && not minfo.IsExtensionMember && - minfo.NumArgs.Length = 1 && - minfo.NumArgs.Head >= 1 && + (match minfo.NumArgs with [x] when x >= 1 -> true | _ -> false) && MethInfoHasAttribute g m g.attrib_ExtensionAttribute minfo then let ilExtMem = ILExtMem (tcrefOfStaticClass, minfo, pri) diff --git a/src/fsharp/TypeChecker.fs b/src/fsharp/TypeChecker.fs index 61cf1098cf6..79591bf565e 100755 --- a/src/fsharp/TypeChecker.fs +++ b/src/fsharp/TypeChecker.fs @@ -1923,6 +1923,7 @@ let FreshenAbstractSlot g amap m synTyparDecls absMethInfo = let BuildFieldMap cenv env isPartial ty flds m = let ad = env.eAccessRights if isNil flds then invalidArg "flds" "BuildFieldMap" + let fldCount = flds.Length let frefSets = let allFields = flds |> List.map (fun ((_, ident), _) -> ident) @@ -1942,7 +1943,7 @@ let BuildFieldMap cenv env isPartial ty flds m = warning (Error(FSComp.SR.tcFieldsDoNotDetermineUniqueRecordType(), m)) // try finding a record type with the same number of fields as the ones that are given. - match tcrefs |> List.tryFind (fun tc -> tc.TrueFieldsAsList.Length = flds.Length) with + match tcrefs |> List.tryFind (fun tc -> tc.TrueFieldsAsList.Length = fldCount) with | Some tcref -> tcref | _ -> // OK, there isn't a unique, good type dictated by the intersection for the field refs. From 29483138f0cc8fe8058425fb61b7be0ea56aa401 Mon Sep 17 00:00:00 2001 From: Steffen Forkmann Date: Tue, 2 Oct 2018 16:33:09 +0200 Subject: [PATCH 066/160] cleanup in service (#5724) --- src/fsharp/service/service.fs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/fsharp/service/service.fs b/src/fsharp/service/service.fs index cee4936084b..2df1fbe2880 100644 --- a/src/fsharp/service/service.fs +++ b/src/fsharp/service/service.fs @@ -690,7 +690,7 @@ type TypeCheckInfo // These come through as an empty plid and residue "". Otherwise we try an environment lookup // and then return to the qualItems. This is because the expression typings are a little inaccurate, primarily because // it appears we're getting some typings recorded for non-atomic expressions like "f x" - when (match plid with [] -> true | _ -> false) -> + when isNil plid -> // lookup based on expression typings successful Some (items |> List.map (CompletionItem (tryDestAppTy g ty) None), denv, m) | GetPreciseCompletionListFromExprTypingsResult.NoneBecauseThereWereTypeErrors, _ -> @@ -700,7 +700,7 @@ type TypeCheckInfo | GetPreciseCompletionListFromExprTypingsResult.NoneBecauseTypecheckIsStaleAndTextChanged, _ -> // we want to report no result and let second-chance intellisense kick in None - | _, true when (match plid with [] -> true | _ -> false) -> + | _, true when isNil plid -> // If the user just pressed '.' after an _expression_ (not a plid), it is never right to show environment-lookup top-level completions. // The user might by typing quickly, and the LS didn't have an expression type right before the dot yet. // Second-chance intellisense will bring up the correct list in a moment. From 55c4c4514ce5c23cabc8e92243c916f254472331 Mon Sep 17 00:00:00 2001 From: Will Smith Date: Tue, 2 Oct 2018 07:41:00 -0700 Subject: [PATCH 067/160] Fixed match expression is evaluated twice if it returns a struct union (#5720) * Thanks to Don Syme, we have a fix * Added test --- src/fsharp/PatternMatchCompilation.fs | 7 ++++++- .../FSharp.Core/DiscrimantedUnionType.fs | 7 +++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/src/fsharp/PatternMatchCompilation.fs b/src/fsharp/PatternMatchCompilation.fs index f0be350d1e2..084e2c8a151 100644 --- a/src/fsharp/PatternMatchCompilation.fs +++ b/src/fsharp/PatternMatchCompilation.fs @@ -907,6 +907,11 @@ let CompilePatternBasic else None,true) + and IsCopyableInputExpr origInputExpr = + match origInputExpr with + | Expr.Op (TOp.LValueOp (LByrefGet, v), [], [], _) when not v.IsMutable -> true + | _ -> false + and ChoosePreBinder simulSetOfEdgeDiscrims subexpr = match simulSetOfEdgeDiscrims with // Very simple 'isinst' tests: put the result of 'isinst' in a local variable @@ -939,7 +944,7 @@ let CompilePatternBasic let argExpr = GetSubExprOfInput subexpr let argExpr = match argExpr, _origInputExprOpt with - | Expr.Val(v1, _, _), Some origInputExpr when valEq origInputVal v1.Deref -> origInputExpr + | Expr.Val(v1, _, _), Some origInputExpr when valEq origInputVal v1.Deref && IsCopyableInputExpr origInputExpr -> origInputExpr | _ -> argExpr let vOpt, addrExp, _readonly, _writeonly = mkExprAddrOfExprAux g true false NeverMutates argExpr None matchm match vOpt with diff --git a/tests/FSharp.Core.UnitTests/FSharp.Core/DiscrimantedUnionType.fs b/tests/FSharp.Core.UnitTests/FSharp.Core/DiscrimantedUnionType.fs index 597258bdbe4..90d30f40a6c 100644 --- a/tests/FSharp.Core.UnitTests/FSharp.Core/DiscrimantedUnionType.fs +++ b/tests/FSharp.Core.UnitTests/FSharp.Core/DiscrimantedUnionType.fs @@ -249,3 +249,10 @@ let [] ``can properly construct a struct union using FSharpValue.MakeUnion let c2 = (fieldVals.[1] :?> int) Assert.AreEqual (3456, c2) +let [] ``struct unions does optimization correctly on pattern matching`` () = + let arr = ResizeArray() + match arr.Add(1); ValueSome () with + | ValueSome () -> () + | ValueNone -> () + + Assert.AreEqual(1, arr.Count) From 99c667b0ee24f18775d4250a909ee5fdb58e2fae Mon Sep 17 00:00:00 2001 From: Steffen Forkmann Date: Tue, 2 Oct 2018 21:59:47 +0200 Subject: [PATCH 068/160] Replacing short-lived options with ValueOption (#5723) * Replacing short-lived options with ValueOption * Remove couple of allocations * Remove couple of allocations --- src/fsharp/AccessibilityLogic.fs | 9 +- src/fsharp/ConstraintSolver.fs | 74 +++---- src/fsharp/IlxGen.fs | 34 +-- src/fsharp/InfoReader.fs | 32 +-- src/fsharp/MethodCalls.fs | 4 +- src/fsharp/NameResolution.fs | 52 ++--- src/fsharp/NicePrint.fs | 8 +- src/fsharp/Optimizer.fs | 16 +- src/fsharp/PatternMatchCompilation.fs | 2 +- src/fsharp/PostInferenceChecks.fs | 18 +- src/fsharp/TastOps.fs | 203 +++++++++--------- src/fsharp/TastOps.fsi | 22 +- src/fsharp/TypeChecker.fs | 58 ++--- src/fsharp/import.fs | 4 +- src/fsharp/infos.fs | 20 +- src/fsharp/service/ServiceDeclarationLists.fs | 26 +-- src/fsharp/service/service.fs | 66 +++--- src/fsharp/symbols/SymbolHelpers.fs | 23 +- src/fsharp/symbols/Symbols.fs | 4 +- src/fsharp/tast.fs | 18 +- 20 files changed, 356 insertions(+), 337 deletions(-) diff --git a/src/fsharp/AccessibilityLogic.fs b/src/fsharp/AccessibilityLogic.fs index 7e2e2ef5d9c..dcd8d5d801e 100644 --- a/src/fsharp/AccessibilityLogic.fs +++ b/src/fsharp/AccessibilityLogic.fs @@ -194,9 +194,10 @@ let CheckTyconReprAccessible amap m ad tcref = /// Indicates if a type is accessible (both definition and instantiation) let rec IsTypeAccessible g amap m ad ty = - not (isAppTy g ty) || - let tcref, tinst = destAppTy g ty - IsEntityAccessible amap m ad tcref && IsTypeInstAccessible g amap m ad tinst + match tryAppTy g ty with + | ValueNone -> true + | ValueSome(tcref, tinst) -> + IsEntityAccessible amap m ad tcref && IsTypeInstAccessible g amap m ad tinst and IsTypeInstAccessible g amap m ad tinst = match tinst with @@ -210,7 +211,7 @@ let IsProvidedMemberAccessible (amap:Import.ImportMap) m ad ty access = if not isTyAccessible then false else not (isAppTy g ty) || - let tcrefOfViewedItem, _ = destAppTy g ty + let tcrefOfViewedItem = tcrefOfAppTy g ty IsILMemberAccessible g amap m tcrefOfViewedItem ad access /// Compute the accessibility of a provided member diff --git a/src/fsharp/ConstraintSolver.fs b/src/fsharp/ConstraintSolver.fs index 869d0dc31a3..8363ea03d6c 100644 --- a/src/fsharp/ConstraintSolver.fs +++ b/src/fsharp/ConstraintSolver.fs @@ -474,8 +474,8 @@ and SolveTypStaticReq (csenv:ConstraintSolverEnv) trace req ty = IterateD (fun ((tpr:Typar), _) -> SolveTypStaticReqTypar csenv trace req tpr) vs | _ -> match tryAnyParTy csenv.g ty with - | Some tpr -> SolveTypStaticReqTypar csenv trace req tpr - | None -> CompleteD + | ValueSome tpr -> SolveTypStaticReqTypar csenv trace req tpr + | ValueNone -> CompleteD let TransactDynamicReq (trace:OptionalTrace) (tpr:Typar) req = let orig = tpr.DynamicReq @@ -487,7 +487,7 @@ let SolveTypDynamicReq (csenv:ConstraintSolverEnv) trace req ty = | TyparDynamicReq.No -> CompleteD | TyparDynamicReq.Yes -> match tryAnyParTy csenv.g ty with - | Some tpr when tpr.DynamicReq <> TyparDynamicReq.Yes -> + | ValueSome tpr when tpr.DynamicReq <> TyparDynamicReq.Yes -> TransactDynamicReq trace tpr TyparDynamicReq.Yes | _ -> CompleteD @@ -499,7 +499,7 @@ let TransactIsCompatFlex (trace:OptionalTrace) (tpr:Typar) req = let SolveTypIsCompatFlex (csenv:ConstraintSolverEnv) trace req ty = if req then match tryAnyParTy csenv.g ty with - | Some tpr when not tpr.IsCompatFlex -> TransactIsCompatFlex trace tpr req + | ValueSome tpr when not tpr.IsCompatFlex -> TransactIsCompatFlex trace tpr req | _ -> CompleteD else CompleteD @@ -687,8 +687,8 @@ let CheckWarnIfRigid (csenv:ConstraintSolverEnv) ty1 (r:Typar) ty = if not r.Rigidity.WarnIfUnified then CompleteD else let needsWarning = match tryAnyParTy g ty with - | None -> true - | Some tp2 -> + | ValueNone -> true + | ValueSome tp2 -> not tp2.IsCompilerGenerated && (r.IsCompilerGenerated || // exclude this warning for two identically named user-specified type parameters, e.g. from different mutually recursive functions or types @@ -758,8 +758,8 @@ and solveTypMeetsTyparConstraints (csenv:ConstraintSolverEnv) ndeep m2 trace ty CompleteD else match tryDestTyparTy g ty with - | None -> CompleteD - | Some destTypar -> + | ValueNone -> CompleteD + | ValueSome destTypar -> AddConstraint csenv ndeep m2 trace destTypar (TyparConstraint.DefaultsTo(priority, dty, m)) | TyparConstraint.SupportsNull m2 -> SolveTypeSupportsNull csenv ndeep m2 trace ty @@ -1458,7 +1458,7 @@ and GetRelevantMethodsForTrait (csenv:ConstraintSolverEnv) permitWeakResolution /// The nominal support of the member constraint and GetSupportOfMemberConstraint (csenv:ConstraintSolverEnv) (TTrait(tys, _, _, _, _, _)) = - tys |> List.choose (tryAnyParTy csenv.g) + tys |> List.choose (tryAnyParTyOption csenv.g) /// All the typars relevant to the member constraint *) and GetFreeTyparsOfMemberConstraint (csenv:ConstraintSolverEnv) (TTrait(tys, _, _, argtys, rty, _)) = @@ -1475,9 +1475,9 @@ and SolveRelevantMemberConstraints (csenv:ConstraintSolverEnv) ndeep permitWeakR /// Normalize the typar let ty = mkTyparTy tp match tryAnyParTy csenv.g ty with - | Some tp -> + | ValueSome tp -> SolveRelevantMemberConstraintsForTypar csenv ndeep permitWeakResolution trace tp - | None -> + | ValueNone -> ResultD false)) and SolveRelevantMemberConstraintsForTypar (csenv:ConstraintSolverEnv) ndeep permitWeakResolution (trace:OptionalTrace) tp = @@ -1690,9 +1690,9 @@ and SolveTypeSupportsNull (csenv:ConstraintSolverEnv) ndeep m2 trace ty = let m = csenv.m let denv = csenv.DisplayEnv match tryDestTyparTy g ty with - | Some destTypar -> + | ValueSome destTypar -> AddConstraint csenv ndeep m2 trace destTypar (TyparConstraint.SupportsNull m) - | None -> + | ValueNone -> if TypeSatisfiesNullConstraint g m ty then CompleteD else match ty with | NullableTy g _ -> @@ -1706,12 +1706,12 @@ and SolveTypeSupportsComparison (csenv:ConstraintSolverEnv) ndeep m2 trace ty = let amap = csenv.amap let denv = csenv.DisplayEnv match tryDestTyparTy g ty with - | Some destTypar -> + | ValueSome destTypar -> AddConstraint csenv ndeep m2 trace destTypar (TyparConstraint.SupportsComparison m) - | None -> + | ValueNone -> // Check it isn't ruled out by the user match tryDestAppTy g ty with - | Some tcref when HasFSharpAttribute g g.attrib_NoComparisonAttribute tcref.Attribs -> + | ValueSome tcref when HasFSharpAttribute g g.attrib_NoComparisonAttribute tcref.Attribs -> ErrorD (ConstraintSolverError(FSComp.SR.csTypeDoesNotSupportComparison1(NicePrint.minimalStringOfType denv ty), m, m2)) | _ -> match ty with @@ -1750,11 +1750,11 @@ and SolveTypeSupportsEquality (csenv:ConstraintSolverEnv) ndeep m2 trace ty = let m = csenv.m let denv = csenv.DisplayEnv match tryDestTyparTy g ty with - | Some destTypar -> + | ValueSome destTypar -> AddConstraint csenv ndeep m2 trace destTypar (TyparConstraint.SupportsEquality m) - | None -> + | _ -> match tryDestAppTy g ty with - | Some tcref when HasFSharpAttribute g g.attrib_NoEqualityAttribute tcref.Attribs -> + | ValueSome tcref when HasFSharpAttribute g g.attrib_NoEqualityAttribute tcref.Attribs -> ErrorD (ConstraintSolverError(FSComp.SR.csTypeDoesNotSupportEquality1(NicePrint.minimalStringOfType denv ty), m, m2)) | _ -> match ty with @@ -1787,9 +1787,9 @@ and SolveTypeIsEnum (csenv:ConstraintSolverEnv) ndeep m2 trace ty underlying = let m = csenv.m let denv = csenv.DisplayEnv match tryDestTyparTy g ty with - | Some destTypar -> + | ValueSome destTypar -> return! AddConstraint csenv ndeep m2 trace destTypar (TyparConstraint.IsEnum(underlying, m)) - | None -> + | _ -> if isEnumTy g ty then do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace underlying (underlyingTypeOfEnumTy g ty) return! CompleteD @@ -1803,9 +1803,9 @@ and SolveTypeIsDelegate (csenv:ConstraintSolverEnv) ndeep m2 trace ty aty bty = let m = csenv.m let denv = csenv.DisplayEnv match tryDestTyparTy g ty with - | Some destTypar -> + | ValueSome destTypar -> return! AddConstraint csenv ndeep m2 trace destTypar (TyparConstraint.IsDelegate(aty, bty, m)) - | None -> + | _ -> if isDelegateTy g ty then match TryDestStandardDelegateType csenv.InfoReader m AccessibleFromSomewhere ty with | Some (tupledArgTy, rty) -> @@ -1823,9 +1823,9 @@ and SolveTypeIsNonNullableValueType (csenv:ConstraintSolverEnv) ndeep m2 trace t let m = csenv.m let denv = csenv.DisplayEnv match tryDestTyparTy g ty with - | Some destTypar -> + | ValueSome destTypar -> return! AddConstraint csenv ndeep m2 trace destTypar (TyparConstraint.IsNonNullableStruct m) - | None -> + | _ -> let underlyingTy = stripTyEqnsAndMeasureEqns g ty if isStructTy g underlyingTy then if tyconRefEq g g.system_Nullable_tcref (tcrefOfAppTy g underlyingTy) then @@ -1839,9 +1839,9 @@ and SolveTypeIsUnmanaged (csenv:ConstraintSolverEnv) ndeep m2 trace ty = let m = csenv.m let denv = csenv.DisplayEnv match tryDestTyparTy g ty with - | Some destTypar -> + | ValueSome destTypar -> AddConstraint csenv ndeep m2 trace destTypar (TyparConstraint.IsUnmanaged m) - | None -> + | _ -> if isUnmanagedTy g ty then CompleteD else @@ -1853,9 +1853,9 @@ and SolveTypeChoice (csenv:ConstraintSolverEnv) ndeep m2 trace ty tys = let m = csenv.m let denv = csenv.DisplayEnv match tryDestTyparTy g ty with - | Some destTypar -> + | ValueSome destTypar -> AddConstraint csenv ndeep m2 trace destTypar (TyparConstraint.SimpleChoice(tys, m)) - | None -> + | _ -> if List.exists (typeEquivAux Erasure.EraseMeasures g ty) tys then CompleteD else ErrorD (ConstraintSolverError(FSComp.SR.csTypeNotCompatibleBecauseOfPrintf((NicePrint.minimalStringOfType denv ty), (String.concat "," (List.map (NicePrint.prettyStringOfTy denv) tys))), m, m2)) @@ -1865,9 +1865,9 @@ and SolveTypeIsReferenceType (csenv:ConstraintSolverEnv) ndeep m2 trace ty = let m = csenv.m let denv = csenv.DisplayEnv match tryDestTyparTy g ty with - | Some destTypar -> + | ValueSome destTypar -> AddConstraint csenv ndeep m2 trace destTypar (TyparConstraint.IsReferenceType m) - | None -> + | _ -> if isRefTy g ty then CompleteD else ErrorD (ConstraintSolverError(FSComp.SR.csGenericConstructRequiresReferenceSemantics(NicePrint.minimalStringOfType denv ty), m, m)) @@ -1878,9 +1878,9 @@ and SolveTypeRequiresDefaultConstructor (csenv:ConstraintSolverEnv) ndeep m2 tra let denv = csenv.DisplayEnv let ty = stripTyEqnsAndMeasureEqns g origTy match tryDestTyparTy g ty with - | Some destTypar -> + | ValueSome destTypar -> AddConstraint csenv ndeep m2 trace destTypar (TyparConstraint.RequiresDefaultConstructor m) - | None -> + | _ -> if isStructTy g ty && TypeHasDefaultValue g m ty then CompleteD else @@ -1888,13 +1888,13 @@ and SolveTypeRequiresDefaultConstructor (csenv:ConstraintSolverEnv) ndeep m2 tra |> List.exists (fun x -> x.IsNullary && IsMethInfoAccessible amap m AccessibleFromEverywhere x) then match tryDestAppTy g ty with - | Some tcref when HasFSharpAttribute g g.attrib_AbstractClassAttribute tcref.Attribs -> + | ValueSome tcref when HasFSharpAttribute g g.attrib_AbstractClassAttribute tcref.Attribs -> ErrorD (ConstraintSolverError(FSComp.SR.csGenericConstructRequiresNonAbstract(NicePrint.minimalStringOfType denv origTy), m, m2)) | _ -> CompleteD else match tryDestAppTy g ty with - | Some tcref when + | ValueSome tcref when tcref.PreEstablishedHasDefaultConstructor || // F# 3.1 feature: records with CLIMutable attribute should satisfy 'default constructor' constraint (tcref.IsRecordTycon && HasFSharpAttribute g g.attrib_CLIMutableAttribute tcref.Attribs) -> @@ -2324,7 +2324,7 @@ and ResolveOverloading // Func<_> is always considered better than any other delegate type match tryDestAppTy csenv.g ty1 with - | Some tcref1 when + | ValueSome tcref1 when tcref1.DisplayName = "Func" && (match tcref1.PublicPath with Some p -> p.EnclosingPath = [| "System" |] | _ -> false) && isDelegateTy g ty1 && @@ -2657,7 +2657,7 @@ let CodegenWitnessThatTypeSupportsTraitConstraint tcVal g amap m (traitInfo:Trai match sln with | ILMethSln(origTy, extOpt, mref, minst) -> let metadataTy = convertToTypeWithMetadataIfPossible g origTy - let tcref, _tinst = destAppTy g metadataTy + let tcref = tcrefOfAppTy g metadataTy let mdef = IL.resolveILMethodRef tcref.ILTyconRawMetadata mref let ilMethInfo = match extOpt with diff --git a/src/fsharp/IlxGen.fs b/src/fsharp/IlxGen.fs index 903a424a4e4..2a5e5dce89a 100644 --- a/src/fsharp/IlxGen.fs +++ b/src/fsharp/IlxGen.fs @@ -471,8 +471,8 @@ and GenUnionRef (amap: ImportMap) m (tcref: TyconRef) = let tycon = tcref.Deref assert(not tycon.IsTypeAbbrev) match tycon.UnionTypeInfo with - | None -> failwith "GenUnionRef m" - | Some funion -> + | ValueNone -> failwith "GenUnionRef m" + | ValueSome funion -> cached funion.CompiledRepresentation (fun () -> let tyenvinner = TypeReprEnv.ForTycon tycon match tcref.CompiledRepresentation with @@ -739,8 +739,8 @@ let AddStorageForVal (g: TcGlobals) (v,s) eenv = // Passing an empty remap is sufficient for FSharp.Core.dll because it turns out the remapped type signature can // still be resolved. match tryRescopeVal g.fslibCcu Remap.Empty v with - | None -> eenv - | Some vref -> + | ValueNone -> eenv + | ValueSome vref -> match vref.TryDeref with | ValueNone -> //let msg = sprintf "could not dereference external value reference to something in FSharp.Core.dll during code generation, v.MangledName = '%s', v.Range = %s" v.MangledName (stringOfRange v.Range) @@ -3425,21 +3425,21 @@ and GenDefaultValue cenv cgbuf eenv (ty,m) = CG.EmitInstr cgbuf (pop 0) (Push [ilTy]) AI_ldnull else match tryDestAppTy cenv.g ty with - | Some tcref when (tyconRefEq cenv.g cenv.g.system_SByte_tcref tcref || - tyconRefEq cenv.g cenv.g.system_Int16_tcref tcref || - tyconRefEq cenv.g cenv.g.system_Int32_tcref tcref || - tyconRefEq cenv.g cenv.g.system_Bool_tcref tcref || - tyconRefEq cenv.g cenv.g.system_Byte_tcref tcref || - tyconRefEq cenv.g cenv.g.system_Char_tcref tcref || - tyconRefEq cenv.g cenv.g.system_UInt16_tcref tcref || - tyconRefEq cenv.g cenv.g.system_UInt32_tcref tcref) -> + | ValueSome tcref when (tyconRefEq cenv.g cenv.g.system_SByte_tcref tcref || + tyconRefEq cenv.g cenv.g.system_Int16_tcref tcref || + tyconRefEq cenv.g cenv.g.system_Int32_tcref tcref || + tyconRefEq cenv.g cenv.g.system_Bool_tcref tcref || + tyconRefEq cenv.g cenv.g.system_Byte_tcref tcref || + tyconRefEq cenv.g cenv.g.system_Char_tcref tcref || + tyconRefEq cenv.g cenv.g.system_UInt16_tcref tcref || + tyconRefEq cenv.g cenv.g.system_UInt32_tcref tcref) -> CG.EmitInstr cgbuf (pop 0) (Push [ilTy]) iLdcZero - | Some tcref when (tyconRefEq cenv.g cenv.g.system_Int64_tcref tcref || - tyconRefEq cenv.g cenv.g.system_UInt64_tcref tcref) -> + | ValueSome tcref when (tyconRefEq cenv.g cenv.g.system_Int64_tcref tcref || + tyconRefEq cenv.g cenv.g.system_UInt64_tcref tcref) -> CG.EmitInstr cgbuf (pop 0) (Push [ilTy]) (iLdcInt64 0L) - | Some tcref when (tyconRefEq cenv.g cenv.g.system_Single_tcref tcref) -> + | ValueSome tcref when (tyconRefEq cenv.g cenv.g.system_Single_tcref tcref) -> CG.EmitInstr cgbuf (pop 0) (Push [ilTy]) (iLdcSingle 0.0f) - | Some tcref when (tyconRefEq cenv.g cenv.g.system_Double_tcref tcref) -> + | ValueSome tcref when (tyconRefEq cenv.g cenv.g.system_Double_tcref tcref) -> CG.EmitInstr cgbuf (pop 0) (Push [ilTy]) (iLdcDouble 0.0) | _ -> let ilTy = GenType cenv.amap m eenv.tyenv ty @@ -5118,7 +5118,7 @@ and ComputeFlagFixupsForMemberBinding cenv (v:Val,memberInfo:ValMemberInfo) = else memberInfo.ImplementedSlotSigs |> List.map (fun slotsig -> let oty = slotsig.ImplementedType - let otcref,_ = destAppTy cenv.g oty + let otcref = tcrefOfAppTy cenv.g oty let tcref = v.MemberApparentEntity let useMethodImpl = diff --git a/src/fsharp/InfoReader.fs b/src/fsharp/InfoReader.fs index 3b9963bad9a..e04485887e1 100644 --- a/src/fsharp/InfoReader.fs +++ b/src/fsharp/InfoReader.fs @@ -81,8 +81,8 @@ let rec GetImmediateIntrinsicMethInfosOfTypeAux (optFilter,ad) g amap m origTy m |> List.filter (fun minfo -> not minfo.IsInstance) else match tryDestAppTy g metadataTy with - | None -> [] - | Some tcref -> + | ValueNone -> [] + | ValueSome tcref -> SelectImmediateMemberVals g optFilter (TrySelectMemberVal g optFilter origTy None) tcref let minfos = minfos |> List.filter (IsMethInfoAccessible amap m ad) minfos @@ -169,8 +169,8 @@ let rec GetImmediateIntrinsicPropInfosOfTypeAux (optFilter,ad) g amap m origTy m GetImmediateIntrinsicPropInfosOfTypeAux (optFilter,ad) g amap m origTy betterMetadataTy else match tryDestAppTy g metadataTy with - | None -> [] - | Some tcref -> + | ValueNone -> [] + | ValueSome tcref -> let propCollector = new PropertyCollector(g, amap, m, origTy, optFilter, ad) SelectImmediateMemberVals g None (fun membInfo vref -> propCollector.Collect(membInfo, vref); None) tcref |> ignore propCollector.Close() @@ -188,11 +188,11 @@ let IsIndexerType g amap ty = isArray1DTy g ty || isListTy g ty || match tryDestAppTy g ty with - | Some tcref -> + | ValueSome tcref -> let _, entityTy = generalizeTyconRef tcref let props = GetImmediateIntrinsicPropInfosOfType (None, AccessibleFromSomeFSharpCode) g amap range0 entityTy props |> List.exists (fun x -> x.PropertyName = "Item") - | None -> false + | ValueNone -> false /// Sets of methods up the hierarchy, ignoring duplicates by name and sig. @@ -268,8 +268,8 @@ type InfoReader(g: TcGlobals, amap: Import.ImportMap) = /// Get the F#-declared record fields or class 'val' fields of a type let GetImmediateIntrinsicRecdOrClassFieldsOfType (optFilter, _ad) _m ty = match tryDestAppTy g ty with - | None -> [] - | Some tcref -> + | ValueNone -> [] + | ValueSome tcref -> // Note;secret fields are not allowed in lookups here, as we're only looking // up user-visible fields in name resolution. match optFilter with @@ -417,17 +417,17 @@ type InfoReader(g: TcGlobals, amap: Import.ImportMap) = /// Try and find a record or class field for a type. member x.TryFindRecdOrClassFieldInfoOfType (nm,m,ty) = match recdOrClassFieldInfoCache.Apply((Some nm,AccessibleFromSomewhere),m,ty) with - | [] -> None - | [single] -> Some single + | [] -> ValueNone + | [single] -> ValueSome single | flds -> // multiple fields with the same name can come from different classes, // so filter them by the given type name match tryDestAppTy g ty with - | None -> None - | Some tcref -> + | ValueNone -> ValueNone + | ValueSome tcref -> match flds |> List.filter (fun rfinfo -> tyconRefEq g tcref rfinfo.TyconRef) with - | [] -> None - | [single] -> Some single + | [] -> ValueNone + | [single] -> ValueSome single | _ -> failwith "unexpected multiple fields with same name" // Because it should have been already reported as duplicate fields /// Try and find an item with the given name in a type. @@ -469,8 +469,8 @@ let rec GetIntrinsicConstructorInfosOfTypeAux (infoReader:InfoReader) m origTy m GetIntrinsicConstructorInfosOfTypeAux infoReader m origTy betterMetadataTy else match tryDestAppTy g metadataTy with - | None -> [] - | Some tcref -> + | ValueNone -> [] + | ValueSome tcref -> tcref.MembersOfFSharpTyconByName |> NameMultiMap.find ".ctor" |> List.choose(fun vref -> diff --git a/src/fsharp/MethodCalls.fs b/src/fsharp/MethodCalls.fs index d51bbe953c0..fa812694fd0 100644 --- a/src/fsharp/MethodCalls.fs +++ b/src/fsharp/MethodCalls.fs @@ -346,9 +346,9 @@ type CalledMeth<'T> Choice1Of2(AssignedItemSetter(id, AssignedILFieldSetter(finfo), e)) | _ -> match infoReader.TryFindRecdOrClassFieldInfoOfType(nm, m, returnedObjTy) with - | Some rfinfo -> + | ValueSome rfinfo -> Choice1Of2(AssignedItemSetter(id, AssignedRecdFieldSetter(rfinfo), e)) - | None -> + | _ -> Choice2Of2(arg)) let names = namedCallerArgs |> List.map (fun (CallerNamedArg(nm, _)) -> nm.idText) diff --git a/src/fsharp/NameResolution.fs b/src/fsharp/NameResolution.fs index b7271c92cf5..28e6830c8eb 100644 --- a/src/fsharp/NameResolution.fs +++ b/src/fsharp/NameResolution.fs @@ -2046,13 +2046,13 @@ type LookupKind = /// Try to find a union case of a type, with the given name let TryFindUnionCaseOfType g ty nm = - if isAppTy g ty then - let tcref,tinst = destAppTy g ty + match tryAppTy g ty with + | ValueSome(tcref,tinst) -> match tcref.GetUnionCaseByName nm with - | None -> None - | Some ucase -> Some(UnionCaseInfo(tinst,tcref.MakeNestedUnionCaseRef ucase)) - else - None + | None -> ValueNone + | Some ucase -> ValueSome(UnionCaseInfo(tinst,tcref.MakeNestedUnionCaseRef ucase)) + | _ -> + ValueNone let CoreDisplayName(pinfo:PropInfo) = match pinfo with @@ -2104,13 +2104,13 @@ let rec ResolveLongIdentInTypePrim (ncenv:NameResolver) nenv lookupKind (resInfo let unionCaseSearch = match lookupKind with | LookupKind.Expr | LookupKind.Pattern -> TryFindUnionCaseOfType g ty nm - | _ -> None + | _ -> ValueNone // Lookup: datatype constructors take precedence match unionCaseSearch with - | Some ucase -> + | ValueSome ucase -> OneResult (success(resInfo,Item.UnionCase(ucase,false),rest)) - | None -> + | _ -> let isLookUpExpr = lookupKind = LookupKind.Expr match TryFindIntrinsicNamedItemOfType ncenv.InfoReader (nm,ad) findFlag m ty with | Some (PropertyItem psets) when isLookUpExpr -> @@ -2199,7 +2199,7 @@ let rec ResolveLongIdentInTypePrim (ncenv:NameResolver) nenv lookupKind (resInfo match lookupKind with | LookupKind.Expr | LookupKind.Pattern -> if isAppTy g ty then - let tcref,_ = destAppTy g ty + let tcref = tcrefOfAppTy g ty tcref.UnionCasesArray |> Array.map (fun uc -> uc.DisplayName) else @@ -3093,8 +3093,8 @@ let ResolveFieldPrim sink (ncenv:NameResolver) nenv ad ty (mp,id:Ident) allField if isAppTy g ty then match ncenv.InfoReader.TryFindRecdOrClassFieldInfoOfType(id.idText,m,ty) with - | Some (RecdFieldInfo(_,rfref)) -> [ResolutionInfo.Empty, FieldResolution(rfref,false)] - | None -> + | ValueSome (RecdFieldInfo(_,rfref)) -> [ResolutionInfo.Empty, FieldResolution(rfref,false)] + | _ -> if isRecdTy g ty then // record label doesn't belong to record type -> suggest other labels of same record let suggestLabels() = SuggestOtherLabelsOfSameRecordType g nenv ty id allFields @@ -3450,12 +3450,14 @@ let ResolveCompletionsInType (ncenv: NameResolver) nenv (completionTargets: Reso ncenv.InfoReader.GetRecordOrClassFieldsOfType(None,ad,m,ty) |> List.filter (fun rfref -> rfref.IsStatic = statics && IsFieldInfoAccessible ad rfref) - let ucinfos = - if completionTargets.ResolveAll && statics && isAppTy g ty then - let tc,tinst = destAppTy g ty - tc.UnionCasesAsRefList - |> List.filter (IsUnionCaseUnseen ad g ncenv.amap m >> not) - |> List.map (fun ucref -> Item.UnionCase(UnionCaseInfo(tinst,ucref),false)) + let ucinfos = + if completionTargets.ResolveAll && statics then + match tryAppTy g ty with + | ValueSome (tc,tinst) -> + tc.UnionCasesAsRefList + |> List.filter (IsUnionCaseUnseen ad g ncenv.amap m >> not) + |> List.map (fun ucref -> Item.UnionCase(UnionCaseInfo(tinst,ucref),false)) + | _ -> [] else [] let einfos = @@ -4137,12 +4139,14 @@ let ResolveCompletionsInTypeForItem (ncenv: NameResolver) nenv m ad statics ty ( |> List.filter (fun rfref -> rfref.IsStatic = statics && IsFieldInfoAccessible ad rfref) |> List.map Item.RecdField | Item.UnionCase _ -> - if statics && isAppTy g ty then - let tc, tinst = destAppTy g ty - yield! - tc.UnionCasesAsRefList - |> List.filter (IsUnionCaseUnseen ad g ncenv.amap m >> not) - |> List.map (fun ucref -> Item.UnionCase(UnionCaseInfo(tinst,ucref),false)) + if statics then + match tryAppTy g ty with + | ValueSome(tc, tinst) -> + yield! + tc.UnionCasesAsRefList + |> List.filter (IsUnionCaseUnseen ad g ncenv.amap m >> not) + |> List.map (fun ucref -> Item.UnionCase(UnionCaseInfo(tinst,ucref),false)) + | _ -> () | Item.Event _ -> yield! ncenv.InfoReader.GetEventInfosOfType(None,ad,m,ty) diff --git a/src/fsharp/NicePrint.fs b/src/fsharp/NicePrint.fs index c4ed19f1ee0..ef865b0afa3 100755 --- a/src/fsharp/NicePrint.fs +++ b/src/fsharp/NicePrint.fs @@ -991,7 +991,7 @@ module private PrintTypes = let isParamArray = HasFSharpAttribute denv.g denv.g.attrib_ParamArrayAttribute argInfo.Attribs match argInfo.Name, isOptionalArg, isParamArray, tryDestOptionTy denv.g ty with // Layout an optional argument - | Some(id), true, _, Some ty -> + | Some(id), true, _, ValueSome ty -> leftL (tagPunctuation "?") ^^ sepL (tagParameter id.idText) ^^ SepL.colon ^^ layoutTypeWithInfoAndPrec denv env 2 ty // Layout an unnamed argument | None, _,_, _ -> @@ -1056,7 +1056,7 @@ module private PrintTypes = let prettyLayoutOfCurriedMemberSig denv typarInst argInfos retTy parentTyparTys = let (prettyTyparInst, parentTyparTys,argInfos,retTy),cxs = PrettyTypes.PrettifyInstAndCurriedSig denv.g (typarInst, parentTyparTys, argInfos, retTy) // Filter out the parent typars, which don't get shown in the member signature - let cxs = cxs |> List.filter (fun (tp,_) -> not (parentTyparTys |> List.exists (fun ty -> match tryDestTyparTy denv.g ty with Some destTypar -> typarEq tp destTypar | None -> false))) + let cxs = cxs |> List.filter (fun (tp,_) -> not (parentTyparTys |> List.exists (fun ty -> match tryDestTyparTy denv.g ty with ValueSome destTypar -> typarEq tp destTypar | _ -> false))) prettyTyparInst, prettyLayoutOfTopTypeInfoAux denv argInfos retTy cxs // Layout: type spec - class, datatype, record, abbrev @@ -1247,7 +1247,7 @@ module InfoMemberPrinting = // Layout an optional argument | _, Some nm, true, ptyOpt -> // detect parameter type, if ptyOpt is None - this is .NET style optional argument - let pty = defaultArg ptyOpt pty + let pty = match ptyOpt with ValueSome x -> x | _ -> pty SepL.questionMark ^^ wordL (tagParameter nm.idText) ^^ RightL.colon ^^ @@ -1513,7 +1513,7 @@ module private TastDefinitionPrinting = /// Another re-implementation of type printing, this time based off provided info objects. let layoutProvidedTycon (denv:DisplayEnv) (infoReader:InfoReader) ad m start lhsL ty = let g = denv.g - let tcref,_ = destAppTy g ty + let tcref = tcrefOfAppTy g ty if isEnumTy g ty then let fieldLs = diff --git a/src/fsharp/Optimizer.fs b/src/fsharp/Optimizer.fs index 023961820d6..043e9e4747f 100644 --- a/src/fsharp/Optimizer.fs +++ b/src/fsharp/Optimizer.fs @@ -455,8 +455,8 @@ let BindExternalLocalVal cenv (v:Val) vval env = // Passing an empty remap is sufficient for FSharp.Core.dll because it turns out the remapped type signature can // still be resolved. match tryRescopeVal cenv.g.fslibCcu Remap.Empty v with - | Some vref -> BindValueForFslib vref.nlr v vval env - | None -> env + | ValueSome vref -> BindValueForFslib vref.nlr v vval env + | _ -> env else env env @@ -2364,11 +2364,13 @@ and OptimizeVal cenv env expr (v:ValRef, m) = //------------------------------------------------------------------------- and StripToNominalTyconRef cenv ty = - if isAppTy cenv.g ty then destAppTy cenv.g ty - elif isRefTupleTy cenv.g ty then - let tyargs = destRefTupleTy cenv.g ty - mkCompiledTupleTyconRef cenv.g false (List.length tyargs), tyargs - else failwith "StripToNominalTyconRef: unreachable" + match tryAppTy cenv.g ty with + | ValueSome x -> x + | _ -> + if isRefTupleTy cenv.g ty then + let tyargs = destRefTupleTy cenv.g ty + mkCompiledTupleTyconRef cenv.g false (List.length tyargs), tyargs + else failwith "StripToNominalTyconRef: unreachable" and CanDevirtualizeApplication cenv v vref ty args = valRefEq cenv.g v vref diff --git a/src/fsharp/PatternMatchCompilation.fs b/src/fsharp/PatternMatchCompilation.fs index 084e2c8a151..625b23a70d0 100644 --- a/src/fsharp/PatternMatchCompilation.fs +++ b/src/fsharp/PatternMatchCompilation.fs @@ -257,7 +257,7 @@ let RefuteDiscrimSet g m path discrims = | None -> raise CannotRefute | Some c -> match tryDestAppTy g ty with - | Some tcref when tcref.IsEnumTycon -> + | ValueSome tcref when tcref.IsEnumTycon -> // We must distinguish between F#-defined enums and other .NET enums, as they are represented differently in the TAST let enumValues = if tcref.IsILEnumTycon then diff --git a/src/fsharp/PostInferenceChecks.fs b/src/fsharp/PostInferenceChecks.fs index 761d5395e88..5e2755dcaac 100644 --- a/src/fsharp/PostInferenceChecks.fs +++ b/src/fsharp/PostInferenceChecks.fs @@ -444,8 +444,8 @@ let CheckTypeForAccess (cenv:cenv) env objName valAcc m ty = // We deliberately only check the fully stripped type for accessibility, // because references to private type abbreviations are permitted match tryDestAppTy cenv.g ty with - | None -> () - | Some tcref -> + | ValueNone -> () + | ValueSome tcref -> let thisCompPath = compPathOfCcu cenv.viewCcu let tyconAcc = tcref.Accessibility |> AccessInternalsVisibleToAsInternal thisCompPath cenv.internalsVisibleToPaths if isLessAccessible tyconAcc valAcc then @@ -460,8 +460,8 @@ let WarnOnWrongTypeForAccess (cenv:cenv) env objName valAcc m ty = // We deliberately only check the fully stripped type for accessibility, // because references to private type abbreviations are permitted match tryDestAppTy cenv.g ty with - | None -> () - | Some tcref -> + | ValueNone -> () + | ValueSome tcref -> let thisCompPath = compPathOfCcu cenv.viewCcu let tyconAcc = tcref.Accessibility |> AccessInternalsVisibleToAsInternal thisCompPath cenv.internalsVisibleToPaths if isLessAccessible tyconAcc valAcc then @@ -578,8 +578,8 @@ let CheckType permitByRefLike (cenv:cenv) env m ty = if isByrefLikeTyconRef cenv.g m tcref then let visitTye ty0 = match tryDestAppTy cenv.g ty0 with - | None -> () - | Some tcref2 -> + | ValueNone -> () + | ValueSome tcref2 -> if isByrefTyconRef cenv.g tcref2 then errorR(Error(FSComp.SR.chkNoByrefsOfByrefs(NicePrint.minimalStringOfType cenv.denv ty), m)) CheckTypesDeep (visitTye, None, None, None, None) cenv.g env tinst @@ -941,7 +941,7 @@ and CheckExpr (cenv:cenv) (env:env) origExpr (context:PermitByRefExpr) : Limit = // Disallow calls to abstract base methods on IL types. match tryDestAppTy g baseVal.Type with - | Some tcref when tcref.IsILTycon -> + | ValueSome tcref when tcref.IsILTycon -> try // This is awkward - we have to explicitly re-resolve back to the IL metadata to determine if the method is abstract. // We believe this may be fragile in some situations, since we are using the Abstract IL code to compare @@ -1603,7 +1603,9 @@ and CheckBinding cenv env alwaysCheckNoReraise context (TBind(v,bindRhs,_) as bi CheckForByrefLikeType cenv env v.Range v.Type (fun () -> errorR(Error(FSComp.SR.chkNoByrefAsTopValue(),v.Range))) | _ -> () - if Option.isSome v.PublicPath then + match v.PublicPath with + | None -> () + | _ -> if // Don't support implicit [] on generated members, except the implicit members // for 'let' bound functions in classes. diff --git a/src/fsharp/TastOps.fs b/src/fsharp/TastOps.fs index 4b161ac1d27..cfbb8e195ed 100644 --- a/src/fsharp/TastOps.fs +++ b/src/fsharp/TastOps.fs @@ -229,7 +229,7 @@ and remapTupInfoAux _tyenv unt = and remapTypesAux tyenv types = List.mapq (remapTypeAux tyenv) types and remapTyparConstraintsAux tyenv cs = - cs |> List.choose (fun x -> + cs |> List.choose (fun x -> match x with | TyparConstraint.CoercesTo(ty, m) -> Some(TyparConstraint.CoercesTo (remapTypeAux tyenv ty, m)) @@ -799,39 +799,47 @@ let isProvenUnionCaseTy ty = match ty with TType_ucase _ -> true | _ -> false let mkAppTy tcref tyargs = TType_app(tcref, tyargs) let mkProvenUnionCaseTy ucref tyargs = TType_ucase(ucref, tyargs) let isAppTy g ty = ty |> stripTyEqns g |> (function TType_app _ -> true | _ -> false) +let tryAppTy g ty = ty |> stripTyEqns g |> (function TType_app(tcref, tinst) -> ValueSome (tcref, tinst) | _ -> ValueNone) let destAppTy g ty = ty |> stripTyEqns g |> (function TType_app(tcref, tinst) -> tcref, tinst | _ -> failwith "destAppTy") let tcrefOfAppTy g ty = ty |> stripTyEqns g |> (function TType_app(tcref, _) -> tcref | _ -> failwith "tcrefOfAppTy") let argsOfAppTy g ty = ty |> stripTyEqns g |> (function TType_app(_, tinst) -> tinst | _ -> []) -let tryDestTyparTy g ty = ty |> stripTyEqns g |> (function TType_var v -> Some v | _ -> None) -let tryDestFunTy g ty = ty |> stripTyEqns g |> (function TType_fun (tyv, tau) -> Some(tyv, tau) | _ -> None) -let tryDestAppTy g ty = ty |> stripTyEqns g |> (function TType_app(tcref, _) -> Some tcref | _ -> None) +let tryDestTyparTy g ty = ty |> stripTyEqns g |> (function TType_var v -> ValueSome v | _ -> ValueNone) +let tryDestFunTy g ty = ty |> stripTyEqns g |> (function TType_fun (tyv, tau) -> ValueSome(tyv, tau) | _ -> ValueNone) +let tryDestAppTy g ty = ty |> stripTyEqns g |> (function TType_app(tcref, _) -> ValueSome tcref | _ -> ValueNone) -let tryAnyParTy g ty = ty |> stripTyEqns g |> (function TType_var v -> Some v | TType_measure unt when isUnitParMeasure g unt -> Some(destUnitParMeasure g unt) | _ -> None) +let tryAnyParTy g ty = ty |> stripTyEqns g |> (function TType_var v -> ValueSome v | TType_measure unt when isUnitParMeasure g unt -> ValueSome(destUnitParMeasure g unt) | _ -> ValueNone) +let tryAnyParTyOption g ty = ty |> stripTyEqns g |> (function TType_var v -> Some v | TType_measure unt when isUnitParMeasure g unt -> Some(destUnitParMeasure g unt) | _ -> None) let (|AppTy|_|) g ty = ty |> stripTyEqns g |> (function TType_app(tcref, tinst) -> Some (tcref, tinst) | _ -> None) let (|RefTupleTy|_|) g ty = ty |> stripTyEqns g |> (function TType_tuple(tupInfo, tys) when not (evalTupInfoIsStruct tupInfo) -> Some tys | _ -> None) let (|FunTy|_|) g ty = ty |> stripTyEqns g |> (function TType_fun(dty, rty) -> Some (dty, rty) | _ -> None) let tryNiceEntityRefOfTy ty = let ty = stripTyparEqnsAux false ty - match ty with + match ty with + | TType_app (tcref, _) -> ValueSome tcref + | TType_measure (Measure.Con tcref) -> ValueSome tcref + | _ -> ValueNone + +let tryNiceEntityRefOfTyOption ty = + let ty = stripTyparEqnsAux false ty + match ty with | TType_app (tcref, _) -> Some tcref | TType_measure (Measure.Con tcref) -> Some tcref | _ -> None - -let (|NullableTy|_|) g ty = - match ty with - | AppTy g (tcr, [tyarg]) when tyconRefEq g tcr g.system_Nullable_tcref -> Some tyarg +let (|NullableTy|_|) g ty = + match tryAppTy g ty with + | ValueSome (tcr, [tyarg]) when tyconRefEq g tcr g.system_Nullable_tcref -> Some tyarg | _ -> None let (|StripNullableTy|) g ty = - match ty with - | AppTy g (tcr, [tyarg]) when tyconRefEq g tcr g.system_Nullable_tcref -> tyarg + match tryAppTy g ty with + | ValueSome (tcr, [tyarg]) when tyconRefEq g tcr g.system_Nullable_tcref -> tyarg | _ -> ty let mkInstForAppTy g ty = - match ty with - | AppTy g (tcref, tinst) -> mkTyconRefInst tcref tinst + match tryAppTy g ty with + | ValueSome (tcref, tinst) -> mkTyconRefInst tcref tinst | _ -> [] let domainOfFunTy g ty = fst (destFunTy g ty) @@ -1228,8 +1236,8 @@ let NormalizeDeclaredTyparsForEquiRecursiveInference g tps = tps |> List.map (fun tp -> let ty = mkTyparTy tp match tryAnyParTy g ty with - | Some anyParTy -> anyParTy - | None -> tp) + | ValueSome anyParTy -> anyParTy + | ValueNone -> tp) type TypeScheme = TypeScheme of Typars * TType @@ -1392,14 +1400,13 @@ type TyconRefMultiMap<'T>(contents: TyconRefMap<'T list>) = //-------------------------------------------------------------------------- /// Try to create a EntityRef suitable for accessing the given Entity from another assembly -let tryRescopeEntity viewedCcu (entity:Entity) : EntityRef option = +let tryRescopeEntity viewedCcu (entity:Entity) : ValueOption = match entity.PublicPath with - | Some pubpath -> Some (ERefNonLocal (rescopePubPath viewedCcu pubpath)) - | None -> None - + | Some pubpath -> ValueSome (ERefNonLocal (rescopePubPath viewedCcu pubpath)) + | None -> ValueNone /// Try to create a ValRef suitable for accessing the given Val from another assembly -let tryRescopeVal viewedCcu (entityRemap:Remap) (vspec:Val) : ValRef option = +let tryRescopeVal viewedCcu (entityRemap:Remap) (vspec:Val) : ValueOption = match vspec.PublicPath with | Some (ValPubPath(p, fullLinkageKey)) -> // The type information in the val linkage doesn't need to keep any information to trait solutions. @@ -1414,9 +1421,8 @@ let tryRescopeVal viewedCcu (entityRemap:Remap) (vspec:Val) : ValRef option = mkNonLocalValRef (rescopePubPathToParent viewedCcu p) fullLinkageKey else mkNonLocalValRef (rescopePubPath viewedCcu p) fullLinkageKey - Some vref - | None -> None - + ValueSome vref + | _ -> ValueNone //--------------------------------------------------------------------------- // Type information about records, constructors etc. @@ -1570,13 +1576,13 @@ let rankOfArrayTyconRef (g:TcGlobals) tcr = //------------------------------------------------------------------------- let destArrayTy (g:TcGlobals) ty = - match ty with - | AppTy g (tcref, [ty]) when isArrayTyconRef g tcref -> ty + match tryAppTy g ty with + | ValueSome (tcref, [ty]) when isArrayTyconRef g tcref -> ty | _ -> failwith "destArrayTy" let destListTy (g:TcGlobals) ty = - match ty with - | AppTy g (tcref, [ty]) when tyconRefEq g tcref g.list_tcr_canon -> ty + match tryAppTy g ty with + | ValueSome (tcref, [ty]) when tyconRefEq g tcref g.list_tcr_canon -> ty | _ -> failwith "destListTy" let tyconRefEqOpt g tcOpt tc = @@ -1668,24 +1674,24 @@ let rankOfArrayTy g ty = rankOfArrayTyconRef g (tcrefOfAppTy g ty) let isFSharpObjModelRefTy g ty = isFSharpObjModelTy g ty && - let tcr, _ = destAppTy g ty + let tcr = tcrefOfAppTy g ty match tcr.FSharpObjectModelTypeInfo.fsobjmodel_kind with | TTyconClass | TTyconInterface | TTyconDelegate _ -> true | TTyconStruct | TTyconEnum -> false let isFSharpClassTy g ty = match tryDestAppTy g ty with - | Some tcref -> tcref.Deref.IsFSharpClassTycon + | ValueSome tcref -> tcref.Deref.IsFSharpClassTycon | _ -> false let isFSharpStructTy g ty = match tryDestAppTy g ty with - | Some tcref -> tcref.Deref.IsFSharpStructOrEnumTycon + | ValueSome tcref -> tcref.Deref.IsFSharpStructOrEnumTycon | _ -> false let isFSharpInterfaceTy g ty = match tryDestAppTy g ty with - | Some tcref -> tcref.Deref.IsFSharpInterfaceTycon + | ValueSome tcref -> tcref.Deref.IsFSharpInterfaceTycon | _ -> false let isDelegateTy g ty = @@ -1696,7 +1702,7 @@ let isDelegateTy g ty = | ILTypeMetadata (TILObjectReprData(_, _, td)) -> td.IsDelegate | FSharpOrArrayOrByrefOrTupleOrExnTypeMetadata -> match tryDestAppTy g ty with - | Some tcref -> tcref.Deref.IsFSharpDelegateTycon + | ValueSome tcref -> tcref.Deref.IsFSharpDelegateTycon | _ -> false let isInterfaceTy g ty = @@ -1717,17 +1723,17 @@ let isClassTy g ty = let isStructOrEnumTyconTy g ty = match tryDestAppTy g ty with - | Some tcref -> tcref.Deref.IsStructOrEnumTycon + | ValueSome tcref -> tcref.Deref.IsStructOrEnumTycon | _ -> false let isStructRecordOrUnionTyconTy g ty = match tryDestAppTy g ty with - | Some tcref -> tcref.Deref.IsStructRecordOrUnionTycon + | ValueSome tcref -> tcref.Deref.IsStructRecordOrUnionTycon | _ -> false let isStructTy g ty = match tryDestAppTy g ty with - | Some tcref -> + | ValueSome tcref -> let tycon = tcref.Deref tycon.IsStructRecordOrUnionTycon || tycon.IsStructOrEnumTycon | _ -> isStructTupleTy g ty @@ -1757,7 +1763,7 @@ let isRefTy g ty = let rec isUnmanagedTy g ty = let ty = stripTyEqnsAndMeasureEqns g ty match tryDestAppTy g ty with - | Some tcref -> + | ValueSome tcref -> let isEq tcref2 = tyconRefEq g tcref tcref2 if isEq g.nativeptr_tcr || isEq g.nativeint_tcr || isEq g.sbyte_tcr || isEq g.byte_tcr || @@ -1779,7 +1785,7 @@ let rec isUnmanagedTy g ty = | [] -> tycon.AllInstanceFieldsAsList |> List.forall (fun r -> isUnmanagedTy g r.rfield_type) | _ -> false // generic structs are never else false - | None -> + | ValueNone -> false let isInterfaceTycon x = @@ -1789,8 +1795,8 @@ let isInterfaceTyconRef (tcref: TyconRef) = isInterfaceTycon tcref.Deref let isEnumTy g ty = match tryDestAppTy g ty with - | None -> false - | Some tcref -> tcref.IsEnumTycon + | ValueNone -> false + | ValueSome tcref -> tcref.IsEnumTycon let actualReturnTyOfSlotSig parentTyInst methTyInst (TSlotSig(_, _, parentFormalTypars, methFormalTypars, _, formalRetTy)) = let methTyInst = mkTyparInst methFormalTypars methTyInst @@ -2454,7 +2460,7 @@ module PrettyTypes = // Badly formed code may instantiate rigid declared typars to types. // Hence we double check here that the thing is really a type variable - let safeDestAnyParTy orig g ty = match tryAnyParTy g ty with None -> orig | Some x -> x + let safeDestAnyParTy orig g ty = match tryAnyParTy g ty with ValueNone -> orig | ValueSome x -> x let tee f x = f x x let foldUnurriedArgInfos f z (x: UncurriedArgInfos) = List.fold (fold1Of2 f) z x @@ -2651,30 +2657,30 @@ let layoutOfPath p = let fullNameOfParentOfPubPath pp = match pp with - | PubPath([| _ |]) -> None - | pp -> Some(textOfPath pp.EnclosingPath) + | PubPath([| _ |]) -> ValueNone + | pp -> ValueSome(textOfPath pp.EnclosingPath) let fullNameOfParentOfPubPathAsLayout pp = match pp with - | PubPath([| _ |]) -> None - | pp -> Some(layoutOfPath (Array.toList pp.EnclosingPath)) + | PubPath([| _ |]) -> ValueNone + | pp -> ValueSome(layoutOfPath (Array.toList pp.EnclosingPath)) let fullNameOfPubPath (PubPath(p)) = textOfPath p let fullNameOfPubPathAsLayout (PubPath(p)) = layoutOfPath (Array.toList p) let fullNameOfParentOfNonLocalEntityRef (nlr: NonLocalEntityRef) = - if nlr.Path.Length < 2 then None - else Some (textOfPath nlr.EnclosingMangledPath) // <--- BAD BAD BAD: this is a mangled path. This is wrong for nested modules + if nlr.Path.Length < 2 then ValueNone + else ValueSome (textOfPath nlr.EnclosingMangledPath) // <--- BAD BAD BAD: this is a mangled path. This is wrong for nested modules let fullNameOfParentOfNonLocalEntityRefAsLayout (nlr: NonLocalEntityRef) = - if nlr.Path.Length < 2 then None - else Some (layoutOfPath (List.ofArray nlr.EnclosingMangledPath)) // <--- BAD BAD BAD: this is a mangled path. This is wrong for nested modules + if nlr.Path.Length < 2 then ValueNone + else ValueSome (layoutOfPath (List.ofArray nlr.EnclosingMangledPath)) // <--- BAD BAD BAD: this is a mangled path. This is wrong for nested modules let fullNameOfParentOfEntityRef eref = match eref with | ERefLocal x -> match x.PublicPath with - | None -> None + | None -> ValueNone | Some ppath -> fullNameOfParentOfPubPath ppath | ERefNonLocal nlr -> fullNameOfParentOfNonLocalEntityRef nlr @@ -2682,14 +2688,14 @@ let fullNameOfParentOfEntityRefAsLayout eref = match eref with | ERefLocal x -> match x.PublicPath with - | None -> None + | None -> ValueNone | Some ppath -> fullNameOfParentOfPubPathAsLayout ppath | ERefNonLocal nlr -> fullNameOfParentOfNonLocalEntityRefAsLayout nlr let fullNameOfEntityRef nmF xref = - match fullNameOfParentOfEntityRef xref with - | None -> nmF xref - | Some pathText -> pathText +.+ nmF xref + match fullNameOfParentOfEntityRef xref with + | ValueNone -> nmF xref + | ValueSome pathText -> pathText +.+ nmF xref let tagEntityRefName (xref: EntityRef) name = if xref.IsNamespace then tagNamespace name @@ -2711,26 +2717,26 @@ let fullNameOfEntityRefAsLayout nmF (xref: EntityRef) = |> mkNav xref.DefinitionRange |> wordL match fullNameOfParentOfEntityRefAsLayout xref with - | None -> navigableText - | Some pathText -> pathText ^^ SepL.dot ^^ navigableText + | ValueNone -> navigableText + | ValueSome pathText -> pathText ^^ SepL.dot ^^ navigableText let fullNameOfParentOfValRef vref = match vref with | VRefLocal x -> match x.PublicPath with - | None -> None - | Some (ValPubPath(pp, _)) -> Some(fullNameOfPubPath pp) + | None -> ValueNone + | Some (ValPubPath(pp, _)) -> ValueSome(fullNameOfPubPath pp) | VRefNonLocal nlr -> - Some (fullNameOfEntityRef (fun (x:EntityRef) -> x.DemangledModuleOrNamespaceName) nlr.EnclosingEntity) + ValueSome (fullNameOfEntityRef (fun (x:EntityRef) -> x.DemangledModuleOrNamespaceName) nlr.EnclosingEntity) let fullNameOfParentOfValRefAsLayout vref = match vref with | VRefLocal x -> match x.PublicPath with - | None -> None - | Some (ValPubPath(pp, _)) -> Some(fullNameOfPubPathAsLayout pp) + | None -> ValueNone + | Some (ValPubPath(pp, _)) -> ValueSome(fullNameOfPubPathAsLayout pp) | VRefNonLocal nlr -> - Some (fullNameOfEntityRefAsLayout (fun (x:EntityRef) -> x.DemangledModuleOrNamespaceName) nlr.EnclosingEntity) + ValueSome (fullNameOfEntityRefAsLayout (fun (x:EntityRef) -> x.DemangledModuleOrNamespaceName) nlr.EnclosingEntity) let fullDisplayTextOfParentOfModRef r = fullNameOfParentOfEntityRef r @@ -2743,12 +2749,12 @@ let fullDisplayTextOfExnRefAsLayout r = fullNameOfEntityRefAsLayout (fun (tc:Ty let fullDisplayTextOfUnionCaseRef (ucref:UnionCaseRef) = fullDisplayTextOfTyconRef ucref.TyconRef +.+ ucref.CaseName let fullDisplayTextOfRecdFieldRef (rfref:RecdFieldRef) = fullDisplayTextOfTyconRef rfref.TyconRef +.+ rfref.FieldName -let fullDisplayTextOfValRef (vref:ValRef) = +let fullDisplayTextOfValRef (vref:ValRef) = match fullNameOfParentOfValRef vref with - | None -> vref.DisplayName - | Some pathText -> pathText +.+ vref.DisplayName + | ValueNone -> vref.DisplayName + | ValueSome pathText -> pathText +.+ vref.DisplayName -let fullDisplayTextOfValRefAsLayout (vref:ValRef) = +let fullDisplayTextOfValRefAsLayout (vref:ValRef) = let n = match vref.MemberInfo with | None -> @@ -2763,8 +2769,8 @@ let fullDisplayTextOfValRefAsLayout (vref:ValRef) = | MemberKind.Constructor -> tagMethod vref.DisplayName | MemberKind.Member -> tagMember vref.DisplayName match fullNameOfParentOfValRefAsLayout vref with - | None -> wordL n - | Some pathText -> + | ValueNone -> wordL n + | ValueSome pathText -> pathText ^^ SepL.dot ^^ wordL n //pathText +.+ vref.DisplayName @@ -2989,8 +2995,8 @@ let destNativePtrTy g ty = let isRefCellTy g ty = match tryDestAppTy g ty with - | None -> false - | Some tcref -> tyconRefEq g g.refcell_tcr_canon tcref + | ValueNone -> false + | ValueSome tcref -> tyconRefEq g g.refcell_tcr_canon tcref let destRefCellTy g ty = match ty |> stripTyEqns g with @@ -3014,23 +3020,23 @@ let mkListTy (g:TcGlobals) ty = TType_app (g.list_tcr_nice, [ty]) let isOptionTy (g:TcGlobals) ty = match tryDestAppTy g ty with - | None -> false - | Some tcref -> tyconRefEq g g.option_tcr_canon tcref + | ValueNone -> false + | ValueSome tcref -> tyconRefEq g g.option_tcr_canon tcref let tryDestOptionTy g ty = match argsOfAppTy g ty with - | [ty1] when isOptionTy g ty -> Some ty1 - | _ -> None + | [ty1] when isOptionTy g ty -> ValueSome ty1 + | _ -> ValueNone let destOptionTy g ty = match tryDestOptionTy g ty with - | Some ty -> ty - | None -> failwith "destOptionTy: not an option type" + | ValueSome ty -> ty + | ValueNone -> failwith "destOptionTy: not an option type" let isLinqExpressionTy g ty = match tryDestAppTy g ty with - | None -> false - | Some tcref -> tyconRefEq g g.system_LinqExpression_tcref tcref + | ValueNone -> false + | ValueSome tcref -> tyconRefEq g g.system_LinqExpression_tcref tcref let tryDestLinqExpressionTy g ty = match argsOfAppTy g ty with @@ -4660,8 +4666,8 @@ let decideStaticOptimizationConstraint g c = | TTyconIsStruct a -> let a = normalizeEnumTy g (stripTyEqnsAndMeasureEqns g a) match tryDestAppTy g a with - | Some tcref1 -> if tcref1.IsStructOrEnumTycon then StaticOptimizationAnswer.Yes else StaticOptimizationAnswer.No - | None -> StaticOptimizationAnswer.Unknown + | ValueSome tcref1 -> if tcref1.IsStructOrEnumTycon then StaticOptimizationAnswer.Yes else StaticOptimizationAnswer.No + | ValueNone -> StaticOptimizationAnswer.Unknown let rec DecideStaticOptimizations g cs = match cs with @@ -5370,8 +5376,8 @@ let ComputeFieldName tycon f = // Helpers for building code contained in the initial environment //------------------------------------------------------------------------- -let isQuotedExprTy g ty = match ty with AppTy g (tcref, _) -> tyconRefEq g tcref g.expr_tcr | _ -> false -let destQuotedExprTy g ty = match ty with AppTy g (_, [ty]) -> ty | _ -> failwith "destQuotedExprTy" +let isQuotedExprTy g ty = match tryAppTy g ty with ValueSome (tcref, _) -> tyconRefEq g tcref g.expr_tcr | _ -> false +let destQuotedExprTy g ty = match tryAppTy g ty with ValueSome (_, [ty]) -> ty | _ -> failwith "destQuotedExprTy" let mkQuotedExprTy (g:TcGlobals) ty = TType_app(g.expr_tcr, [ty]) let mkRawQuotedExprTy (g:TcGlobals) = TType_app(g.raw_expr_tcr, []) @@ -5681,8 +5687,8 @@ let isRecdOrStructTyconRefReadOnly (g: TcGlobals) m (tcref: TyconRef) = let isRecdOrStructTyReadOnly (g: TcGlobals) m ty = match tryDestAppTy g ty with - | None -> false - | Some tcref -> isRecdOrStructTyconRefReadOnly g m tcref + | ValueNone -> false + | ValueSome tcref -> isRecdOrStructTyconRefReadOnly g m tcref let CanTakeAddressOf g m ty mut = @@ -6168,7 +6174,7 @@ let mkMinusOne g m = mkInt g m (-1) let destInt32 = function Expr.Const(Const.Int32 n, _, _) -> Some n | _ -> None -let isIDelegateEventType g ty = isAppTy g ty && tyconRefEq g g.fslib_IDelegateEvent_tcr (tcrefOfAppTy g ty) +let isIDelegateEventType g ty = match tryDestAppTy g ty with ValueSome tcref -> tyconRefEq g g.fslib_IDelegateEvent_tcr tcref | _ -> false let destIDelegateEventType g ty = if isIDelegateEventType g ty then match argsOfAppTy g ty with @@ -7461,16 +7467,16 @@ let TypeNullNever g ty = let TypeNullIsExtraValue g m ty = if isILReferenceTy g ty || isDelegateTy g ty then // Putting AllowNullLiteralAttribute(false) on an IL or provided type means 'null' can't be used with that type - not (isAppTy g ty && TryFindTyconRefBoolAttribute g m g.attrib_AllowNullLiteralAttribute (tcrefOfAppTy g ty) = Some(false)) + not (match tryDestAppTy g ty with ValueSome tcref -> TryFindTyconRefBoolAttribute g m g.attrib_AllowNullLiteralAttribute tcref = Some false | _ -> false) elif TypeNullNever g ty then false else // Putting AllowNullLiteralAttribute(true) on an F# type means 'null' can be used with that type - isAppTy g ty && TryFindTyconRefBoolAttribute g m g.attrib_AllowNullLiteralAttribute (tcrefOfAppTy g ty) = Some(true) + match tryDestAppTy g ty with ValueSome tcref -> TryFindTyconRefBoolAttribute g m g.attrib_AllowNullLiteralAttribute tcref = Some true | _ -> false let TypeNullIsTrueValue g ty = (match tryDestAppTy g ty with - | Some tcref -> IsUnionTypeWithNullAsTrueValue g tcref.Deref + | ValueSome tcref -> IsUnionTypeWithNullAsTrueValue g tcref.Deref | _ -> false) || (isUnitTy g ty) let TypeNullNotLiked g m ty = @@ -7510,8 +7516,8 @@ let (|SpecialComparableHeadType|_|) g ty = let _tupInfo, elemTys = destAnyTupleTy g ty Some elemTys else - match ty with - | AppTy g (tcref, tinst) -> + match tryAppTy g ty with + | ValueSome (tcref, tinst) -> if isArrayTyconRef g tcref || tyconRefEq g tcref g.system_UIntPtr_tcref || tyconRefEq g tcref g.system_IntPtr_tcref then @@ -7620,17 +7626,16 @@ let isSealedTy g ty = | ProvidedTypeMetadata st -> st.IsSealed #endif | ILTypeMetadata (TILObjectReprData(_, _, td)) -> td.IsSealed - | FSharpOrArrayOrByrefOrTupleOrExnTypeMetadata -> - + | FSharpOrArrayOrByrefOrTupleOrExnTypeMetadata -> if (isFSharpInterfaceTy g ty || isFSharpClassTy g ty) then - let tcref, _ = destAppTy g ty - (TryFindFSharpBoolAttribute g g.attrib_SealedAttribute tcref.Attribs = Some(true)) + let tcref = tcrefOfAppTy g ty + TryFindFSharpBoolAttribute g g.attrib_SealedAttribute tcref.Attribs = Some true else // All other F# types, array, byref, tuple types are sealed true let isComInteropTy g ty = - let tcr, _ = destAppTy g ty + let tcr = tcrefOfAppTy g ty match g.attrib_ComImportAttribute with | None -> false | Some attr -> TryFindFSharpBoolAttribute g attr tcr.Attribs = Some(true) @@ -7936,9 +7941,9 @@ let MakeExportRemapping viewedCcu (mspec:ModuleOrNamespace) = let accEntityRemap (entity:Entity) acc = match tryRescopeEntity viewedCcu entity with - | Some eref -> + | ValueSome eref -> addTyconRefRemap (mkLocalTyconRef entity) eref acc - | None -> + | _ -> if entity.IsNamespace then acc else @@ -7947,9 +7952,9 @@ let MakeExportRemapping viewedCcu (mspec:ModuleOrNamespace) = let accValRemap (vspec:Val) acc = // The acc contains the entity remappings match tryRescopeVal viewedCcu acc vspec with - | Some vref -> + | ValueSome vref -> {acc with valRemap=acc.valRemap.Add vspec vref } - | None -> + | _ -> error(InternalError("Unexpected value without a pubpath when remapping assembly data", vspec.Range)) let mty = mspec.ModuleOrNamespaceType diff --git a/src/fsharp/TastOps.fsi b/src/fsharp/TastOps.fsi index d2a532c37a9..6723cb84c2e 100755 --- a/src/fsharp/TastOps.fsi +++ b/src/fsharp/TastOps.fsi @@ -9,6 +9,7 @@ open Internal.Utilities open Microsoft.FSharp.Compiler.AbstractIL open Microsoft.FSharp.Compiler.AbstractIL.IL open Microsoft.FSharp.Compiler.AbstractIL.Internal +open Microsoft.FSharp.Compiler.AbstractIL.Internal.Library open Microsoft.FSharp.Compiler open Microsoft.FSharp.Compiler.Range open Microsoft.FSharp.Compiler.Rational @@ -482,7 +483,8 @@ val isFSharpStructOrEnumTy : TcGlobals -> TType -> bool val isFSharpEnumTy : TcGlobals -> TType -> bool val isTyparTy : TcGlobals -> TType -> bool val isAnyParTy : TcGlobals -> TType -> bool -val tryAnyParTy : TcGlobals -> TType -> Typar option +val tryAnyParTy : TcGlobals -> TType -> ValueOption +val tryAnyParTyOption : TcGlobals -> TType -> Typar option val isMeasureTy : TcGlobals -> TType -> bool val mkAppTy : TyconRef -> TypeInst -> TType @@ -491,16 +493,18 @@ val mkProvenUnionCaseTy : UnionCaseRef -> TypeInst -> TType val isProvenUnionCaseTy : TType -> bool val isAppTy : TcGlobals -> TType -> bool +val tryAppTy : TcGlobals -> TType -> ValueOption val destAppTy : TcGlobals -> TType -> TyconRef * TypeInst val tcrefOfAppTy : TcGlobals -> TType -> TyconRef -val tryDestAppTy : TcGlobals -> TType -> TyconRef option -val tryDestTyparTy : TcGlobals -> TType -> Typar option -val tryDestFunTy : TcGlobals -> TType -> (TType * TType) option +val tryDestAppTy : TcGlobals -> TType -> ValueOption +val tryDestTyparTy : TcGlobals -> TType -> ValueOption +val tryDestFunTy : TcGlobals -> TType -> ValueOption<(TType * TType)> val argsOfAppTy : TcGlobals -> TType -> TypeInst val mkInstForAppTy : TcGlobals -> TType -> TyparInst /// Try to get a TyconRef for a type without erasing type abbreviations -val tryNiceEntityRefOfTy : TType -> TyconRef option +val tryNiceEntityRefOfTy : TType -> ValueOption +val tryNiceEntityRefOfTyOption : TType -> TyconRef option val domainOfFunTy : TcGlobals -> TType -> TType @@ -729,7 +733,7 @@ val tagEntityRefName: xref: EntityRef -> name: string -> StructuredFormat.Tagged /// Return the full text for an item as we want it displayed to the user as a fully qualified entity val fullDisplayTextOfModRef : ModuleOrNamespaceRef -> string -val fullDisplayTextOfParentOfModRef : ModuleOrNamespaceRef -> string option +val fullDisplayTextOfParentOfModRef : ModuleOrNamespaceRef -> ValueOption val fullDisplayTextOfValRef : ValRef -> string val fullDisplayTextOfValRefAsLayout : ValRef -> StructuredFormat.Layout val fullDisplayTextOfTyconRef : TyconRef -> string @@ -883,8 +887,8 @@ val SigTypeOfImplFile : TypedImplFile -> ModuleOrNamespaceType //------------------------------------------------------------------------- -val tryRescopeEntity : CcuThunk -> Entity -> EntityRef option -val tryRescopeVal : CcuThunk -> Remap -> Val -> ValRef option +val tryRescopeEntity : CcuThunk -> Entity -> ValueOption +val tryRescopeVal : CcuThunk -> Remap -> Val -> ValueOption val MakeExportRemapping : CcuThunk -> ModuleOrNamespace -> Remap val ApplyExportRemappingToEntity : TcGlobals -> Remap -> ModuleOrNamespace -> ModuleOrNamespace @@ -1024,7 +1028,7 @@ val mkVoidPtrTy : TcGlobals -> TType val mkArrayType : TcGlobals -> TType -> TType val isOptionTy : TcGlobals -> TType -> bool val destOptionTy : TcGlobals -> TType -> TType -val tryDestOptionTy : TcGlobals -> TType -> TType option +val tryDestOptionTy : TcGlobals -> TType -> ValueOption val isLinqExpressionTy : TcGlobals -> TType -> bool val destLinqExpressionTy : TcGlobals -> TType -> TType diff --git a/src/fsharp/TypeChecker.fs b/src/fsharp/TypeChecker.fs index 79591bf565e..7f5d834a519 100755 --- a/src/fsharp/TypeChecker.fs +++ b/src/fsharp/TypeChecker.fs @@ -724,21 +724,21 @@ let UnifyStructTupleType contextInfo cenv denv m ty ps = /// variables unnecessarily let UnifyFunctionTypeUndoIfFailed cenv denv m ty = match tryDestFunTy cenv.g ty with - | None -> + | ValueNone -> let domainTy = NewInferenceType () let resultTy = NewInferenceType () if AddCxTypeEqualsTypeUndoIfFailed denv cenv.css m ty (domainTy --> resultTy) then - Some(domainTy, resultTy) + ValueSome(domainTy, resultTy) else - None + ValueNone | r -> r /// Optimized unification routine that avoids creating new inference /// variables unnecessarily let UnifyFunctionType extraInfo cenv denv mFunExpr ty = match UnifyFunctionTypeUndoIfFailed cenv denv mFunExpr ty with - | Some res -> res - | None -> + | ValueSome res -> res + | ValueNone -> match extraInfo with | Some argm -> error (NotAFunction(denv, ty, mFunExpr, argm)) | None -> error (FunctionExpected(denv, ty, mFunExpr)) @@ -1507,7 +1507,7 @@ let MakeAndPublishBaseVal cenv env baseIdOpt ty = let InstanceMembersNeedSafeInitCheck cenv m thisTy = ExistsInEntireHierarchyOfType - (fun ty -> not (isStructTy cenv.g ty) && (match tryDestAppTy cenv.g ty with Some tcref when tcref.HasSelfReferentialConstructor -> true | _ -> false)) + (fun ty -> not (isStructTy cenv.g ty) && (match tryDestAppTy cenv.g ty with ValueSome tcref when tcref.HasSelfReferentialConstructor -> true | _ -> false)) cenv.g cenv.amap m @@ -2205,11 +2205,11 @@ module GeneralizationHelpers = let lhsConstraintTypars = allUntupledArgTys |> List.collect (fun ty -> match tryDestTyparTy cenv.g ty with - | Some tp -> + | ValueSome tp -> match relevantUniqueSubtypeConstraint tp with | Some cxty -> freeInTypeLeftToRight cenv.g false cxty | None -> [] - | None -> []) + | _ -> []) let IsCondensationTypar (tp:Typar) = // A condensation typar may not a user-generated type variable nor has it been unified with any user type variable @@ -2221,7 +2221,7 @@ module GeneralizationHelpers = // A condensation typar can't be used in the constraints of any candidate condensation typars not (ListSet.contains typarEq tp lhsConstraintTypars) && // A condensation typar must occur precisely once in tyIJ, and must not occur free in any other tyIJ - (match allUntupledArgTysWithFreeVars |> List.partition (fun (ty, _) -> match tryDestTyparTy cenv.g ty with Some destTypar -> typarEq destTypar tp | _ -> false) with + (match allUntupledArgTysWithFreeVars |> List.partition (fun (ty, _) -> match tryDestTyparTy cenv.g ty with ValueSome destTypar -> typarEq destTypar tp | _ -> false) with | [_], rest -> not (rest |> List.exists (fun (_, fvs) -> ListSet.contains typarEq tp fvs)) | _ -> false) @@ -5656,7 +5656,7 @@ and TcExprs cenv env m tpenv flexes argtys args = and CheckSuperInit cenv objTy m = // Check the type is not abstract match tryDestAppTy cenv.g objTy with - | Some tcref when isAbstractTycon tcref.Deref -> + | ValueSome tcref when isAbstractTycon tcref.Deref -> errorR(Error(FSComp.SR.tcAbstractTypeCannotBeInstantiated(), m)) | _ -> () @@ -6183,9 +6183,9 @@ and TcIndexerThen cenv env overallTy mWholeExpr mDot tpenv wholeExpr e1 indexArg match acc with | None -> match tryDestAppTy cenv.g ty with - | Some tcref -> + | ValueSome tcref -> TryFindTyconRefStringAttribute cenv.g mWholeExpr cenv.g.attrib_DefaultMemberAttribute tcref - | None -> + | _ -> match AllPropInfosOfTypeInScope cenv.infoReader env.NameEnv (Some "Item", ad) IgnoreOverrides mWholeExpr ty with | [] -> None | _ -> Some "Item" @@ -6667,8 +6667,8 @@ and TcObjectExpr cenv overallTy env tpenv (synObjTy, argopt, binds, extraImpls, let objTy, tpenv = TcType cenv NewTyparsOK CheckCxs ItemOccurence.UseInType env tpenv synObjTy match tryDestAppTy cenv.g objTy with - | None -> error(Error(FSComp.SR.tcNewMustBeUsedWithNamedType(), mNewExpr)) - | Some tcref -> + | ValueNone -> error(Error(FSComp.SR.tcNewMustBeUsedWithNamedType(), mNewExpr)) + | ValueSome tcref -> let isRecordTy = isRecdTy cenv.g objTy if not isRecordTy && not (isInterfaceTy cenv.g objTy) && isSealedTy cenv.g objTy then errorR(Error(FSComp.SR.tcCannotCreateExtensionOfSealedType(), mNewExpr)) @@ -8387,7 +8387,7 @@ and Propagate cenv overallTy env tpenv (expr: ApplicableExpr) exprty delayed = | DelayedApp (_, arg, mExprAndArg) :: delayedList' -> let denv = env.DisplayEnv match UnifyFunctionTypeUndoIfFailed cenv denv mExpr exprty with - | Some (_, resultTy) -> + | ValueSome (_, resultTy) -> // We add tag parameter to the return type for "&x" and 'NativePtr.toByRef' // See RFC FS-1053.md @@ -8400,7 +8400,7 @@ and Propagate cenv overallTy env tpenv (expr: ApplicableExpr) exprty delayed = propagate isAddrOf delayedList' mExprAndArg resultTy - | None -> + | _ -> let mArg = arg.Range match arg with | SynExpr.CompExpr _ -> () @@ -8488,7 +8488,7 @@ and TcFunctionApplicationThen cenv overallTy env tpenv mExprAndArg expr exprty ( // If the type of 'synArg' unifies as a function type, then this is a function application, otherwise // it is an error or a computation expression match UnifyFunctionTypeUndoIfFailed cenv denv mFunExpr exprty with - | Some (domainTy, resultTy) -> + | ValueSome (domainTy, resultTy) -> // Notice the special case 'seq { ... }'. In this case 'seq' is actually a function in the F# library. // Set a flag in the syntax tree to say we noticed a leading 'seq' @@ -8505,7 +8505,7 @@ and TcFunctionApplicationThen cenv overallTy env tpenv mExprAndArg expr exprty ( let arg, tpenv = TcExpr cenv domainTy env tpenv synArg let exprAndArg, resultTy = buildApp cenv expr resultTy arg mExprAndArg TcDelayed cenv overallTy env tpenv mExprAndArg exprAndArg resultTy atomicFlag delayed - | None -> + | _ -> // OK, 'expr' doesn't have function type, but perhaps 'expr' is a computation expression builder, and 'arg' is '{ ... }' match synArg with | SynExpr.CompExpr (false, _isNotNakedRefCell, comp, _m) -> @@ -10212,10 +10212,10 @@ and TcMethodArg cenv env (lambdaPropagationInfo, tpenv) (lambdaPropagationInfo if allRowsGiveSameArgumentType then // Force the caller to be a function type. match UnifyFunctionTypeUndoIfFailed cenv env.DisplayEnv mArg callerLambdaTy with - | Some (callerLambdaDomainTy, callerLambdaRangeTy) -> + | ValueSome (callerLambdaDomainTy, callerLambdaRangeTy) -> if AddCxTypeEqualsTypeUndoIfFailed env.DisplayEnv cenv.css mArg calledLambdaArgTy callerLambdaDomainTy then loop callerLambdaRangeTy (lambdaVarNum + 1) - | None -> () + | _ -> () loop argTy 0 let e', tpenv = TcExpr cenv argTy env tpenv argExpr @@ -14064,7 +14064,7 @@ module AddAugmentationDeclarations = let tcaugHasNominalInterface g (tcaug: TyconAugmentation) tcref = tcaug.tcaug_interfaces |> List.exists (fun (x, _, _) -> match tryDestAppTy g x with - | Some tcref2 when tyconRefEq g tcref2 tcref -> true + | ValueSome tcref2 when tyconRefEq g tcref2 tcref -> true | _ -> false) let AddGenericCompareDeclarations cenv (env: TcEnv) (scSet:Set) (tycon:Tycon) = @@ -14212,7 +14212,7 @@ module TyconConstraintInference = // Is the field type a type parameter? match tryDestTyparTy cenv.g ty with - | Some tp -> + | ValueSome tp -> // Look for an explicit 'comparison' constraint if tp.Constraints |> List.exists (function TyparConstraint.SupportsComparison _ -> true | _ -> false) then true @@ -14225,7 +14225,7 @@ module TyconConstraintInference = else false - | None -> + | _ -> match ty with // Look for array, UIntPtr and IntPtr types | SpecialComparableHeadType g tinst -> @@ -14337,7 +14337,7 @@ module TyconConstraintInference = // and type parameters. let rec checkIfFieldTypeSupportsEquality (tycon:Tycon) (ty: TType) = match tryDestTyparTy cenv.g ty with - | Some tp -> + | ValueSome tp -> // Look for an explicit 'equality' constraint if tp.Constraints |> List.exists (function TyparConstraint.SupportsEquality _ -> true | _ -> false) then true @@ -14349,7 +14349,7 @@ module TyconConstraintInference = true else false - | None -> + | _ -> match ty with | SpecialEquatableHeadType g tinst -> tinst |> List.forall (checkIfFieldTypeSupportsEquality tycon) @@ -15724,9 +15724,9 @@ module EstablishTypeDefinitionCores = else acc // note: all edges added are (tycon, _) let insertEdgeToType ty acc = match tryDestAppTy cenv.g ty with - | Some tcref -> + | ValueSome tcref -> insertEdgeToTycon tcref.Deref acc - | None -> + | _ -> acc // collect edges from an a struct field (which is struct-contained in tycon) @@ -15748,9 +15748,9 @@ module EstablishTypeDefinitionCores = (structTycon === tycon2) && (structTyInst, tinst2) ||> List.lengthsEqAndForall2 (fun ty1 ty2 -> match tryDestTyparTy cenv.g ty1 with - | Some destTypar1 -> + | ValueSome destTypar1 -> match tryDestTyparTy cenv.g ty2 with - | Some destTypar2 -> typarEq destTypar1 destTypar2 + | ValueSome destTypar2 -> typarEq destTypar1 destTypar2 | _ -> false | _ -> false) if specialCaseStaticField then diff --git a/src/fsharp/import.fs b/src/fsharp/import.fs index 098720fb0ad..c5b1041a970 100644 --- a/src/fsharp/import.fs +++ b/src/fsharp/import.fs @@ -109,8 +109,8 @@ let ImportTypeRefData (env:ImportMap) m (scoref,path,typeName) = () #endif match tryRescopeEntity ccu tycon with - | None -> error (Error(FSComp.SR.impImportedAssemblyUsesNotPublicType(String.concat "." (Array.toList path@[typeName])),m)) - | Some tcref -> tcref + | ValueNone -> error (Error(FSComp.SR.impImportedAssemblyUsesNotPublicType(String.concat "." (Array.toList path@[typeName])),m)) + | ValueSome tcref -> tcref /// Import a reference to a type definition, given an AbstractIL ILTypeRef, without caching diff --git a/src/fsharp/infos.fs b/src/fsharp/infos.fs index 7e23785723d..2a7d82d8afd 100755 --- a/src/fsharp/infos.fs +++ b/src/fsharp/infos.fs @@ -67,15 +67,14 @@ let GetSuperTypeOfType g amap m ty = | Some super -> Some(Import.ImportProvidedType amap m super) #endif | ILTypeMetadata (TILObjectReprData(scoref,_,tdef)) -> - let _,tinst = destAppTy g ty + let tinst = argsOfAppTy g ty match tdef.Extends with | None -> None | Some ilty -> Some (ImportILType scoref amap m tinst ilty) | FSharpOrArrayOrByrefOrTupleOrExnTypeMetadata -> - - if isFSharpObjModelTy g ty || isExnDeclTy g ty then - let tcref,_tinst = destAppTy g ty + if isFSharpObjModelTy g ty || isExnDeclTy g ty then + let tcref = tcrefOfAppTy g ty Some (instType (mkInstForAppTy g ty) (superOfTycon g tcref.Deref)) elif isArrayTy g ty then Some g.system_Array_ty @@ -105,8 +104,8 @@ type SkipUnrefInterfaces = Yes | No /// traverse the type hierarchy to collect further interfaces. let rec GetImmediateInterfacesOfType skipUnref g amap m ty = let itys = - if isAppTy g ty then - let tcref,tinst = destAppTy g ty + match tryAppTy g ty with + | ValueSome(tcref,tinst) -> if tcref.IsMeasureableReprTycon then [ match tcref.TypeReprInfo with | TMeasureableRepr reprTy -> @@ -142,8 +141,7 @@ let rec GetImmediateInterfacesOfType skipUnref g amap m ty = | FSharpOrArrayOrByrefOrTupleOrExnTypeMetadata -> tcref.ImmediateInterfaceTypesOfFSharpTycon |> List.map (instType (mkInstForAppTy g ty)) - else - [] + | _ -> [] // .NET array types are considered to implement IList let itys = @@ -187,7 +185,7 @@ let private FoldHierarchyOfTypeAux followInterfaces allowMultiIntfInst skipUnref (loop ndeep g.obj_ty state) else match tryDestTyparTy g ty with - | Some tp -> + | ValueSome tp -> let state = loop (ndeep+1) g.obj_ty state List.foldBack (fun x vacc -> @@ -208,7 +206,7 @@ let private FoldHierarchyOfTypeAux followInterfaces allowMultiIntfInst skipUnref loop (ndeep + 1) cty vacc) tp.Constraints state - | None -> + | _ -> let state = if followInterfaces then List.foldBack @@ -1436,7 +1434,7 @@ type MethInfo = // if multiple caller info attributes are specified, pick the "wrong" one here // so that we get an error later match tryDestOptionTy g ty with - | Some optTy when typeEquiv g g.int32_ty optTy -> CallerFilePath + | ValueSome optTy when typeEquiv g g.int32_ty optTy -> CallerFilePath | _ -> CallerLineNumber (isParamArrayArg, isInArg, isOutArg, optArgInfo, callerInfo, reflArgInfo)) diff --git a/src/fsharp/service/ServiceDeclarationLists.fs b/src/fsharp/service/ServiceDeclarationLists.fs index 85d7249f61c..fc87de946d1 100644 --- a/src/fsharp/service/ServiceDeclarationLists.fs +++ b/src/fsharp/service/ServiceDeclarationLists.fs @@ -109,7 +109,7 @@ module internal DescriptionListsImpl = | Some id, true, ptyOpt -> let nm = id.idText // detect parameter type, if ptyOpt is None - this is .NET style optional argument - let pty = defaultArg ptyOpt pty + let pty = match ptyOpt with ValueSome x -> x | _ -> pty (nm, isOptArg, SepL.questionMark ^^ (wordL (TaggedTextOps.tagParameter nm))), pty // Layout an unnamed argument | None, _,_ -> @@ -204,13 +204,13 @@ module internal DescriptionListsImpl = let getPrettyParamsOfTypes() = let tau = vref.TauType match tryDestFunTy denv.g tau with - | Some(arg,rtau) -> + | ValueSome(arg,rtau) -> let args = tryDestRefTupleTy denv.g arg let _prettyTyparInst, prettyParams, prettyRetTyL, _prettyConstraintsL = PrettyParamsOfTypes g denv item.TyparInst args rtau // FUTURE: prettyTyparInst is the pretty version of the known instantiations of type parameters in the output. It could be returned // for display as part of the method group prettyParams, prettyRetTyL - | None -> + | _ -> let _prettyTyparInst, prettyTyL = NicePrint.prettyLayoutOfUncurriedSig denv item.TyparInst [] tau [], prettyTyL @@ -241,8 +241,8 @@ module internal DescriptionListsImpl = // Adjust the return type so it only strips the first argument let curriedRetTy = match tryDestFunTy denv.g vref.TauType with - | Some(_,rtau) -> rtau - | None -> lastRetTy + | ValueSome(_,rtau) -> rtau + | _ -> lastRetTy let _prettyTyparInst, prettyFirstCurriedParams, prettyCurriedRetTyL, prettyConstraintsL = PrettyParamsOfParamDatas g denv item.TyparInst firstCurriedParamDatas curriedRetTy @@ -381,14 +381,14 @@ module internal DescriptionListsImpl = /// Find the glyph for the given type representation. let typeToGlyph ty = - if isAppTy denv.g ty then - let tcref = tcrefOfAppTy denv.g ty - tcref.TypeReprInfo |> reprToGlyph - elif isStructTupleTy denv.g ty then FSharpGlyph.Struct - elif isRefTupleTy denv.g ty then FSharpGlyph.Class - elif isFunction denv.g ty then FSharpGlyph.Delegate - elif isTyparTy denv.g ty then FSharpGlyph.Struct - else FSharpGlyph.Typedef + match tryDestAppTy denv.g ty with + | ValueSome tcref -> tcref.TypeReprInfo |> reprToGlyph + | _ -> + if isStructTupleTy denv.g ty then FSharpGlyph.Struct + elif isRefTupleTy denv.g ty then FSharpGlyph.Class + elif isFunction denv.g ty then FSharpGlyph.Delegate + elif isTyparTy denv.g ty then FSharpGlyph.Struct + else FSharpGlyph.Typedef // This may explore assemblies that are not in the reference set, // e.g. for type abbreviations to types not in the reference set. diff --git a/src/fsharp/service/service.fs b/src/fsharp/service/service.fs index 2df1fbe2880..be7157ddde7 100644 --- a/src/fsharp/service/service.fs +++ b/src/fsharp/service/service.fs @@ -568,7 +568,7 @@ type TypeCheckInfo p <- p - 1 if p >= 0 then Some p else None - let CompletionItem (ty: TyconRef option) (assemblySymbol: AssemblySymbol option) (item: ItemWithInst) = + let CompletionItem (ty: ValueOption) (assemblySymbol: ValueOption) (item: ItemWithInst) = let kind = match item.Item with | Item.MethodGroup (_, minfo :: _, _) -> CompletionItemKind.Method minfo.IsExtensionMember @@ -584,10 +584,10 @@ type TypeCheckInfo MinorPriority = 0 Kind = kind IsOwnMember = false - Type = ty - Unresolved = assemblySymbol |> Option.map (fun x -> x.UnresolvedSymbol) } + Type = match ty with ValueSome x -> Some x | _ -> None + Unresolved = match assemblySymbol with ValueSome x -> Some x.UnresolvedSymbol | _ -> None } - let DefaultCompletionItem item = CompletionItem None None item + let DefaultCompletionItem item = CompletionItem ValueNone ValueNone item let getItem (x: ItemWithInst) = x.Item let GetDeclaredItems (parseResultsOpt: FSharpParseFileResults option, lineStr: string, origLongIdentOpt, colAtEndOfNamesAndResidue, residueOpt, lastDotPos, line, loc, @@ -635,29 +635,27 @@ type TypeCheckInfo let pos = mkPos line loc let (nenv, ad), m = GetBestEnvForPos pos - let getType() = - let tref = - match NameResolution.TryToResolveLongIdentAsType ncenv nenv m plid with - | Some x -> Some x - | None -> - match lastDotPos |> Option.orElseWith (fun _ -> FindFirstNonWhitespacePosition lineStr (colAtEndOfNamesAndResidue - 1)) with - | Some p when lineStr.[p] = '.' -> - match FindFirstNonWhitespacePosition lineStr (p - 1) with - | Some colAtEndOfNames -> - let colAtEndOfNames = colAtEndOfNames + 1 // convert 0-based to 1-based - let tyconRef = TryGetTypeFromNameResolution(line, colAtEndOfNames, residueOpt, resolveOverloads) - tyconRef - | None -> None - | _ -> None - - tref |> Option.bind (tryDestAppTy g) + let getType() = + match NameResolution.TryToResolveLongIdentAsType ncenv nenv m plid with + | Some x -> tryDestAppTy g x + | None -> + match lastDotPos |> Option.orElseWith (fun _ -> FindFirstNonWhitespacePosition lineStr (colAtEndOfNamesAndResidue - 1)) with + | Some p when lineStr.[p] = '.' -> + match FindFirstNonWhitespacePosition lineStr (p - 1) with + | Some colAtEndOfNames -> + let colAtEndOfNames = colAtEndOfNames + 1 // convert 0-based to 1-based + match TryGetTypeFromNameResolution(line, colAtEndOfNames, residueOpt, resolveOverloads) with + | Some x -> tryDestAppTy g x + | _ -> ValueNone + | None -> ValueNone + | _ -> ValueNone match nameResItems with | NameResResult.TypecheckStaleAndTextChanged -> None // second-chance intellisense will try again | NameResResult.Cancel(denv,m) -> Some([], denv, m) | NameResResult.Members(FilterRelevantItems getItem exactMatchResidueOpt (items, denv, m)) -> // lookup based on name resolution results successful - Some (items |> List.map (CompletionItem (getType()) None), denv, m) + Some (items |> List.map (CompletionItem (getType()) ValueNone), denv, m) | _ -> match origLongIdentOpt with | None -> None @@ -692,7 +690,7 @@ type TypeCheckInfo // it appears we're getting some typings recorded for non-atomic expressions like "f x" when isNil plid -> // lookup based on expression typings successful - Some (items |> List.map (CompletionItem (tryDestAppTy g ty) None), denv, m) + Some (items |> List.map (CompletionItem (tryDestAppTy g ty) ValueNone), denv, m) | GetPreciseCompletionListFromExprTypingsResult.NoneBecauseThereWereTypeErrors, _ -> // There was an error, e.g. we have "." and there is an error determining the type of // In this case, we don't want any of the fallback logic, rather, we want to produce zero results. @@ -715,19 +713,19 @@ type TypeCheckInfo // First, use unfiltered name resolution items, if they're not empty | NameResResult.Members(items, denv, m), _, _ when not (isNil items) -> // lookup based on name resolution results successful - Some(items |> List.map (CompletionItem (getType()) None), denv, m) + ValueSome(items |> List.map (CompletionItem (getType()) ValueNone), denv, m) // If we have nonempty items from environment that were resolved from a type, then use them... // (that's better than the next case - here we'd return 'int' as a type) | _, FilterRelevantItems getItem exactMatchResidueOpt (items, denv, m), _ when not (isNil items) -> // lookup based on name and environment successful - Some(items |> List.map (CompletionItem (getType()) None), denv, m) + ValueSome(items |> List.map (CompletionItem (getType()) ValueNone), denv, m) // Try again with the qualItems | _, _, GetPreciseCompletionListFromExprTypingsResult.Some(FilterRelevantItems getItem exactMatchResidueOpt (items, denv, m), ty) -> - Some(items |> List.map (CompletionItem (tryDestAppTy g ty) None), denv, m) + ValueSome(items |> List.map (CompletionItem (tryDestAppTy g ty) ValueNone), denv, m) - | _ -> None + | _ -> ValueNone let globalResult = match origLongIdentOpt with @@ -745,16 +743,16 @@ type TypeCheckInfo match globalItems, denv, m with | FilterRelevantItems getItem exactMatchResidueOpt (globalItemsFiltered, denv, m) when not (isNil globalItemsFiltered) -> globalItemsFiltered - |> List.map(fun globalItem -> CompletionItem (getType()) (Some globalItem) (ItemWithNoInst globalItem.Symbol.Item)) - |> fun r -> Some(r, denv, m) - | _ -> None - | _ -> None // do not return unresolved items after dot + |> List.map(fun globalItem -> CompletionItem (getType()) (ValueSome globalItem) (ItemWithNoInst globalItem.Symbol.Item)) + |> fun r -> ValueSome(r, denv, m) + | _ -> ValueNone + | _ -> ValueNone // do not return unresolved items after dot match envResult, globalResult with - | Some (items, denv, m), Some (gItems,_,_) -> Some (items @ gItems, denv, m) - | Some x, None -> Some x - | None, Some y -> Some y - | None, None -> None + | ValueSome (items, denv, m), ValueSome (gItems,_,_) -> Some (items @ gItems, denv, m) + | ValueSome x, ValueNone -> Some x + | ValueNone, ValueSome y -> Some y + | ValueNone, ValueNone -> None let toCompletionItems (items: ItemWithInst list, denv: DisplayEnv, m: range ) = diff --git a/src/fsharp/symbols/SymbolHelpers.fs b/src/fsharp/symbols/SymbolHelpers.fs index 2a3031e004d..aa3ecc7cab5 100644 --- a/src/fsharp/symbols/SymbolHelpers.fs +++ b/src/fsharp/symbols/SymbolHelpers.fs @@ -365,7 +365,7 @@ module internal SymbolHelpers = | Item.Event einfo -> rangeOfEventInfo preferFlag einfo | Item.ILField _ -> None | Item.Property(_, pinfos) -> rangeOfPropInfo preferFlag pinfos.Head - | Item.Types(_, tys) -> tys |> List.tryPick (tryNiceEntityRefOfTy >> Option.map (rangeOfEntityRef preferFlag)) + | Item.Types(_, tys) -> tys |> List.tryPick (tryNiceEntityRefOfTyOption >> Option.map (rangeOfEntityRef preferFlag)) | Item.CustomOperation (_, _, Some minfo) -> rangeOfMethInfo g preferFlag minfo | Item.TypeVar (_, tp) -> Some tp.Range | Item.ModuleOrNamespaces(modrefs) -> modrefs |> List.tryPick (rangeOfEntityRef preferFlag >> Some) @@ -379,7 +379,7 @@ module internal SymbolHelpers = | Item.ImplicitOp _ -> None | Item.UnqualifiedType tcrefs -> tcrefs |> List.tryPick (rangeOfEntityRef preferFlag >> Some) | Item.DelegateCtor ty - | Item.FakeInterfaceCtor ty -> ty |> tryNiceEntityRefOfTy |> Option.map (rangeOfEntityRef preferFlag) + | Item.FakeInterfaceCtor ty -> ty |> tryNiceEntityRefOfTyOption |> Option.map (rangeOfEntityRef preferFlag) | Item.NewDef _ -> None // Provided type definitions do not have a useful F# CCU for the purposes of goto-definition. @@ -419,7 +419,7 @@ module internal SymbolHelpers = | Item.CtorGroup(_, minfos) -> minfos |> List.tryPick (ccuOfMethInfo g) | Item.CustomOperation (_, _, Some minfo) -> ccuOfMethInfo g minfo - | Item.Types(_, tys) -> tys |> List.tryPick (tryNiceEntityRefOfTy >> Option.bind computeCcuOfTyconRef) + | Item.Types(_, tys) -> tys |> List.tryPick (tryNiceEntityRefOfTyOption >> Option.bind computeCcuOfTyconRef) | Item.ArgName (_, _, Some (ArgumentContainer.Type eref)) -> computeCcuOfTyconRef eref @@ -713,8 +713,12 @@ module internal SymbolHelpers = // In this case just bail out and assume items are not equal protectAssemblyExploration false (fun () -> let equalHeadTypes(ty1, ty2) = - if isAppTy g ty1 && isAppTy g ty2 then tyconRefEq g (tcrefOfAppTy g ty1) (tcrefOfAppTy g ty2) - else typeEquiv g ty1 ty2 + match tryDestAppTy g ty1 with + | ValueSome tcref1 -> + match tryDestAppTy g ty2 with + | ValueSome tcref2 -> tyconRefEq g tcref1 tcref2 + | _ -> typeEquiv g ty1 ty2 + | _ -> typeEquiv g ty1 ty2 ItemsAreEffectivelyEqual g item1 item2 || @@ -768,8 +772,9 @@ module internal SymbolHelpers = protectAssemblyExploration 1027 (fun () -> match item with | ItemWhereTypIsPreferred ty -> - if isAppTy g ty then hash (tcrefOfAppTy g ty).LogicalName - else 1010 + match tryDestAppTy g ty with + | ValueSome tcref -> hash (tcref).LogicalName + | _ -> 1010 | Item.ILField(ILFieldInfo(_, fld)) -> System.Runtime.CompilerServices.RuntimeHelpers.GetHashCode fld // hash on the object identity of the AbstractIL metadata blob for the field | Item.TypeVar (nm, _tp) -> hash nm @@ -878,7 +883,7 @@ module internal SymbolHelpers = | Item.DelegateCtor ty | Item.Types(_, ty:: _) -> match tryDestAppTy g ty with - | Some tcref -> bufs (fun os -> NicePrint.outputTyconRef denv os tcref) + | ValueSome tcref -> bufs (fun os -> NicePrint.outputTyconRef denv os tcref) | _ -> "" | Item.ModuleOrNamespaces((modref :: _) as modrefs) -> let definiteNamespace = modrefs |> List.forall (fun modref -> modref.IsNamespace) @@ -1180,7 +1185,7 @@ module internal SymbolHelpers = ([], modrefs) ||> Seq.fold (fun st modref -> match fullDisplayTextOfParentOfModRef modref with - | Some(txt) -> txt::st + | ValueSome txt -> txt::st | _ -> st) |> Seq.mapi (fun i x -> i, x) |> Seq.toList diff --git a/src/fsharp/symbols/Symbols.fs b/src/fsharp/symbols/Symbols.fs index 104d998fda7..0df99aa034a 100644 --- a/src/fsharp/symbols/Symbols.fs +++ b/src/fsharp/symbols/Symbols.fs @@ -80,8 +80,8 @@ module Impl = | None -> mkLocalEntityRef entity | Some viewedCcu -> match tryRescopeEntity viewedCcu entity with - | None -> mkLocalEntityRef entity - | Some eref -> eref + | ValueNone -> mkLocalEntityRef entity + | ValueSome eref -> eref let entityIsUnresolved(entity:EntityRef) = match entity with diff --git a/src/fsharp/tast.fs b/src/fsharp/tast.fs index 334891b79fb..d03c0114dc7 100644 --- a/src/fsharp/tast.fs +++ b/src/fsharp/tast.fs @@ -270,8 +270,8 @@ type TyparKind = member x.AttrName = match x with - | TyparKind.Type -> None - | TyparKind.Measure -> Some "Measure" + | TyparKind.Type -> ValueNone + | TyparKind.Measure -> ValueSome "Measure" //[] //member x.DebugText = x.ToString() @@ -966,14 +966,14 @@ and /// Represents a type definition, exception definition, module definition or /// Get the union cases and other union-type information for a type, if any member x.UnionTypeInfo = match x.TypeReprInfo with - | TUnionRepr x -> Some x - | _ -> None + | TUnionRepr x -> ValueSome x + | _ -> ValueNone /// Get the union cases for a type, if any member x.UnionCasesArray = match x.UnionTypeInfo with - | Some x -> x.CasesTable.CasesByIndex - | None -> [| |] + | ValueSome x -> x.CasesTable.CasesByIndex + | ValueNone -> [| |] /// Get the union cases for a type, if any, as a list member x.UnionCasesAsList = x.UnionCasesArray |> Array.toList @@ -981,8 +981,8 @@ and /// Represents a type definition, exception definition, module definition or /// Get a union case of a type by name member x.GetUnionCaseByName n = match x.UnionTypeInfo with - | Some x -> NameMap.tryFind n x.CasesTable.CasesByName - | None -> None + | ValueSome x -> NameMap.tryFind n x.CasesTable.CasesByName + | ValueNone -> None /// Create a new entity with empty, unlinked data. Only used during unpickling of F# metadata. @@ -5423,7 +5423,7 @@ let fslibValRefEq fslibCcu vref1 vref2 = // is not significant nlr1.ItemKey.PartialKey = nm2.PartialKey && fslibRefEq nlr1.EnclosingEntity.nlr pp2 - | None -> + | _ -> false // Note: I suspect this private-to-private reference comparison is not needed | (VRefLocal e1, VRefLocal e2) -> From ad11b5ab92df165fa4e6adff80d22eb12627e161 Mon Sep 17 00:00:00 2001 From: Alan Ball Date: Tue, 2 Oct 2018 23:30:42 -0400 Subject: [PATCH 069/160] Error message was not direct enough. (#4183) * Fixed error message to be more direct. * update xlf --- src/fsharp/FSComp.txt | 4 ++-- src/fsharp/xlf/FSComp.txt.cs.xlf | 8 ++++---- src/fsharp/xlf/FSComp.txt.de.xlf | 8 ++++---- src/fsharp/xlf/FSComp.txt.en.xlf | 8 ++++---- src/fsharp/xlf/FSComp.txt.es.xlf | 8 ++++---- src/fsharp/xlf/FSComp.txt.fr.xlf | 8 ++++---- src/fsharp/xlf/FSComp.txt.it.xlf | 8 ++++---- src/fsharp/xlf/FSComp.txt.ja.xlf | 8 ++++---- src/fsharp/xlf/FSComp.txt.ko.xlf | 8 ++++---- src/fsharp/xlf/FSComp.txt.pl.xlf | 8 ++++---- src/fsharp/xlf/FSComp.txt.pt-BR.xlf | 8 ++++---- src/fsharp/xlf/FSComp.txt.ru.xlf | 8 ++++---- src/fsharp/xlf/FSComp.txt.tr.xlf | 8 ++++---- src/fsharp/xlf/FSComp.txt.zh-Hans.xlf | 8 ++++---- src/fsharp/xlf/FSComp.txt.zh-Hant.xlf | 8 ++++---- 15 files changed, 58 insertions(+), 58 deletions(-) diff --git a/src/fsharp/FSComp.txt b/src/fsharp/FSComp.txt index 86b76615525..b8b72353118 100644 --- a/src/fsharp/FSComp.txt +++ b/src/fsharp/FSComp.txt @@ -1040,8 +1040,8 @@ lexHashBangMustBeFirstInFile,"#! may only appear as the first line at the start 1186,parsInvalidProperty,"Invalid property getter or setter" 1187,parsIndexerPropertyRequiresAtLeastOneArgument,"An indexer property must be given at least one argument" 1188,tastInvalidAddressOfMutableAcrossAssemblyBoundary,"This operation accesses a mutable top-level value defined in another assembly in an unsupported way. The value cannot be accessed through its address. Consider copying the expression to a mutable local, e.g. 'let mutable x = ...', and if necessary assigning the value back after the completion of the operation" -1189,parsNonAdjacentTypars,"Type parameters must be placed directly adjacent to the type name, e.g. \"type C<'T>\", not type \"C <'T>\"" -1190,parsNonAdjacentTyargs,"Type arguments must be placed directly adjacent to the type name, e.g. \"C<'T>\", not \"C <'T>\"" +1189,parsNonAdjacentTypars,"Remove spaces between the type name and type parameter, e.g. \"type C<'T>\", not type \"C <'T>\". Type parameters must be placed directly adjacent to the type name." +1190,parsNonAdjacentTyargs,"Remove spaces between the type name and type parameter, e.g. \"C<'T>\", not \"C <'T>\". Type parameters must be placed directly adjacent to the type name." parsNonAtomicType,"The use of the type syntax 'int C' and 'C ' is not permitted here. Consider adjusting this type to be written in the form 'C'" # 1191,tastUndefinedTyconItemField,"The type %s did not contain the field '%s'" # 1192,tastUndefinedTyconItemUnionCase,"The type %s did not contain the union case '%s'" diff --git a/src/fsharp/xlf/FSComp.txt.cs.xlf b/src/fsharp/xlf/FSComp.txt.cs.xlf index a55f03383b1..05d6ee76c54 100644 --- a/src/fsharp/xlf/FSComp.txt.cs.xlf +++ b/src/fsharp/xlf/FSComp.txt.cs.xlf @@ -5123,13 +5123,13 @@ - Type parameters must be placed directly adjacent to the type name, e.g. \"type C<'T>\", not type \"C <'T>\" - Parametry typu je potřeba zadat bezprostředně za název typu, třeba \"type C<'T>\", ne type \"C <'T>\". + Remove spaces between the type name and type parameter, e.g. \"type C<'T>\", not type \"C <'T>\". Type parameters must be placed directly adjacent to the type name. + Parametry typu je potřeba zadat bezprostředně za název typu, třeba \"type C<'T>\", ne type \"C <'T>\". - Type arguments must be placed directly adjacent to the type name, e.g. \"C<'T>\", not \"C <'T>\" - Argumenty typu je potřeba zadat bezprostředně za název typu, třeba \"C<'T>\", ne \"C <'T>\". + Remove spaces between the type name and type parameter, e.g. \"C<'T>\", not \"C <'T>\". Type parameters must be placed directly adjacent to the type name. + Argumenty typu je potřeba zadat bezprostředně za název typu, třeba \"C<'T>\", ne \"C <'T>\". diff --git a/src/fsharp/xlf/FSComp.txt.de.xlf b/src/fsharp/xlf/FSComp.txt.de.xlf index f1694c10973..fdce970796c 100644 --- a/src/fsharp/xlf/FSComp.txt.de.xlf +++ b/src/fsharp/xlf/FSComp.txt.de.xlf @@ -5123,13 +5123,13 @@ - Type parameters must be placed directly adjacent to the type name, e.g. \"type C<'T>\", not type \"C <'T>\" - Typparameter müssen direkt neben dem Typnamen platziert werden, z.B. \"type C<'T>\", nicht type \"C <'T>\". + Remove spaces between the type name and type parameter, e.g. \"type C<'T>\", not type \"C <'T>\". Type parameters must be placed directly adjacent to the type name. + Typparameter müssen direkt neben dem Typnamen platziert werden, z.B. \"type C<'T>\", nicht type \"C <'T>\". - Type arguments must be placed directly adjacent to the type name, e.g. \"C<'T>\", not \"C <'T>\" - Typargumente müssen direkt neben dem Typnamen platziert werden. Beispiel: \"C<'T>\", nicht \"C <'T>\". + Remove spaces between the type name and type parameter, e.g. \"C<'T>\", not \"C <'T>\". Type parameters must be placed directly adjacent to the type name. + Typargumente müssen direkt neben dem Typnamen platziert werden. Beispiel: \"C<'T>\", nicht \"C <'T>\". diff --git a/src/fsharp/xlf/FSComp.txt.en.xlf b/src/fsharp/xlf/FSComp.txt.en.xlf index 214bc542ec4..c56232af4bd 100644 --- a/src/fsharp/xlf/FSComp.txt.en.xlf +++ b/src/fsharp/xlf/FSComp.txt.en.xlf @@ -5123,13 +5123,13 @@ - Type parameters must be placed directly adjacent to the type name, e.g. \"type C<'T>\", not type \"C <'T>\" - Type parameters must be placed directly adjacent to the type name, e.g. \"type C<'T>\", not type \"C <'T>\" + Remove spaces between the type name and type parameter, e.g. \"type C<'T>\", not type \"C <'T>\". Type parameters must be placed directly adjacent to the type name. + Remove spaces between the type name and type parameter, e.g. \"type C<'T>\", not type \"C <'T>\". Type parameters must be placed directly adjacent to the type name. - Type arguments must be placed directly adjacent to the type name, e.g. \"C<'T>\", not \"C <'T>\" - Type arguments must be placed directly adjacent to the type name, e.g. \"C<'T>\", not \"C <'T>\" + Remove spaces between the type name and type parameter, e.g. \"C<'T>\", not \"C <'T>\". Type parameters must be placed directly adjacent to the type name. + Remove spaces between the type name and type parameter, e.g. \"C<'T>\", not \"C <'T>\". Type parameters must be placed directly adjacent to the type name. diff --git a/src/fsharp/xlf/FSComp.txt.es.xlf b/src/fsharp/xlf/FSComp.txt.es.xlf index e553d7e8149..c6a73702da9 100644 --- a/src/fsharp/xlf/FSComp.txt.es.xlf +++ b/src/fsharp/xlf/FSComp.txt.es.xlf @@ -5123,13 +5123,13 @@ - Type parameters must be placed directly adjacent to the type name, e.g. \"type C<'T>\", not type \"C <'T>\" - Los parámetros de tipo se deben colocar directamente adyacentes al nombre de tipo; por ejemplo, \"type C<'T>\", no type \"C <'T>\". + Remove spaces between the type name and type parameter, e.g. \"type C<'T>\", not type \"C <'T>\". Type parameters must be placed directly adjacent to the type name. + Los parámetros de tipo se deben colocar directamente adyacentes al nombre de tipo; por ejemplo, \"type C<'T>\", no type \"C <'T>\". - Type arguments must be placed directly adjacent to the type name, e.g. \"C<'T>\", not \"C <'T>\" - Los argumentos de tipo se deben colocar directamente adyacentes al nombre de tipo; por ejemplo, \"C<'T>\", no \"C <'T>\". + Remove spaces between the type name and type parameter, e.g. \"C<'T>\", not \"C <'T>\". Type parameters must be placed directly adjacent to the type name. + Los argumentos de tipo se deben colocar directamente adyacentes al nombre de tipo; por ejemplo, \"C<'T>\", no \"C <'T>\". diff --git a/src/fsharp/xlf/FSComp.txt.fr.xlf b/src/fsharp/xlf/FSComp.txt.fr.xlf index ace9b0593e8..f78d170be49 100644 --- a/src/fsharp/xlf/FSComp.txt.fr.xlf +++ b/src/fsharp/xlf/FSComp.txt.fr.xlf @@ -5123,13 +5123,13 @@ - Type parameters must be placed directly adjacent to the type name, e.g. \"type C<'T>\", not type \"C <'T>\" - Les paramètres de type doivent être directement adjacents au nom de type, par exemple \"type C<'T>\" et non type \"C <'T>\" + Remove spaces between the type name and type parameter, e.g. \"type C<'T>\", not type \"C <'T>\". Type parameters must be placed directly adjacent to the type name. + Les paramètres de type doivent être directement adjacents au nom de type, par exemple \"type C<'T>\" et non type \"C <'T>\" - Type arguments must be placed directly adjacent to the type name, e.g. \"C<'T>\", not \"C <'T>\" - Les arguments de type doivent être directement adjacents au nom de type, par exemple \"C<'T>\" et non \"C <'T>\" + Remove spaces between the type name and type parameter, e.g. \"C<'T>\", not \"C <'T>\". Type parameters must be placed directly adjacent to the type name. + Les arguments de type doivent être directement adjacents au nom de type, par exemple \"C<'T>\" et non \"C <'T>\" diff --git a/src/fsharp/xlf/FSComp.txt.it.xlf b/src/fsharp/xlf/FSComp.txt.it.xlf index da96371da26..5a499b9e702 100644 --- a/src/fsharp/xlf/FSComp.txt.it.xlf +++ b/src/fsharp/xlf/FSComp.txt.it.xlf @@ -5123,13 +5123,13 @@ - Type parameters must be placed directly adjacent to the type name, e.g. \"type C<'T>\", not type \"C <'T>\" - I parametri di tipo devono trovarsi immediatamente accanto al nome del tipo, ad esempio \"type C<'T>\", non type \"C <'T>\" + Remove spaces between the type name and type parameter, e.g. \"type C<'T>\", not type \"C <'T>\". Type parameters must be placed directly adjacent to the type name. + I parametri di tipo devono trovarsi immediatamente accanto al nome del tipo, ad esempio \"type C<'T>\", non type \"C <'T>\" - Type arguments must be placed directly adjacent to the type name, e.g. \"C<'T>\", not \"C <'T>\" - Gli argomenti tipo devono trovarsi immediatamente accanto al nome del tipo, ad esempio \"C<'T>\", non \"C <'T>\" + Remove spaces between the type name and type parameter, e.g. \"C<'T>\", not \"C <'T>\". Type parameters must be placed directly adjacent to the type name. + Gli argomenti tipo devono trovarsi immediatamente accanto al nome del tipo, ad esempio \"C<'T>\", non \"C <'T>\" diff --git a/src/fsharp/xlf/FSComp.txt.ja.xlf b/src/fsharp/xlf/FSComp.txt.ja.xlf index 65ace493654..782c0613974 100644 --- a/src/fsharp/xlf/FSComp.txt.ja.xlf +++ b/src/fsharp/xlf/FSComp.txt.ja.xlf @@ -5123,13 +5123,13 @@ - Type parameters must be placed directly adjacent to the type name, e.g. \"type C<'T>\", not type \"C <'T>\" - 型パラメーターと型名は隣接している必要があります。たとえば、type \"C <'T>\" ではなく \"type C<'T>\" と指定します。 + Remove spaces between the type name and type parameter, e.g. \"type C<'T>\", not type \"C <'T>\". Type parameters must be placed directly adjacent to the type name. + 型パラメーターと型名は隣接している必要があります。たとえば、type \"C <'T>\" ではなく \"type C<'T>\" と指定します。 - Type arguments must be placed directly adjacent to the type name, e.g. \"C<'T>\", not \"C <'T>\" - 型引数と型名は隣接している必要があります。たとえば、\"C <'T>\" ではなく \"C<'T>\" と指定します。 + Remove spaces between the type name and type parameter, e.g. \"C<'T>\", not \"C <'T>\". Type parameters must be placed directly adjacent to the type name. + 型引数と型名は隣接している必要があります。たとえば、\"C <'T>\" ではなく \"C<'T>\" と指定します。 diff --git a/src/fsharp/xlf/FSComp.txt.ko.xlf b/src/fsharp/xlf/FSComp.txt.ko.xlf index 22fbe5d88eb..e00fdb729bd 100644 --- a/src/fsharp/xlf/FSComp.txt.ko.xlf +++ b/src/fsharp/xlf/FSComp.txt.ko.xlf @@ -5123,13 +5123,13 @@ - Type parameters must be placed directly adjacent to the type name, e.g. \"type C<'T>\", not type \"C <'T>\" - 형식 매개 변수는 형식 이름 바로 옆에 배치해야 합니다(예: type \"C <'T>\"가 아니라 \"type C<'T>\"). + Remove spaces between the type name and type parameter, e.g. \"type C<'T>\", not type \"C <'T>\". Type parameters must be placed directly adjacent to the type name. + 형식 매개 변수는 형식 이름 바로 옆에 배치해야 합니다(예: type \"C <'T>\"가 아니라 \"type C<'T>\"). - Type arguments must be placed directly adjacent to the type name, e.g. \"C<'T>\", not \"C <'T>\" - 형식 인수는 형식 이름 바로 옆에 배치해야 합니다(예: \"C <'T>\"가 아니라 \"C<'T>\"). + Remove spaces between the type name and type parameter, e.g. \"C<'T>\", not \"C <'T>\". Type parameters must be placed directly adjacent to the type name. + 형식 인수는 형식 이름 바로 옆에 배치해야 합니다(예: \"C <'T>\"가 아니라 \"C<'T>\"). diff --git a/src/fsharp/xlf/FSComp.txt.pl.xlf b/src/fsharp/xlf/FSComp.txt.pl.xlf index 23ffa36bdd5..c07c9316f30 100644 --- a/src/fsharp/xlf/FSComp.txt.pl.xlf +++ b/src/fsharp/xlf/FSComp.txt.pl.xlf @@ -5123,13 +5123,13 @@ - Type parameters must be placed directly adjacent to the type name, e.g. \"type C<'T>\", not type \"C <'T>\" - Parametry typu muszą być umieszczone w bezpośrednim sąsiedztwie nazwy typu (np. \"type C<'T>\", a nie type \"C <'T>\") + Remove spaces between the type name and type parameter, e.g. \"type C<'T>\", not type \"C <'T>\". Type parameters must be placed directly adjacent to the type name. + Parametry typu muszą być umieszczone w bezpośrednim sąsiedztwie nazwy typu (np. \"type C<'T>\", a nie type \"C <'T>\") - Type arguments must be placed directly adjacent to the type name, e.g. \"C<'T>\", not \"C <'T>\" - Argumenty typu muszą być umieszczone w bezpośrednim sąsiedztwie nazwy typu (np. \"C<'T>\", a nie \"C <'T>\") + Remove spaces between the type name and type parameter, e.g. \"C<'T>\", not \"C <'T>\". Type parameters must be placed directly adjacent to the type name. + Argumenty typu muszą być umieszczone w bezpośrednim sąsiedztwie nazwy typu (np. \"C<'T>\", a nie \"C <'T>\") diff --git a/src/fsharp/xlf/FSComp.txt.pt-BR.xlf b/src/fsharp/xlf/FSComp.txt.pt-BR.xlf index 5e22244bf74..8956263b4da 100644 --- a/src/fsharp/xlf/FSComp.txt.pt-BR.xlf +++ b/src/fsharp/xlf/FSComp.txt.pt-BR.xlf @@ -5123,13 +5123,13 @@ - Type parameters must be placed directly adjacent to the type name, e.g. \"type C<'T>\", not type \"C <'T>\" - Parâmetros de tipo devem ser colocados diretamente ao lado do nome do tipo, por exemplo: \"type C<'T>\", não type \"C <'T>\" + Remove spaces between the type name and type parameter, e.g. \"type C<'T>\", not type \"C <'T>\". Type parameters must be placed directly adjacent to the type name. + Parâmetros de tipo devem ser colocados diretamente ao lado do nome do tipo, por exemplo: \"type C<'T>\", não type \"C <'T>\" - Type arguments must be placed directly adjacent to the type name, e.g. \"C<'T>\", not \"C <'T>\" - Argumentos de tipo devem ser colocados diretamente ao lado do nome do tipo, por exemplo: \"C<'T>\", não \"C <'T>\" + Remove spaces between the type name and type parameter, e.g. \"C<'T>\", not \"C <'T>\". Type parameters must be placed directly adjacent to the type name. + Argumentos de tipo devem ser colocados diretamente ao lado do nome do tipo, por exemplo: \"C<'T>\", não \"C <'T>\" diff --git a/src/fsharp/xlf/FSComp.txt.ru.xlf b/src/fsharp/xlf/FSComp.txt.ru.xlf index 34090ba9646..b658c0ec23f 100644 --- a/src/fsharp/xlf/FSComp.txt.ru.xlf +++ b/src/fsharp/xlf/FSComp.txt.ru.xlf @@ -5123,13 +5123,13 @@ - Type parameters must be placed directly adjacent to the type name, e.g. \"type C<'T>\", not type \"C <'T>\" - Параметры типа необходимо указывать непосредственно после имени типа, например, \"type C<'T>\", но не type \"C <'T>\" + Remove spaces between the type name and type parameter, e.g. \"type C<'T>\", not type \"C <'T>\". Type parameters must be placed directly adjacent to the type name. + Параметры типа необходимо указывать непосредственно после имени типа, например, \"type C<'T>\", но не type \"C <'T>\" - Type arguments must be placed directly adjacent to the type name, e.g. \"C<'T>\", not \"C <'T>\" - Аргументы типа необходимо указывать непосредственно после имени типа, например \"C<'T>\", но не \"C <'T>\" + Remove spaces between the type name and type parameter, e.g. \"C<'T>\", not \"C <'T>\". Type parameters must be placed directly adjacent to the type name. + Аргументы типа необходимо указывать непосредственно после имени типа, например \"C<'T>\", но не \"C <'T>\" diff --git a/src/fsharp/xlf/FSComp.txt.tr.xlf b/src/fsharp/xlf/FSComp.txt.tr.xlf index 42e1af2de94..ae8e758dfd0 100644 --- a/src/fsharp/xlf/FSComp.txt.tr.xlf +++ b/src/fsharp/xlf/FSComp.txt.tr.xlf @@ -5123,13 +5123,13 @@ - Type parameters must be placed directly adjacent to the type name, e.g. \"type C<'T>\", not type \"C <'T>\" - Tür parametreleri doğrudan tür adının bitişiğine yerleştirilmelidir, örn. type \"C <'T>\" değil \"type C<'T>\" + Remove spaces between the type name and type parameter, e.g. \"type C<'T>\", not type \"C <'T>\". Type parameters must be placed directly adjacent to the type name. + Tür parametreleri doğrudan tür adının bitişiğine yerleştirilmelidir, örn. type \"C <'T>\" değil \"type C<'T>\" - Type arguments must be placed directly adjacent to the type name, e.g. \"C<'T>\", not \"C <'T>\" - Tür bağımsız değişkenleri doğrudan tür adının bitişiğine yerleştirilmelidir, örn. \"C <'T>\" değil \"C<'T>\" + Remove spaces between the type name and type parameter, e.g. \"C<'T>\", not \"C <'T>\". Type parameters must be placed directly adjacent to the type name. + Tür bağımsız değişkenleri doğrudan tür adının bitişiğine yerleştirilmelidir, örn. \"C <'T>\" değil \"C<'T>\" diff --git a/src/fsharp/xlf/FSComp.txt.zh-Hans.xlf b/src/fsharp/xlf/FSComp.txt.zh-Hans.xlf index ba86113d4d9..e3273d74087 100644 --- a/src/fsharp/xlf/FSComp.txt.zh-Hans.xlf +++ b/src/fsharp/xlf/FSComp.txt.zh-Hans.xlf @@ -5123,13 +5123,13 @@ - Type parameters must be placed directly adjacent to the type name, e.g. \"type C<'T>\", not type \"C <'T>\" - 必须将类型参数直接放置到类型名称的旁边,例如 \"type C<'T>\",而非 type \"C <'T>\" + Remove spaces between the type name and type parameter, e.g. \"type C<'T>\", not type \"C <'T>\". Type parameters must be placed directly adjacent to the type name. + 必须将类型参数直接放置到类型名称的旁边,例如 \"type C<'T>\",而非 type \"C <'T>\" - Type arguments must be placed directly adjacent to the type name, e.g. \"C<'T>\", not \"C <'T>\" - 必须将类型参数直接放置到类型名称的旁边,例如 \"C<'T>\",而非 \"C <'T>\" + Remove spaces between the type name and type parameter, e.g. \"C<'T>\", not \"C <'T>\". Type parameters must be placed directly adjacent to the type name. + 必须将类型参数直接放置到类型名称的旁边,例如 \"C<'T>\",而非 \"C <'T>\" diff --git a/src/fsharp/xlf/FSComp.txt.zh-Hant.xlf b/src/fsharp/xlf/FSComp.txt.zh-Hant.xlf index 84d6951594e..835390456ac 100644 --- a/src/fsharp/xlf/FSComp.txt.zh-Hant.xlf +++ b/src/fsharp/xlf/FSComp.txt.zh-Hant.xlf @@ -5123,13 +5123,13 @@ - Type parameters must be placed directly adjacent to the type name, e.g. \"type C<'T>\", not type \"C <'T>\" - 型別參數必須放在緊鄰類型名稱的位置,例如 \"type C<'T>\",而不是 type \"C <'T>\" + Remove spaces between the type name and type parameter, e.g. \"type C<'T>\", not type \"C <'T>\". Type parameters must be placed directly adjacent to the type name. + 型別參數必須放在緊鄰類型名稱的位置,例如 \"type C<'T>\",而不是 type \"C <'T>\" - Type arguments must be placed directly adjacent to the type name, e.g. \"C<'T>\", not \"C <'T>\" - 型別引數必須放在緊鄰類型名稱的位置,例如 \"C<'T>\",而不是 \"C <'T>\" + Remove spaces between the type name and type parameter, e.g. \"C<'T>\", not \"C <'T>\". Type parameters must be placed directly adjacent to the type name. + 型別引數必須放在緊鄰類型名稱的位置,例如 \"C<'T>\",而不是 \"C <'T>\" From 2fd269ba2c8adbc59a5a80e451c324f54535ac3e Mon Sep 17 00:00:00 2001 From: Tom Date: Thu, 4 Oct 2018 15:19:00 +0100 Subject: [PATCH 070/160] Fix typo (#5732) --- TESTGUIDE.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/TESTGUIDE.md b/TESTGUIDE.md index 86ba173a08e..80f51322d7e 100644 --- a/TESTGUIDE.md +++ b/TESTGUIDE.md @@ -10,7 +10,7 @@ To run tests, use variations such as the following, depending on which test suit build.cmd vs test build.cmd all test -You can also submit pull requests to http://github.com/Microsoft/visualfsharp and run the tests via continuoous integration. Most people do wholesale testing that way. +You can also submit pull requests to http://github.com/Microsoft/visualfsharp and run the tests via continuous integration. Most people do wholesale testing that way. ## Prerequisites From 7f5bf5ecbef2c58da32cc7739bf917362bee6bf8 Mon Sep 17 00:00:00 2001 From: Tom Date: Fri, 5 Oct 2018 15:27:27 +0100 Subject: [PATCH 071/160] Update DEVGUIDE.md (#5741) Explicitly mention that the optional components are found in the VS Installer, not somewhere on the downloads page (since that's what was linked just before) --- DEVGUIDE.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/DEVGUIDE.md b/DEVGUIDE.md index 22098bee1a9..82b79e2bafd 100644 --- a/DEVGUIDE.md +++ b/DEVGUIDE.md @@ -130,7 +130,8 @@ Testing the .NET Core version of the F# compiler on macOS and Linux is TBD. To build and test Visual F# IDE Tools, install these requirements: -- [Visual Studio 2017](https://www.visualstudio.com/downloads/) +- Download [Visual Studio 2017](https://www.visualstudio.com/downloads/) +- Launch the Visual Studio Installer - Under the "Windows" workloads, select ".NET desktop development" - Select "F# desktop language support" under the optional components - Under the "Other Toolsets" workloads, select "Visual Studio extension development" From 88ad9d3e5b8596bffcbed86c23f523f1a30db074 Mon Sep 17 00:00:00 2001 From: Phillip Carter Date: Fri, 5 Oct 2018 09:35:58 -0700 Subject: [PATCH 072/160] Opens places at top of file by default (#5738) --- vsintegration/src/FSharp.Editor/Options/EditorOptions.fs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vsintegration/src/FSharp.Editor/Options/EditorOptions.fs b/vsintegration/src/FSharp.Editor/Options/EditorOptions.fs index 2851acda15c..1728637ea04 100644 --- a/vsintegration/src/FSharp.Editor/Options/EditorOptions.fs +++ b/vsintegration/src/FSharp.Editor/Options/EditorOptions.fs @@ -58,7 +58,7 @@ type CodeFixesOptions = { // We have this off by default, disable until we work out how to make this low priority // See https://github.com/Microsoft/visualfsharp/pull/3238#issue-237699595 SimplifyName = false - AlwaysPlaceOpensAtTopLevel = false + AlwaysPlaceOpensAtTopLevel = true UnusedOpens = true UnusedDeclarations = true } From 4529c8fd2b697638dbc6ace0d34051c2ca7f1c23 Mon Sep 17 00:00:00 2001 From: Phillip Carter Date: Fri, 5 Oct 2018 09:36:29 -0700 Subject: [PATCH 073/160] Do not show symbols from unopened places by default (#5739) --- .../src/FSharp.Editor/Completion/CompletionProvider.fs | 2 +- vsintegration/src/FSharp.Editor/Options/EditorOptions.fs | 4 ++-- .../src/FSharp.UIResources/IntelliSenseOptionControl.xaml | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/vsintegration/src/FSharp.Editor/Completion/CompletionProvider.fs b/vsintegration/src/FSharp.Editor/Completion/CompletionProvider.fs index fa1101d18de..fec42d030f7 100644 --- a/vsintegration/src/FSharp.Editor/Completion/CompletionProvider.fs +++ b/vsintegration/src/FSharp.Editor/Completion/CompletionProvider.fs @@ -221,7 +221,7 @@ type internal FSharpCompletionProvider let! _parsingOptions, projectOptions = projectInfoManager.TryGetOptionsForEditingDocumentOrProject(document) let! textVersion = context.Document.GetTextVersionAsync(context.CancellationToken) let getAllSymbols(fileCheckResults: FSharpCheckFileResults) = - if settings.IntelliSense.ShowAllSymbols + if settings.IntelliSense.IncludeSymbolsFromUnopenedNamespacesOrModules then assemblyContentProvider.GetAllEntitiesInProjectAndReferencedAssemblies(fileCheckResults) else [] let! results = diff --git a/vsintegration/src/FSharp.Editor/Options/EditorOptions.fs b/vsintegration/src/FSharp.Editor/Options/EditorOptions.fs index 1728637ea04..47dcad5a029 100644 --- a/vsintegration/src/FSharp.Editor/Options/EditorOptions.fs +++ b/vsintegration/src/FSharp.Editor/Options/EditorOptions.fs @@ -28,12 +28,12 @@ type EnterKeySetting = type IntelliSenseOptions = { ShowAfterCharIsTyped: bool ShowAfterCharIsDeleted: bool - ShowAllSymbols : bool + IncludeSymbolsFromUnopenedNamespacesOrModules : bool EnterKeySetting : EnterKeySetting } static member Default = { ShowAfterCharIsTyped = true ShowAfterCharIsDeleted = true - ShowAllSymbols = true + IncludeSymbolsFromUnopenedNamespacesOrModules = false EnterKeySetting = EnterKeySetting.NeverNewline} diff --git a/vsintegration/src/FSharp.UIResources/IntelliSenseOptionControl.xaml b/vsintegration/src/FSharp.UIResources/IntelliSenseOptionControl.xaml index 7eb21c35559..dbb7b6bb8fc 100644 --- a/vsintegration/src/FSharp.UIResources/IntelliSenseOptionControl.xaml +++ b/vsintegration/src/FSharp.UIResources/IntelliSenseOptionControl.xaml @@ -25,7 +25,7 @@ - From 5d1843b9864f47dda684632ec2db9e2c907d3486 Mon Sep 17 00:00:00 2001 From: Phillip Carter Date: Wed, 10 Oct 2018 02:56:57 -0700 Subject: [PATCH 074/160] Fix linux build (#5748) * Attempt to fix linux build * Clean up --- src/scripts/scriptlib.fsx | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/scripts/scriptlib.fsx b/src/scripts/scriptlib.fsx index 6835b9418fe..f77e5e5578d 100644 --- a/src/scripts/scriptlib.fsx +++ b/src/scripts/scriptlib.fsx @@ -60,15 +60,15 @@ module Scripting = let (++) a b = Path.Combine(a,b) - let getBasename a = Path.GetFileNameWithoutExtension a - let getFullPath a = Path.GetFullPath a - let getFilename a = Path.GetFileName a - let getDirectoryName a = Path.GetDirectoryName a + let getBasename (a: string) = Path.GetFileNameWithoutExtension(a) + let getFullPath a = Path.GetFullPath(a) + let getFilename (a: string) = Path.GetFileName(a) + let getDirectoryName (a: string) = Path.GetDirectoryName(a) let copyFile source dir = let dest = if not (Directory.Exists dir) then Directory.CreateDirectory dir |>ignore - let result = Path.Combine(dir, Path.GetFileName source) + let result = Path.Combine(dir, getFilename source) result //printfn "Copy %s --> %s" source dest File.Copy(source, dest, true) @@ -96,7 +96,7 @@ module Scripting = let processExePath baseDir exe = if Path.IsPathRooted(exe) then exe else - match Path.GetDirectoryName(exe) with + match getDirectoryName exe with | "" -> exe | _ -> Path.Combine(baseDir,exe) |> Path.GetFullPath From 9f6a5b7b26299c99fab70c1f83d619c42f1f5451 Mon Sep 17 00:00:00 2001 From: "Brett V. Forsgren" Date: Tue, 9 Oct 2018 16:58:48 -0700 Subject: [PATCH 075/160] update yaml syntax to conform to new standards --- .vsts-pr.yaml | 56 ++++++++------- .vsts-signed.yaml | 174 ++++++++++++++++++++++------------------------ 2 files changed, 114 insertions(+), 116 deletions(-) diff --git a/.vsts-pr.yaml b/.vsts-pr.yaml index 0d7262e418a..1f9976034fd 100644 --- a/.vsts-pr.yaml +++ b/.vsts-pr.yaml @@ -1,9 +1,10 @@ -phases: -- phase: Linux - queue: - name: Hosted Linux Preview - timeoutInMinutes: 90 - parallel: 2 +jobs: +- job: Linux + pool: + vmImage: ubuntu-16.04 + timeoutInMinutes: 90 + strategy: + maxParallel: 2 matrix: release_default: _command: ./mono/cibuild.sh @@ -13,20 +14,21 @@ phases: # _command: ./fcs/build.sh # _args: Build steps: - - script: $(_command) $(_args) - - task: PublishBuildArtifacts@1 - inputs: - PathtoPublish: '$(Build.SourcesDirectory)/tests/TestResults' - ArtifactName: 'Linux $(_command) $(_args)' - publishLocation: Container - continueOnError: true - condition: failed() + - script: $(_command) $(_args) + - task: PublishBuildArtifacts@1 + inputs: + PathtoPublish: '$(Build.SourcesDirectory)/tests/TestResults' + ArtifactName: 'Linux $(_command) $(_args)' + publishLocation: Container + continueOnError: true + condition: failed() -- phase: Windows - queue: - name: Hosted VS2017 - timeoutInMinutes: 90 - parallel: 7 +- job: Windows + pool: + vmImage: vs2017-win2016 + timeoutInMinutes: 90 + strategy: + maxParallel: 7 matrix: ci_part1: _command: build.cmd @@ -50,11 +52,11 @@ phases: _command: fcs\build.cmd _args: TestAndNuget steps: - - script: $(_command) $(_args) - - task: PublishBuildArtifacts@1 - inputs: - PathtoPublish: '$(Build.SourcesDirectory)\tests\TestResults' - ArtifactName: 'Windows $(_command) $(_args)' - publishLocation: Container - continueOnError: true - condition: failed() + - script: $(_command) $(_args) + - task: PublishBuildArtifacts@1 + inputs: + PathtoPublish: '$(Build.SourcesDirectory)\tests\TestResults' + ArtifactName: 'Windows $(_command) $(_args)' + publishLocation: Container + continueOnError: true + condition: failed() diff --git a/.vsts-signed.yaml b/.vsts-signed.yaml index df4e8a6bd5f..82b5d247362 100644 --- a/.vsts-signed.yaml +++ b/.vsts-signed.yaml @@ -1,100 +1,96 @@ -queue: - name: VSEng-MicroBuildVS2017 +jobs: +- job: Full_Signed + pool: + name: VSEng-MicroBuildVS2017 timeoutInMinutes: 300 - demands: - - visualstudio - - DotNetFramework - - msbuild + variables: + MSBuildConfiguration: 'Release' + steps: + # Install Signing Plugin + - task: ms-vseng.MicroBuildTasks.30666190-6959-11e5-9f96-f56098202fef.MicroBuildSigningPlugin@1 + displayName: Install Signing Plugin + inputs: + signType: real + condition: and(succeeded(), in(variables['PB_SignType'], 'test', 'real')) -variables: - MSBuildConfiguration: 'Release' + # Install Swix Plugin + - task: ms-vseng.MicroBuildTasks.32f78468-e895-4f47-962c-58a699361df8.MicroBuildSwixPlugin@1 + displayName: Install Swix Plugin -steps: -# Install Signing Plugin -- task: ms-vseng.MicroBuildTasks.30666190-6959-11e5-9f96-f56098202fef.MicroBuildSigningPlugin@1 - displayName: Install Signing Plugin - inputs: - signType: real - condition: and(succeeded(), in(variables['PB_SignType'], 'test', 'real')) + # Run build.cmd + - task: CmdLine@1 + displayName: Run build.cmd + inputs: + filename: build.cmd + arguments: microbuild -# Install Swix Plugin -- task: ms-vseng.MicroBuildTasks.32f78468-e895-4f47-962c-58a699361df8.MicroBuildSwixPlugin@1 - displayName: Install Swix Plugin + # Publish nightly package to MyGet + - task: PowerShell@1 + displayName: Publish nightly package to MyGet + inputs: + scriptName: 'setup\publish-assets.ps1' + arguments: '-binariesPath $(MSBuildConfiguration) -branchName $(Build.SourceBranch) -apiKey $(FSharp.MyGetApiKey)' + condition: and(succeeded(), contains(variables['PB_PublishType'], 'myget')) -# Run build.cmd -- task: CmdLine@1 - displayName: Run build.cmd - inputs: - filename: build.cmd - arguments: microbuild + # Publish packages to Azure Blob Storage + - task: MSBuild@1 + displayName: Publish packages to Azure Blob Storage + inputs: + solution: PublishToBlob.proj + msbuildArguments: '/t:Build /p:ExpectedFeedUrl=$(PB_PublishBlobFeedUrl) /p:AccountKey=$(PB_PublishBlobFeedKey) /p:ManifestBranch=$(SourceBranch) /p:ManifestCommit=$(SourceVersion) /p:ManifestBuildId=$(OfficialBuildId)' + condition: and(succeeded(), contains(variables['PB_PublishType'], 'blob')) -# Publish nightly package to MyGet -- task: PowerShell@1 - displayName: Publish nightly package to MyGet - inputs: - scriptName: 'setup\publish-assets.ps1' - arguments: '-binariesPath $(MSBuildConfiguration) -branchName $(Build.SourceBranch) -apiKey $(FSharp.MyGetApiKey)' - condition: and(succeeded(), contains(variables['PB_PublishType'], 'myget')) + # Create static drop + - task: PublishBuildArtifacts@1 + displayName: Create static drop + inputs: + PathtoPublish: '$(MSBuildConfiguration)' + ArtifactName: '$(Build.BuildNumber)' + publishLocation: FilePath + TargetPath: '$(DropRoot)\$(Build.DefinitionName)\$(Build.SourceBranchName)' + Parallel: true + ParallelCount: 64 + condition: and(succeeded(), contains(variables['PB_PublishType'], 'drop')) -# Publish packages to Azure Blob Storage -- task: MSBuild@1 - displayName: Publish packages to Azure Blob Storage - inputs: - solution: PublishToBlob.proj - msbuildArguments: '/t:Build /p:ExpectedFeedUrl=$(PB_PublishBlobFeedUrl) /p:AccountKey=$(PB_PublishBlobFeedKey) /p:ManifestBranch=$(SourceBranch) /p:ManifestCommit=$(SourceVersion) /p:ManifestBuildId=$(OfficialBuildId)' - condition: and(succeeded(), contains(variables['PB_PublishType'], 'blob')) + # Publish symbols + - task: PublishSymbols@1 + displayName: Publish symbols + inputs: + SymbolsPath: '$(DropRoot)\$(Build.DefinitionName)\$(Build.SourceBranchName)\$(Build.BuildNumber)\Symbols' + SearchPattern: '**\*.dll;**\*.exe;**\*.pdb' + SymbolsFolder: '$(Build.SourcesDirectory)\$(MSBuildConfiguration)' + TreatNotIndexedAsWarning: true + SymbolsProduct: '$(Build.DefinitionName)' + SymbolsVersion: '$(Build.BuildNumber)' + continueOnError: true + condition: and(succeeded(), contains(variables['PB_PublishType'], 'symbols')) -# Create static drop -- task: PublishBuildArtifacts@1 - displayName: Create static drop - inputs: - PathtoPublish: '$(MSBuildConfiguration)' - ArtifactName: '$(Build.BuildNumber)' - publishLocation: FilePath - TargetPath: '$(DropRoot)\$(Build.DefinitionName)\$(Build.SourceBranchName)' - Parallel: true - ParallelCount: 64 - condition: and(succeeded(), contains(variables['PB_PublishType'], 'drop')) + # Upload VSTS Drop + - task: ms-vseng.MicroBuildTasks.4305a8de-ba66-4d8b-b2d1-0dc4ecbbf5e8.MicroBuildUploadVstsDropFolder@1 + displayName: Upload VSTS Drop + inputs: + DropFolder: '$(Build.SourcesDirectory)\$(MSBuildConfiguration)\insertion' + condition: and(succeeded(), contains(variables['PB_PublishType'], 'vsts')) -# Publish symbols -- task: PublishSymbols@1 - displayName: Publish symbols - inputs: - SymbolsPath: '$(DropRoot)\$(Build.DefinitionName)\$(Build.SourceBranchName)\$(Build.BuildNumber)\Symbols' - SearchPattern: '**\*.dll;**\*.exe;**\*.pdb' - SymbolsFolder: '$(Build.SourcesDirectory)\$(MSBuildConfiguration)' - TreatNotIndexedAsWarning: true - SymbolsProduct: '$(Build.DefinitionName)' - SymbolsVersion: '$(Build.BuildNumber)' - continueOnError: true - condition: and(succeeded(), contains(variables['PB_PublishType'], 'symbols')) + # Execute cleanup tasks + - task: ms-vseng.MicroBuildTasks.521a94ea-9e68-468a-8167-6dcf361ea776.MicroBuildCleanup@1 + displayName: Execute cleanup tasks + condition: succeededOrFailed() -# Upload VSTS Drop -- task: ms-vseng.MicroBuildTasks.4305a8de-ba66-4d8b-b2d1-0dc4ecbbf5e8.MicroBuildUploadVstsDropFolder@1 - displayName: Upload VSTS Drop - inputs: - DropFolder: '$(Build.SourcesDirectory)\$(MSBuildConfiguration)\insertion' - condition: and(succeeded(), contains(variables['PB_PublishType'], 'vsts')) + # Publish Artifact: MicroBuildOutputs + - task: PublishBuildArtifacts@1 + displayName: 'Publish Artifact: MicroBuildOutputs' + inputs: + PathtoPublish: '$(Build.StagingDirectory)\MicroBuild\Output' + ArtifactName: MicroBuildOutputs + publishLocation: Container + condition: and(succeeded(), contains(variables['PB_PublishType'], 'microbuild')) -# Execute cleanup tasks -- task: ms-vseng.MicroBuildTasks.521a94ea-9e68-468a-8167-6dcf361ea776.MicroBuildCleanup@1 - displayName: Execute cleanup tasks - condition: succeededOrFailed() - -# Publish Artifact: MicroBuildOutputs -- task: PublishBuildArtifacts@1 - displayName: 'Publish Artifact: MicroBuildOutputs' - inputs: - PathtoPublish: '$(Build.StagingDirectory)\MicroBuild\Output' - ArtifactName: MicroBuildOutputs - publishLocation: Container - condition: and(succeeded(), contains(variables['PB_PublishType'], 'microbuild')) - -# Publish Symbols to Symweb -- task: ms-vscs-artifact.build-tasks.artifactSymbolTask-1.artifactSymbolTask@0 - displayName: Publish symbols to SymWeb - inputs: - symbolServiceURI: 'https://microsoft.artifacts.visualstudio.com/DefaultCollection' - sourcePath: '$(DropRoot)\$(Build.DefinitionName)\$(Build.SourceBranchName)\$(Build.BuildNumber)\Symbols' - usePat: false - condition: and(succeeded(), contains(variables['PB_PublishType'], 'symweb')) + # Publish Symbols to Symweb + - task: ms-vscs-artifact.build-tasks.artifactSymbolTask-1.artifactSymbolTask@0 + displayName: Publish symbols to SymWeb + inputs: + symbolServiceURI: 'https://microsoft.artifacts.visualstudio.com/DefaultCollection' + sourcePath: '$(DropRoot)\$(Build.DefinitionName)\$(Build.SourceBranchName)\$(Build.BuildNumber)\Symbols' + usePat: false + condition: and(succeeded(), contains(variables['PB_PublishType'], 'symweb')) From 6979c9d920918440f9b8176f4e0161158250688c Mon Sep 17 00:00:00 2001 From: "Kevin Ransom (msft)" Date: Wed, 10 Oct 2018 09:49:05 -0700 Subject: [PATCH 076/160] Dev 16.0 new F# template fails (#5751) --- vsintegration/Vsix/VisualFSharpFull/VisualFSharpFull.csproj | 5 ----- 1 file changed, 5 deletions(-) diff --git a/vsintegration/Vsix/VisualFSharpFull/VisualFSharpFull.csproj b/vsintegration/Vsix/VisualFSharpFull/VisualFSharpFull.csproj index 99a3e3d7007..2b640de5112 100644 --- a/vsintegration/Vsix/VisualFSharpFull/VisualFSharpFull.csproj +++ b/vsintegration/Vsix/VisualFSharpFull/VisualFSharpFull.csproj @@ -22,11 +22,6 @@ License.txt true - - PreserveNewest - packages\System.ValueTuple.4.4.0.nupkg - true - PreserveNewest FSharp.Data.TypeProviders.dll From fafad3c1aef406f6c652a079bc104e3d72ce075d Mon Sep 17 00:00:00 2001 From: Don Syme Date: Thu, 11 Oct 2018 11:51:38 +0100 Subject: [PATCH 077/160] re-add tests --- src/fsharp/FSharp.Core/printf.fs | 2 + src/fsharp/FSharp.Core/printf.fsi | 10 ++++- tests/fsharp/tests.fs | 4 +- tests/fsharp/typecheck/sigs/neg103.vsbsl | 47 +++++++++++----------- tests/fsharp/typecheck/sigs/neg103b.bsl | 24 +++++++++++ tests/fsharp/typecheck/sigs/neg103b.fs | 20 +++++++++ tests/fsharp/typecheck/sigs/neg104.bsl | 2 +- tests/fsharp/typecheck/sigs/neg104.vsbsl | 2 +- tests/fsharp/typecheck/sigs/neg104b.bsl | 20 +++++++++ tests/fsharp/typecheck/sigs/neg104b.fs | 12 ++++++ tests/fsharp/typecheck/sigs/neg_anon_1.bsl | 16 ++++---- 11 files changed, 122 insertions(+), 37 deletions(-) create mode 100644 tests/fsharp/typecheck/sigs/neg103b.bsl create mode 100644 tests/fsharp/typecheck/sigs/neg103b.fs create mode 100644 tests/fsharp/typecheck/sigs/neg104b.bsl create mode 100644 tests/fsharp/typecheck/sigs/neg104b.fs diff --git a/src/fsharp/FSharp.Core/printf.fs b/src/fsharp/FSharp.Core/printf.fs index f3d47e1c0ab..535d87d491b 100644 --- a/src/fsharp/FSharp.Core/printf.fs +++ b/src/fsharp/FSharp.Core/printf.fs @@ -4,6 +4,8 @@ namespace Microsoft.FSharp.Core type PrintfFormat<'Printer,'State,'Residue,'Result>(value:string) = member x.Value = value + + override __.ToString() = value type PrintfFormat<'Printer,'State,'Residue,'Result,'Tuple>(value:string) = inherit PrintfFormat<'Printer,'State,'Residue,'Result>(value) diff --git a/src/fsharp/FSharp.Core/printf.fsi b/src/fsharp/FSharp.Core/printf.fsi index 011e4f0d9b9..c8f7b2dcaeb 100644 --- a/src/fsharp/FSharp.Core/printf.fsi +++ b/src/fsharp/FSharp.Core/printf.fsi @@ -15,10 +15,12 @@ open System.Text /// Value generated by the overall printf action (e.g. sprint generates a string) /// Value generated after post processing (e.g. failwithf generates a string internally then raises an exception) type PrintfFormat<'Printer,'State,'Residue,'Result> = + ///

Construct a format string /// The input string. /// The PrintfFormat containing the formatted result. new : value:string -> PrintfFormat<'Printer,'State,'Residue,'Result> + /// The raw text of the format string. member Value : string @@ -29,7 +31,9 @@ type PrintfFormat<'Printer,'State,'Residue,'Result> = /// Value generated after post processing (e.g. failwithf generates a string internally then raises an exception) /// Tuple of values generated by scan or match. type PrintfFormat<'Printer,'State,'Residue,'Result,'Tuple> = + inherit PrintfFormat<'Printer,'State,'Residue,'Result> + /// Construct a format string /// The input string. /// The created format string. @@ -137,9 +141,11 @@ module Printf = /// Represents a statically-analyzed format associated with writing to a System.Text.StringBuilder. The first type parameter indicates the /// arguments of the format operation and the last the overall return type. type BuilderFormat<'T,'Result> = Format<'T, StringBuilder, unit, 'Result> + /// Represents a statically-analyzed format when formatting builds a string. The first type parameter indicates the /// arguments of the format operation and the last the overall return type. type StringFormat<'T,'Result> = Format<'T, unit, string, 'Result> + /// Represents a statically-analyzed format associated with writing to a System.IO.TextWriter. The first type parameter indicates the /// arguments of the format operation and the last the overall return type. type TextWriterFormat<'T,'Result> = Format<'T, TextWriter, unit, 'Result> @@ -147,15 +153,15 @@ module Printf = /// Represents a statically-analyzed format associated with writing to a System.Text.StringBuilder. The type parameter indicates the /// arguments and return type of the format operation. type BuilderFormat<'T> = BuilderFormat<'T,unit> + /// Represents a statically-analyzed format when formatting builds a string. The type parameter indicates the /// arguments and return type of the format operation. type StringFormat<'T> = StringFormat<'T,string> + /// Represents a statically-analyzed format associated with writing to a System.IO.TextWriter. The type parameter indicates the /// arguments and return type of the format operation. type TextWriterFormat<'T> = TextWriterFormat<'T,unit> - - /// Print to a System.Text.StringBuilder /// The StringBuilder to print to. /// The input formatter. diff --git a/tests/fsharp/tests.fs b/tests/fsharp/tests.fs index 383d0d839c8..cddd580bce4 100644 --- a/tests/fsharp/tests.fs +++ b/tests/fsharp/tests.fs @@ -2440,10 +2440,10 @@ module TypecheckTests = let ``type check neg104`` () = singleNegTest (testConfig "typecheck/sigs") "neg104" [] - let ``type check neg103`` () = singleNegTest (testConfig "typecheck/sigs") "neg103" + let ``type check neg103b`` () = singleNegTest (testConfig "typecheck/sigs") "neg103b" [] - let ``type check neg104`` () = singleNegTest (testConfig "typecheck/sigs") "neg104" + let ``type check neg104b`` () = singleNegTest (testConfig "typecheck/sigs") "neg104b" [] let ``type check neg_anon_1`` () = singleNegTest (testConfig "typecheck/sigs") "neg_anon_1" diff --git a/tests/fsharp/typecheck/sigs/neg103.vsbsl b/tests/fsharp/typecheck/sigs/neg103.vsbsl index 4c55fca4170..422a9e3bf81 100644 --- a/tests/fsharp/typecheck/sigs/neg103.vsbsl +++ b/tests/fsharp/typecheck/sigs/neg103.vsbsl @@ -1,24 +1,25 @@ -neg103.fs(5,50,5,61): typecheck error FS0001: Two anonymous record types have mismatched sets of field names '["a"; "b"]' and '["a"]' - -neg103.fs(7,41,7,52): typecheck error FS0001: Two anonymous record types have mismatched sets of field names '["b"]' and '["a"]' - -neg103.fs(10,27,10,55): typecheck error FS0059: The type '{|a : int|}' does not have any proper subtypes and need not be used as the target of a static coercion - -neg103.fs(10,27,10,55): typecheck error FS0193: Type constraint mismatch. The type - '{|b : int|}' -is not compatible with type - '{|a : int|}' - - -neg103.fs(13,27,13,62): typecheck error FS0059: The type '{|a : int|}' does not have any proper subtypes and need not be used as the target of a static coercion - -neg103.fs(13,27,13,62): typecheck error FS0193: Type constraint mismatch. The type - '{|a : int ; b : int|}' -is not compatible with type - '{|a : int|}' - - -neg103.fs(18,34,18,36): typecheck error FS0001: The type '('a -> 'a)' does not support the 'comparison' constraint. For example, it does not support the 'System.IComparable' interface - -neg103.fs(20,42,20,44): typecheck error FS0001: The type '('a -> 'a)' does not support the 'comparison' constraint. For example, it does not support the 'System.IComparable' interface +neg103.fs(7,12,7,22): typecheck error FS0001: This expression was expected to have type + 'Async<'a>' +but here has type + 'string' + +neg103.fs(12,7,12,15): typecheck error FS0001: This expression was expected to have type + 'int' +but here has type + 'MyUnion' + +neg103.fs(17,7,17,15): typecheck error FS0001: This expression was expected to have type + 'int' +but here has type + 'MyUnion' + +neg103.fs(21,7,21,9): typecheck error FS0001: This expression was expected to have type + 'Async' +but here has type + 'int' + +neg103.fs(25,11,25,19): typecheck error FS0001: This expression was expected to have type + 'int' +but here has type + 'MyUnion' diff --git a/tests/fsharp/typecheck/sigs/neg103b.bsl b/tests/fsharp/typecheck/sigs/neg103b.bsl new file mode 100644 index 00000000000..6c67abf0a6e --- /dev/null +++ b/tests/fsharp/typecheck/sigs/neg103b.bsl @@ -0,0 +1,24 @@ + +neg103.fs(5,50,5,61): typecheck error FS0001: Two anonymous record types have mismatched sets of field names '["a"; "b"]' and '["a"]' + +neg103.fs(7,41,7,52): typecheck error FS0001: Two anonymous record types have mismatched sets of field names '["b"]' and '["a"]' + +neg103.fs(10,27,10,55): typecheck error FS0059: The type '{|a : int|}' does not have any proper subtypes and need not be used as the target of a static coercion + +neg103.fs(10,27,10,55): typecheck error FS0193: Type constraint mismatch. The type + '{|b : int|}' +is not compatible with type + '{|a : int|}' + + +neg103.fs(13,27,13,62): typecheck error FS0059: The type '{|a : int|}' does not have any proper subtypes and need not be used as the target of a static coercion + +neg103.fs(13,27,13,62): typecheck error FS0193: Type constraint mismatch. The type + '{|a : int ; b : int|}' +is not compatible with type + '{|a : int|}' + + +neg103.fs(18,34,18,36): typecheck error FS0001: The type '('a -> 'a)' does not support the 'comparison' constraint. For example, it does not support the 'System.IComparable' interface + +neg103.fs(20,42,20,44): typecheck error FS0001: The type '('a -> 'a)' does not support the 'comparison' constraint. For example, it does not support the 'System.IComparable' interface \ No newline at end of file diff --git a/tests/fsharp/typecheck/sigs/neg103b.fs b/tests/fsharp/typecheck/sigs/neg103b.fs new file mode 100644 index 00000000000..4979cea70bd --- /dev/null +++ b/tests/fsharp/typecheck/sigs/neg103b.fs @@ -0,0 +1,20 @@ + +module M + + // Check we get compile-time errors + let negTypeTest1() = ({| a = 1+1; b = 2 |} = {| a = 2 |}) + + let negTypeTest2() = ({| b = 2 |} = {| a = 2 |} ) + + // no subsumption + let negTypeTest3() = ({| b = 2 |} :> {| a : int |} ) + + // no subsumption + let negTypeTest4() = ({| b = 2; a = 1 |} :> {| a : int |} ) + + let posgTypeTest5() = ({| b = 2; a = 1 |} = {| a = 1; b = 2 |} ) + + // Comparison is not possible if structural elements are comparable + let negTypeTest6() = ({| a = id |} > {| a = id |}) + + let negTypeTest7() = (compare {| a = id |} {| a = id |}) \ No newline at end of file diff --git a/tests/fsharp/typecheck/sigs/neg104.bsl b/tests/fsharp/typecheck/sigs/neg104.bsl index aa804860dfc..022a8e3e4b2 100644 --- a/tests/fsharp/typecheck/sigs/neg104.bsl +++ b/tests/fsharp/typecheck/sigs/neg104.bsl @@ -17,4 +17,4 @@ neg104.fs(32,27,32,28): parse error FS0604: Unmatched '{' neg104.fs(35,19,35,20): parse error FS0010: Unexpected symbol '}' in definition. Expected incomplete structured construct at or before this point or other token. -neg104.fs(35,1,35,20): parse error FS0010: Incomplete structured construct at or before this point in implementation file +neg104.fs(36,1,36,1): parse error FS0010: Incomplete structured construct at or before this point in implementation file diff --git a/tests/fsharp/typecheck/sigs/neg104.vsbsl b/tests/fsharp/typecheck/sigs/neg104.vsbsl index 1fe8b3683ef..e4e6e79397a 100644 --- a/tests/fsharp/typecheck/sigs/neg104.vsbsl +++ b/tests/fsharp/typecheck/sigs/neg104.vsbsl @@ -17,7 +17,7 @@ neg104.fs(32,27,32,28): parse error FS0604: Unmatched '{' neg104.fs(35,19,35,20): parse error FS0010: Unexpected symbol '}' in definition. Expected incomplete structured construct at or before this point or other token. -neg104.fs(35,1,35,20): parse error FS0010: Incomplete structured construct at or before this point in implementation file +neg104.fs(36,1,36,1): parse error FS0010: Incomplete structured construct at or before this point in implementation file neg104.fs(8,9,8,30): typecheck error FS0750: This construct may only be used within computation expressions diff --git a/tests/fsharp/typecheck/sigs/neg104b.bsl b/tests/fsharp/typecheck/sigs/neg104b.bsl new file mode 100644 index 00000000000..8a5f0f96195 --- /dev/null +++ b/tests/fsharp/typecheck/sigs/neg104b.bsl @@ -0,0 +1,20 @@ + +neg104b.fs(6,38,6,39): parse error FS0010: Unexpected symbol '}' in binding. Expected '|}' or other token. + +neg104b.fs(6,29,6,31): parse error FS0605: Unmatched '{|' + +neg104b.fs(8,5,8,8): parse error FS0058: Possible incorrect indentation: this token is offside of context started at position (6:29). Try indenting this token further or using standard formatting conventions. + +neg104b.fs(10,5,10,9): parse error FS0058: Possible incorrect indentation: this token is offside of context started at position (8:5). Try indenting this token further or using standard formatting conventions. + +neg104b.fs(10,5,10,9): parse error FS0010: Unexpected keyword 'type' in binding. Expected incomplete structured construct at or before this point or other token. + +neg104b.fs(6,5,6,8): parse error FS3118: Incomplete value or function definition. If this is in an expression, the body of the expression must be indented to the same column as the 'let' keyword. + +neg104b.fs(10,25,10,26): parse error FS0010: Unexpected symbol '}' in type definition. Expected '|}' or other token. + +neg104b.fs(10,14,10,16): parse error FS0605: Unmatched '{|' + +neg104b.fs(12,5,12,8): parse error FS0058: Possible incorrect indentation: this token is offside of context started at position (10:14). Try indenting this token further or using standard formatting conventions. + +neg104b.fs(14,1,14,1): parse error FS0010: Incomplete structured construct at or before this point in implementation file \ No newline at end of file diff --git a/tests/fsharp/typecheck/sigs/neg104b.fs b/tests/fsharp/typecheck/sigs/neg104b.fs new file mode 100644 index 00000000000..98c907e65d3 --- /dev/null +++ b/tests/fsharp/typecheck/sigs/neg104b.fs @@ -0,0 +1,12 @@ + +module M + + + // Check we get parsing error and decent recovery + let negParsingTest2() = {| b = 2 } + + let normalCode1() = () + // Check we get parsing error and decent recovery + type X = {| A : int } + + let normalCode2() = () diff --git a/tests/fsharp/typecheck/sigs/neg_anon_1.bsl b/tests/fsharp/typecheck/sigs/neg_anon_1.bsl index cdc62ab4d79..d7aaaecd939 100644 --- a/tests/fsharp/typecheck/sigs/neg_anon_1.bsl +++ b/tests/fsharp/typecheck/sigs/neg_anon_1.bsl @@ -1,24 +1,24 @@ -neg-anon-1.fs(5,50,5,61): typecheck error FS0001: Two anonymous record types have mismatched sets of field names '["a"; "b"]' and '["a"]' +neg_anon_1.fs(5,50,5,61): typecheck error FS0001: Two anonymous record types have mismatched sets of field names '["a"; "b"]' and '["a"]' -neg-anon-1.fs(7,41,7,52): typecheck error FS0001: Two anonymous record types have mismatched sets of field names '["b"]' and '["a"]' +neg_anon_1.fs(7,41,7,52): typecheck error FS0001: Two anonymous record types have mismatched sets of field names '["b"]' and '["a"]' -neg-anon-1.fs(10,27,10,55): typecheck error FS0059: The type '{|a : int|}' does not have any proper subtypes and need not be used as the target of a static coercion +neg_anon_1.fs(10,27,10,55): typecheck error FS0059: The type '{|a : int|}' does not have any proper subtypes and need not be used as the target of a static coercion -neg-anon-1.fs(10,27,10,55): typecheck error FS0193: Type constraint mismatch. The type +neg_anon_1.fs(10,27,10,55): typecheck error FS0193: Type constraint mismatch. The type '{|b : int|}' is not compatible with type '{|a : int|}' -neg-anon-1.fs(13,27,13,62): typecheck error FS0059: The type '{|a : int|}' does not have any proper subtypes and need not be used as the target of a static coercion +neg_anon_1.fs(13,27,13,62): typecheck error FS0059: The type '{|a : int|}' does not have any proper subtypes and need not be used as the target of a static coercion -neg-anon-1.fs(13,27,13,62): typecheck error FS0193: Type constraint mismatch. The type +neg_anon_1.fs(13,27,13,62): typecheck error FS0193: Type constraint mismatch. The type '{|a : int ; b : int|}' is not compatible with type '{|a : int|}' -neg-anon-1.fs(18,34,18,36): typecheck error FS0001: The type '('a -> 'a)' does not support the 'comparison' constraint. For example, it does not support the 'System.IComparable' interface +neg_anon_1.fs(18,34,18,36): typecheck error FS0001: The type '('a -> 'a)' does not support the 'comparison' constraint. For example, it does not support the 'System.IComparable' interface -neg-anon-1.fs(20,42,20,44): typecheck error FS0001: The type '('a -> 'a)' does not support the 'comparison' constraint. For example, it does not support the 'System.IComparable' interface +neg_anon_1.fs(20,42,20,44): typecheck error FS0001: The type '('a -> 'a)' does not support the 'comparison' constraint. For example, it does not support the 'System.IComparable' interface From 2e4e60f74f76342e2938182278bf7f20ba0c2733 Mon Sep 17 00:00:00 2001 From: "Brett V. Forsgren" Date: Thu, 11 Oct 2018 07:05:54 -0700 Subject: [PATCH 078/160] fix path casing (#5761) --- .../{unittests => UnitTests}/SemanticColorizationServiceTests.fs | 0 .../{unittests => UnitTests}/SyntacticColorizationServiceTests.fs | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename vsintegration/tests/{unittests => UnitTests}/SemanticColorizationServiceTests.fs (100%) rename vsintegration/tests/{unittests => UnitTests}/SyntacticColorizationServiceTests.fs (100%) diff --git a/vsintegration/tests/unittests/SemanticColorizationServiceTests.fs b/vsintegration/tests/UnitTests/SemanticColorizationServiceTests.fs similarity index 100% rename from vsintegration/tests/unittests/SemanticColorizationServiceTests.fs rename to vsintegration/tests/UnitTests/SemanticColorizationServiceTests.fs diff --git a/vsintegration/tests/unittests/SyntacticColorizationServiceTests.fs b/vsintegration/tests/UnitTests/SyntacticColorizationServiceTests.fs similarity index 100% rename from vsintegration/tests/unittests/SyntacticColorizationServiceTests.fs rename to vsintegration/tests/UnitTests/SyntacticColorizationServiceTests.fs From e42cea2dfc329579c0bb23f5f19f982c6ff2b6cf Mon Sep 17 00:00:00 2001 From: Steffen Forkmann Date: Thu, 11 Oct 2018 16:08:14 +0200 Subject: [PATCH 079/160] Use lazy evaluation for useMethodImpl (#5728) --- src/fsharp/IlxGen.fs | 37 ++++++++++++++++++++++--------------- 1 file changed, 22 insertions(+), 15 deletions(-) diff --git a/src/fsharp/IlxGen.fs b/src/fsharp/IlxGen.fs index 2a5e5dce89a..d115154a756 100644 --- a/src/fsharp/IlxGen.fs +++ b/src/fsharp/IlxGen.fs @@ -5121,25 +5121,32 @@ and ComputeFlagFixupsForMemberBinding cenv (v:Val,memberInfo:ValMemberInfo) = let otcref = tcrefOfAppTy cenv.g oty let tcref = v.MemberApparentEntity - let useMethodImpl = - // REVIEW: it would be good to get rid of this special casing of Compare and GetHashCode during code generation - let isCompare = - (Option.isSome tcref.GeneratedCompareToValues && typeEquiv cenv.g oty cenv.g.mk_IComparable_ty) || - (Option.isSome tcref.GeneratedCompareToValues && tyconRefEq cenv.g cenv.g.system_GenericIComparable_tcref otcref) - - let isGenericEquals = - (Option.isSome tcref.GeneratedHashAndEqualsWithComparerValues && tyconRefEq cenv.g cenv.g.system_GenericIEquatable_tcref otcref) - - let isStructural = - (Option.isSome tcref.GeneratedCompareToWithComparerValues && typeEquiv cenv.g oty cenv.g.mk_IStructuralComparable_ty) || - (Option.isSome tcref.GeneratedHashAndEqualsWithComparerValues && typeEquiv cenv.g oty cenv.g.mk_IStructuralEquatable_ty) - isInterfaceTy cenv.g oty && not isCompare && not isStructural && not isGenericEquals + let useMethodImpl = + // REVIEW: it would be good to get rid of this special casing of Compare and GetHashCode during code generation + isInterfaceTy cenv.g oty && + (let isCompare = + Option.isSome tcref.GeneratedCompareToValues && + (typeEquiv cenv.g oty cenv.g.mk_IComparable_ty || + tyconRefEq cenv.g cenv.g.system_GenericIComparable_tcref otcref) + + not isCompare) && + + (let isGenericEquals = + Option.isSome tcref.GeneratedHashAndEqualsWithComparerValues && tyconRefEq cenv.g cenv.g.system_GenericIEquatable_tcref otcref + + not isGenericEquals) && + (let isStructural = + (Option.isSome tcref.GeneratedCompareToWithComparerValues && typeEquiv cenv.g oty cenv.g.mk_IStructuralComparable_ty) || + (Option.isSome tcref.GeneratedHashAndEqualsWithComparerValues && typeEquiv cenv.g oty cenv.g.mk_IStructuralEquatable_ty) + not isStructural) let nameOfOverridingMethod = GenNameOfOverridingMethod cenv (useMethodImpl,slotsig) - (if useMethodImpl then fixupMethodImplFlags >> renameMethodDef nameOfOverridingMethod - else fixupVirtualSlotFlags >> renameMethodDef nameOfOverridingMethod)) + if useMethodImpl then + fixupMethodImplFlags >> renameMethodDef nameOfOverridingMethod + else + fixupVirtualSlotFlags >> renameMethodDef nameOfOverridingMethod) and ComputeMethodImplAttribs cenv (_v:Val) attrs = let implflags = From bf935d56cf4df130450906f066c77eff15326f45 Mon Sep 17 00:00:00 2001 From: Don Syme Date: Thu, 11 Oct 2018 15:08:46 +0100 Subject: [PATCH 080/160] fix tests --- tests/fsharp/tests.fs | 4 ++-- tests/fsharp/typecheck/sigs/neg104b.bsl | 20 ---------------- .../sigs/{neg103b.bsl => neg113.bsl} | 16 ++++++------- .../typecheck/sigs/{neg103b.fs => neg113.fs} | 0 tests/fsharp/typecheck/sigs/neg113.vsbsl | 24 +++++++++++++++++++ tests/fsharp/typecheck/sigs/neg114.bsl | 20 ++++++++++++++++ .../typecheck/sigs/{neg104b.fs => neg114.fs} | 0 tests/fsharp/typecheck/sigs/neg114.vsbsl | 24 +++++++++++++++++++ 8 files changed, 78 insertions(+), 30 deletions(-) delete mode 100644 tests/fsharp/typecheck/sigs/neg104b.bsl rename tests/fsharp/typecheck/sigs/{neg103b.bsl => neg113.bsl} (55%) rename tests/fsharp/typecheck/sigs/{neg103b.fs => neg113.fs} (100%) create mode 100644 tests/fsharp/typecheck/sigs/neg113.vsbsl create mode 100644 tests/fsharp/typecheck/sigs/neg114.bsl rename tests/fsharp/typecheck/sigs/{neg104b.fs => neg114.fs} (100%) create mode 100644 tests/fsharp/typecheck/sigs/neg114.vsbsl diff --git a/tests/fsharp/tests.fs b/tests/fsharp/tests.fs index cddd580bce4..57f79821c5f 100644 --- a/tests/fsharp/tests.fs +++ b/tests/fsharp/tests.fs @@ -2440,10 +2440,10 @@ module TypecheckTests = let ``type check neg104`` () = singleNegTest (testConfig "typecheck/sigs") "neg104" [] - let ``type check neg103b`` () = singleNegTest (testConfig "typecheck/sigs") "neg103b" + let ``type check neg113`` () = singleNegTest (testConfig "typecheck/sigs") "neg113" [] - let ``type check neg104b`` () = singleNegTest (testConfig "typecheck/sigs") "neg104b" + let ``type check neg114`` () = singleNegTest (testConfig "typecheck/sigs") "neg114" [] let ``type check neg_anon_1`` () = singleNegTest (testConfig "typecheck/sigs") "neg_anon_1" diff --git a/tests/fsharp/typecheck/sigs/neg104b.bsl b/tests/fsharp/typecheck/sigs/neg104b.bsl deleted file mode 100644 index 8a5f0f96195..00000000000 --- a/tests/fsharp/typecheck/sigs/neg104b.bsl +++ /dev/null @@ -1,20 +0,0 @@ - -neg104b.fs(6,38,6,39): parse error FS0010: Unexpected symbol '}' in binding. Expected '|}' or other token. - -neg104b.fs(6,29,6,31): parse error FS0605: Unmatched '{|' - -neg104b.fs(8,5,8,8): parse error FS0058: Possible incorrect indentation: this token is offside of context started at position (6:29). Try indenting this token further or using standard formatting conventions. - -neg104b.fs(10,5,10,9): parse error FS0058: Possible incorrect indentation: this token is offside of context started at position (8:5). Try indenting this token further or using standard formatting conventions. - -neg104b.fs(10,5,10,9): parse error FS0010: Unexpected keyword 'type' in binding. Expected incomplete structured construct at or before this point or other token. - -neg104b.fs(6,5,6,8): parse error FS3118: Incomplete value or function definition. If this is in an expression, the body of the expression must be indented to the same column as the 'let' keyword. - -neg104b.fs(10,25,10,26): parse error FS0010: Unexpected symbol '}' in type definition. Expected '|}' or other token. - -neg104b.fs(10,14,10,16): parse error FS0605: Unmatched '{|' - -neg104b.fs(12,5,12,8): parse error FS0058: Possible incorrect indentation: this token is offside of context started at position (10:14). Try indenting this token further or using standard formatting conventions. - -neg104b.fs(14,1,14,1): parse error FS0010: Incomplete structured construct at or before this point in implementation file \ No newline at end of file diff --git a/tests/fsharp/typecheck/sigs/neg103b.bsl b/tests/fsharp/typecheck/sigs/neg113.bsl similarity index 55% rename from tests/fsharp/typecheck/sigs/neg103b.bsl rename to tests/fsharp/typecheck/sigs/neg113.bsl index 6c67abf0a6e..211ba670f91 100644 --- a/tests/fsharp/typecheck/sigs/neg103b.bsl +++ b/tests/fsharp/typecheck/sigs/neg113.bsl @@ -1,24 +1,24 @@ -neg103.fs(5,50,5,61): typecheck error FS0001: Two anonymous record types have mismatched sets of field names '["a"; "b"]' and '["a"]' +neg113.fs(5,50,5,61): typecheck error FS0001: Two anonymous record types have mismatched sets of field names '["a"; "b"]' and '["a"]' -neg103.fs(7,41,7,52): typecheck error FS0001: Two anonymous record types have mismatched sets of field names '["b"]' and '["a"]' +neg113.fs(7,41,7,52): typecheck error FS0001: Two anonymous record types have mismatched sets of field names '["b"]' and '["a"]' -neg103.fs(10,27,10,55): typecheck error FS0059: The type '{|a : int|}' does not have any proper subtypes and need not be used as the target of a static coercion +neg113.fs(10,27,10,55): typecheck error FS0059: The type '{|a : int|}' does not have any proper subtypes and need not be used as the target of a static coercion -neg103.fs(10,27,10,55): typecheck error FS0193: Type constraint mismatch. The type +neg113.fs(10,27,10,55): typecheck error FS0193: Type constraint mismatch. The type '{|b : int|}' is not compatible with type '{|a : int|}' -neg103.fs(13,27,13,62): typecheck error FS0059: The type '{|a : int|}' does not have any proper subtypes and need not be used as the target of a static coercion +neg113.fs(13,27,13,62): typecheck error FS0059: The type '{|a : int|}' does not have any proper subtypes and need not be used as the target of a static coercion -neg103.fs(13,27,13,62): typecheck error FS0193: Type constraint mismatch. The type +neg113.fs(13,27,13,62): typecheck error FS0193: Type constraint mismatch. The type '{|a : int ; b : int|}' is not compatible with type '{|a : int|}' -neg103.fs(18,34,18,36): typecheck error FS0001: The type '('a -> 'a)' does not support the 'comparison' constraint. For example, it does not support the 'System.IComparable' interface +neg113.fs(18,34,18,36): typecheck error FS0001: The type '('a -> 'a)' does not support the 'comparison' constraint. For example, it does not support the 'System.IComparable' interface -neg103.fs(20,42,20,44): typecheck error FS0001: The type '('a -> 'a)' does not support the 'comparison' constraint. For example, it does not support the 'System.IComparable' interface \ No newline at end of file +neg113.fs(20,42,20,44): typecheck error FS0001: The type '('a -> 'a)' does not support the 'comparison' constraint. For example, it does not support the 'System.IComparable' interface diff --git a/tests/fsharp/typecheck/sigs/neg103b.fs b/tests/fsharp/typecheck/sigs/neg113.fs similarity index 100% rename from tests/fsharp/typecheck/sigs/neg103b.fs rename to tests/fsharp/typecheck/sigs/neg113.fs diff --git a/tests/fsharp/typecheck/sigs/neg113.vsbsl b/tests/fsharp/typecheck/sigs/neg113.vsbsl new file mode 100644 index 00000000000..211ba670f91 --- /dev/null +++ b/tests/fsharp/typecheck/sigs/neg113.vsbsl @@ -0,0 +1,24 @@ + +neg113.fs(5,50,5,61): typecheck error FS0001: Two anonymous record types have mismatched sets of field names '["a"; "b"]' and '["a"]' + +neg113.fs(7,41,7,52): typecheck error FS0001: Two anonymous record types have mismatched sets of field names '["b"]' and '["a"]' + +neg113.fs(10,27,10,55): typecheck error FS0059: The type '{|a : int|}' does not have any proper subtypes and need not be used as the target of a static coercion + +neg113.fs(10,27,10,55): typecheck error FS0193: Type constraint mismatch. The type + '{|b : int|}' +is not compatible with type + '{|a : int|}' + + +neg113.fs(13,27,13,62): typecheck error FS0059: The type '{|a : int|}' does not have any proper subtypes and need not be used as the target of a static coercion + +neg113.fs(13,27,13,62): typecheck error FS0193: Type constraint mismatch. The type + '{|a : int ; b : int|}' +is not compatible with type + '{|a : int|}' + + +neg113.fs(18,34,18,36): typecheck error FS0001: The type '('a -> 'a)' does not support the 'comparison' constraint. For example, it does not support the 'System.IComparable' interface + +neg113.fs(20,42,20,44): typecheck error FS0001: The type '('a -> 'a)' does not support the 'comparison' constraint. For example, it does not support the 'System.IComparable' interface diff --git a/tests/fsharp/typecheck/sigs/neg114.bsl b/tests/fsharp/typecheck/sigs/neg114.bsl new file mode 100644 index 00000000000..f69db960676 --- /dev/null +++ b/tests/fsharp/typecheck/sigs/neg114.bsl @@ -0,0 +1,20 @@ + +neg114.fs(6,38,6,39): parse error FS0010: Unexpected symbol '}' in binding. Expected '|}' or other token. + +neg114.fs(6,29,6,31): parse error FS0605: Unmatched '{|' + +neg114.fs(8,5,8,8): parse error FS0058: Possible incorrect indentation: this token is offside of context started at position (6:29). Try indenting this token further or using standard formatting conventions. + +neg114.fs(10,5,10,9): parse error FS0058: Possible incorrect indentation: this token is offside of context started at position (8:5). Try indenting this token further or using standard formatting conventions. + +neg114.fs(10,5,10,9): parse error FS0010: Unexpected keyword 'type' in binding. Expected incomplete structured construct at or before this point or other token. + +neg114.fs(6,5,6,8): parse error FS3118: Incomplete value or function definition. If this is in an expression, the body of the expression must be indented to the same column as the 'let' keyword. + +neg114.fs(10,25,10,26): parse error FS0010: Unexpected symbol '}' in type definition. Expected '|}' or other token. + +neg114.fs(10,14,10,16): parse error FS0605: Unmatched '{|' + +neg114.fs(12,5,12,8): parse error FS0058: Possible incorrect indentation: this token is offside of context started at position (10:14). Try indenting this token further or using standard formatting conventions. + +neg114.fs(13,1,13,1): parse error FS0010: Incomplete structured construct at or before this point in implementation file diff --git a/tests/fsharp/typecheck/sigs/neg104b.fs b/tests/fsharp/typecheck/sigs/neg114.fs similarity index 100% rename from tests/fsharp/typecheck/sigs/neg104b.fs rename to tests/fsharp/typecheck/sigs/neg114.fs diff --git a/tests/fsharp/typecheck/sigs/neg114.vsbsl b/tests/fsharp/typecheck/sigs/neg114.vsbsl new file mode 100644 index 00000000000..1573127e3b5 --- /dev/null +++ b/tests/fsharp/typecheck/sigs/neg114.vsbsl @@ -0,0 +1,24 @@ + +neg114.fs(6,38,6,39): parse error FS0010: Unexpected symbol '}' in binding. Expected '|}' or other token. + +neg114.fs(6,29,6,31): parse error FS0605: Unmatched '{|' + +neg114.fs(8,5,8,8): parse error FS0058: Possible incorrect indentation: this token is offside of context started at position (6:29). Try indenting this token further or using standard formatting conventions. + +neg114.fs(10,5,10,9): parse error FS0058: Possible incorrect indentation: this token is offside of context started at position (8:5). Try indenting this token further or using standard formatting conventions. + +neg114.fs(10,5,10,9): parse error FS0010: Unexpected keyword 'type' in binding. Expected incomplete structured construct at or before this point or other token. + +neg114.fs(6,5,6,8): parse error FS3118: Incomplete value or function definition. If this is in an expression, the body of the expression must be indented to the same column as the 'let' keyword. + +neg114.fs(10,25,10,26): parse error FS0010: Unexpected symbol '}' in type definition. Expected '|}' or other token. + +neg114.fs(10,14,10,16): parse error FS0605: Unmatched '{|' + +neg114.fs(12,5,12,8): parse error FS0058: Possible incorrect indentation: this token is offside of context started at position (10:14). Try indenting this token further or using standard formatting conventions. + +neg114.fs(13,1,13,1): parse error FS0010: Incomplete structured construct at or before this point in implementation file + +neg114.fs(10,10,10,11): typecheck error FS0964: Type abbreviations cannot have augmentations + +neg114.fs(12,5,12,27): typecheck error FS0912: This declaration element is not permitted in an augmentation From 836d7d2737ee4e6f53bbc4a113d5dc9a503727ac Mon Sep 17 00:00:00 2001 From: Don Syme Date: Fri, 12 Oct 2018 12:05:36 +0100 Subject: [PATCH 081/160] update FSharp.Core dependency --- .../FSharp.Compiler.Service.MSBuild.v12.fsproj | 2 +- .../FSharp.Compiler.Service.ProjectCracker.fsproj | 2 +- .../FSharp.Compiler.Service.ProjectCrackerTool.fsproj | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/fcs/FSharp.Compiler.Service.MSBuild.v12/FSharp.Compiler.Service.MSBuild.v12.fsproj b/fcs/FSharp.Compiler.Service.MSBuild.v12/FSharp.Compiler.Service.MSBuild.v12.fsproj index 8128ab15731..32a0b6812d7 100644 --- a/fcs/FSharp.Compiler.Service.MSBuild.v12/FSharp.Compiler.Service.MSBuild.v12.fsproj +++ b/fcs/FSharp.Compiler.Service.MSBuild.v12/FSharp.Compiler.Service.MSBuild.v12.fsproj @@ -29,7 +29,7 @@ - + $(FSharpSourcesRoot)\..\fcs\dependencies\MSBuild.v12.0\Microsoft.Build.Framework.dll diff --git a/fcs/FSharp.Compiler.Service.ProjectCracker/FSharp.Compiler.Service.ProjectCracker.fsproj b/fcs/FSharp.Compiler.Service.ProjectCracker/FSharp.Compiler.Service.ProjectCracker.fsproj index 86296dcea04..1bf41b7bf27 100644 --- a/fcs/FSharp.Compiler.Service.ProjectCracker/FSharp.Compiler.Service.ProjectCracker.fsproj +++ b/fcs/FSharp.Compiler.Service.ProjectCracker/FSharp.Compiler.Service.ProjectCracker.fsproj @@ -31,7 +31,7 @@ - + \ No newline at end of file diff --git a/fcs/FSharp.Compiler.Service.ProjectCrackerTool/FSharp.Compiler.Service.ProjectCrackerTool.fsproj b/fcs/FSharp.Compiler.Service.ProjectCrackerTool/FSharp.Compiler.Service.ProjectCrackerTool.fsproj index d7f29459dee..cd0768f8da7 100644 --- a/fcs/FSharp.Compiler.Service.ProjectCrackerTool/FSharp.Compiler.Service.ProjectCrackerTool.fsproj +++ b/fcs/FSharp.Compiler.Service.ProjectCrackerTool/FSharp.Compiler.Service.ProjectCrackerTool.fsproj @@ -28,7 +28,7 @@ $(FSharpSourcesRoot)\..\packages\Microsoft.Portable.FSharp.Core.$(FSharpCoreFrozenPortablePackageVersion)\lib\profiles\net40\FSharp.Core.dll false - + $(FSharpSourcesRoot)\..\fcs\dependencies\MSBuild.v12.0\Microsoft.Build.Framework.dll false From 39fd7b8216d9242213577070d7892c148bb9994e Mon Sep 17 00:00:00 2001 From: Steffen Forkmann Date: Mon, 15 Oct 2018 22:40:14 +0200 Subject: [PATCH 082/160] Remove one "impossible" error (#5746) * Remove one "impossible" error - fixes #5745 * Fix tests * Add test for #5745 * Fix "build from source" --- .../FSharp.Compiler.Private/FSComp.fs | 9 ++++++ .../FSharp.Compiler.Private/FSComp.resx | 11 ++++++- src/fsharp/FSComp.txt | 5 ++- src/fsharp/TypeChecker.fs | 31 +++++++++++-------- src/fsharp/xlf/FSComp.txt.cs.xlf | 19 ++++++++++-- src/fsharp/xlf/FSComp.txt.de.xlf | 19 ++++++++++-- src/fsharp/xlf/FSComp.txt.en.xlf | 19 ++++++++++-- src/fsharp/xlf/FSComp.txt.es.xlf | 19 ++++++++++-- src/fsharp/xlf/FSComp.txt.fr.xlf | 19 ++++++++++-- src/fsharp/xlf/FSComp.txt.it.xlf | 19 ++++++++++-- src/fsharp/xlf/FSComp.txt.ja.xlf | 19 ++++++++++-- src/fsharp/xlf/FSComp.txt.ko.xlf | 19 ++++++++++-- src/fsharp/xlf/FSComp.txt.pl.xlf | 19 ++++++++++-- src/fsharp/xlf/FSComp.txt.pt-BR.xlf | 19 ++++++++++-- src/fsharp/xlf/FSComp.txt.ru.xlf | 19 ++++++++++-- src/fsharp/xlf/FSComp.txt.tr.xlf | 19 ++++++++++-- src/fsharp/xlf/FSComp.txt.zh-Hans.xlf | 19 ++++++++++-- src/fsharp/xlf/FSComp.txt.zh-Hant.xlf | 19 ++++++++++-- .../E_ExnConstructorBadFieldName.fs | 4 +-- .../E_UnionConstructorBadFieldName.fs | 6 ++-- .../Named/E_ActivePatternHasNoFields.fs | 13 ++++++++ .../Conformance/PatternMatching/Named/env.lst | 1 + 22 files changed, 298 insertions(+), 48 deletions(-) create mode 100644 tests/fsharpqa/Source/Conformance/PatternMatching/Named/E_ActivePatternHasNoFields.fs diff --git a/src/buildfromsource/FSharp.Compiler.Private/FSComp.fs b/src/buildfromsource/FSharp.Compiler.Private/FSComp.fs index f6fc5a409ea..c6341838189 100644 --- a/src/buildfromsource/FSharp.Compiler.Private/FSComp.fs +++ b/src/buildfromsource/FSharp.Compiler.Private/FSComp.fs @@ -3916,6 +3916,15 @@ type internal SR private() = /// Union case/exception '%s' does not have field named '%s'. /// (Originally from ..\FSComp.txt:1296) static member tcUnionCaseConstructorDoesNotHaveFieldWithGivenName(a0 : System.String, a1 : System.String) = (3174, GetStringFunc("tcUnionCaseConstructorDoesNotHaveFieldWithGivenName",",,,%s,,,%s,,,") a0 a1) + /// The exception '%s' does not have a field named '%s'. + /// (Originally from ..\FSComp.txt:1297) + static member tcExceptionConstructorDoesNotHaveFieldWithGivenName(a0 : System.String, a1 : System.String) = (3174, GetStringFunc("tcExceptionConstructorDoesNotHaveFieldWithGivenName",",,,%s,,,%s,,,") a0 a1) + /// Active patterns do not have fields. This syntax is invalid. + /// (Originally from ..\FSComp.txt:1298) + static member tcActivePatternsDoNotHaveFields() = (3174, GetStringFunc("tcActivePatternsDoNotHaveFields",",,,") ) + /// The constructor does not have a field named '%s'. + /// (Originally from ..\FSComp.txt:1299) + static member tcConstructorDoesNotHaveFieldWithGivenName(a0 : System.String) = (3174, GetStringFunc("tcConstructorDoesNotHaveFieldWithGivenName",",,,%s,,,") a0) /// Union case/exception field '%s' cannot be used more than once. /// (Originally from ..\FSComp.txt:1297) static member tcUnionCaseFieldCannotBeUsedMoreThanOnce(a0 : System.String) = (3175, GetStringFunc("tcUnionCaseFieldCannotBeUsedMoreThanOnce",",,,%s,,,") a0) diff --git a/src/buildfromsource/FSharp.Compiler.Private/FSComp.resx b/src/buildfromsource/FSharp.Compiler.Private/FSComp.resx index a56052a1e9d..c34fee949bd 100644 --- a/src/buildfromsource/FSharp.Compiler.Private/FSComp.resx +++ b/src/buildfromsource/FSharp.Compiler.Private/FSComp.resx @@ -3916,7 +3916,16 @@ Array method '{0}' is supplied by the runtime and cannot be directly used in code. For operations with array elements consider using family of GetArray/SetArray functions from LanguagePrimitives.IntrinsicFunctions module. - Union case/exception '{0}' does not have field named '{1}'. + The union case '{0}' does not have a field named '{1}'. + + + The exception '{0}' does not have a field named '{1}'. + + + Active patterns do not have fields. This syntax is invalid. + + + The constructor does not have a field named '{0}'. Union case/exception field '{0}' cannot be used more than once. diff --git a/src/fsharp/FSComp.txt b/src/fsharp/FSComp.txt index b8b72353118..a3f5f82d0ea 100644 --- a/src/fsharp/FSComp.txt +++ b/src/fsharp/FSComp.txt @@ -1293,7 +1293,10 @@ descriptionUnavailable,"(description unavailable...)" 3171,tcGeneratedTypesShouldBeInternalOrPrivate,"The provided types generated by this use of a type provider may not be used from other F# assemblies and should be marked internal or private. Consider using 'type internal TypeName = ...' or 'type private TypeName = ...'." 3172,chkGetterAndSetterHaveSamePropertyType,"A property's getter and setter must have the same type. Property '%s' has getter of type '%s' but setter of type '%s'." 3173,tcRuntimeSuppliedMethodCannotBeUsedInUserCode,"Array method '%s' is supplied by the runtime and cannot be directly used in code. For operations with array elements consider using family of GetArray/SetArray functions from LanguagePrimitives.IntrinsicFunctions module." -3174,tcUnionCaseConstructorDoesNotHaveFieldWithGivenName,"Union case/exception '%s' does not have field named '%s'." +3174,tcUnionCaseConstructorDoesNotHaveFieldWithGivenName,"The union case '%s' does not have a field named '%s'." +3174,tcExceptionConstructorDoesNotHaveFieldWithGivenName,"The exception '%s' does not have a field named '%s'." +3174,tcActivePatternsDoNotHaveFields,"Active patterns do not have fields. This syntax is invalid." +3174,tcConstructorDoesNotHaveFieldWithGivenName,"The constructor does not have a field named '%s'." 3175,tcUnionCaseFieldCannotBeUsedMoreThanOnce,"Union case/exception field '%s' cannot be used more than once." 3176,tcFieldNameIsUsedModeThanOnce,"Named field '%s' is used more than once." 3176,tcFieldNameConflictsWithGeneratedNameForAnonymousField,"Named field '%s' conflicts with autogenerated name for anonymous field." diff --git a/src/fsharp/TypeChecker.fs b/src/fsharp/TypeChecker.fs index 7f5d834a519..c558602ffa9 100755 --- a/src/fsharp/TypeChecker.fs +++ b/src/fsharp/TypeChecker.fs @@ -5316,12 +5316,14 @@ and TcPat warnOnUpper cenv env topValInfo vFlags (tpenv, names, takenNames) ty p for (id, pat) in pairs do match argNames |> List.tryFindIndex (fun id2 -> id.idText = id2.idText) with | None -> - let caseName = - match item with - | Item.UnionCase(uci, _) -> uci.Name - | Item.ExnCase tcref -> tcref.DisplayName - | _ -> failwith "impossible" - error(Error(FSComp.SR.tcUnionCaseConstructorDoesNotHaveFieldWithGivenName(caseName, id.idText), id.idRange)) + match item with + | Item.UnionCase(uci, _) -> + error(Error(FSComp.SR.tcUnionCaseConstructorDoesNotHaveFieldWithGivenName(uci.Name, id.idText), id.idRange)) + | Item.ExnCase tcref -> + error(Error(FSComp.SR.tcExceptionConstructorDoesNotHaveFieldWithGivenName(tcref.DisplayName, id.idText), id.idRange)) + | _ -> + error(Error(FSComp.SR.tcConstructorDoesNotHaveFieldWithGivenName(id.idText), id.idRange)) + | Some idx -> match box result.[idx] with | null -> @@ -8644,13 +8646,16 @@ and TcItemThen cenv overallTy env tpenv (item, mItem, rest, afterResolution) del assert (isNull(box fittedArgs.[currentIndex])) fittedArgs.[currentIndex] <- List.item currentIndex args // grab original argument, not item from the list of named parameters currentIndex <- currentIndex + 1 - else - let caseName = - match item with - | Item.UnionCase(uci, _) -> uci.Name - | Item.ExnCase tcref -> tcref.DisplayName - | _ -> failwith "impossible" - error(Error(FSComp.SR.tcUnionCaseConstructorDoesNotHaveFieldWithGivenName(caseName, id.idText), id.idRange)) + else + match item with + | Item.UnionCase(uci, _) -> + error(Error(FSComp.SR.tcUnionCaseConstructorDoesNotHaveFieldWithGivenName(uci.Name, id.idText), id.idRange)) + | Item.ExnCase tcref -> + error(Error(FSComp.SR.tcExceptionConstructorDoesNotHaveFieldWithGivenName(tcref.DisplayName, id.idText), id.idRange)) + | Item.ActivePatternResult(_,_,_,_) -> + error(Error(FSComp.SR.tcActivePatternsDoNotHaveFields(), id.idRange)) + | _ -> + error(Error(FSComp.SR.tcConstructorDoesNotHaveFieldWithGivenName(id.idText), id.idRange)) assert (Seq.forall (box >> ((<>) null) ) fittedArgs) List.ofArray fittedArgs diff --git a/src/fsharp/xlf/FSComp.txt.cs.xlf b/src/fsharp/xlf/FSComp.txt.cs.xlf index 05d6ee76c54..1c840d2c66e 100644 --- a/src/fsharp/xlf/FSComp.txt.cs.xlf +++ b/src/fsharp/xlf/FSComp.txt.cs.xlf @@ -6328,8 +6328,8 @@ - Union case/exception '{0}' does not have field named '{1}'. - Výjimka nebo případ typu union {0} nemá pole s názvem {1}. + The union case '{0}' does not have a field named '{1}'. + Výjimka nebo případ typu union {0} nemá pole s názvem {1}. @@ -7067,6 +7067,21 @@ This type does not inherit Attribute, it will not work correctly with other .NET languages. + + The exception '{0}' does not have a field named '{1}'. + The exception '{0}' does not have a field named '{1}'. + + + + The constructor does not have a field named '{0}'. + The constructor does not have a field named '{0}'. + + + + Active patterns do not have fields. This syntax is invalid. + Active patterns do not have fields. This syntax is invalid. + + \ No newline at end of file diff --git a/src/fsharp/xlf/FSComp.txt.de.xlf b/src/fsharp/xlf/FSComp.txt.de.xlf index fdce970796c..cd09b539e4b 100644 --- a/src/fsharp/xlf/FSComp.txt.de.xlf +++ b/src/fsharp/xlf/FSComp.txt.de.xlf @@ -6328,8 +6328,8 @@ - Union case/exception '{0}' does not have field named '{1}'. - Union-Fall/Ausnahme '{0}' verfügt nicht über ein Feld mit dem Namen '{1}'. + The union case '{0}' does not have a field named '{1}'. + Union-Fall/Ausnahme '{0}' verfügt nicht über ein Feld mit dem Namen '{1}'. @@ -7067,6 +7067,21 @@ This type does not inherit Attribute, it will not work correctly with other .NET languages. + + The exception '{0}' does not have a field named '{1}'. + The exception '{0}' does not have a field named '{1}'. + + + + The constructor does not have a field named '{0}'. + The constructor does not have a field named '{0}'. + + + + Active patterns do not have fields. This syntax is invalid. + Active patterns do not have fields. This syntax is invalid. + + \ No newline at end of file diff --git a/src/fsharp/xlf/FSComp.txt.en.xlf b/src/fsharp/xlf/FSComp.txt.en.xlf index c56232af4bd..69e90b775be 100644 --- a/src/fsharp/xlf/FSComp.txt.en.xlf +++ b/src/fsharp/xlf/FSComp.txt.en.xlf @@ -6328,8 +6328,8 @@ - Union case/exception '{0}' does not have field named '{1}'. - Union case/exception '{0}' does not have field named '{1}'. + The union case '{0}' does not have a field named '{1}'. + The union case '{0}' does not have a field named '{1}'. @@ -7067,6 +7067,21 @@ This type does not inherit Attribute, it will not work correctly with other .NET languages. + + The exception '{0}' does not have a field named '{1}'. + The exception '{0}' does not have a field named '{1}'. + + + + The constructor does not have a field named '{0}'. + The constructor does not have a field named '{0}'. + + + + Active patterns do not have fields. This syntax is invalid. + Active patterns do not have fields. This syntax is invalid. + + \ No newline at end of file diff --git a/src/fsharp/xlf/FSComp.txt.es.xlf b/src/fsharp/xlf/FSComp.txt.es.xlf index c6a73702da9..cab140a050a 100644 --- a/src/fsharp/xlf/FSComp.txt.es.xlf +++ b/src/fsharp/xlf/FSComp.txt.es.xlf @@ -6328,8 +6328,8 @@ - Union case/exception '{0}' does not have field named '{1}'. - La excepción o el caso de unión '{0}' no tiene un campo denominado '{1}'. + The union case '{0}' does not have a field named '{1}'. + La excepción o el caso de unión '{0}' no tiene un campo denominado '{1}'. @@ -7067,6 +7067,21 @@ This type does not inherit Attribute, it will not work correctly with other .NET languages. + + The exception '{0}' does not have a field named '{1}'. + The exception '{0}' does not have a field named '{1}'. + + + + The constructor does not have a field named '{0}'. + The constructor does not have a field named '{0}'. + + + + Active patterns do not have fields. This syntax is invalid. + Active patterns do not have fields. This syntax is invalid. + + \ No newline at end of file diff --git a/src/fsharp/xlf/FSComp.txt.fr.xlf b/src/fsharp/xlf/FSComp.txt.fr.xlf index f78d170be49..0ef363d31e4 100644 --- a/src/fsharp/xlf/FSComp.txt.fr.xlf +++ b/src/fsharp/xlf/FSComp.txt.fr.xlf @@ -6328,8 +6328,8 @@ - Union case/exception '{0}' does not have field named '{1}'. - Le cas ou l'exception d'union '{0}' ne possède pas de champ nommé '{1}'. + The union case '{0}' does not have a field named '{1}'. + Le cas ou l'exception d'union '{0}' ne possède pas de champ nommé '{1}'. @@ -7067,6 +7067,21 @@ This type does not inherit Attribute, it will not work correctly with other .NET languages. + + The exception '{0}' does not have a field named '{1}'. + The exception '{0}' does not have a field named '{1}'. + + + + The constructor does not have a field named '{0}'. + The constructor does not have a field named '{0}'. + + + + Active patterns do not have fields. This syntax is invalid. + Active patterns do not have fields. This syntax is invalid. + + \ No newline at end of file diff --git a/src/fsharp/xlf/FSComp.txt.it.xlf b/src/fsharp/xlf/FSComp.txt.it.xlf index 5a499b9e702..5c224442175 100644 --- a/src/fsharp/xlf/FSComp.txt.it.xlf +++ b/src/fsharp/xlf/FSComp.txt.it.xlf @@ -6328,8 +6328,8 @@ - Union case/exception '{0}' does not have field named '{1}'. - Il case di unione/eccezione '{0}' non contiene il campo denominato '{1}'. + The union case '{0}' does not have a field named '{1}'. + Il case di unione/eccezione '{0}' non contiene il campo denominato '{1}'. @@ -7067,6 +7067,21 @@ This type does not inherit Attribute, it will not work correctly with other .NET languages. + + The exception '{0}' does not have a field named '{1}'. + The exception '{0}' does not have a field named '{1}'. + + + + The constructor does not have a field named '{0}'. + The constructor does not have a field named '{0}'. + + + + Active patterns do not have fields. This syntax is invalid. + Active patterns do not have fields. This syntax is invalid. + + \ No newline at end of file diff --git a/src/fsharp/xlf/FSComp.txt.ja.xlf b/src/fsharp/xlf/FSComp.txt.ja.xlf index 782c0613974..168cd7d6efb 100644 --- a/src/fsharp/xlf/FSComp.txt.ja.xlf +++ b/src/fsharp/xlf/FSComp.txt.ja.xlf @@ -6328,8 +6328,8 @@ - Union case/exception '{0}' does not have field named '{1}'. - 共用体ケース/例外 '{0}' には、'{1}' という名前のフィールドがありません。 + The union case '{0}' does not have a field named '{1}'. + 共用体ケース/例外 '{0}' には、'{1}' という名前のフィールドがありません。 @@ -7067,6 +7067,21 @@ This type does not inherit Attribute, it will not work correctly with other .NET languages. + + The exception '{0}' does not have a field named '{1}'. + The exception '{0}' does not have a field named '{1}'. + + + + The constructor does not have a field named '{0}'. + The constructor does not have a field named '{0}'. + + + + Active patterns do not have fields. This syntax is invalid. + Active patterns do not have fields. This syntax is invalid. + + \ No newline at end of file diff --git a/src/fsharp/xlf/FSComp.txt.ko.xlf b/src/fsharp/xlf/FSComp.txt.ko.xlf index e00fdb729bd..3dd8fa16415 100644 --- a/src/fsharp/xlf/FSComp.txt.ko.xlf +++ b/src/fsharp/xlf/FSComp.txt.ko.xlf @@ -6328,8 +6328,8 @@ - Union case/exception '{0}' does not have field named '{1}'. - 공용 구조체 케이스/예외 '{0}'에 이름이 '{1}'인 필드가 없습니다. + The union case '{0}' does not have a field named '{1}'. + 공용 구조체 케이스/예외 '{0}'에 이름이 '{1}'인 필드가 없습니다. @@ -7067,6 +7067,21 @@ This type does not inherit Attribute, it will not work correctly with other .NET languages. + + The exception '{0}' does not have a field named '{1}'. + The exception '{0}' does not have a field named '{1}'. + + + + The constructor does not have a field named '{0}'. + The constructor does not have a field named '{0}'. + + + + Active patterns do not have fields. This syntax is invalid. + Active patterns do not have fields. This syntax is invalid. + + \ No newline at end of file diff --git a/src/fsharp/xlf/FSComp.txt.pl.xlf b/src/fsharp/xlf/FSComp.txt.pl.xlf index c07c9316f30..a2e4ad8a2b5 100644 --- a/src/fsharp/xlf/FSComp.txt.pl.xlf +++ b/src/fsharp/xlf/FSComp.txt.pl.xlf @@ -6328,8 +6328,8 @@ - Union case/exception '{0}' does not have field named '{1}'. - Przypadek unii/wyjątek „{0}” nie ma pola o nazwie „{1}”. + The union case '{0}' does not have a field named '{1}'. + Przypadek unii/wyjątek „{0}” nie ma pola o nazwie „{1}”. @@ -7067,6 +7067,21 @@ This type does not inherit Attribute, it will not work correctly with other .NET languages. + + The exception '{0}' does not have a field named '{1}'. + The exception '{0}' does not have a field named '{1}'. + + + + The constructor does not have a field named '{0}'. + The constructor does not have a field named '{0}'. + + + + Active patterns do not have fields. This syntax is invalid. + Active patterns do not have fields. This syntax is invalid. + + \ No newline at end of file diff --git a/src/fsharp/xlf/FSComp.txt.pt-BR.xlf b/src/fsharp/xlf/FSComp.txt.pt-BR.xlf index 8956263b4da..b81572e3a73 100644 --- a/src/fsharp/xlf/FSComp.txt.pt-BR.xlf +++ b/src/fsharp/xlf/FSComp.txt.pt-BR.xlf @@ -6328,8 +6328,8 @@ - Union case/exception '{0}' does not have field named '{1}'. - O caso união/exceção '{0}' não possui um campo chamado '{1}'. + The union case '{0}' does not have a field named '{1}'. + O caso união/exceção '{0}' não possui um campo chamado '{1}'. @@ -7067,6 +7067,21 @@ This type does not inherit Attribute, it will not work correctly with other .NET languages. + + The exception '{0}' does not have a field named '{1}'. + The exception '{0}' does not have a field named '{1}'. + + + + The constructor does not have a field named '{0}'. + The constructor does not have a field named '{0}'. + + + + Active patterns do not have fields. This syntax is invalid. + Active patterns do not have fields. This syntax is invalid. + + \ No newline at end of file diff --git a/src/fsharp/xlf/FSComp.txt.ru.xlf b/src/fsharp/xlf/FSComp.txt.ru.xlf index b658c0ec23f..e3b2d9f4b51 100644 --- a/src/fsharp/xlf/FSComp.txt.ru.xlf +++ b/src/fsharp/xlf/FSComp.txt.ru.xlf @@ -6328,8 +6328,8 @@ - Union case/exception '{0}' does not have field named '{1}'. - Ветвь объединения/исключение "{0}" не содержит поля с именем "{1}". + The union case '{0}' does not have a field named '{1}'. + Ветвь объединения/исключение "{0}" не содержит поля с именем "{1}". @@ -7067,6 +7067,21 @@ This type does not inherit Attribute, it will not work correctly with other .NET languages. + + The exception '{0}' does not have a field named '{1}'. + The exception '{0}' does not have a field named '{1}'. + + + + The constructor does not have a field named '{0}'. + The constructor does not have a field named '{0}'. + + + + Active patterns do not have fields. This syntax is invalid. + Active patterns do not have fields. This syntax is invalid. + + \ No newline at end of file diff --git a/src/fsharp/xlf/FSComp.txt.tr.xlf b/src/fsharp/xlf/FSComp.txt.tr.xlf index ae8e758dfd0..9c9f740dcb7 100644 --- a/src/fsharp/xlf/FSComp.txt.tr.xlf +++ b/src/fsharp/xlf/FSComp.txt.tr.xlf @@ -6328,8 +6328,8 @@ - Union case/exception '{0}' does not have field named '{1}'. - {0}' birleşim durumu/özel durumunda '{1}' adlı alan yok. + The union case '{0}' does not have a field named '{1}'. + {0}' birleşim durumu/özel durumunda '{1}' adlı alan yok. @@ -7067,6 +7067,21 @@ This type does not inherit Attribute, it will not work correctly with other .NET languages. + + The exception '{0}' does not have a field named '{1}'. + The exception '{0}' does not have a field named '{1}'. + + + + The constructor does not have a field named '{0}'. + The constructor does not have a field named '{0}'. + + + + Active patterns do not have fields. This syntax is invalid. + Active patterns do not have fields. This syntax is invalid. + + \ No newline at end of file diff --git a/src/fsharp/xlf/FSComp.txt.zh-Hans.xlf b/src/fsharp/xlf/FSComp.txt.zh-Hans.xlf index e3273d74087..180d2f95b6a 100644 --- a/src/fsharp/xlf/FSComp.txt.zh-Hans.xlf +++ b/src/fsharp/xlf/FSComp.txt.zh-Hans.xlf @@ -6328,8 +6328,8 @@ - Union case/exception '{0}' does not have field named '{1}'. - 联合用例/异常“{0}”没有名为“{1}”的字段。 + The union case '{0}' does not have a field named '{1}'. + 联合用例/异常“{0}”没有名为“{1}”的字段。 @@ -7067,6 +7067,21 @@ This type does not inherit Attribute, it will not work correctly with other .NET languages. + + The exception '{0}' does not have a field named '{1}'. + The exception '{0}' does not have a field named '{1}'. + + + + The constructor does not have a field named '{0}'. + The constructor does not have a field named '{0}'. + + + + Active patterns do not have fields. This syntax is invalid. + Active patterns do not have fields. This syntax is invalid. + + \ No newline at end of file diff --git a/src/fsharp/xlf/FSComp.txt.zh-Hant.xlf b/src/fsharp/xlf/FSComp.txt.zh-Hant.xlf index 835390456ac..6e0f7e50c20 100644 --- a/src/fsharp/xlf/FSComp.txt.zh-Hant.xlf +++ b/src/fsharp/xlf/FSComp.txt.zh-Hant.xlf @@ -6328,8 +6328,8 @@ - Union case/exception '{0}' does not have field named '{1}'. - 等位/例外狀況 '{0}' 沒有名為 '{1}' 的欄位。 + The union case '{0}' does not have a field named '{1}'. + 等位/例外狀況 '{0}' 沒有名為 '{1}' 的欄位。 @@ -7067,6 +7067,21 @@ This type does not inherit Attribute, it will not work correctly with other .NET languages. + + The exception '{0}' does not have a field named '{1}'. + The exception '{0}' does not have a field named '{1}'. + + + + The constructor does not have a field named '{0}'. + The constructor does not have a field named '{0}'. + + + + Active patterns do not have fields. This syntax is invalid. + Active patterns do not have fields. This syntax is invalid. + + \ No newline at end of file diff --git a/tests/fsharpqa/Source/Conformance/BasicTypeAndModuleDefinitions/ExceptionDefinitions/E_ExnConstructorBadFieldName.fs b/tests/fsharpqa/Source/Conformance/BasicTypeAndModuleDefinitions/ExceptionDefinitions/E_ExnConstructorBadFieldName.fs index 01e7c7fa611..640fc4a532b 100644 --- a/tests/fsharpqa/Source/Conformance/BasicTypeAndModuleDefinitions/ExceptionDefinitions/E_ExnConstructorBadFieldName.fs +++ b/tests/fsharpqa/Source/Conformance/BasicTypeAndModuleDefinitions/ExceptionDefinitions/E_ExnConstructorBadFieldName.fs @@ -1,7 +1,7 @@ // #Conformance #TypesAndModules #Exceptions // Make sure we properly detect bogus named field in constructors -//Union case/exception 'AAA' does not have field named 'V3'\. -//Union case/exception 'AAA' does not have field named 'V3'\. +//The exception 'AAA' does not have a field named 'V3'\. +//The exception 'AAA' does not have a field named 'V3'\. exception AAA of V1 : int * V2 : string diff --git a/tests/fsharpqa/Source/Conformance/BasicTypeAndModuleDefinitions/UnionTypes/E_UnionConstructorBadFieldName.fs b/tests/fsharpqa/Source/Conformance/BasicTypeAndModuleDefinitions/UnionTypes/E_UnionConstructorBadFieldName.fs index fbf8b6d278a..f9ebb74b26f 100644 --- a/tests/fsharpqa/Source/Conformance/BasicTypeAndModuleDefinitions/UnionTypes/E_UnionConstructorBadFieldName.fs +++ b/tests/fsharpqa/Source/Conformance/BasicTypeAndModuleDefinitions/UnionTypes/E_UnionConstructorBadFieldName.fs @@ -1,8 +1,8 @@ // #Conformance #TypesAndModules #Unions // Make sure we properly detect bogus named field in constructors -//Union case/exception 'Case1' does not have field named 'V3'\. -//Union case/exception 'Case1' does not have field named 'V3'\. -//Union case/exception 'Case1' does not have field named 'V4'\. +//The union case 'Case1' does not have a field named 'V3'\. +//The union case 'Case1' does not have a field named 'V3'\. +//The union case 'Case1' does not have a field named 'V4'\. type MyDU = | Case1 of V1 : int * V2 : string diff --git a/tests/fsharpqa/Source/Conformance/PatternMatching/Named/E_ActivePatternHasNoFields.fs b/tests/fsharpqa/Source/Conformance/PatternMatching/Named/E_ActivePatternHasNoFields.fs new file mode 100644 index 00000000000..09cf78bec16 --- /dev/null +++ b/tests/fsharpqa/Source/Conformance/PatternMatching/Named/E_ActivePatternHasNoFields.fs @@ -0,0 +1,13 @@ +// #Regression #Conformance #PatternMatching #ActivePatterns +// Regression test for https://github.com/Microsoft/visualfsharp/issues/5745 +//Active patterns do not have fields. This syntax is invalid\. +open System.Text.RegularExpressions + +let (|USZipPlus4Code|_|) s = + let m = Regex.Match(s, @"^(\d{5})\-(\d{4})$") + if m.Success then + USZipPlus4Code(x=m.Groups.[1].Value, + y=m.Groups.[2].Value) + |> Some + else + None diff --git a/tests/fsharpqa/Source/Conformance/PatternMatching/Named/env.lst b/tests/fsharpqa/Source/Conformance/PatternMatching/Named/env.lst index f71447b925f..63f5a897cb7 100644 --- a/tests/fsharpqa/Source/Conformance/PatternMatching/Named/env.lst +++ b/tests/fsharpqa/Source/Conformance/PatternMatching/Named/env.lst @@ -26,6 +26,7 @@ SOURCE=E_ActivePatterns01.fs # E_ActivePatterns01.fs SOURCE=E_ActivePatterns02.fs # E_ActivePatterns02.fs + SOURCE=E_ActivePatternHasNoFields.fs # E_ActivePatternHasNoFields.fs SOURCE=E_ParameterRestrictions01.fs # E_ParameterRestrictions01.fs SOURCE=MultiActivePatterns01.fs # MultiActivePatterns01.fs From a58d9e6fc5e5499d808cd833af402521c757f23a Mon Sep 17 00:00:00 2001 From: Saul Rennison Date: Wed, 17 Oct 2018 01:38:06 +0100 Subject: [PATCH 083/160] Reformat indentation on paste (#4702) * Format indentation on paste * Fix pasting when next line should be indented * Initial pass at 'Formatting' page * Add some tests * Fix tests --- build.cmd | 3 +- .../FSharp.Compiler.Private/FSComp.fs | 303 +++++++++--------- .../FSharp.Compiler.Private/FSComp.resx | 8 +- .../src/FSharp.Editor/Common/Constants.fs | 5 + .../src/FSharp.Editor/FSharp.Editor.resx | 15 +- .../Formatting/EditorFormattingService.fs | 110 ++++++- .../Formatting/IndentationService.fs | 71 ++-- .../LanguageService/LanguageService.fs | 1 + .../FSharp.Editor/Options/EditorOptions.fs | 14 + .../FSharp.Editor/xlf/FSharp.Editor.cs.xlf | 5 + .../FSharp.Editor/xlf/FSharp.Editor.de.xlf | 5 + .../FSharp.Editor/xlf/FSharp.Editor.en.xlf | 5 + .../FSharp.Editor/xlf/FSharp.Editor.es.xlf | 5 + .../FSharp.Editor/xlf/FSharp.Editor.fr.xlf | 5 + .../FSharp.Editor/xlf/FSharp.Editor.it.xlf | 5 + .../FSharp.Editor/xlf/FSharp.Editor.ja.xlf | 5 + .../FSharp.Editor/xlf/FSharp.Editor.ko.xlf | 5 + .../FSharp.Editor/xlf/FSharp.Editor.pl.xlf | 5 + .../FSharp.Editor/xlf/FSharp.Editor.pt-BR.xlf | 5 + .../FSharp.Editor/xlf/FSharp.Editor.ru.xlf | 5 + .../FSharp.Editor/xlf/FSharp.Editor.tr.xlf | 5 + .../xlf/FSharp.Editor.zh-Hans.xlf | 5 + .../xlf/FSharp.Editor.zh-Hant.xlf | 5 + .../FSharp.UIResources.csproj | 23 +- .../FormattingOptionsControl.xaml | 24 ++ .../FormattingOptionsControl.xaml.cs | 28 ++ .../FSharp.UIResources/Strings.Designer.cs | 9 + .../src/FSharp.UIResources/Strings.resx | 3 + .../src/FSharp.UIResources/xlf/Strings.cs.xlf | 5 + .../src/FSharp.UIResources/xlf/Strings.de.xlf | 5 + .../src/FSharp.UIResources/xlf/Strings.en.xlf | 5 + .../src/FSharp.UIResources/xlf/Strings.es.xlf | 5 + .../src/FSharp.UIResources/xlf/Strings.fr.xlf | 5 + .../src/FSharp.UIResources/xlf/Strings.it.xlf | 5 + .../src/FSharp.UIResources/xlf/Strings.ja.xlf | 5 + .../src/FSharp.UIResources/xlf/Strings.ko.xlf | 5 + .../src/FSharp.UIResources/xlf/Strings.pl.xlf | 5 + .../FSharp.UIResources/xlf/Strings.pt-BR.xlf | 5 + .../src/FSharp.UIResources/xlf/Strings.ru.xlf | 5 + .../src/FSharp.UIResources/xlf/Strings.tr.xlf | 5 + .../xlf/Strings.zh-Hans.xlf | 5 + .../xlf/Strings.zh-Hant.xlf | 5 + .../UnitTests/EditorFormattingServiceTests.fs | 171 +++++++++- 43 files changed, 705 insertions(+), 223 deletions(-) create mode 100644 vsintegration/src/FSharp.UIResources/FormattingOptionsControl.xaml create mode 100644 vsintegration/src/FSharp.UIResources/FormattingOptionsControl.xaml.cs diff --git a/build.cmd b/build.cmd index cc4283d19aa..dae4a3cafbf 100644 --- a/build.cmd +++ b/build.cmd @@ -633,8 +633,7 @@ goto :eof :havemsbuild set _nrswitch=/nr:false -set msbuildflags=%_nrswitch% /nologo -REM set msbuildflags=%_nrswitch% /nologo +set msbuildflags=%_nrswitch% /nologo /clp:Summary /v:minimal set _ngenexe="%SystemRoot%\Microsoft.NET\Framework\v4.0.30319\ngen.exe" if not exist %_ngenexe% echo Error: Could not find ngen.exe. && goto :failure diff --git a/src/buildfromsource/FSharp.Compiler.Private/FSComp.fs b/src/buildfromsource/FSharp.Compiler.Private/FSComp.fs index c6341838189..a41d55206bc 100644 --- a/src/buildfromsource/FSharp.Compiler.Private/FSComp.fs +++ b/src/buildfromsource/FSharp.Compiler.Private/FSComp.fs @@ -3190,10 +3190,10 @@ type internal SR private() = /// This operation accesses a mutable top-level value defined in another assembly in an unsupported way. The value cannot be accessed through its address. Consider copying the expression to a mutable local, e.g. 'let mutable x = ...', and if necessary assigning the value back after the completion of the operation /// (Originally from ..\FSComp.txt:1042) static member tastInvalidAddressOfMutableAcrossAssemblyBoundary() = (1188, GetStringFunc("tastInvalidAddressOfMutableAcrossAssemblyBoundary",",,,") ) - /// Type parameters must be placed directly adjacent to the type name, e.g. \"type C<'T>\", not type \"C <'T>\" + /// Remove spaces between the type name and type parameter, e.g. \"type C<'T>\", not type \"C <'T>\". Type parameters must be placed directly adjacent to the type name. /// (Originally from ..\FSComp.txt:1043) static member parsNonAdjacentTypars() = (1189, GetStringFunc("parsNonAdjacentTypars",",,,") ) - /// Type arguments must be placed directly adjacent to the type name, e.g. \"C<'T>\", not \"C <'T>\" + /// Remove spaces between the type name and type parameter, e.g. \"C<'T>\", not \"C <'T>\". Type parameters must be placed directly adjacent to the type name. /// (Originally from ..\FSComp.txt:1044) static member parsNonAdjacentTyargs() = (1190, GetStringFunc("parsNonAdjacentTyargs",",,,") ) /// The use of the type syntax 'int C' and 'C ' is not permitted here. Consider adjusting this type to be written in the form 'C' @@ -3913,7 +3913,7 @@ type internal SR private() = /// Array method '%s' is supplied by the runtime and cannot be directly used in code. For operations with array elements consider using family of GetArray/SetArray functions from LanguagePrimitives.IntrinsicFunctions module. /// (Originally from ..\FSComp.txt:1295) static member tcRuntimeSuppliedMethodCannotBeUsedInUserCode(a0 : System.String) = (3173, GetStringFunc("tcRuntimeSuppliedMethodCannotBeUsedInUserCode",",,,%s,,,") a0) - /// Union case/exception '%s' does not have field named '%s'. + /// The union case '%s' does not have a field named '%s'. /// (Originally from ..\FSComp.txt:1296) static member tcUnionCaseConstructorDoesNotHaveFieldWithGivenName(a0 : System.String, a1 : System.String) = (3174, GetStringFunc("tcUnionCaseConstructorDoesNotHaveFieldWithGivenName",",,,%s,,,%s,,,") a0 a1) /// The exception '%s' does not have a field named '%s'. @@ -3926,445 +3926,445 @@ type internal SR private() = /// (Originally from ..\FSComp.txt:1299) static member tcConstructorDoesNotHaveFieldWithGivenName(a0 : System.String) = (3174, GetStringFunc("tcConstructorDoesNotHaveFieldWithGivenName",",,,%s,,,") a0) /// Union case/exception field '%s' cannot be used more than once. - /// (Originally from ..\FSComp.txt:1297) + /// (Originally from ..\FSComp.txt:1300) static member tcUnionCaseFieldCannotBeUsedMoreThanOnce(a0 : System.String) = (3175, GetStringFunc("tcUnionCaseFieldCannotBeUsedMoreThanOnce",",,,%s,,,") a0) /// Named field '%s' is used more than once. - /// (Originally from ..\FSComp.txt:1298) + /// (Originally from ..\FSComp.txt:1301) static member tcFieldNameIsUsedModeThanOnce(a0 : System.String) = (3176, GetStringFunc("tcFieldNameIsUsedModeThanOnce",",,,%s,,,") a0) /// Named field '%s' conflicts with autogenerated name for anonymous field. - /// (Originally from ..\FSComp.txt:1299) + /// (Originally from ..\FSComp.txt:1302) static member tcFieldNameConflictsWithGeneratedNameForAnonymousField(a0 : System.String) = (3176, GetStringFunc("tcFieldNameConflictsWithGeneratedNameForAnonymousField",",,,%s,,,") a0) /// This literal expression or attribute argument results in an arithmetic overflow. - /// (Originally from ..\FSComp.txt:1300) + /// (Originally from ..\FSComp.txt:1303) static member tastConstantExpressionOverflow() = (3177, GetStringFunc("tastConstantExpressionOverflow",",,,") ) /// This is not valid literal expression. The [] attribute will be ignored. - /// (Originally from ..\FSComp.txt:1301) + /// (Originally from ..\FSComp.txt:1304) static member tcIllegalStructTypeForConstantExpression() = (3178, GetStringFunc("tcIllegalStructTypeForConstantExpression",",,,") ) /// System.Runtime.InteropServices assembly is required to use UnknownWrapper\DispatchWrapper classes. - /// (Originally from ..\FSComp.txt:1302) + /// (Originally from ..\FSComp.txt:1305) static member fscSystemRuntimeInteropServicesIsRequired() = (3179, GetStringFunc("fscSystemRuntimeInteropServicesIsRequired",",,,") ) /// The mutable local '%s' is implicitly allocated as a reference cell because it has been captured by a closure. This warning is for informational purposes only to indicate where implicit allocations are performed. - /// (Originally from ..\FSComp.txt:1303) + /// (Originally from ..\FSComp.txt:1306) static member abImplicitHeapAllocation(a0 : System.String) = (3180, GetStringFunc("abImplicitHeapAllocation",",,,%s,,,") a0) /// A type provider implemented GetStaticParametersForMethod, but ApplyStaticArgumentsForMethod was not implemented or invalid - /// (Originally from ..\FSComp.txt:1304) + /// (Originally from ..\FSComp.txt:1307) static member estApplyStaticArgumentsForMethodNotImplemented() = (GetStringFunc("estApplyStaticArgumentsForMethodNotImplemented",",,,") ) /// An error occured applying the static arguments to a provided method - /// (Originally from ..\FSComp.txt:1305) + /// (Originally from ..\FSComp.txt:1308) static member etErrorApplyingStaticArgumentsToMethod() = (3181, GetStringFunc("etErrorApplyingStaticArgumentsToMethod",",,,") ) /// Unexpected character '%s' in preprocessor expression - /// (Originally from ..\FSComp.txt:1306) + /// (Originally from ..\FSComp.txt:1309) static member pplexUnexpectedChar(a0 : System.String) = (3182, GetStringFunc("pplexUnexpectedChar",",,,%s,,,") a0) /// Unexpected token '%s' in preprocessor expression - /// (Originally from ..\FSComp.txt:1307) + /// (Originally from ..\FSComp.txt:1310) static member ppparsUnexpectedToken(a0 : System.String) = (3183, GetStringFunc("ppparsUnexpectedToken",",,,%s,,,") a0) /// Incomplete preprocessor expression - /// (Originally from ..\FSComp.txt:1308) + /// (Originally from ..\FSComp.txt:1311) static member ppparsIncompleteExpression() = (3184, GetStringFunc("ppparsIncompleteExpression",",,,") ) /// Missing token '%s' in preprocessor expression - /// (Originally from ..\FSComp.txt:1309) + /// (Originally from ..\FSComp.txt:1312) static member ppparsMissingToken(a0 : System.String) = (3185, GetStringFunc("ppparsMissingToken",",,,%s,,,") a0) /// An error occurred while reading the F# metadata node at position %d in table '%s' of assembly '%s'. The node had no matching declaration. Please report this warning. You may need to recompile the F# assembly you are using. - /// (Originally from ..\FSComp.txt:1310) + /// (Originally from ..\FSComp.txt:1313) static member pickleMissingDefinition(a0 : System.Int32, a1 : System.String, a2 : System.String) = (3186, GetStringFunc("pickleMissingDefinition",",,,%d,,,%s,,,%s,,,") a0 a1 a2) /// Type inference caused the type variable %s to escape its scope. Consider adding an explicit type parameter declaration or adjusting your code to be less generic. - /// (Originally from ..\FSComp.txt:1311) + /// (Originally from ..\FSComp.txt:1314) static member checkNotSufficientlyGenericBecauseOfScope(a0 : System.String) = (3187, GetStringFunc("checkNotSufficientlyGenericBecauseOfScope",",,,%s,,,") a0) /// Type inference caused an inference type variable to escape its scope. Consider adding type annotations to make your code less generic. - /// (Originally from ..\FSComp.txt:1312) + /// (Originally from ..\FSComp.txt:1315) static member checkNotSufficientlyGenericBecauseOfScopeAnon() = (3188, GetStringFunc("checkNotSufficientlyGenericBecauseOfScopeAnon",",,,") ) /// Redundant arguments are being ignored in function '%s'. Expected %d but got %d arguments. - /// (Originally from ..\FSComp.txt:1313) + /// (Originally from ..\FSComp.txt:1316) static member checkRaiseFamilyFunctionArgumentCount(a0 : System.String, a1 : System.Int32, a2 : System.Int32) = (3189, GetStringFunc("checkRaiseFamilyFunctionArgumentCount",",,,%s,,,%d,,,%d,,,") a0 a1 a2) /// Lowercase literal '%s' is being shadowed by a new pattern with the same name. Only uppercase and module-prefixed literals can be used as named patterns. - /// (Originally from ..\FSComp.txt:1314) + /// (Originally from ..\FSComp.txt:1317) static member checkLowercaseLiteralBindingInPattern(a0 : System.String) = (3190, GetStringFunc("checkLowercaseLiteralBindingInPattern",",,,%s,,,") a0) /// This literal pattern does not take arguments - /// (Originally from ..\FSComp.txt:1315) + /// (Originally from ..\FSComp.txt:1318) static member tcLiteralDoesNotTakeArguments() = (3191, GetStringFunc("tcLiteralDoesNotTakeArguments",",,,") ) /// Constructors are not permitted as extension members - they must be defined as part of the original definition of the type - /// (Originally from ..\FSComp.txt:1316) + /// (Originally from ..\FSComp.txt:1319) static member tcConstructorsIllegalInAugmentation() = (3192, GetStringFunc("tcConstructorsIllegalInAugmentation",",,,") ) /// Invalid response file '%s' ( '%s' ) - /// (Originally from ..\FSComp.txt:1317) + /// (Originally from ..\FSComp.txt:1320) static member optsInvalidResponseFile(a0 : System.String, a1 : System.String) = (3193, GetStringFunc("optsInvalidResponseFile",",,,%s,,,%s,,,") a0 a1) /// Response file '%s' not found in '%s' - /// (Originally from ..\FSComp.txt:1318) + /// (Originally from ..\FSComp.txt:1321) static member optsResponseFileNotFound(a0 : System.String, a1 : System.String) = (3194, GetStringFunc("optsResponseFileNotFound",",,,%s,,,%s,,,") a0 a1) /// Response file name '%s' is empty, contains invalid characters, has a drive specification without an absolute path, or is too long - /// (Originally from ..\FSComp.txt:1319) + /// (Originally from ..\FSComp.txt:1322) static member optsResponseFileNameInvalid(a0 : System.String) = (3195, GetStringFunc("optsResponseFileNameInvalid",",,,%s,,,") a0) /// Cannot find FSharp.Core.dll in compiler's directory - /// (Originally from ..\FSComp.txt:1320) + /// (Originally from ..\FSComp.txt:1323) static member fsharpCoreNotFoundToBeCopied() = (3196, GetStringFunc("fsharpCoreNotFoundToBeCopied",",,,") ) /// One tuple type is a struct tuple, the other is a reference tuple - /// (Originally from ..\FSComp.txt:1321) + /// (Originally from ..\FSComp.txt:1324) static member tcTupleStructMismatch() = (GetStringFunc("tcTupleStructMismatch",",,,") ) /// This provided method requires static parameters - /// (Originally from ..\FSComp.txt:1322) + /// (Originally from ..\FSComp.txt:1325) static member etMissingStaticArgumentsToMethod() = (3197, GetStringFunc("etMissingStaticArgumentsToMethod",",,,") ) /// The conversion from %s to %s is a compile-time safe upcast, not a downcast. Consider using 'upcast' instead of 'downcast'. - /// (Originally from ..\FSComp.txt:1323) + /// (Originally from ..\FSComp.txt:1326) static member considerUpcast(a0 : System.String, a1 : System.String) = (3198, GetStringFunc("considerUpcast",",,,%s,,,%s,,,") a0 a1) /// The conversion from %s to %s is a compile-time safe upcast, not a downcast. Consider using the :> (upcast) operator instead of the :?> (downcast) operator. - /// (Originally from ..\FSComp.txt:1324) + /// (Originally from ..\FSComp.txt:1327) static member considerUpcastOperator(a0 : System.String, a1 : System.String) = (3198, GetStringFunc("considerUpcastOperator",",,,%s,,,%s,,,") a0 a1) /// The 'rec' on this module is implied by an outer 'rec' declaration and is being ignored - /// (Originally from ..\FSComp.txt:1325) + /// (Originally from ..\FSComp.txt:1328) static member tcRecImplied() = (3199, GetStringFunc("tcRecImplied",",,,") ) /// In a recursive declaration group, 'open' declarations must come first in each module - /// (Originally from ..\FSComp.txt:1326) + /// (Originally from ..\FSComp.txt:1329) static member tcOpenFirstInMutRec() = (3200, GetStringFunc("tcOpenFirstInMutRec",",,,") ) /// In a recursive declaration group, module abbreviations must come after all 'open' declarations and before other declarations - /// (Originally from ..\FSComp.txt:1327) + /// (Originally from ..\FSComp.txt:1330) static member tcModuleAbbrevFirstInMutRec() = (3201, GetStringFunc("tcModuleAbbrevFirstInMutRec",",,,") ) /// This declaration is not supported in recursive declaration groups - /// (Originally from ..\FSComp.txt:1328) + /// (Originally from ..\FSComp.txt:1331) static member tcUnsupportedMutRecDecl() = (3202, GetStringFunc("tcUnsupportedMutRecDecl",",,,") ) /// Invalid use of 'rec' keyword - /// (Originally from ..\FSComp.txt:1329) + /// (Originally from ..\FSComp.txt:1332) static member parsInvalidUseOfRec() = (3203, GetStringFunc("parsInvalidUseOfRec",",,,") ) /// If a union type has more than one case and is a struct, then all fields within the union type must be given unique names. - /// (Originally from ..\FSComp.txt:1330) + /// (Originally from ..\FSComp.txt:1333) static member tcStructUnionMultiCaseDistinctFields() = (3204, GetStringFunc("tcStructUnionMultiCaseDistinctFields",",,,") ) /// The CallerMemberNameAttribute applied to parameter '%s' will have no effect. It is overridden by the CallerFilePathAttribute. - /// (Originally from ..\FSComp.txt:1331) + /// (Originally from ..\FSComp.txt:1334) static member CallerMemberNameIsOverriden(a0 : System.String) = (3206, GetStringFunc("CallerMemberNameIsOverriden",",,,%s,,,") a0) /// Invalid use of 'fixed'. 'fixed' may only be used in a declaration of the form 'use x = fixed expr' where the expression is an array, the address of a field, the address of an array element or a string' - /// (Originally from ..\FSComp.txt:1332) + /// (Originally from ..\FSComp.txt:1335) static member tcFixedNotAllowed() = (3207, GetStringFunc("tcFixedNotAllowed",",,,") ) /// Could not find method System.Runtime.CompilerServices.OffsetToStringData in references when building 'fixed' expression. - /// (Originally from ..\FSComp.txt:1333) + /// (Originally from ..\FSComp.txt:1336) static member tcCouldNotFindOffsetToStringData() = (3208, GetStringFunc("tcCouldNotFindOffsetToStringData",",,,") ) /// The address of the variable '%s' or a related expression cannot be used at this point. This is to ensure the address of the local value does not escape its scope. - /// (Originally from ..\FSComp.txt:1334) + /// (Originally from ..\FSComp.txt:1337) static member chkNoByrefAddressOfLocal(a0 : System.String) = (3209, GetStringFunc("chkNoByrefAddressOfLocal",",,,%s,,,") a0) /// %s is an active pattern and cannot be treated as a discriminated union case with named fields. - /// (Originally from ..\FSComp.txt:1335) + /// (Originally from ..\FSComp.txt:1338) static member tcNamedActivePattern(a0 : System.String) = (3210, GetStringFunc("tcNamedActivePattern",",,,%s,,,") a0) /// The default value does not have the same type as the argument. The DefaultParameterValue attribute and any Optional attribute will be ignored. Note: 'null' needs to be annotated with the correct type, e.g. 'DefaultParameterValue(null:obj)'. - /// (Originally from ..\FSComp.txt:1336) + /// (Originally from ..\FSComp.txt:1339) static member DefaultParameterValueNotAppropriateForArgument() = (3211, GetStringFunc("DefaultParameterValueNotAppropriateForArgument",",,,") ) /// The system type '%s' was required but no referenced system DLL contained this type - /// (Originally from ..\FSComp.txt:1337) + /// (Originally from ..\FSComp.txt:1340) static member tcGlobalsSystemTypeNotFound(a0 : System.String) = (GetStringFunc("tcGlobalsSystemTypeNotFound",",,,%s,,,") a0) /// The member '%s' matches multiple overloads of the same method.\nPlease restrict it to one of the following:%s. - /// (Originally from ..\FSComp.txt:1338) + /// (Originally from ..\FSComp.txt:1341) static member typrelMemberHasMultiplePossibleDispatchSlots(a0 : System.String, a1 : System.String) = (3213, GetStringFunc("typrelMemberHasMultiplePossibleDispatchSlots",",,,%s,,,%s,,,") a0 a1) /// Method or object constructor '%s' is not static - /// (Originally from ..\FSComp.txt:1339) + /// (Originally from ..\FSComp.txt:1342) static member methodIsNotStatic(a0 : System.String) = (3214, GetStringFunc("methodIsNotStatic",",,,%s,,,") a0) /// Unexpected symbol '=' in expression. Did you intend to use 'for x in y .. z do' instead? - /// (Originally from ..\FSComp.txt:1340) + /// (Originally from ..\FSComp.txt:1343) static member parsUnexpectedSymbolEqualsInsteadOfIn() = (3215, GetStringFunc("parsUnexpectedSymbolEqualsInsteadOfIn",",,,") ) /// Indicates a method that either has no implementation in the type in which it is declared or that is virtual and has a default implementation. - /// (Originally from ..\FSComp.txt:1341) + /// (Originally from ..\FSComp.txt:1344) static member keywordDescriptionAbstract() = (GetStringFunc("keywordDescriptionAbstract",",,,") ) /// Used in mutually recursive bindings, in property declarations, and with multiple constraints on generic parameters. - /// (Originally from ..\FSComp.txt:1342) + /// (Originally from ..\FSComp.txt:1345) static member keyworkDescriptionAnd() = (GetStringFunc("keyworkDescriptionAnd",",,,") ) /// Used to give the current class object an object name. Also used to give a name to a whole pattern within a pattern match. - /// (Originally from ..\FSComp.txt:1343) + /// (Originally from ..\FSComp.txt:1346) static member keywordDescriptionAs() = (GetStringFunc("keywordDescriptionAs",",,,") ) /// Used to verify code during debugging. - /// (Originally from ..\FSComp.txt:1344) + /// (Originally from ..\FSComp.txt:1347) static member keywordDescriptionAssert() = (GetStringFunc("keywordDescriptionAssert",",,,") ) /// Used as the name of the base class object. - /// (Originally from ..\FSComp.txt:1345) + /// (Originally from ..\FSComp.txt:1348) static member keywordDescriptionBase() = (GetStringFunc("keywordDescriptionBase",",,,") ) /// In verbose syntax, indicates the start of a code block. - /// (Originally from ..\FSComp.txt:1346) + /// (Originally from ..\FSComp.txt:1349) static member keywordDescriptionBegin() = (GetStringFunc("keywordDescriptionBegin",",,,") ) /// In verbose syntax, indicates the start of a class definition. - /// (Originally from ..\FSComp.txt:1347) + /// (Originally from ..\FSComp.txt:1350) static member keywordDescriptionClass() = (GetStringFunc("keywordDescriptionClass",",,,") ) /// Indicates an implementation of an abstract method; used together with an abstract method declaration to create a virtual method. - /// (Originally from ..\FSComp.txt:1348) + /// (Originally from ..\FSComp.txt:1351) static member keywordDescriptionDefault() = (GetStringFunc("keywordDescriptionDefault",",,,") ) /// Used to declare a delegate. - /// (Originally from ..\FSComp.txt:1349) + /// (Originally from ..\FSComp.txt:1352) static member keywordDescriptionDelegate() = (GetStringFunc("keywordDescriptionDelegate",",,,") ) /// Used in looping constructs or to execute imperative code. - /// (Originally from ..\FSComp.txt:1350) + /// (Originally from ..\FSComp.txt:1353) static member keywordDescriptionDo() = (GetStringFunc("keywordDescriptionDo",",,,") ) /// In verbose syntax, indicates the end of a block of code in a looping expression. - /// (Originally from ..\FSComp.txt:1351) + /// (Originally from ..\FSComp.txt:1354) static member keywordDescriptionDone() = (GetStringFunc("keywordDescriptionDone",",,,") ) /// Used to convert to a type that is lower in the inheritance chain. - /// (Originally from ..\FSComp.txt:1352) + /// (Originally from ..\FSComp.txt:1355) static member keywordDescriptionDowncast() = (GetStringFunc("keywordDescriptionDowncast",",,,") ) /// In a for expression, used when counting in reverse. - /// (Originally from ..\FSComp.txt:1353) + /// (Originally from ..\FSComp.txt:1356) static member keywordDescriptionDownto() = (GetStringFunc("keywordDescriptionDownto",",,,") ) /// Used in conditional branching. A short form of else if. - /// (Originally from ..\FSComp.txt:1354) + /// (Originally from ..\FSComp.txt:1357) static member keywordDescriptionElif() = (GetStringFunc("keywordDescriptionElif",",,,") ) /// Used in conditional branching. - /// (Originally from ..\FSComp.txt:1355) + /// (Originally from ..\FSComp.txt:1358) static member keywordDescriptionElse() = (GetStringFunc("keywordDescriptionElse",",,,") ) /// In type definitions and type extensions, indicates the end of a section of member definitions. In verbose syntax, used to specify the end of a code block that starts with the begin keyword. - /// (Originally from ..\FSComp.txt:1356) + /// (Originally from ..\FSComp.txt:1359) static member keywordDescriptionEnd() = (GetStringFunc("keywordDescriptionEnd",",,,") ) /// Used to declare an exception type. - /// (Originally from ..\FSComp.txt:1357) + /// (Originally from ..\FSComp.txt:1360) static member keywordDescriptionException() = (GetStringFunc("keywordDescriptionException",",,,") ) /// Indicates that a declared program element is defined in another binary or assembly. - /// (Originally from ..\FSComp.txt:1358) + /// (Originally from ..\FSComp.txt:1361) static member keywordDescriptionExtern() = (GetStringFunc("keywordDescriptionExtern",",,,") ) /// Used as a Boolean literal. - /// (Originally from ..\FSComp.txt:1359) + /// (Originally from ..\FSComp.txt:1362) static member keywordDescriptionTrueFalse() = (GetStringFunc("keywordDescriptionTrueFalse",",,,") ) /// Used together with try to introduce a block of code that executes regardless of whether an exception occurs. - /// (Originally from ..\FSComp.txt:1360) + /// (Originally from ..\FSComp.txt:1363) static member keywordDescriptionFinally() = (GetStringFunc("keywordDescriptionFinally",",,,") ) /// Used in looping constructs. - /// (Originally from ..\FSComp.txt:1361) + /// (Originally from ..\FSComp.txt:1364) static member keywordDescriptionFor() = (GetStringFunc("keywordDescriptionFor",",,,") ) /// Used in lambda expressions, also known as anonymous functions. - /// (Originally from ..\FSComp.txt:1362) + /// (Originally from ..\FSComp.txt:1365) static member keywordDescriptionFun() = (GetStringFunc("keywordDescriptionFun",",,,") ) /// Used as a shorter alternative to the fun keyword and a match expression in a lambda expression that has pattern matching on a single argument. - /// (Originally from ..\FSComp.txt:1363) + /// (Originally from ..\FSComp.txt:1366) static member keywordDescriptionFunction() = (GetStringFunc("keywordDescriptionFunction",",,,") ) /// Used to reference the top-level .NET namespace. - /// (Originally from ..\FSComp.txt:1364) + /// (Originally from ..\FSComp.txt:1367) static member keywordDescriptionGlobal() = (GetStringFunc("keywordDescriptionGlobal",",,,") ) /// Used in conditional branching constructs. - /// (Originally from ..\FSComp.txt:1365) + /// (Originally from ..\FSComp.txt:1368) static member keywordDescriptionIf() = (GetStringFunc("keywordDescriptionIf",",,,") ) /// Used for sequence expressions and, in verbose syntax, to separate expressions from bindings. - /// (Originally from ..\FSComp.txt:1366) + /// (Originally from ..\FSComp.txt:1369) static member keywordDescriptionIn() = (GetStringFunc("keywordDescriptionIn",",,,") ) /// Used to specify a base class or base interface. - /// (Originally from ..\FSComp.txt:1367) + /// (Originally from ..\FSComp.txt:1370) static member keywordDescriptionInherit() = (GetStringFunc("keywordDescriptionInherit",",,,") ) /// Used to indicate a function that should be integrated directly into the caller's code. - /// (Originally from ..\FSComp.txt:1368) + /// (Originally from ..\FSComp.txt:1371) static member keywordDescriptionInline() = (GetStringFunc("keywordDescriptionInline",",,,") ) /// Used to declare and implement interfaces. - /// (Originally from ..\FSComp.txt:1369) + /// (Originally from ..\FSComp.txt:1372) static member keywordDescriptionInterface() = (GetStringFunc("keywordDescriptionInterface",",,,") ) /// Used to specify that a member is visible inside an assembly but not outside it. - /// (Originally from ..\FSComp.txt:1370) + /// (Originally from ..\FSComp.txt:1373) static member keywordDescriptionInternal() = (GetStringFunc("keywordDescriptionInternal",",,,") ) /// Used to specify a computation that is to be performed only when a result is needed. - /// (Originally from ..\FSComp.txt:1371) + /// (Originally from ..\FSComp.txt:1374) static member keywordDescriptionLazy() = (GetStringFunc("keywordDescriptionLazy",",,,") ) /// Used to associate, or bind, a name to a value or function. - /// (Originally from ..\FSComp.txt:1372) + /// (Originally from ..\FSComp.txt:1375) static member keywordDescriptionLet() = (GetStringFunc("keywordDescriptionLet",",,,") ) /// Used in computation expressions to bind a name to the result of another computation expression. - /// (Originally from ..\FSComp.txt:1373) + /// (Originally from ..\FSComp.txt:1376) static member keywordDescriptionLetBang() = (GetStringFunc("keywordDescriptionLetBang",",,,") ) /// Used to branch by comparing a value to a pattern. - /// (Originally from ..\FSComp.txt:1374) + /// (Originally from ..\FSComp.txt:1377) static member keywordDescriptionMatch() = (GetStringFunc("keywordDescriptionMatch",",,,") ) /// Used in computation expressions to pattern match directly over the result of another computation expression. - /// (Originally from ..\FSComp.txt:1375) + /// (Originally from ..\FSComp.txt:1378) static member keywordDescriptionMatchBang() = (GetStringFunc("keywordDescriptionMatchBang",",,,") ) /// Used to declare a property or method in an object type. - /// (Originally from ..\FSComp.txt:1376) + /// (Originally from ..\FSComp.txt:1379) static member keywordDescriptionMember() = (GetStringFunc("keywordDescriptionMember",",,,") ) /// Used to associate a name with a group of related types, values, and functions, to logically separate it from other code. - /// (Originally from ..\FSComp.txt:1377) + /// (Originally from ..\FSComp.txt:1380) static member keywordDescriptionModule() = (GetStringFunc("keywordDescriptionModule",",,,") ) /// Used to declare a variable, that is, a value that can be changed. - /// (Originally from ..\FSComp.txt:1378) + /// (Originally from ..\FSComp.txt:1381) static member keywordDescriptionMutable() = (GetStringFunc("keywordDescriptionMutable",",,,") ) /// Used to associate a name with a group of related types and modules, to logically separate it from other code. - /// (Originally from ..\FSComp.txt:1379) + /// (Originally from ..\FSComp.txt:1382) static member keywordDescriptionNamespace() = (GetStringFunc("keywordDescriptionNamespace",",,,") ) /// Used to declare, define, or invoke a constructor that creates or that can create an object. Also used in generic parameter constraints to indicate that a type must have a certain constructor. - /// (Originally from ..\FSComp.txt:1380) + /// (Originally from ..\FSComp.txt:1383) static member keywordDescriptionNew() = (GetStringFunc("keywordDescriptionNew",",,,") ) /// Not actually a keyword. However, not struct in combination is used as a generic parameter constraint. - /// (Originally from ..\FSComp.txt:1381) + /// (Originally from ..\FSComp.txt:1384) static member keywordDescriptionNot() = (GetStringFunc("keywordDescriptionNot",",,,") ) /// Indicates the absence of an object. Also used in generic parameter constraints. - /// (Originally from ..\FSComp.txt:1382) + /// (Originally from ..\FSComp.txt:1385) static member keywordDescriptionNull() = (GetStringFunc("keywordDescriptionNull",",,,") ) /// Used in discriminated unions to indicate the type of categories of values, and in delegate and exception declarations. - /// (Originally from ..\FSComp.txt:1383) + /// (Originally from ..\FSComp.txt:1386) static member keywordDescriptionOf() = (GetStringFunc("keywordDescriptionOf",",,,") ) /// Used to make the contents of a namespace or module available without qualification. - /// (Originally from ..\FSComp.txt:1384) + /// (Originally from ..\FSComp.txt:1387) static member keywordDescriptionOpen() = (GetStringFunc("keywordDescriptionOpen",",,,") ) /// Used with Boolean conditions as a Boolean or operator. Equivalent to ||. Also used in member constraints. - /// (Originally from ..\FSComp.txt:1385) + /// (Originally from ..\FSComp.txt:1388) static member keywordDescriptionOr() = (GetStringFunc("keywordDescriptionOr",",,,") ) /// Used to implement a version of an abstract or virtual method that differs from the base version. - /// (Originally from ..\FSComp.txt:1386) + /// (Originally from ..\FSComp.txt:1389) static member keywordDescriptionOverride() = (GetStringFunc("keywordDescriptionOverride",",,,") ) /// Restricts access to a member to code in the same type or module. - /// (Originally from ..\FSComp.txt:1387) + /// (Originally from ..\FSComp.txt:1390) static member keywordDescriptionPrivate() = (GetStringFunc("keywordDescriptionPrivate",",,,") ) /// Allows access to a member from outside the type. - /// (Originally from ..\FSComp.txt:1388) + /// (Originally from ..\FSComp.txt:1391) static member keywordDescriptionPublic() = (GetStringFunc("keywordDescriptionPublic",",,,") ) /// Used to indicate that a function is recursive. - /// (Originally from ..\FSComp.txt:1389) + /// (Originally from ..\FSComp.txt:1392) static member keywordDescriptionRec() = (GetStringFunc("keywordDescriptionRec",",,,") ) /// Used to provide a value for the result of the containing computation expression. - /// (Originally from ..\FSComp.txt:1390) + /// (Originally from ..\FSComp.txt:1393) static member keywordDescriptionReturn() = (GetStringFunc("keywordDescriptionReturn",",,,") ) /// Used to provide a value for the result of the containing computation expression, where that value itself comes from the result another computation expression. - /// (Originally from ..\FSComp.txt:1391) + /// (Originally from ..\FSComp.txt:1394) static member keywordDescriptionReturnBang() = (GetStringFunc("keywordDescriptionReturnBang",",,,") ) /// Used in query expressions to specify what fields or columns to extract. Note that this is a contextual keyword, which means that it is not actually a reserved word and it only acts like a keyword in appropriate context. - /// (Originally from ..\FSComp.txt:1392) + /// (Originally from ..\FSComp.txt:1395) static member keywordDescriptionSelect() = (GetStringFunc("keywordDescriptionSelect",",,,") ) /// Used to indicate a method or property that can be called without an instance of a type, or a value member that is shared among all instances of a type. - /// (Originally from ..\FSComp.txt:1393) + /// (Originally from ..\FSComp.txt:1396) static member keywordDescriptionStatic() = (GetStringFunc("keywordDescriptionStatic",",,,") ) /// Used to declare a structure type. Also used in generic parameter constraints. Used for OCaml compatibility in module definitions. - /// (Originally from ..\FSComp.txt:1394) + /// (Originally from ..\FSComp.txt:1397) static member keywordDescriptionStruct() = (GetStringFunc("keywordDescriptionStruct",",,,") ) /// Used in conditional expressions. Also used to perform side effects after object construction. - /// (Originally from ..\FSComp.txt:1395) + /// (Originally from ..\FSComp.txt:1398) static member keywordDescriptionThen() = (GetStringFunc("keywordDescriptionThen",",,,") ) /// Used in for loops to indicate a range. - /// (Originally from ..\FSComp.txt:1396) + /// (Originally from ..\FSComp.txt:1399) static member keywordDescriptionTo() = (GetStringFunc("keywordDescriptionTo",",,,") ) /// Used to introduce a block of code that might generate an exception. Used together with with or finally. - /// (Originally from ..\FSComp.txt:1397) + /// (Originally from ..\FSComp.txt:1400) static member keywordDescriptionTry() = (GetStringFunc("keywordDescriptionTry",",,,") ) /// Used to declare a class, record, structure, discriminated union, enumeration type, unit of measure, or type abbreviation. - /// (Originally from ..\FSComp.txt:1398) + /// (Originally from ..\FSComp.txt:1401) static member keywordDescriptionType() = (GetStringFunc("keywordDescriptionType",",,,") ) /// Used to convert to a type that is higher in the inheritance chain. - /// (Originally from ..\FSComp.txt:1399) + /// (Originally from ..\FSComp.txt:1402) static member keywordDescriptionUpcast() = (GetStringFunc("keywordDescriptionUpcast",",,,") ) /// Used instead of let for values that implement IDisposable" - /// (Originally from ..\FSComp.txt:1400) + /// (Originally from ..\FSComp.txt:1403) static member keywordDescriptionUse() = (GetStringFunc("keywordDescriptionUse",",,,") ) /// Used instead of let! in computation expressions for computation expression results that implement IDisposable. - /// (Originally from ..\FSComp.txt:1401) + /// (Originally from ..\FSComp.txt:1404) static member keywordDescriptionUseBang() = (GetStringFunc("keywordDescriptionUseBang",",,,") ) /// Used in a signature to indicate a value, or in a type to declare a member, in limited situations. - /// (Originally from ..\FSComp.txt:1402) + /// (Originally from ..\FSComp.txt:1405) static member keywordDescriptionVal() = (GetStringFunc("keywordDescriptionVal",",,,") ) /// Indicates the .NET void type. Used when interoperating with other .NET languages. - /// (Originally from ..\FSComp.txt:1403) + /// (Originally from ..\FSComp.txt:1406) static member keywordDescriptionVoid() = (GetStringFunc("keywordDescriptionVoid",",,,") ) /// Used for Boolean conditions (when guards) on pattern matches and to introduce a constraint clause for a generic type parameter. - /// (Originally from ..\FSComp.txt:1404) + /// (Originally from ..\FSComp.txt:1407) static member keywordDescriptionWhen() = (GetStringFunc("keywordDescriptionWhen",",,,") ) /// Introduces a looping construct. - /// (Originally from ..\FSComp.txt:1405) + /// (Originally from ..\FSComp.txt:1408) static member keywordDescriptionWhile() = (GetStringFunc("keywordDescriptionWhile",",,,") ) /// Used together with the match keyword in pattern matching expressions. Also used in object expressions, record copying expressions, and type extensions to introduce member definitions, and to introduce exception handlers. - /// (Originally from ..\FSComp.txt:1406) + /// (Originally from ..\FSComp.txt:1409) static member keywordDescriptionWith() = (GetStringFunc("keywordDescriptionWith",",,,") ) /// Used in a sequence expression to produce a value for a sequence. - /// (Originally from ..\FSComp.txt:1407) + /// (Originally from ..\FSComp.txt:1410) static member keywordDescriptionYield() = (GetStringFunc("keywordDescriptionYield",",,,") ) /// Used in a computation expression to append the result of a given computation expression to a collection of results for the containing computation expression. - /// (Originally from ..\FSComp.txt:1408) + /// (Originally from ..\FSComp.txt:1411) static member keywordDescriptionYieldBang() = (GetStringFunc("keywordDescriptionYieldBang",",,,") ) /// In function types, delimits arguments and return values. Yields an expression (in sequence expressions); equivalent to the yield keyword. Used in match expressions - /// (Originally from ..\FSComp.txt:1409) + /// (Originally from ..\FSComp.txt:1412) static member keywordDescriptionRightArrow() = (GetStringFunc("keywordDescriptionRightArrow",",,,") ) /// Assigns a value to a variable. - /// (Originally from ..\FSComp.txt:1410) + /// (Originally from ..\FSComp.txt:1413) static member keywordDescriptionLeftArrow() = (GetStringFunc("keywordDescriptionLeftArrow",",,,") ) /// Converts a type to type that is higher in the hierarchy. - /// (Originally from ..\FSComp.txt:1411) + /// (Originally from ..\FSComp.txt:1414) static member keywordDescriptionCast() = (GetStringFunc("keywordDescriptionCast",",,,") ) /// Converts a type to a type that is lower in the hierarchy. - /// (Originally from ..\FSComp.txt:1412) + /// (Originally from ..\FSComp.txt:1415) static member keywordDescriptionDynamicCast() = (GetStringFunc("keywordDescriptionDynamicCast",",,,") ) /// Delimits a typed code quotation. - /// (Originally from ..\FSComp.txt:1413) + /// (Originally from ..\FSComp.txt:1416) static member keywordDescriptionTypedQuotation() = (GetStringFunc("keywordDescriptionTypedQuotation",",,,") ) /// Delimits a untyped code quotation. - /// (Originally from ..\FSComp.txt:1414) + /// (Originally from ..\FSComp.txt:1417) static member keywordDescriptionUntypedQuotation() = (GetStringFunc("keywordDescriptionUntypedQuotation",",,,") ) /// %s '%s' not found in assembly '%s'. A possible cause may be a version incompatibility. You may need to explicitly reference the correct version of this assembly to allow all referenced components to use the correct version. - /// (Originally from ..\FSComp.txt:1415) + /// (Originally from ..\FSComp.txt:1418) static member itemNotFoundDuringDynamicCodeGen(a0 : System.String, a1 : System.String, a2 : System.String) = (3216, GetStringFunc("itemNotFoundDuringDynamicCodeGen",",,,%s,,,%s,,,%s,,,") a0 a1 a2) /// %s '%s' not found in type '%s' from assembly '%s'. A possible cause may be a version incompatibility. You may need to explicitly reference the correct version of this assembly to allow all referenced components to use the correct version. - /// (Originally from ..\FSComp.txt:1416) + /// (Originally from ..\FSComp.txt:1419) static member itemNotFoundInTypeDuringDynamicCodeGen(a0 : System.String, a1 : System.String, a2 : System.String, a3 : System.String) = (3216, GetStringFunc("itemNotFoundInTypeDuringDynamicCodeGen",",,,%s,,,%s,,,%s,,,%s,,,") a0 a1 a2 a3) /// is - /// (Originally from ..\FSComp.txt:1417) + /// (Originally from ..\FSComp.txt:1420) static member descriptionWordIs() = (GetStringFunc("descriptionWordIs",",,,") ) /// This value is not a function and cannot be applied. - /// (Originally from ..\FSComp.txt:1418) + /// (Originally from ..\FSComp.txt:1421) static member notAFunction() = (GetStringFunc("notAFunction",",,,") ) /// This value is not a function and cannot be applied. Did you intend to access the indexer via %s.[index] instead? - /// (Originally from ..\FSComp.txt:1419) + /// (Originally from ..\FSComp.txt:1422) static member notAFunctionButMaybeIndexerWithName(a0 : System.String) = (GetStringFunc("notAFunctionButMaybeIndexerWithName",",,,%s,,,") a0) /// This expression is not a function and cannot be applied. Did you intend to access the indexer via expr.[index] instead? - /// (Originally from ..\FSComp.txt:1420) + /// (Originally from ..\FSComp.txt:1423) static member notAFunctionButMaybeIndexer() = (GetStringFunc("notAFunctionButMaybeIndexer",",,,") ) /// - /// (Originally from ..\FSComp.txt:1421) + /// (Originally from ..\FSComp.txt:1424) static member notAFunctionButMaybeIndexerErrorCode() = (3217, GetStringFunc("notAFunctionButMaybeIndexerErrorCode",",,,") ) /// This value is not a function and cannot be applied. Did you forget to terminate a declaration? - /// (Originally from ..\FSComp.txt:1422) + /// (Originally from ..\FSComp.txt:1425) static member notAFunctionButMaybeDeclaration() = (GetStringFunc("notAFunctionButMaybeDeclaration",",,,") ) /// The argument names in the signature '%s' and implementation '%s' do not match. The argument name from the signature file will be used. This may cause problems when debugging or profiling. - /// (Originally from ..\FSComp.txt:1423) + /// (Originally from ..\FSComp.txt:1426) static member ArgumentsInSigAndImplMismatch(a0 : System.String, a1 : System.String) = (3218, GetStringFunc("ArgumentsInSigAndImplMismatch",",,,%s,,,%s,,,") a0 a1) /// An error occurred while reading the F# metadata of assembly '%s'. A reserved construct was utilized. You may need to upgrade your F# compiler or use an earlier version of the assembly that doesn't make use of a specific construct. - /// (Originally from ..\FSComp.txt:1424) + /// (Originally from ..\FSComp.txt:1427) static member pickleUnexpectedNonZero(a0 : System.String) = (3219, GetStringFunc("pickleUnexpectedNonZero",",,,%s,,,") a0) /// This method or property is not normally used from F# code, use an explicit tuple pattern for deconstruction instead. - /// (Originally from ..\FSComp.txt:1425) + /// (Originally from ..\FSComp.txt:1428) static member tcTupleMemberNotNormallyUsed() = (3220, GetStringFunc("tcTupleMemberNotNormallyUsed",",,,") ) /// This expression returns a value of type '%s' but is implicitly discarded. Consider using 'let' to bind the result to a name, e.g. 'let result = expression'. If you intended to use the expression as a value in the sequence then use an explicit 'yield'. - /// (Originally from ..\FSComp.txt:1426) + /// (Originally from ..\FSComp.txt:1429) static member implicitlyDiscardedInSequenceExpression(a0 : System.String) = (3221, GetStringFunc("implicitlyDiscardedInSequenceExpression",",,,%s,,,") a0) /// This expression returns a value of type '%s' but is implicitly discarded. Consider using 'let' to bind the result to a name, e.g. 'let result = expression'. If you intended to use the expression as a value in the sequence then use an explicit 'yield!'. - /// (Originally from ..\FSComp.txt:1427) + /// (Originally from ..\FSComp.txt:1430) static member implicitlyDiscardedSequenceInSequenceExpression(a0 : System.String) = (3222, GetStringFunc("implicitlyDiscardedSequenceInSequenceExpression",",,,%s,,,") a0) /// The file '%s' changed on disk unexpectedly, please reload. - /// (Originally from ..\FSComp.txt:1428) + /// (Originally from ..\FSComp.txt:1431) static member ilreadFileChanged(a0 : System.String) = (3223, GetStringFunc("ilreadFileChanged",",,,%s,,,") a0) /// The byref pointer is readonly, so this write is not permitted. - /// (Originally from ..\FSComp.txt:1429) + /// (Originally from ..\FSComp.txt:1432) static member writeToReadOnlyByref() = (3224, GetStringFunc("writeToReadOnlyByref",",,,") ) /// A ReadOnly attribute has been applied to a struct type with a mutable field. - /// (Originally from ..\FSComp.txt:1430) + /// (Originally from ..\FSComp.txt:1433) static member readOnlyAttributeOnStructWithMutableField() = (3225, GetStringFunc("readOnlyAttributeOnStructWithMutableField",",,,") ) /// A byref pointer returned by a function or method is implicitly dereferenced as of F# 4.5. To acquire the return value as a pointer, use the address-of operator, e.g. '&f(x)' or '&obj.Method(arg1, arg2)'. - /// (Originally from ..\FSComp.txt:1431) + /// (Originally from ..\FSComp.txt:1434) static member tcByrefReturnImplicitlyDereferenced() = (3226, GetStringFunc("tcByrefReturnImplicitlyDereferenced",",,,") ) /// A type annotated with IsByRefLike must also be a struct. Consider adding the [] attribute to the type. - /// (Originally from ..\FSComp.txt:1432) + /// (Originally from ..\FSComp.txt:1435) static member tcByRefLikeNotStruct() = (3227, GetStringFunc("tcByRefLikeNotStruct",",,,") ) /// The address of a value returned from the expression cannot be used at this point. This is to ensure the address of the local value does not escape its scope. - /// (Originally from ..\FSComp.txt:1433) + /// (Originally from ..\FSComp.txt:1436) static member chkNoByrefAddressOfValueFromExpression() = (3228, GetStringFunc("chkNoByrefAddressOfValueFromExpression",",,,") ) /// The Span or IsByRefLike expression cannot be returned from this function or method, because it is composed using elements that may escape their scope. - /// (Originally from ..\FSComp.txt:1434) + /// (Originally from ..\FSComp.txt:1437) static member chkNoReturnOfLimitedSpan() = (3229, GetStringFunc("chkNoReturnOfLimitedSpan",",,,") ) /// This value can't be assigned because the target '%s' may refer to non-stack-local memory, while the expression being assigned is assessed to potentially refer to stack-local memory. This is to help prevent pointers to stack-bound memory escaping their scope. - /// (Originally from ..\FSComp.txt:1435) + /// (Originally from ..\FSComp.txt:1438) static member chkNoWriteToLimitedSpan(a0 : System.String) = (3230, GetStringFunc("chkNoWriteToLimitedSpan",",,,%s,,,") a0) /// A value defined in a module must be mutable in order to take its address, e.g. 'let mutable x = ...' - /// (Originally from ..\FSComp.txt:1436) + /// (Originally from ..\FSComp.txt:1439) static member tastValueMustBeLocal() = (3231, GetStringFunc("tastValueMustBeLocal",",,,") ) /// A type annotated with IsReadOnly must also be a struct. Consider adding the [] attribute to the type. - /// (Originally from ..\FSComp.txt:1437) + /// (Originally from ..\FSComp.txt:1440) static member tcIsReadOnlyNotStruct() = (3232, GetStringFunc("tcIsReadOnlyNotStruct",",,,") ) /// Struct members cannot return the address of fields of the struct by reference - /// (Originally from ..\FSComp.txt:1438) + /// (Originally from ..\FSComp.txt:1441) static member chkStructsMayNotReturnAddressesOfContents() = (3233, GetStringFunc("chkStructsMayNotReturnAddressesOfContents",",,,") ) /// The function or method call cannot be used at this point, because one argument that is a byref of a non-stack-local Span or IsByRefLike type is used with another argument that is a stack-local Span or IsByRefLike type. This is to ensure the address of the local value does not escape its scope. - /// (Originally from ..\FSComp.txt:1439) + /// (Originally from ..\FSComp.txt:1442) static member chkNoByrefLikeFunctionCall() = (3234, GetStringFunc("chkNoByrefLikeFunctionCall",",,,") ) /// The Span or IsByRefLike variable '%s' cannot be used at this point. This is to ensure the address of the local value does not escape its scope. - /// (Originally from ..\FSComp.txt:1440) + /// (Originally from ..\FSComp.txt:1443) static member chkNoSpanLikeVariable(a0 : System.String) = (3235, GetStringFunc("chkNoSpanLikeVariable",",,,%s,,,") a0) /// A Span or IsByRefLike value returned from the expression cannot be used at ths point. This is to ensure the address of the local value does not escape its scope. - /// (Originally from ..\FSComp.txt:1441) + /// (Originally from ..\FSComp.txt:1444) static member chkNoSpanLikeValueFromExpression() = (3236, GetStringFunc("chkNoSpanLikeValueFromExpression",",,,") ) /// Cannot take the address of the value returned from the expression. Assign the returned value to a let-bound value before taking the address. - /// (Originally from ..\FSComp.txt:1442) + /// (Originally from ..\FSComp.txt:1445) static member tastCantTakeAddressOfExpression() = (3237, GetStringFunc("tastCantTakeAddressOfExpression",",,,") ) /// This type does not inherit Attribute, it will not work correctly with other .NET languages. - /// (Originally from ..\FSComp.txt:1443) + /// (Originally from ..\FSComp.txt:1446) static member tcTypeDoesNotInheritAttribute() = (3242, GetStringFunc("tcTypeDoesNotInheritAttribute",",,,") ) /// Call this method once to validate that all known resources are valid; throws if not @@ -5636,6 +5636,9 @@ type internal SR private() = ignore(GetString("chkGetterAndSetterHaveSamePropertyType")) ignore(GetString("tcRuntimeSuppliedMethodCannotBeUsedInUserCode")) ignore(GetString("tcUnionCaseConstructorDoesNotHaveFieldWithGivenName")) + ignore(GetString("tcExceptionConstructorDoesNotHaveFieldWithGivenName")) + ignore(GetString("tcActivePatternsDoNotHaveFields")) + ignore(GetString("tcConstructorDoesNotHaveFieldWithGivenName")) ignore(GetString("tcUnionCaseFieldCannotBeUsedMoreThanOnce")) ignore(GetString("tcFieldNameIsUsedModeThanOnce")) ignore(GetString("tcFieldNameConflictsWithGeneratedNameForAnonymousField")) diff --git a/src/buildfromsource/FSharp.Compiler.Private/FSComp.resx b/src/buildfromsource/FSharp.Compiler.Private/FSComp.resx index c34fee949bd..0365551a5fd 100644 --- a/src/buildfromsource/FSharp.Compiler.Private/FSComp.resx +++ b/src/buildfromsource/FSharp.Compiler.Private/FSComp.resx @@ -3082,7 +3082,7 @@ This number is outside the allowable range for 32-bit floats - This is not a valid numeric literal. Valid numeric literals include 1, 0x1, 0b0001 (int), 1u (uint32), 1L (int64), 1UL (uint64), 1s (int16), 1us (uint16), 1y (sbyte), 1uy (byte), 1.0 (float), 1.0f (float32), 1.0m (decimal), 1I (BigInteger). + This is not a valid numeric literal. Valid numeric literals include 1, 0x1, 0b0001 (int), 1u (uint32), 1L (int64), 1UL (uint64), 1s (int16), 1y (sbyte), 1uy (byte), 1.0 (float), 1.0f (float32), 1.0m (decimal), 1I (BigInteger). This is not a valid byte literal @@ -3193,10 +3193,10 @@ This operation accesses a mutable top-level value defined in another assembly in an unsupported way. The value cannot be accessed through its address. Consider copying the expression to a mutable local, e.g. 'let mutable x = ...', and if necessary assigning the value back after the completion of the operation - Type parameters must be placed directly adjacent to the type name, e.g. \"type C<'T>\", not type \"C <'T>\" + Remove spaces between the type name and type parameter, e.g. \"type C<'T>\", not type \"C <'T>\". Type parameters must be placed directly adjacent to the type name. - Type arguments must be placed directly adjacent to the type name, e.g. \"C<'T>\", not \"C <'T>\" + Remove spaces between the type name and type parameter, e.g. \"C<'T>\", not \"C <'T>\". Type parameters must be placed directly adjacent to the type name. The use of the type syntax 'int C' and 'C <int>' is not permitted here. Consider adjusting this type to be written in the form 'C<int>' @@ -4369,4 +4369,4 @@ This type does not inherit Attribute, it will not work correctly with other .NET languages. - + \ No newline at end of file diff --git a/vsintegration/src/FSharp.Editor/Common/Constants.fs b/vsintegration/src/FSharp.Editor/Common/Constants.fs index f304a6484b1..58d8a5448a1 100644 --- a/vsintegration/src/FSharp.Editor/Common/Constants.fs +++ b/vsintegration/src/FSharp.Editor/Common/Constants.fs @@ -78,6 +78,11 @@ module internal Guids = let languageServicePerformanceOptionPageIdString = "8FDA964A-263D-4B4E-9560-29897535217C" [] + /// "9007718C-357A-4327-A193-AB3EC38D7EE8" let advancedSettingsPageIdSring = "9007718C-357A-4327-A193-AB3EC38D7EE8" + [] + /// "9EBEBCE8-A79B-46B0-A8C5-A9818AEED17D" + let formattingOptionPageIdString = "9EBEBCE8-A79B-46B0-A8C5-A9818AEED17D" + let blueHighContrastThemeId = Guid "{ce94d289-8481-498b-8ca9-9b6191a315b9}" diff --git a/vsintegration/src/FSharp.Editor/FSharp.Editor.resx b/vsintegration/src/FSharp.Editor/FSharp.Editor.resx index 572a794eedf..3675912ce61 100644 --- a/vsintegration/src/FSharp.Editor/FSharp.Editor.resx +++ b/vsintegration/src/FSharp.Editor/FSharp.Editor.resx @@ -177,6 +177,15 @@ Performance + + Advanced + + + CodeLens + + + Formatting + The value is unused @@ -204,10 +213,4 @@ Rename '{0}' to '__' - - Advanced - - - CodeLens - \ No newline at end of file diff --git a/vsintegration/src/FSharp.Editor/Formatting/EditorFormattingService.fs b/vsintegration/src/FSharp.Editor/Formatting/EditorFormattingService.fs index 03061fa350f..5fff337649b 100644 --- a/vsintegration/src/FSharp.Editor/Formatting/EditorFormattingService.fs +++ b/vsintegration/src/FSharp.Editor/Formatting/EditorFormattingService.fs @@ -13,6 +13,7 @@ open Microsoft.CodeAnalysis.Text open Microsoft.FSharp.Compiler.SourceCodeServices open System.Threading +open System.Windows.Forms [] [, FSharpConstants.FSharpLanguageName)>] @@ -20,8 +21,13 @@ type internal FSharpEditorFormattingService [] ( checkerProvider: FSharpCheckerProvider, - projectInfoManager: FSharpProjectOptionsManager + projectInfoManager: FSharpProjectOptionsManager, + settings: EditorOptions ) = + + static let toIList (xs : 'a seq) = ResizeArray(xs) :> IList<'a> + + static let getIndentation (line : string) = line |> Seq.takeWhile ((=) ' ') |> Seq.length static member GetFormattingChanges(documentId: DocumentId, sourceText: SourceText, filePath: string, checker: FSharpChecker, indentStyle: FormattingOptions.IndentStyle, options: (FSharpParsingOptions * FSharpProjectOptions) option, position: int) = // Logic for determining formatting changes: @@ -68,6 +74,77 @@ type internal FSharpEditorFormattingService else return! None } + + static member GetPasteChanges(documentId: DocumentId, sourceText: SourceText, filePath: string, formattingOptions: Microsoft.VisualStudio.FSharp.Editor.FormattingOptions, tabSize: int, parsingOptions: FSharpParsingOptions, currentClipboard: string, span: TextSpan) = + asyncMaybe { + + do! Option.guard formattingOptions.FormatOnPaste + + let startLineIdx = sourceText.Lines.IndexOf span.Start + + // If we're starting and ending on the same line, we've got nothing to format + do! Option.guard (startLineIdx <> sourceText.Lines.IndexOf span.End) + + let startLine = sourceText.Lines.[startLineIdx] + + // VS quirk: if we're pasting on an empty line which has automatically been + // indented (i.e. by ISynchronousIndentationService), then the pasted span + // includes this automatic indentation. When pasting, we only care about what + // was actually in the clipboard. + let fixedSpan = + let pasteText = sourceText.GetSubText(span) + let pasteTextString = pasteText.ToString() + + if currentClipboard.Length > 0 && pasteTextString.EndsWith currentClipboard then + let prepended = pasteTextString.[0..pasteTextString.Length-currentClipboard.Length-1] + + // Only strip off leading indentation if the pasted span is otherwise + // identical to the clipboard (ignoring leading spaces). + if prepended |> Seq.forall ((=) ' ') then + TextSpan(span.Start + prepended.Length, span.Length - prepended.Length) + else + span + else + span + + // Calculate the indentation of the line we pasted onto + let currentIndent = + let priorStartSpan = TextSpan(startLine.Span.Start, startLine.Span.Length - (startLine.Span.End - fixedSpan.Start)) + + sourceText.GetSubText(priorStartSpan).ToString() + |> Seq.takeWhile ((=) ' ') + |> Seq.length + + let fixedPasteText = sourceText.GetSubText(fixedSpan) + let leadingIndentation = fixedPasteText.ToString() |> getIndentation + + let stripIndentation charsToRemove = + let searchIndent = String.replicate charsToRemove " " + let newText = String.replicate currentIndent " " + + fixedPasteText.Lines + |> Seq.indexed + |> Seq.choose (fun (i, line) -> + if line.ToString().StartsWith searchIndent then + TextChange(TextSpan(line.Start + fixedSpan.Start, charsToRemove), if i = 0 then "" else newText) + |> Some + else + None + ) + + if leadingIndentation > 0 then + return stripIndentation leadingIndentation + else + let nextLineShouldBeIndented = FSharpIndentationService.IndentShouldFollow(documentId, sourceText, filePath, span.Start, parsingOptions) + + let removeIndentation = + let nextLineIndent = fixedPasteText.Lines.[1].ToString() |> getIndentation + + if nextLineShouldBeIndented then nextLineIndent - tabSize + else nextLineIndent + + return stripIndentation removeIndentation + } member __.GetFormattingChangesAsync (document: Document, position: int, cancellationToken: CancellationToken) = async { @@ -76,20 +153,27 @@ type internal FSharpEditorFormattingService let indentStyle = options.GetOption(FormattingOptions.SmartIndent, FSharpConstants.FSharpLanguageName) let projectOptionsOpt = projectInfoManager.TryGetOptionsForEditingDocumentOrProject document let! textChange = FSharpEditorFormattingService.GetFormattingChanges(document.Id, sourceText, document.FilePath, checkerProvider.Checker, indentStyle, projectOptionsOpt, position) - - return - match textChange with - | Some change -> - ResizeArray([change]) :> IList<_> - - | None -> - ResizeArray() :> IList<_> + return textChange |> Option.toList |> toIList + } + + member __.OnPasteAsync (document: Document, span: TextSpan, currentClipboard: string, cancellationToken: CancellationToken) = + async { + let! sourceText = document.GetTextAsync(cancellationToken) |> Async.AwaitTask + let! options = document.GetOptionsAsync(cancellationToken) |> Async.AwaitTask + let tabSize = options.GetOption(FormattingOptions.TabSize, FSharpConstants.FSharpLanguageName) + + match projectInfoManager.TryGetOptionsForEditingDocumentOrProject document with + | Some (parsingOptions, _) -> + let! textChanges = FSharpEditorFormattingService.GetPasteChanges(document.Id, sourceText, document.FilePath, settings.Formatting, tabSize, parsingOptions, currentClipboard, span) + return textChanges |> Option.defaultValue Seq.empty |> toIList + | None -> + return toIList Seq.empty } interface IEditorFormattingService with member val SupportsFormatDocument = false member val SupportsFormatSelection = false - member val SupportsFormatOnPaste = false + member val SupportsFormatOnPaste = true member val SupportsFormatOnReturn = true override __.SupportsFormattingOnTypedCharacter (document, ch) = @@ -104,8 +188,10 @@ type internal FSharpEditorFormattingService async { return ResizeArray() :> IList<_> } |> RoslynHelpers.StartAsyncAsTask cancellationToken - override __.GetFormattingChangesOnPasteAsync (_document, _span, cancellationToken) = - async { return ResizeArray() :> IList<_> } + override this.GetFormattingChangesOnPasteAsync (document, span, cancellationToken) = + let currentClipboard = Clipboard.GetText() + + this.OnPasteAsync (document, span, currentClipboard, cancellationToken) |> RoslynHelpers.StartAsyncAsTask cancellationToken override this.GetFormattingChangesAsync (document, _typedChar, position, cancellationToken) = diff --git a/vsintegration/src/FSharp.Editor/Formatting/IndentationService.fs b/vsintegration/src/FSharp.Editor/Formatting/IndentationService.fs index c4c293624bd..20acd00c462 100644 --- a/vsintegration/src/FSharp.Editor/Formatting/IndentationService.fs +++ b/vsintegration/src/FSharp.Editor/Formatting/IndentationService.fs @@ -23,38 +23,26 @@ type internal FSharpIndentationService static member IsSmartIndentEnabled (options: Microsoft.CodeAnalysis.Options.OptionSet) = options.GetOption(FormattingOptions.SmartIndent, FSharpConstants.FSharpLanguageName) = FormattingOptions.IndentStyle.Smart - static member GetDesiredIndentation(documentId: DocumentId, sourceText: SourceText, filePath: string, lineNumber: int, tabSize: int, indentStyle: FormattingOptions.IndentStyle, options: (FSharpParsingOptions * FSharpProjectOptions) option): Option = - - // Match indentation with previous line - let rec tryFindPreviousNonEmptyLine l = - if l <= 0 then None - else - let previousLine = sourceText.Lines.[l - 1] - if not (String.IsNullOrEmpty(previousLine.ToString())) then - Some previousLine - else - tryFindPreviousNonEmptyLine (l - 1) - - let rec tryFindLastNonWhitespaceOrCommentToken (line: TextLine) = maybe { - let! parsingOptions, _projectOptions = options + static member IndentShouldFollow (documentId: DocumentId, sourceText: SourceText, filePath: string, position: int, parsingOptions: FSharpParsingOptions) = + let lastTokenOpt = let defines = CompilerEnvironment.GetCompilationDefinesForEditing parsingOptions - let tokens = Tokenizer.tokenizeLine(documentId, sourceText, line.Start, filePath, defines) - - return! - tokens - |> Array.rev - |> Array.tryFind (fun x -> - x.Tag <> FSharpTokenTag.WHITESPACE && - x.Tag <> FSharpTokenTag.COMMENT && - x.Tag <> FSharpTokenTag.LINE_COMMENT) - } + let tokens = Tokenizer.tokenizeLine(documentId, sourceText, position, filePath, defines) + + tokens + |> Array.rev + |> Array.tryFind (fun x -> + x.Tag <> FSharpTokenTag.WHITESPACE && + x.Tag <> FSharpTokenTag.COMMENT && + x.Tag <> FSharpTokenTag.LINE_COMMENT) let (|Eq|_|) y x = if x = y then Some() else None - let (|NeedIndent|_|) (token: Tokenizer.SavedTokenInfo) = - match token.Tag with + match lastTokenOpt with + | None -> false + | Some lastToken -> + match lastToken.Tag with | Eq FSharpTokenTag.EQUALS // = | Eq FSharpTokenTag.LARROW // <- | Eq FSharpTokenTag.RARROW // -> @@ -70,8 +58,20 @@ type internal FSharpIndentationService | Eq FSharpTokenTag.STRUCT // struct | Eq FSharpTokenTag.CLASS // class | Eq FSharpTokenTag.TRY -> // try - Some () - | _ -> None + true + | _ -> false + + static member GetDesiredIndentation(documentId: DocumentId, sourceText: SourceText, filePath: string, lineNumber: int, tabSize: int, indentStyle: FormattingOptions.IndentStyle, options: (FSharpParsingOptions * FSharpProjectOptions) option): Option = + + // Match indentation with previous line + let rec tryFindPreviousNonEmptyLine l = + if l <= 0 then None + else + let previousLine = sourceText.Lines.[l - 1] + if not (String.IsNullOrEmpty(previousLine.ToString())) then + Some previousLine + else + tryFindPreviousNonEmptyLine (l - 1) maybe { let! previousLine = tryFindPreviousNonEmptyLine lineNumber @@ -81,18 +81,15 @@ type internal FSharpIndentationService |> Seq.takeWhile ((=) ' ') |> Seq.length + let! parsingOptions, _ = options + // Only use smart indentation after tokens that need indentation // if the option is enabled - let lastToken = - if indentStyle = FormattingOptions.IndentStyle.Smart then - tryFindLastNonWhitespaceOrCommentToken previousLine - else - None - return - match lastToken with - | Some NeedIndent -> (lastIndent/tabSize + 1) * tabSize - | _ -> lastIndent + if indentStyle = FormattingOptions.IndentStyle.Smart && FSharpIndentationService.IndentShouldFollow(documentId, sourceText, filePath, previousLine.Start, parsingOptions) then + (lastIndent/tabSize + 1) * tabSize + else + lastIndent } interface ISynchronousIndentationService with diff --git a/vsintegration/src/FSharp.Editor/LanguageService/LanguageService.fs b/vsintegration/src/FSharp.Editor/LanguageService/LanguageService.fs index a91cd2634b5..0621b0fd9b4 100644 --- a/vsintegration/src/FSharp.Editor/LanguageService/LanguageService.fs +++ b/vsintegration/src/FSharp.Editor/LanguageService/LanguageService.fs @@ -101,6 +101,7 @@ type internal FSharpSettingsFactory [, "F#", null, "Performance", "6011")>] [, "F#", null, "Advanced", "6012")>] [, "F#", null, "CodeLens", "6013")>] +[, "F#", null, "Formatting", "6014")>] [] // 64 represents a hex number. It needs to be greater than 37 so the TextMate editor will not be chosen as higher priority. [, ".fs", 64)>] diff --git a/vsintegration/src/FSharp.Editor/Options/EditorOptions.fs b/vsintegration/src/FSharp.Editor/Options/EditorOptions.fs index 47dcad5a029..14578e617c6 100644 --- a/vsintegration/src/FSharp.Editor/Options/EditorOptions.fs +++ b/vsintegration/src/FSharp.Editor/Options/EditorOptions.fs @@ -94,6 +94,12 @@ type AdvancedOptions = { IsBlockStructureEnabled = true IsOutliningEnabled = true } +[] +type FormattingOptions = + { FormatOnPaste: bool } + static member Default = + { FormatOnPaste = true } + [] [)>] type EditorOptions @@ -111,6 +117,7 @@ type EditorOptions store.Register AdvancedOptions.Default store.Register IntelliSenseOptions.Default store.Register CodeLensOptions.Default + store.Register FormattingOptions.Default member __.IntelliSense : IntelliSenseOptions = store.Read() member __.QuickInfo : QuickInfoOptions = store.Read() @@ -118,6 +125,7 @@ type EditorOptions member __.LanguageServicePerformance : LanguageServicePerformanceOptions = store.Read() member __.Advanced: AdvancedOptions = store.Read() member __.CodeLens: CodeLensOptions = store.Read() + member __.Formatting : FormattingOptions = store.Read() interface Microsoft.CodeAnalysis.Host.IWorkspaceService @@ -183,3 +191,9 @@ module internal OptionsUI = inherit AbstractOptionPage() override __.CreateView() = upcast AdvancedOptionsControl() + + [] + type internal FormattingOptionPage() = + inherit AbstractOptionPage() + override __.CreateView() = + upcast FormattingOptionsControl() diff --git a/vsintegration/src/FSharp.Editor/xlf/FSharp.Editor.cs.xlf b/vsintegration/src/FSharp.Editor/xlf/FSharp.Editor.cs.xlf index 73d205eca82..0654a740171 100644 --- a/vsintegration/src/FSharp.Editor/xlf/FSharp.Editor.cs.xlf +++ b/vsintegration/src/FSharp.Editor/xlf/FSharp.Editor.cs.xlf @@ -157,6 +157,11 @@ CodeLens + + Formatting + Formatting + + \ No newline at end of file diff --git a/vsintegration/src/FSharp.Editor/xlf/FSharp.Editor.de.xlf b/vsintegration/src/FSharp.Editor/xlf/FSharp.Editor.de.xlf index b728e57410b..aa863bc5944 100644 --- a/vsintegration/src/FSharp.Editor/xlf/FSharp.Editor.de.xlf +++ b/vsintegration/src/FSharp.Editor/xlf/FSharp.Editor.de.xlf @@ -157,6 +157,11 @@ CodeLens + + Formatting + Formatting + + \ No newline at end of file diff --git a/vsintegration/src/FSharp.Editor/xlf/FSharp.Editor.en.xlf b/vsintegration/src/FSharp.Editor/xlf/FSharp.Editor.en.xlf index 666f3a369b5..ce6a404fc97 100644 --- a/vsintegration/src/FSharp.Editor/xlf/FSharp.Editor.en.xlf +++ b/vsintegration/src/FSharp.Editor/xlf/FSharp.Editor.en.xlf @@ -157,6 +157,11 @@ CodeLens + + Formatting + Formatting + + \ No newline at end of file diff --git a/vsintegration/src/FSharp.Editor/xlf/FSharp.Editor.es.xlf b/vsintegration/src/FSharp.Editor/xlf/FSharp.Editor.es.xlf index 26758d30cf8..46096198e54 100644 --- a/vsintegration/src/FSharp.Editor/xlf/FSharp.Editor.es.xlf +++ b/vsintegration/src/FSharp.Editor/xlf/FSharp.Editor.es.xlf @@ -157,6 +157,11 @@ CodeLens + + Formatting + Formatting + + \ No newline at end of file diff --git a/vsintegration/src/FSharp.Editor/xlf/FSharp.Editor.fr.xlf b/vsintegration/src/FSharp.Editor/xlf/FSharp.Editor.fr.xlf index eadd06f5dbd..a036f2e361f 100644 --- a/vsintegration/src/FSharp.Editor/xlf/FSharp.Editor.fr.xlf +++ b/vsintegration/src/FSharp.Editor/xlf/FSharp.Editor.fr.xlf @@ -157,6 +157,11 @@ CodeLens + + Formatting + Formatting + + \ No newline at end of file diff --git a/vsintegration/src/FSharp.Editor/xlf/FSharp.Editor.it.xlf b/vsintegration/src/FSharp.Editor/xlf/FSharp.Editor.it.xlf index d288d6839fc..088b2b6a806 100644 --- a/vsintegration/src/FSharp.Editor/xlf/FSharp.Editor.it.xlf +++ b/vsintegration/src/FSharp.Editor/xlf/FSharp.Editor.it.xlf @@ -157,6 +157,11 @@ CodeLens + + Formatting + Formatting + + \ No newline at end of file diff --git a/vsintegration/src/FSharp.Editor/xlf/FSharp.Editor.ja.xlf b/vsintegration/src/FSharp.Editor/xlf/FSharp.Editor.ja.xlf index 8b05b335d8f..3de44bfa2e5 100644 --- a/vsintegration/src/FSharp.Editor/xlf/FSharp.Editor.ja.xlf +++ b/vsintegration/src/FSharp.Editor/xlf/FSharp.Editor.ja.xlf @@ -157,6 +157,11 @@ CodeLens + + Formatting + Formatting + + \ No newline at end of file diff --git a/vsintegration/src/FSharp.Editor/xlf/FSharp.Editor.ko.xlf b/vsintegration/src/FSharp.Editor/xlf/FSharp.Editor.ko.xlf index b017a3562e1..033e677e964 100644 --- a/vsintegration/src/FSharp.Editor/xlf/FSharp.Editor.ko.xlf +++ b/vsintegration/src/FSharp.Editor/xlf/FSharp.Editor.ko.xlf @@ -157,6 +157,11 @@ CodeLens + + Formatting + Formatting + + \ No newline at end of file diff --git a/vsintegration/src/FSharp.Editor/xlf/FSharp.Editor.pl.xlf b/vsintegration/src/FSharp.Editor/xlf/FSharp.Editor.pl.xlf index e0898181ecb..883d6916ced 100644 --- a/vsintegration/src/FSharp.Editor/xlf/FSharp.Editor.pl.xlf +++ b/vsintegration/src/FSharp.Editor/xlf/FSharp.Editor.pl.xlf @@ -157,6 +157,11 @@ CodeLens + + Formatting + Formatting + + \ No newline at end of file diff --git a/vsintegration/src/FSharp.Editor/xlf/FSharp.Editor.pt-BR.xlf b/vsintegration/src/FSharp.Editor/xlf/FSharp.Editor.pt-BR.xlf index 03c3c7bf667..b326f493f69 100644 --- a/vsintegration/src/FSharp.Editor/xlf/FSharp.Editor.pt-BR.xlf +++ b/vsintegration/src/FSharp.Editor/xlf/FSharp.Editor.pt-BR.xlf @@ -157,6 +157,11 @@ CodeLens + + Formatting + Formatting + + \ No newline at end of file diff --git a/vsintegration/src/FSharp.Editor/xlf/FSharp.Editor.ru.xlf b/vsintegration/src/FSharp.Editor/xlf/FSharp.Editor.ru.xlf index 16a1bba37ae..dc9dfbf737e 100644 --- a/vsintegration/src/FSharp.Editor/xlf/FSharp.Editor.ru.xlf +++ b/vsintegration/src/FSharp.Editor/xlf/FSharp.Editor.ru.xlf @@ -157,6 +157,11 @@ CodeLens + + Formatting + Formatting + + \ No newline at end of file diff --git a/vsintegration/src/FSharp.Editor/xlf/FSharp.Editor.tr.xlf b/vsintegration/src/FSharp.Editor/xlf/FSharp.Editor.tr.xlf index dd4dd7d6c03..6e5f80d10fd 100644 --- a/vsintegration/src/FSharp.Editor/xlf/FSharp.Editor.tr.xlf +++ b/vsintegration/src/FSharp.Editor/xlf/FSharp.Editor.tr.xlf @@ -157,6 +157,11 @@ CodeLens + + Formatting + Formatting + + \ No newline at end of file diff --git a/vsintegration/src/FSharp.Editor/xlf/FSharp.Editor.zh-Hans.xlf b/vsintegration/src/FSharp.Editor/xlf/FSharp.Editor.zh-Hans.xlf index 1c301f002c1..f214f085784 100644 --- a/vsintegration/src/FSharp.Editor/xlf/FSharp.Editor.zh-Hans.xlf +++ b/vsintegration/src/FSharp.Editor/xlf/FSharp.Editor.zh-Hans.xlf @@ -157,6 +157,11 @@ CodeLens + + Formatting + Formatting + + \ No newline at end of file diff --git a/vsintegration/src/FSharp.Editor/xlf/FSharp.Editor.zh-Hant.xlf b/vsintegration/src/FSharp.Editor/xlf/FSharp.Editor.zh-Hant.xlf index bcbd222af0d..68fb0da4a0b 100644 --- a/vsintegration/src/FSharp.Editor/xlf/FSharp.Editor.zh-Hant.xlf +++ b/vsintegration/src/FSharp.Editor/xlf/FSharp.Editor.zh-Hant.xlf @@ -157,6 +157,11 @@ CodeLens + + Formatting + Formatting + + \ No newline at end of file diff --git a/vsintegration/src/FSharp.UIResources/FSharp.UIResources.csproj b/vsintegration/src/FSharp.UIResources/FSharp.UIResources.csproj index a5d5df95ee1..0bc0e961369 100644 --- a/vsintegration/src/FSharp.UIResources/FSharp.UIResources.csproj +++ b/vsintegration/src/FSharp.UIResources/FSharp.UIResources.csproj @@ -26,13 +26,28 @@ + + + True + True + Strings.resx + + + + + PublicResXFileCodeGenerator + Strings.Designer.cs + + + - - + + + @@ -58,5 +73,7 @@ false - + + + \ No newline at end of file diff --git a/vsintegration/src/FSharp.UIResources/FormattingOptionsControl.xaml b/vsintegration/src/FSharp.UIResources/FormattingOptionsControl.xaml new file mode 100644 index 00000000000..d69712f6120 --- /dev/null +++ b/vsintegration/src/FSharp.UIResources/FormattingOptionsControl.xaml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + diff --git a/vsintegration/src/FSharp.UIResources/FormattingOptionsControl.xaml.cs b/vsintegration/src/FSharp.UIResources/FormattingOptionsControl.xaml.cs new file mode 100644 index 00000000000..ade1f2291ed --- /dev/null +++ b/vsintegration/src/FSharp.UIResources/FormattingOptionsControl.xaml.cs @@ -0,0 +1,28 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Input; +using System.Windows.Media; +using System.Windows.Media.Imaging; +using System.Windows.Navigation; +using System.Windows.Shapes; + +namespace Microsoft.VisualStudio.FSharp.UIResources +{ + /// + /// Interaction logic for FormattingOptionsControl.xaml + /// + public partial class FormattingOptionsControl : UserControl + { + public FormattingOptionsControl() + { + InitializeComponent(); + } + } +} diff --git a/vsintegration/src/FSharp.UIResources/Strings.Designer.cs b/vsintegration/src/FSharp.UIResources/Strings.Designer.cs index a1afd465942..23634b9f2c6 100644 --- a/vsintegration/src/FSharp.UIResources/Strings.Designer.cs +++ b/vsintegration/src/FSharp.UIResources/Strings.Designer.cs @@ -168,6 +168,15 @@ public static string Enable_in_memory_cross_project_references { } } + /// + /// Looks up a localized string similar to Re-format indentation on paste. + /// + public static string Format_on_paste { + get { + return ResourceManager.GetString("Format_on_paste", resourceCulture); + } + } + /// /// Looks up a localized string similar to Enable stale data for IntelliSense features. /// diff --git a/vsintegration/src/FSharp.UIResources/Strings.resx b/vsintegration/src/FSharp.UIResources/Strings.resx index a10b4454580..11862ae1a14 100644 --- a/vsintegration/src/FSharp.UIResources/Strings.resx +++ b/vsintegration/src/FSharp.UIResources/Strings.resx @@ -225,4 +225,7 @@ Enter key behavior + + Re-format indentation on paste + \ No newline at end of file diff --git a/vsintegration/src/FSharp.UIResources/xlf/Strings.cs.xlf b/vsintegration/src/FSharp.UIResources/xlf/Strings.cs.xlf index 239e9000005..162cd846f77 100644 --- a/vsintegration/src/FSharp.UIResources/xlf/Strings.cs.xlf +++ b/vsintegration/src/FSharp.UIResources/xlf/Strings.cs.xlf @@ -182,6 +182,11 @@ Enter key behavior + + Re-format indentation on paste + Re-format indentation on paste + + \ No newline at end of file diff --git a/vsintegration/src/FSharp.UIResources/xlf/Strings.de.xlf b/vsintegration/src/FSharp.UIResources/xlf/Strings.de.xlf index 4bd995642a6..45f2b2912e9 100644 --- a/vsintegration/src/FSharp.UIResources/xlf/Strings.de.xlf +++ b/vsintegration/src/FSharp.UIResources/xlf/Strings.de.xlf @@ -182,6 +182,11 @@ Enter key behavior + + Re-format indentation on paste + Re-format indentation on paste + + \ No newline at end of file diff --git a/vsintegration/src/FSharp.UIResources/xlf/Strings.en.xlf b/vsintegration/src/FSharp.UIResources/xlf/Strings.en.xlf index 9c5b33763c9..d37ed25e390 100644 --- a/vsintegration/src/FSharp.UIResources/xlf/Strings.en.xlf +++ b/vsintegration/src/FSharp.UIResources/xlf/Strings.en.xlf @@ -182,6 +182,11 @@ Enter key behavior + + Re-format indentation on paste + Re-format indentation on paste + + \ No newline at end of file diff --git a/vsintegration/src/FSharp.UIResources/xlf/Strings.es.xlf b/vsintegration/src/FSharp.UIResources/xlf/Strings.es.xlf index 545ceb9b15b..aaffbe80b3f 100644 --- a/vsintegration/src/FSharp.UIResources/xlf/Strings.es.xlf +++ b/vsintegration/src/FSharp.UIResources/xlf/Strings.es.xlf @@ -182,6 +182,11 @@ Enter key behavior + + Re-format indentation on paste + Re-format indentation on paste + + \ No newline at end of file diff --git a/vsintegration/src/FSharp.UIResources/xlf/Strings.fr.xlf b/vsintegration/src/FSharp.UIResources/xlf/Strings.fr.xlf index dea1037b7b3..1ac52555cef 100644 --- a/vsintegration/src/FSharp.UIResources/xlf/Strings.fr.xlf +++ b/vsintegration/src/FSharp.UIResources/xlf/Strings.fr.xlf @@ -182,6 +182,11 @@ Enter key behavior + + Re-format indentation on paste + Re-format indentation on paste + + \ No newline at end of file diff --git a/vsintegration/src/FSharp.UIResources/xlf/Strings.it.xlf b/vsintegration/src/FSharp.UIResources/xlf/Strings.it.xlf index 22ed85d58f7..24b0b788bd5 100644 --- a/vsintegration/src/FSharp.UIResources/xlf/Strings.it.xlf +++ b/vsintegration/src/FSharp.UIResources/xlf/Strings.it.xlf @@ -182,6 +182,11 @@ Enter key behavior + + Re-format indentation on paste + Re-format indentation on paste + + \ No newline at end of file diff --git a/vsintegration/src/FSharp.UIResources/xlf/Strings.ja.xlf b/vsintegration/src/FSharp.UIResources/xlf/Strings.ja.xlf index 4230bb7e5ba..c33d988b863 100644 --- a/vsintegration/src/FSharp.UIResources/xlf/Strings.ja.xlf +++ b/vsintegration/src/FSharp.UIResources/xlf/Strings.ja.xlf @@ -182,6 +182,11 @@ Enter key behavior + + Re-format indentation on paste + Re-format indentation on paste + + \ No newline at end of file diff --git a/vsintegration/src/FSharp.UIResources/xlf/Strings.ko.xlf b/vsintegration/src/FSharp.UIResources/xlf/Strings.ko.xlf index 9429a1d42ab..b669c2d72e6 100644 --- a/vsintegration/src/FSharp.UIResources/xlf/Strings.ko.xlf +++ b/vsintegration/src/FSharp.UIResources/xlf/Strings.ko.xlf @@ -182,6 +182,11 @@ Enter key behavior + + Re-format indentation on paste + Re-format indentation on paste + + \ No newline at end of file diff --git a/vsintegration/src/FSharp.UIResources/xlf/Strings.pl.xlf b/vsintegration/src/FSharp.UIResources/xlf/Strings.pl.xlf index 41c64aebd31..c147de0de05 100644 --- a/vsintegration/src/FSharp.UIResources/xlf/Strings.pl.xlf +++ b/vsintegration/src/FSharp.UIResources/xlf/Strings.pl.xlf @@ -182,6 +182,11 @@ Enter key behavior + + Re-format indentation on paste + Re-format indentation on paste + + \ No newline at end of file diff --git a/vsintegration/src/FSharp.UIResources/xlf/Strings.pt-BR.xlf b/vsintegration/src/FSharp.UIResources/xlf/Strings.pt-BR.xlf index a7efc694f2b..5f120677515 100644 --- a/vsintegration/src/FSharp.UIResources/xlf/Strings.pt-BR.xlf +++ b/vsintegration/src/FSharp.UIResources/xlf/Strings.pt-BR.xlf @@ -182,6 +182,11 @@ Enter key behavior + + Re-format indentation on paste + Re-format indentation on paste + + \ No newline at end of file diff --git a/vsintegration/src/FSharp.UIResources/xlf/Strings.ru.xlf b/vsintegration/src/FSharp.UIResources/xlf/Strings.ru.xlf index 892209a2d43..7bfb60eef68 100644 --- a/vsintegration/src/FSharp.UIResources/xlf/Strings.ru.xlf +++ b/vsintegration/src/FSharp.UIResources/xlf/Strings.ru.xlf @@ -182,6 +182,11 @@ Enter key behavior + + Re-format indentation on paste + Re-format indentation on paste + + \ No newline at end of file diff --git a/vsintegration/src/FSharp.UIResources/xlf/Strings.tr.xlf b/vsintegration/src/FSharp.UIResources/xlf/Strings.tr.xlf index f1187f2e25c..6fc089bc3c9 100644 --- a/vsintegration/src/FSharp.UIResources/xlf/Strings.tr.xlf +++ b/vsintegration/src/FSharp.UIResources/xlf/Strings.tr.xlf @@ -182,6 +182,11 @@ Enter key behavior + + Re-format indentation on paste + Re-format indentation on paste + + \ No newline at end of file diff --git a/vsintegration/src/FSharp.UIResources/xlf/Strings.zh-Hans.xlf b/vsintegration/src/FSharp.UIResources/xlf/Strings.zh-Hans.xlf index db270930177..f1f0caa8e5e 100644 --- a/vsintegration/src/FSharp.UIResources/xlf/Strings.zh-Hans.xlf +++ b/vsintegration/src/FSharp.UIResources/xlf/Strings.zh-Hans.xlf @@ -182,6 +182,11 @@ Enter key behavior + + Re-format indentation on paste + Re-format indentation on paste + + \ No newline at end of file diff --git a/vsintegration/src/FSharp.UIResources/xlf/Strings.zh-Hant.xlf b/vsintegration/src/FSharp.UIResources/xlf/Strings.zh-Hant.xlf index 264a4df8808..2d8638de434 100644 --- a/vsintegration/src/FSharp.UIResources/xlf/Strings.zh-Hant.xlf +++ b/vsintegration/src/FSharp.UIResources/xlf/Strings.zh-Hant.xlf @@ -182,6 +182,11 @@ Enter key behavior + + Re-format indentation on paste + Re-format indentation on paste + + \ No newline at end of file diff --git a/vsintegration/tests/UnitTests/EditorFormattingServiceTests.fs b/vsintegration/tests/UnitTests/EditorFormattingServiceTests.fs index 82101256552..c1d043377d5 100644 --- a/vsintegration/tests/UnitTests/EditorFormattingServiceTests.fs +++ b/vsintegration/tests/UnitTests/EditorFormattingServiceTests.fs @@ -2,13 +2,10 @@ namespace Microsoft.VisualStudio.FSharp.Editor.Tests.Roslyn open System -open System.Threading open NUnit.Framework open Microsoft.CodeAnalysis -open Microsoft.CodeAnalysis.Classification -open Microsoft.CodeAnalysis.Editor open Microsoft.CodeAnalysis.Text open Microsoft.VisualStudio.FSharp.Editor open Microsoft.FSharp.Compiler.SourceCodeServices @@ -32,12 +29,11 @@ type EditorFormattingServiceTests() = ExtraProjectInfo = None Stamp = None } - //let parsingOptions: FSharpParsingOptions = let documentId = DocumentId.CreateNewId(ProjectId.CreateNewId()) let indentStyle = FormattingOptions.IndentStyle.Smart - let template = """ + let indentTemplate = """ let foo = [ 15 ]marker1 @@ -56,6 +52,18 @@ let def = "hi" )marker4 """ + + let pasteTemplate = """ + +let foo = + printfn "Something here" + marker1 + +marker2 + + marker3 + +marker4""" [] [] @@ -63,17 +71,162 @@ let def = [] member this.TestIndentation(marker: string, expectedLine: string) = let checker = FSharpChecker.Create() - let position = template.IndexOf(marker) + let position = indentTemplate.IndexOf(marker) Assert.IsTrue(position >= 0, "Precondition failed: unable to find marker in template") - let sourceText = SourceText.From(template) + let sourceText = SourceText.From(indentTemplate) let lineNumber = sourceText.Lines |> Seq.findIndex (fun line -> line.Span.Contains position) let parsingOptions, _ = checker.GetParsingOptionsFromProjectOptions projectOptions let changesOpt = FSharpEditorFormattingService.GetFormattingChanges(documentId, sourceText, filePath, checker, indentStyle, Some (parsingOptions, projectOptions), position) |> Async.RunSynchronously match changesOpt with | None -> Assert.Fail("Expected a text change, but got None") - | Some change -> - let changedText = sourceText.WithChanges(change) + | Some changes -> + let changedText = sourceText.WithChanges(changes) let lineText = changedText.Lines.[lineNumber].ToString() Assert.IsTrue(lineText.StartsWith(expectedLine), "Changed line does not start with expected text") + + [] + [] + [] + member this.TestPasteChanges_PastingOntoIndentedLine(enabled: bool, prefix: string) = + let checker = FSharpChecker.Create() + let parsingOptions, _ = checker.GetParsingOptionsFromProjectOptions projectOptions + + let clipboard = prefix + """[] + type SomeNameHere () = + member __.Test ()""" + + let start = """ + +let foo = + printfn "Something here" + $ + +somethingElseHere +""" + + let expected = """ + +let foo = + printfn "Something here" + [] + type SomeNameHere () = + member __.Test () + +somethingElseHere +""" + + let sourceText = SourceText.From(start.Replace("$", clipboard)) + let span = TextSpan(start.IndexOf '$', clipboard.Length) + + let formattingOptions = { FormatOnPaste = enabled } + + let changesOpt = + FSharpEditorFormattingService.GetPasteChanges(documentId, sourceText, filePath, formattingOptions, 4, parsingOptions, clipboard, span) + |> Async.RunSynchronously + |> Option.map List.ofSeq + + if enabled then + match changesOpt with + | Some changes -> + let changedText = sourceText.WithChanges(changes).ToString() + Assert.AreEqual(expected, changedText) + | _ -> Assert.Fail (sprintf "Expected text changes, but got %+A" changesOpt) + else + Assert.AreEqual(None, changesOpt, "Expected no changes as FormatOnPaste is disabled") + + [] + [] + member this.TestPasteChanges_PastingOntoEmptyLine(prefix: string) = + let checker = FSharpChecker.Create() + let parsingOptions, _ = checker.GetParsingOptionsFromProjectOptions projectOptions + + let clipboard = prefix + """[] + type SomeNameHere () = + member __.Test ()""" + + let start = """ +$ + +let foo = + printfn "Something here" + +somethingElseHere +""" + + let expected = """ +[] +type SomeNameHere () = + member __.Test () + +let foo = + printfn "Something here" + +somethingElseHere +""" + + let sourceText = SourceText.From(start.Replace("$", clipboard)) + let span = TextSpan(start.IndexOf '$', clipboard.Length) + + let formattingOptions = { FormatOnPaste = true } + + let changesOpt = + FSharpEditorFormattingService.GetPasteChanges(documentId, sourceText, filePath, formattingOptions, 4, parsingOptions, clipboard, span) + |> Async.RunSynchronously + |> Option.map List.ofSeq + + match changesOpt with + | Some changes -> + let changedText = sourceText.WithChanges(changes).ToString() + Assert.AreEqual(expected, changedText) + | _ -> Assert.Fail (sprintf "Expected a changes, but got %+A" changesOpt) + + [] + member this.TestPasteChanges_PastingWithAutoIndentationInPasteSpan() = + let checker = FSharpChecker.Create() + let parsingOptions, _ = checker.GetParsingOptionsFromProjectOptions projectOptions + + let clipboard = """[] + type SomeNameHere () = + member __.Test ()""" + + let start = """ + +let foo = + printfn "Something here" + $ + +somethingElseHere +""" + + let expected = """ + +let foo = + printfn "Something here" + [] + type SomeNameHere () = + member __.Test () + +somethingElseHere +""" + + let sourceText = SourceText.From(start.Replace("$", clipboard)) + + // If we're pasting on an empty line which has been automatically indented, + // then the pasted span includes this automatic indentation. Check that we + // still format as expected + let span = TextSpan(start.IndexOf '$' - 4, clipboard.Length + 4) + + let formattingOptions = { FormatOnPaste = true } + + let changesOpt = + FSharpEditorFormattingService.GetPasteChanges(documentId, sourceText, filePath, formattingOptions, 4, parsingOptions, clipboard, span) + |> Async.RunSynchronously + |> Option.map List.ofSeq + + match changesOpt with + | Some changes -> + let changedText = sourceText.WithChanges(changes).ToString() + Assert.AreEqual(expected, changedText) + | _ -> Assert.Fail (sprintf "Expected a changes, but got %+A" changesOpt) From fb9f425d9ea7d10f53bd60b2dd17783fb556669b Mon Sep 17 00:00:00 2001 From: Eugene Auduchinok Date: Wed, 17 Oct 2018 03:38:38 +0300 Subject: [PATCH 084/160] Add decoded ILAttribute representation (#5674) * Add decoded ILAttribute representation * Remove ILAttribute.Data * Add docs --- src/absil/il.fs | 68 +++++++++++++++++++++++++++++------------- src/absil/il.fsi | 22 ++++++++++---- src/absil/ilmorph.fs | 10 +++---- src/absil/ilprint.fs | 24 ++++++++------- src/absil/ilprint.fsi | 2 +- src/absil/ilread.fs | 9 +++--- src/absil/ilreflect.fs | 4 +-- src/absil/ilwrite.fs | 5 ++-- src/fsharp/fsi/fsi.fs | 2 +- 9 files changed, 94 insertions(+), 52 deletions(-) diff --git a/src/absil/il.fs b/src/absil/il.fs index b1bf2fdf920..6d25d3a4bf6 100644 --- a/src/absil/il.fs +++ b/src/absil/il.fs @@ -946,11 +946,25 @@ type ILAttribElem = type ILAttributeNamedArg = (string * ILType * bool * ILAttribElem) -[] -type ILAttribute = - { Method: ILMethodSpec - Data: byte[] - Elements: ILAttribElem list } +[] +type ILAttribute = + | Encoded of method: ILMethodSpec * data: byte[] * elements: ILAttribElem list + | Decoded of method: ILMethodSpec * fixedArgs: ILAttribElem list * namedArgs: ILAttributeNamedArg list + + member x.Method = + match x with + | Encoded (method, _, _) + | Decoded (method, _, _) -> method + + member x.Elements = + match x with + | Encoded (_, _, elements) -> elements + | Decoded (_, fixedArgs, namedArgs) -> fixedArgs @ (namedArgs |> List.map (fun (_, _, _, e) -> e)) + + member x.WithMethod(method: ILMethodSpec) = + match x with + | Encoded (_, data, elements) -> Encoded (method, data, elements) + | Decoded (_, fixedArgs, namedArgs) -> Decoded (method, fixedArgs, namedArgs) /// For debugging [] @@ -3571,21 +3585,30 @@ let encodeCustomAttrNamedArg ilg (nm, ty, prop, elem) = yield! encodeCustomAttrString nm yield! encodeCustomAttrValue ilg ty elem |] -let mkILCustomAttribMethRef (ilg: ILGlobals) (mspec:ILMethodSpec, fixedArgs: list<_>, namedArgs: list<_>) = +let encodeCustomAttrArgs (ilg: ILGlobals) (mspec:ILMethodSpec) (fixedArgs: list<_>) (namedArgs: list<_>) = let argtys = mspec.MethodRef.ArgTypes - let args = - [| yield! [| 0x01uy; 0x00uy; |] - for (argty, fixedArg) in Seq.zip argtys fixedArgs do - yield! encodeCustomAttrValue ilg argty fixedArg - yield! u16AsBytes (uint16 namedArgs.Length) - for namedArg in namedArgs do - yield! encodeCustomAttrNamedArg ilg namedArg |] - { Method = mspec - Data = args - Elements = fixedArgs @ (namedArgs |> List.map(fun (_, _, _, e) -> e)) } - -let mkILCustomAttribute ilg (tref, argtys, argvs, propvs) = - mkILCustomAttribMethRef ilg (mkILNonGenericCtorMethSpec (tref, argtys), argvs, propvs) + [| yield! [| 0x01uy; 0x00uy; |] + for (argty, fixedArg) in Seq.zip argtys fixedArgs do + yield! encodeCustomAttrValue ilg argty fixedArg + yield! u16AsBytes (uint16 namedArgs.Length) + for namedArg in namedArgs do + yield! encodeCustomAttrNamedArg ilg namedArg |] + +let encodeCustomAttr (ilg: ILGlobals) (mspec:ILMethodSpec, fixedArgs: list<_>, namedArgs: list<_>) = + let args = encodeCustomAttrArgs ilg mspec fixedArgs namedArgs + ILAttribute.Encoded (mspec, args, fixedArgs @ (namedArgs |> List.map (fun (_, _, _, e) -> e))) + +let mkILCustomAttribMethRef (ilg: ILGlobals) (mspec:ILMethodSpec, fixedArgs: list<_>, namedArgs: list<_>) = + encodeCustomAttr ilg (mspec, fixedArgs, namedArgs) + +let mkILCustomAttribute ilg (tref, argtys, argvs, propvs) = + encodeCustomAttr ilg (mkILNonGenericCtorMethSpec (tref, argtys), argvs, propvs) + +let getCustomAttrData (ilg: ILGlobals) cattr = + match cattr with + | ILAttribute.Encoded (_, data, _) -> data + | ILAttribute.Decoded (mspec, fixedArgs, namedArgs) -> + encodeCustomAttrArgs ilg mspec fixedArgs namedArgs let MscorlibScopeRef = ILScopeRef.Assembly (ILAssemblyRef.Create("mscorlib", None, Some ecmaPublicKey, true, None, None)) let EcmaMscorlibILGlobals = mkILGlobals MscorlibScopeRef @@ -3754,7 +3777,10 @@ type ILTypeSigParser(tstring : string) = ILAttribElem.Type(Some(ilty)) let decodeILAttribData (ilg: ILGlobals) (ca: ILAttribute) = - let bytes = ca.Data + match ca with + | ILAttribute.Decoded (_, fixedArgs, namedArgs) -> fixedArgs, namedArgs + | ILAttribute.Encoded (_, bytes, _) -> + let sigptr = 0 let bb0, sigptr = sigptr_get_byte bytes sigptr let bb1, sigptr = sigptr_get_byte bytes sigptr @@ -3943,7 +3969,7 @@ and refs_of_token s x = | ILToken.ILMethod mr -> refs_of_mspec s mr | ILToken.ILField fr -> refs_of_fspec s fr -and refs_of_custom_attr s x = refs_of_mspec s x.Method +and refs_of_custom_attr s (cattr: ILAttribute) = refs_of_mspec s cattr.Method and refs_of_custom_attrs s (cas : ILAttributes) = List.iter (refs_of_custom_attr s) cas.AsList and refs_of_varargs s tyso = Option.iter (refs_of_tys s) tyso diff --git a/src/absil/il.fsi b/src/absil/il.fsi index 3362f53d619..7148b6e0ab1 100644 --- a/src/absil/il.fsi +++ b/src/absil/il.fsi @@ -752,12 +752,22 @@ type ILAttribElem = /// Named args: values and flags indicating if they are fields or properties. type ILAttributeNamedArg = string * ILType * bool * ILAttribElem -/// Custom attributes. See 'decodeILAttribData' for a helper to parse the byte[] -/// to ILAttribElem's as best as possible. +/// Custom attribute. type ILAttribute = - { Method: ILMethodSpec - Data: byte[] - Elements: ILAttribElem list} + /// Attribute with args encoded to a binary blob according to ECMA-335 II.21 and II.23.3. + /// 'decodeILAttribData' is used to parse the byte[] blob to ILAttribElem's as best as possible. + | Encoded of method: ILMethodSpec * data: byte[] * elements: ILAttribElem list + + /// Attribute with args in decoded form. + | Decoded of method: ILMethodSpec * fixedArgs: ILAttribElem list * namedArgs: ILAttributeNamedArg list + + /// Attribute instance constructor. + member Method: ILMethodSpec + + /// Decoded arguments. May be empty in encoded attribute form. + member Elements: ILAttribElem list + + member WithMethod: method: ILMethodSpec -> ILAttribute [] type ILAttributes = @@ -1679,6 +1689,8 @@ val mkILCustomAttribute: ILAttributeNamedArg list (* named args: values and flags indicating if they are fields or properties *) -> ILAttribute +val getCustomAttrData: ILGlobals -> ILAttribute -> byte[] + val mkPermissionSet: ILGlobals -> ILSecurityAction * (ILTypeRef * (string * ILType * ILAttribElem) list) list -> ILSecurityDecl /// Making code. diff --git a/src/absil/ilmorph.fs b/src/absil/ilmorph.fs index c6d009cd4d3..d5398099e0d 100644 --- a/src/absil/ilmorph.fs +++ b/src/absil/ilmorph.fs @@ -136,7 +136,7 @@ let rec celem_ty2ty f celem = let cnamedarg_ty2ty f ((nm, ty, isProp, elem) : ILAttributeNamedArg) = (nm, f ty, isProp, celem_ty2ty f elem) -let cattr_ty2ty ilg f c = +let cattr_ty2ty ilg f (c: ILAttribute) = let meth = mspec_ty2ty (f, (fun _ -> f)) c.Method // dev11 M3 defensive coding: if anything goes wrong with attribute decoding or encoding, then back out. if morphCustomAttributeData then @@ -144,11 +144,11 @@ let cattr_ty2ty ilg f c = let elems,namedArgs = IL.decodeILAttribData ilg c let elems = elems |> List.map (celem_ty2ty f) let namedArgs = namedArgs |> List.map (cnamedarg_ty2ty f) - IL.mkILCustomAttribMethRef ilg (meth, elems, namedArgs) - with _ -> - { c with Method = meth } + mkILCustomAttribMethRef ilg (meth, elems, namedArgs) + with _ -> + c.WithMethod(meth) else - { c with Method = meth } + c.WithMethod(meth) let cattrs_ty2ty ilg f (cs: ILAttributes) = diff --git a/src/absil/ilprint.fs b/src/absil/ilprint.fs index f11524bc8d1..0ae779c6f60 100644 --- a/src/absil/ilprint.fs +++ b/src/absil/ilprint.fs @@ -30,13 +30,14 @@ let tyvar_generator = // Carry an environment because the way we print method variables // depends on the gparams of the current scope. type ppenv = - { ppenvClassFormals: int; + { ilGlobals: ILGlobals + ppenvClassFormals: int; ppenvMethodFormals: int } let ppenv_enter_method mgparams env = {env with ppenvMethodFormals=mgparams} let ppenv_enter_tdef gparams env = {env with ppenvClassFormals=List.length gparams; ppenvMethodFormals=0} -let mk_ppenv = { ppenvClassFormals=0; ppenvMethodFormals=0 } +let mk_ppenv ilg = { ilGlobals = ilg; ppenvClassFormals = 0; ppenvMethodFormals = 0 } let debug_ppenv = mk_ppenv let ppenv_enter_modul env = { env with ppenvClassFormals=0; ppenvMethodFormals=0 } @@ -469,10 +470,11 @@ let output_basic_type os x = let output_custom_attr_data os data = output_string os " = "; output_parens output_bytes os data -let goutput_custom_attr env os attr = +let goutput_custom_attr env os (attr: ILAttribute) = output_string os " .custom " goutput_mspec env os attr.Method - output_custom_attr_data os attr.Data + let data = getCustomAttrData env.ilGlobals attr + output_custom_attr_data os data let goutput_custom_attrs env os (attrs : ILAttributes) = List.iter (fun attr -> goutput_custom_attr env os attr; output_string os "\n" ) attrs.AsList @@ -1029,9 +1031,9 @@ let goutput_manifest env os m = output_string os " } \n" -let output_module_fragment_aux _refs os modul = +let output_module_fragment_aux _refs os (ilg: ILGlobals) modul = try - let env = mk_ppenv + let env = mk_ppenv ilg let env = ppenv_enter_modul env goutput_tdefs false ([]) env os modul.TypeDefs; goutput_tdefs true ([]) env os modul.TypeDefs; @@ -1039,9 +1041,9 @@ let output_module_fragment_aux _refs os modul = output_string os "*** Error during printing : "; output_string os (e.ToString()); os.Flush(); reraise() -let output_module_fragment os modul = +let output_module_fragment os (ilg: ILGlobals) modul = let refs = computeILRefs modul - output_module_fragment_aux refs os modul; + output_module_fragment_aux refs os ilg modul refs let output_module_refs os refs = @@ -1059,14 +1061,14 @@ let goutput_module_manifest env os modul = output_string os "\n"; (output_option (goutput_manifest env)) os modul.Manifest -let output_module os modul = +let output_module os (ilg: ILGlobals) modul = try let refs = computeILRefs modul - let env = mk_ppenv + let env = mk_ppenv ilg let env = ppenv_enter_modul env output_module_refs os refs; goutput_module_manifest env os modul; - output_module_fragment_aux refs os modul; + output_module_fragment_aux refs os ilg modul; with e -> output_string os "*** Error during printing : "; output_string os (e.ToString()); os.Flush(); raise e diff --git a/src/absil/ilprint.fsi b/src/absil/ilprint.fsi index 55e768ab686..5f7ebe4f11d 100644 --- a/src/absil/ilprint.fsi +++ b/src/absil/ilprint.fsi @@ -9,6 +9,6 @@ open Microsoft.FSharp.Compiler.AbstractIL.Internal open System.IO #if DEBUG -val public output_module : TextWriter -> ILModuleDef -> unit +val public output_module: TextWriter -> ilg: ILGlobals -> ILModuleDef -> unit #endif diff --git a/src/absil/ilread.fs b/src/absil/ilread.fs index 5d94041dae1..b08da89249f 100644 --- a/src/absil/ilread.fs +++ b/src/absil/ilread.fs @@ -2567,12 +2567,13 @@ and seekReadCustomAttr ctxt (TaggedIndex(cat, idx), b) = and seekReadCustomAttrUncached ctxtH (CustomAttrIdx (cat, idx, valIdx)) = let ctxt = getHole ctxtH - { Method=seekReadCustomAttrType ctxt (TaggedIndex(cat, idx)) - Data= + let method = seekReadCustomAttrType ctxt (TaggedIndex(cat, idx)) + let data = match readBlobHeapOption ctxt valIdx with | Some bytes -> bytes - | None -> Bytes.ofInt32Array [| |] - Elements = [] } + | None -> Bytes.ofInt32Array [| |] + let elements = [] + ILAttribute.Encoded (method, data, elements) and securityDeclsReader ctxtH tag = mkILSecurityDeclsReader diff --git a/src/absil/ilreflect.fs b/src/absil/ilreflect.fs index 96ca8efe04c..6cb379d5d4d 100644 --- a/src/absil/ilreflect.fs +++ b/src/absil/ilreflect.fs @@ -1414,12 +1414,12 @@ let emitMethodBody cenv modB emEnv ilG _name (mbody: ILLazyMethodBody) = | MethodBody.Native -> failwith "emitMethodBody: native" | MethodBody.NotAvailable -> failwith "emitMethodBody: metadata only" -let convCustomAttr cenv emEnv cattr = +let convCustomAttr cenv emEnv (cattr: ILAttribute) = let methInfo = match convConstructorSpec cenv emEnv cattr.Method with | null -> failwithf "convCustomAttr: %+A" cattr.Method | res -> res - let data = cattr.Data + let data = getCustomAttrData cenv.ilg cattr (methInfo, data) let emitCustomAttr cenv emEnv add cattr = add (convCustomAttr cenv emEnv cattr) diff --git a/src/absil/ilwrite.fs b/src/absil/ilwrite.fs index d28348bf860..cd9e1ac41f3 100644 --- a/src/absil/ilwrite.fs +++ b/src/absil/ilwrite.fs @@ -1382,8 +1382,9 @@ and GetMethodRefAsCustomAttribType cenv (mref:ILMethodRef) = let rec GetCustomAttrDataAsBlobIdx cenv (data:byte[]) = if data.Length = 0 then 0 else GetBytesAsBlobIdx cenv data -and GetCustomAttrRow cenv hca attr = +and GetCustomAttrRow cenv hca (attr: ILAttribute) = let cat = GetMethodRefAsCustomAttribType cenv attr.Method.MethodRef + let data = getCustomAttrData cenv.ilg attr for element in attr.Elements do match element with | ILAttribElem.Type (Some ty) when ty.IsNominal -> GetTypeRefAsTypeRefIdx cenv ty.TypeRef |> ignore @@ -1393,7 +1394,7 @@ and GetCustomAttrRow cenv hca attr = UnsharedRow [| HasCustomAttribute (fst hca, snd hca); CustomAttributeType (fst cat, snd cat); - Blob (GetCustomAttrDataAsBlobIdx cenv attr.Data) + Blob (GetCustomAttrDataAsBlobIdx cenv data) |] and GenCustomAttrPass3Or4 cenv hca attr = diff --git a/src/fsharp/fsi/fsi.fs b/src/fsharp/fsi/fsi.fs index eb926991dc1..5c797a06f57 100644 --- a/src/fsharp/fsi/fsi.fs +++ b/src/fsharp/fsi/fsi.fs @@ -1060,7 +1060,7 @@ type internal FsiDynamicCompiler #if DEBUG if fsiOptions.ShowILCode then fsiConsoleOutput.uprintnfn "--------------------"; - ILAsciiWriter.output_module outWriter mainmod3; + ILAsciiWriter.output_module outWriter ilGlobals mainmod3; fsiConsoleOutput.uprintnfn "--------------------" #else ignore(fsiOptions) From 7f8374e70efd3777fe74f469d15ce12272697551 Mon Sep 17 00:00:00 2001 From: "Kevin Ransom (msft)" Date: Wed, 17 Oct 2018 15:58:31 -0700 Subject: [PATCH 085/160] Fix # 5514 (#5516) (#5783) --- src/utils/CompilerLocationUtils.fs | 32 ++++--------------- .../PropertyPages/ApplicationPropPage.vb | 23 ++----------- 2 files changed, 10 insertions(+), 45 deletions(-) diff --git a/src/utils/CompilerLocationUtils.fs b/src/utils/CompilerLocationUtils.fs index 06cc5893e29..3499e7e5b21 100644 --- a/src/utils/CompilerLocationUtils.fs +++ b/src/utils/CompilerLocationUtils.fs @@ -217,31 +217,13 @@ module internal FSharpEnvironment = match probePoint with | Some p when safeExists (Path.Combine(p,"FSharp.Core.dll")) -> Some p | _ -> - - // On windows the location of the compiler is via a registry key - - // Note: If the keys below change, be sure to update code in: - // Property pages (ApplicationPropPage.vb) - let keys = - [| - @"Software\Microsoft\FSharp\10.1\Runtime\v4.0"; - @"Software\Microsoft\FSharp\4.1\Runtime\v4.0"; - @"Software\Microsoft\FSharp\4.0\Runtime\v4.0" - |] - let path = keys |> Seq.tryPick(fun k -> tryRegKey k) - match path with - | Some _ -> path - | None -> - // On Unix we let you set FSHARP_COMPILER_BIN. I've rarely seen this used and its not documented in the install instructions. - let result = - let var = System.Environment.GetEnvironmentVariable("FSHARP_COMPILER_BIN") - if String.IsNullOrEmpty(var) then None - else Some(var) - match result with - | Some _ -> result - | None -> - // For the prototype compiler, we can just use the current domain - tryCurrentDomain() + // We let you set FSHARP_COMPILER_BIN. I've rarely seen this used and its not documented in the install instructions. + let result = System.Environment.GetEnvironmentVariable("FSHARP_COMPILER_BIN") + if not (String.IsNullOrEmpty(result)) then + Some result + else + // For the prototype compiler, we can just use the current domain + tryCurrentDomain() with e -> System.Diagnostics.Debug.Assert(false, "Error while determining default location of F# compiler") None diff --git a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/ApplicationPropPage.vb b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/ApplicationPropPage.vb index 964304b02ee..692619c912b 100644 --- a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/ApplicationPropPage.vb +++ b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/ApplicationPropPage.vb @@ -49,8 +49,6 @@ Namespace Microsoft.VisualStudio.Editors.PropertyPages Protected Const INDEX_WINDOWSCLASSLIB As Integer = 2 Protected Const INDEX_LAST As Integer = INDEX_WINDOWSCLASSLIB Public Const Const_TargetFrameworkMoniker As String = "TargetFrameworkMoniker" - Private m_v20FSharpRedistInstalled As Boolean = False - Private m_v40FSharpRedistInstalled As Boolean = False Friend WithEvents TargetFramework As System.Windows.Forms.ComboBox Friend WithEvents TargetFrameworkLabel As System.Windows.Forms.Label @@ -75,12 +73,6 @@ Namespace Microsoft.VisualStudio.Editors.PropertyPages m_OutputTypeStringKeys(INDEX_COMMANDLINEAPP) = SR.GetString(SR.PPG_CommandLineApp) m_OutputTypeStringKeys(INDEX_WINDOWSCLASSLIB) = SR.GetString(SR.PPG_WindowsClassLib) - Dim v20FSharpRedistKey As String = "HKEY_LOCAL_MACHINE\Software\Microsoft\FSharp\10.1\Runtime\v2.0" - Dim v40FSharpRedistKey As String = "HKEY_LOCAL_MACHINE\Software\Microsoft\FSharp\10.1\Runtime\v4.0" - - m_v20FSharpRedistInstalled = Not (IsNothing(Microsoft.Win32.Registry.GetValue(v20FSharpRedistKey, Nothing, Nothing))) - m_v40FSharpRedistInstalled = Not (IsNothing(Microsoft.Win32.Registry.GetValue(v40FSharpRedistKey, Nothing, Nothing))) - 'Add any initialization after the InitializeComponent() call AddChangeHandlers() @@ -587,18 +579,9 @@ Namespace Microsoft.VisualStudio.Editors.PropertyPages If moniker.StartsWith(".NETCoreApp") OrElse moniker.StartsWith(".NETStandard") Then Return True End If - If moniker.Contains("v2") Then - Return Me.m_v20FSharpRedistInstalled - End If - If moniker.Contains("v3.0") Then - Return Me.m_v20FSharpRedistInstalled - End If - If moniker.Contains("v3.5") Then - Return Me.m_v20FSharpRedistInstalled - End If - '' Is this cheating? - If moniker.Contains("v4") Then - Return Me.m_v40FSharpRedistInstalled + ' With the latest tooling, if we have editors the redist is installed by definition + If moniker.Contains("v2") Or moniker.Contains("v3.0") Or moniker.Contains("v3.5") Or moniker.Contains("v4") Then + Return True End If Return False End Function From 5e9c7caea813f8aa3277e8cc843f784488a7da6f Mon Sep 17 00:00:00 2001 From: "Kevin Ransom (msft)" Date: Wed, 17 Oct 2018 15:58:45 -0700 Subject: [PATCH 086/160] Fix linux build (#5748) (#5784) * Attempt to fix linux build * Clean up --- src/scripts/scriptlib.fsx | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/scripts/scriptlib.fsx b/src/scripts/scriptlib.fsx index 2bf8cc26b41..2b0da79350c 100644 --- a/src/scripts/scriptlib.fsx +++ b/src/scripts/scriptlib.fsx @@ -60,15 +60,15 @@ module Scripting = let (++) a b = Path.Combine(a,b) - let getBasename a = Path.GetFileNameWithoutExtension a - let getFullPath a = Path.GetFullPath a - let getFilename a = Path.GetFileName a - let getDirectoryName a = Path.GetDirectoryName a + let getBasename (a: string) = Path.GetFileNameWithoutExtension(a) + let getFullPath a = Path.GetFullPath(a) + let getFilename (a: string) = Path.GetFileName(a) + let getDirectoryName (a: string) = Path.GetDirectoryName(a) let copyFile source dir = let dest = if not (Directory.Exists dir) then Directory.CreateDirectory dir |>ignore - let result = Path.Combine(dir, Path.GetFileName source) + let result = Path.Combine(dir, getFilename source) result //printfn "Copy %s --> %s" source dest File.Copy(source, dest, true) @@ -96,7 +96,7 @@ module Scripting = let processExePath baseDir exe = if Path.IsPathRooted(exe) then exe else - match Path.GetDirectoryName(exe) with + match getDirectoryName exe with | "" -> exe | _ -> Path.Combine(baseDir,exe) |> Path.GetFullPath From 11055119ef5b96e00ce6fecb7e56c1ad2f7c9cb7 Mon Sep 17 00:00:00 2001 From: Steffen Forkmann Date: Thu, 18 Oct 2018 14:14:13 +0200 Subject: [PATCH 087/160] Cleanup checkTypeDef (#4981) * Cleanup checkTypeDef * Use error recovery for hidden * Return early --- src/fsharp/SignatureConformance.fs | 40 +++++++++++++++++++++--------- 1 file changed, 28 insertions(+), 12 deletions(-) diff --git a/src/fsharp/SignatureConformance.fs b/src/fsharp/SignatureConformance.fs index 8b0981451ef..ed5c04da71f 100644 --- a/src/fsharp/SignatureConformance.fs +++ b/src/fsharp/SignatureConformance.fs @@ -177,46 +177,62 @@ type Checker(g, amap, denv, remapInfo: SignatureRepackageInfo, checkingSig) = |> ListSet.setify (typeEquiv g) |> List.filter (isInterfaceTy g) let aintfs = flatten aintfs - let aintfsUser = flatten aintfsUser let fintfs = flatten fintfs let unimpl = ListSet.subtract (fun fity aity -> typeAEquiv g aenv aity fity) fintfs aintfs - (unimpl |> List.forall (fun ity -> errorR (Error (FSComp.SR.DefinitionsInSigAndImplNotCompatibleMissingInterface(implTycon.TypeOrMeasureKind.ToString(),implTycon.DisplayName, NicePrint.minimalStringOfType denv ity),m)); false)) && + (unimpl + |> List.forall (fun ity -> + let errorMessage = FSComp.SR.DefinitionsInSigAndImplNotCompatibleMissingInterface(implTycon.TypeOrMeasureKind.ToString(),implTycon.DisplayName, NicePrint.minimalStringOfType denv ity) + errorR (Error(errorMessage,m)); false)) && + + let aintfsUser = flatten aintfsUser + let hidden = ListSet.subtract (typeAEquiv g aenv) aintfsUser fintfs - let warningOrError = if implTycon.IsFSharpInterfaceTycon then error else warning - hidden |> List.iter (fun ity -> warningOrError (InterfaceNotRevealed(denv,ity,implTycon.Range))) + let continueChecks,warningOrError = if implTycon.IsFSharpInterfaceTycon then false,errorR else true,warning + (hidden |> List.forall (fun ity -> warningOrError (InterfaceNotRevealed(denv,ity,implTycon.Range)); continueChecks)) && let aNull = IsUnionTypeWithNullAsTrueValue g implTycon let fNull = IsUnionTypeWithNullAsTrueValue g sigTycon if aNull && not fNull then - errorR(Error(FSComp.SR.DefinitionsInSigAndImplNotCompatibleImplementationSaysNull(implTycon.TypeOrMeasureKind.ToString(),implTycon.DisplayName),m)) + errorR(Error(FSComp.SR.DefinitionsInSigAndImplNotCompatibleImplementationSaysNull(implTycon.TypeOrMeasureKind.ToString(),implTycon.DisplayName),m)) + false elif fNull && not aNull then - errorR(Error(FSComp.SR.DefinitionsInSigAndImplNotCompatibleSignatureSaysNull(implTycon.TypeOrMeasureKind.ToString(),implTycon.DisplayName),m)) + errorR(Error(FSComp.SR.DefinitionsInSigAndImplNotCompatibleSignatureSaysNull(implTycon.TypeOrMeasureKind.ToString(),implTycon.DisplayName),m)) + false + else let aNull2 = TypeNullIsExtraValue g m (generalizedTyconRef (mkLocalTyconRef implTycon)) let fNull2 = TypeNullIsExtraValue g m (generalizedTyconRef (mkLocalTyconRef implTycon)) if aNull2 && not fNull2 then errorR(Error(FSComp.SR.DefinitionsInSigAndImplNotCompatibleImplementationSaysNull2(implTycon.TypeOrMeasureKind.ToString(),implTycon.DisplayName),m)) + false elif fNull2 && not aNull2 then errorR(Error(FSComp.SR.DefinitionsInSigAndImplNotCompatibleSignatureSaysNull2(implTycon.TypeOrMeasureKind.ToString(),implTycon.DisplayName),m)) + false + else let aSealed = isSealedTy g (generalizedTyconRef (mkLocalTyconRef implTycon)) let fSealed = isSealedTy g (generalizedTyconRef (mkLocalTyconRef sigTycon)) - if aSealed && not fSealed then + if aSealed && not fSealed then errorR(Error(FSComp.SR.DefinitionsInSigAndImplNotCompatibleImplementationSealed(implTycon.TypeOrMeasureKind.ToString(),implTycon.DisplayName),m)) - if not aSealed && fSealed then + false + elif not aSealed && fSealed then errorR(Error(FSComp.SR.DefinitionsInSigAndImplNotCompatibleImplementationIsNotSealed(implTycon.TypeOrMeasureKind.ToString(),implTycon.DisplayName),m)) + false + else let aPartial = isAbstractTycon implTycon let fPartial = isAbstractTycon sigTycon if aPartial && not fPartial then errorR(Error(FSComp.SR.DefinitionsInSigAndImplNotCompatibleImplementationIsAbstract(implTycon.TypeOrMeasureKind.ToString(),implTycon.DisplayName),m)) - - if not aPartial && fPartial then + false + elif not aPartial && fPartial then errorR(Error(FSComp.SR.DefinitionsInSigAndImplNotCompatibleSignatureIsAbstract(implTycon.TypeOrMeasureKind.ToString(),implTycon.DisplayName),m)) - - if not (typeAEquiv g aenv (superOfTycon g implTycon) (superOfTycon g sigTycon)) then + false + elif not (typeAEquiv g aenv (superOfTycon g implTycon) (superOfTycon g sigTycon)) then errorR (Error(FSComp.SR.DefinitionsInSigAndImplNotCompatibleTypesHaveDifferentBaseTypes(implTycon.TypeOrMeasureKind.ToString(),implTycon.DisplayName),m)) + false + else checkTypars m aenv implTypars sigTypars && checkTypeRepr m aenv implTycon sigTycon.TypeReprInfo && From 2b882b203e84262c1d8197310f03bf4835dd1d5c Mon Sep 17 00:00:00 2001 From: Don Syme Date: Tue, 23 Oct 2018 14:02:12 +0100 Subject: [PATCH 088/160] update tools version --- DotnetCLIToolsVersion.txt | 2 +- fcs/build.fsx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/DotnetCLIToolsVersion.txt b/DotnetCLIToolsVersion.txt index 6e840019a3b..c735fa77fd7 100644 --- a/DotnetCLIToolsVersion.txt +++ b/DotnetCLIToolsVersion.txt @@ -1 +1 @@ - 2.1.400-preview-009197 + 2.1.403 diff --git a/fcs/build.fsx b/fcs/build.fsx index 145d4c88e8f..d5e3df4ac4f 100644 --- a/fcs/build.fsx +++ b/fcs/build.fsx @@ -24,7 +24,7 @@ let isMono = false // Utilities // -------------------------------------------------------------------------------------- -let dotnetExePath = DotNetCli.InstallDotNetSDK "2.1.201" +let dotnetExePath = DotNetCli.InstallDotNetSDK "2.1.403" let runDotnet workingDir args = let result = From 17d05ae119b7ea47e89a170aa1b04534b971f5e1 Mon Sep 17 00:00:00 2001 From: Don Syme Date: Tue, 23 Oct 2018 15:09:24 +0100 Subject: [PATCH 089/160] fix fcs build --- fcs/samples/EditorService/EditorService.fsproj | 2 +- fcs/samples/FscExe/FscExe.fsproj | 2 +- fcs/samples/FsiExe/FsiExe.fsproj | 2 +- .../InteractiveService/InteractiveService.fsproj | 2 +- fcs/samples/Tokenizer/Tokenizer.fsproj | 2 +- fcs/samples/UntypedTree/UntypedTree.fsproj | 2 +- src/absil/illib.fs | 6 ------ src/fsharp/NameResolution.fs | 2 +- src/fsharp/Optimizer.fs | 2 +- src/fsharp/QuotationTranslator.fs | 2 +- src/fsharp/TastOps.fs | 15 +++++++++------ src/fsharp/TastPickle.fs | 2 +- src/fsharp/TypeChecker.fs | 12 ++++++------ src/fsharp/symbols/Symbols.fs | 16 ++++++++-------- src/fsharp/tast.fs | 3 ++- 15 files changed, 35 insertions(+), 37 deletions(-) diff --git a/fcs/samples/EditorService/EditorService.fsproj b/fcs/samples/EditorService/EditorService.fsproj index 05847e67f90..447906070f0 100644 --- a/fcs/samples/EditorService/EditorService.fsproj +++ b/fcs/samples/EditorService/EditorService.fsproj @@ -12,7 +12,7 @@ - + diff --git a/fcs/samples/FscExe/FscExe.fsproj b/fcs/samples/FscExe/FscExe.fsproj index c482656827f..b2b146913a1 100644 --- a/fcs/samples/FscExe/FscExe.fsproj +++ b/fcs/samples/FscExe/FscExe.fsproj @@ -14,7 +14,7 @@ - + diff --git a/fcs/samples/FsiExe/FsiExe.fsproj b/fcs/samples/FsiExe/FsiExe.fsproj index 7377f2c2912..aae2ba03182 100644 --- a/fcs/samples/FsiExe/FsiExe.fsproj +++ b/fcs/samples/FsiExe/FsiExe.fsproj @@ -16,7 +16,7 @@ - + diff --git a/fcs/samples/InteractiveService/InteractiveService.fsproj b/fcs/samples/InteractiveService/InteractiveService.fsproj index 7aa42497261..387439fcfdd 100644 --- a/fcs/samples/InteractiveService/InteractiveService.fsproj +++ b/fcs/samples/InteractiveService/InteractiveService.fsproj @@ -12,7 +12,7 @@ - + diff --git a/fcs/samples/Tokenizer/Tokenizer.fsproj b/fcs/samples/Tokenizer/Tokenizer.fsproj index 7aa42497261..387439fcfdd 100644 --- a/fcs/samples/Tokenizer/Tokenizer.fsproj +++ b/fcs/samples/Tokenizer/Tokenizer.fsproj @@ -12,7 +12,7 @@ - + diff --git a/fcs/samples/UntypedTree/UntypedTree.fsproj b/fcs/samples/UntypedTree/UntypedTree.fsproj index 7aa42497261..387439fcfdd 100644 --- a/fcs/samples/UntypedTree/UntypedTree.fsproj +++ b/fcs/samples/UntypedTree/UntypedTree.fsproj @@ -12,7 +12,7 @@ - + diff --git a/src/absil/illib.fs b/src/absil/illib.fs index 66622b7e2a4..ab92a747b5e 100644 --- a/src/absil/illib.fs +++ b/src/absil/illib.fs @@ -432,16 +432,10 @@ module List = let existsSquared f xss = xss |> List.exists (fun xs -> xs |> List.exists (fun x -> f x)) let mapiFoldSquared f z xss = mapFoldSquared f z (xss |> mapiSquared (fun i j x -> (i,j,x))) -type ValueOption<'T> with - member x.IsSome = match x with ValueSome _ -> true | ValueNone -> false - member x.IsNone = match x with ValueSome _ -> false | ValueNone -> true - member x.Value = match x with ValueSome r -> r | ValueNone -> failwith "ValueOption.Value: value is None" - [] module ValueOption = let inline ofOption x = match x with Some x -> ValueSome x | None -> ValueNone let inline bind f x = match x with ValueSome x -> f x | ValueNone -> ValueNone - let inline get x = match x with ValueSome x -> x | ValueNone -> failwith "ValueOption.get" let inline isSome x = match x with ValueSome _ -> true | ValueNone -> false let inline isNone x = match x with ValueSome _ -> false | ValueNone -> true diff --git a/src/fsharp/NameResolution.fs b/src/fsharp/NameResolution.fs index 8aaf8e2571e..0b95e6f72f3 100644 --- a/src/fsharp/NameResolution.fs +++ b/src/fsharp/NameResolution.fs @@ -1100,7 +1100,7 @@ let AddEntityForProvidedType (amap: Import.ImportMap, modref: ModuleOrNamespaceR let tycon = Construct.NewProvidedTycon(resolutionEnvironment, st, importProvidedType, isSuppressRelocate, m) modref.ModuleOrNamespaceType.AddProvidedTypeEntity(tycon) let tcref = modref.NestedTyconRef tycon - System.Diagnostics.Debug.Assert(modref.TryDeref.IsSome) + System.Diagnostics.Debug.Assert(ValueOption.isSome modref.TryDeref) tcref diff --git a/src/fsharp/Optimizer.fs b/src/fsharp/Optimizer.fs index e4b93403385..599392383d7 100644 --- a/src/fsharp/Optimizer.fs +++ b/src/fsharp/Optimizer.fs @@ -3102,7 +3102,7 @@ and OptimizeBinding cenv isRec env (TBind(vref, expr, spBind)) = | None -> false | Some mbrTyconRef -> // Check we can deref system_MarshalByRefObject_tcref. When compiling against the Silverlight mscorlib we can't - if mbrTyconRef.TryDeref.IsSome then + if ValueOption.isSome mbrTyconRef.TryDeref then // Check if this is a subtype of MarshalByRefObject assert (cenv.g.system_MarshalByRefObject_ty.IsSome) ExistsSameHeadTypeInHierarchy cenv.g cenv.amap vref.Range (generalizedTyconRef tcref) cenv.g.system_MarshalByRefObject_ty.Value diff --git a/src/fsharp/QuotationTranslator.fs b/src/fsharp/QuotationTranslator.fs index 48dcefb7d6f..99fdf6c751a 100644 --- a/src/fsharp/QuotationTranslator.fs +++ b/src/fsharp/QuotationTranslator.fs @@ -66,7 +66,7 @@ type QuotationGenerationScope = static member ComputeQuotationFormat g = let deserializeExValRef = ValRefForIntrinsic g.deserialize_quoted_FSharp_40_plus_info - if deserializeExValRef.TryDeref.IsSome then + if ValueOption.isSome deserializeExValRef.TryDeref then QuotationSerializationFormat.FSharp_40_Plus else QuotationSerializationFormat.FSharp_20_Plus diff --git a/src/fsharp/TastOps.fs b/src/fsharp/TastOps.fs index 8e67f2cb5c3..dfebdb9bae0 100644 --- a/src/fsharp/TastOps.fs +++ b/src/fsharp/TastOps.fs @@ -675,7 +675,7 @@ let mkOuterCompiledTupleTy g isStruct tupElemTys = let marker = TType_app (mkCompiledTupleTyconRef g isStruct 1, [tyB]) TType_app (tcref, tysA@[marker]) | _ -> - TType_app (tcref, tysA@[TType_tuple (TupInfo.Const isStruct, tysB)]) + TType_app (tcref, tysA@[TType_tuple (mkTupInfo isStruct, tysB)]) //--------------------------------------------------------------------------- // Remove inference equations and abbreviations from types @@ -7556,7 +7556,9 @@ let rec TypeHasDefaultValue g m ty = elif isStructTupleTy g ty then destStructTupleTy g ty |> List.forall (TypeHasDefaultValue g m) elif isStructAnonRecdTy g ty then - tryDestAnonRecdTy g ty |> ValueOption.get |> snd |> List.forall (TypeHasDefaultValue g m) + match tryDestAnonRecdTy g ty with + | ValueNone -> true + | ValueSome (_, ptys) -> ptys |> List.forall (TypeHasDefaultValue g m) else // All struct types defined in other .NET languages have a DefaultValue regardless of their // instantiation @@ -7570,8 +7572,9 @@ let (|SpecialComparableHeadType|_|) g ty = let _tupInfo, elemTys = destAnyTupleTy g ty Some elemTys elif isAnonRecdTy g ty then - let _anonInfo, elemTys = tryDestAnonRecdTy g ty |> ValueOption.get - Some elemTys + match tryDestAnonRecdTy g ty with + | ValueNone -> Some [] + | ValueSome (_anonInfo, elemTys) -> Some elemTys else match tryAppTy g ty with | ValueSome (tcref, tinst) -> @@ -8338,12 +8341,12 @@ let rec mkCompiledTuple g isStruct (argtys, args, m) = ty8, arg8 | _ -> let ty8enc = TType_app((if isStruct then g.struct_tuple1_tcr else g.ref_tuple1_tcr), [ty8]) - let v8enc = Expr.Op (TOp.Tuple (TupInfo.Const isStruct), [ty8], [arg8], m) + let v8enc = Expr.Op (TOp.Tuple (mkTupInfo isStruct), [ty8], [arg8], m) ty8enc, v8enc | _ -> let a, b, c, d = mkCompiledTuple g isStruct (argtysB, argsB, m) let ty8plus = TType_app(a, b) - let v8plus = Expr.Op (TOp.Tuple(TupInfo.Const isStruct), b, c, d) + let v8plus = Expr.Op (TOp.Tuple(mkTupInfo isStruct), b, c, d) ty8plus, v8plus let argtysAB = argtysA @ [ty8] (mkCompiledTupleTyconRef g isStruct (List.length argtysAB), argtysAB, argsA @ [v8], m) diff --git a/src/fsharp/TastPickle.fs b/src/fsharp/TastPickle.fs index cdd45c70bd6..d86546b3699 100755 --- a/src/fsharp/TastPickle.fs +++ b/src/fsharp/TastPickle.fs @@ -1433,7 +1433,7 @@ let p_trait (TTrait(a,b,c,d,e,f)) st = let u_anonInfo_data st = let (ccu, info, nms) = u_tup3 u_ccuref u_bool (u_array u_ident) st - AnonRecdTypeInfo.Create (ccu, TupInfo.Const info, nms) + AnonRecdTypeInfo.Create (ccu, mkTupInfo info, nms) let u_anonInfo st = u_osgn_decl st.ianoninfos u_anonInfo_data st diff --git a/src/fsharp/TypeChecker.fs b/src/fsharp/TypeChecker.fs index d85153a0109..23abddc3cfd 100755 --- a/src/fsharp/TypeChecker.fs +++ b/src/fsharp/TypeChecker.fs @@ -713,13 +713,13 @@ let UnifyTupleTypeAndInferCharacteristics contextInfo cenv denv m knownTy isExpl let tupInfo, ptys = if isAnyTupleTy cenv.g knownTy then let tupInfo, ptys = destAnyTupleTy cenv.g knownTy - let tupInfo = (if isExplicitStruct then TupInfo.Const isExplicitStruct else tupInfo) + let tupInfo = (if isExplicitStruct then tupInfoStruct else tupInfo) let ptys = if List.length ps = List.length ptys then ptys else NewInferenceTypes ps tupInfo, ptys else - TupInfo.Const isExplicitStruct, NewInferenceTypes ps + mkTupInfo isExplicitStruct, NewInferenceTypes ps let contextInfo = match contextInfo with @@ -739,7 +739,7 @@ let UnifyAnonRecdTypeAndInferCharacteristics contextInfo cenv denv m ty isExplic // Note: use the assembly of the known type, not the current assembly // Note: use the structness of the known type, unless explicit // Note: use the names of our type, since they are always explicit - let tupInfo = (if isExplicitStruct then TupInfo.Const isExplicitStruct else anonInfo.TupInfo) + let tupInfo = (if isExplicitStruct then tupInfoStruct else anonInfo.TupInfo) let anonInfo = AnonRecdTypeInfo.Create(anonInfo.Assembly, tupInfo, unsortedNames) let ptys = if List.length ptys = Array.length unsortedNames then ptys @@ -747,7 +747,7 @@ let UnifyAnonRecdTypeAndInferCharacteristics contextInfo cenv denv m ty isExplic anonInfo, ptys | ValueNone -> // Note: no known anonymous record type - use our assembly - let anonInfo = AnonRecdTypeInfo.Create(cenv.topCcu, TupInfo.Const isExplicitStruct, unsortedNames) + let anonInfo = AnonRecdTypeInfo.Create(cenv.topCcu, mkTupInfo isExplicitStruct, unsortedNames) anonInfo, NewInferenceTypes (Array.toList anonInfo.SortedNames) let ty2 = TType_anon (anonInfo, ptys) AddCxTypeEqualsType contextInfo denv cenv.css m ty ty2 @@ -4619,7 +4619,7 @@ and TcTypeOrMeasure optKind cenv newOk checkCxs occ env (tpenv:SyntacticUnscoped | _ -> error(Error(FSComp.SR.tcTypeHasNoNestedTypes(), m)) | SynType.Tuple(isStruct, args, m) -> - let tupInfo = TupInfo.Const isStruct + let tupInfo = mkTupInfo isStruct if isStruct then let args',tpenv = TcTypesAsTuple cenv newOk checkCxs occ env tpenv args m TType_tuple(tupInfo,args'),tpenv @@ -4633,7 +4633,7 @@ and TcTypeOrMeasure optKind cenv newOk checkCxs occ env (tpenv:SyntacticUnscoped TType_tuple(tupInfo,args'),tpenv | SynType.AnonRecd(isStruct, args,m) -> - let tupInfo = TupInfo.Const isStruct + let tupInfo = mkTupInfo isStruct let args',tpenv = TcTypesAsTuple cenv newOk checkCxs occ env tpenv (args |> List.map snd |> List.map (fun x -> (false,x))) m let unsortedIds = args |> List.map fst |> List.toArray let anonInfo = AnonRecdTypeInfo.Create(cenv.topCcu, tupInfo, unsortedIds) diff --git a/src/fsharp/symbols/Symbols.fs b/src/fsharp/symbols/Symbols.fs index 68d5fcbfd5f..ab4cc75a977 100644 --- a/src/fsharp/symbols/Symbols.fs +++ b/src/fsharp/symbols/Symbols.fs @@ -86,7 +86,7 @@ module Impl = let entityIsUnresolved(entity:EntityRef) = match entity with | ERefNonLocal(NonLocalEntityRef(ccu, _)) -> - ccu.IsUnresolvedReference && entity.TryDeref.IsNone + ccu.IsUnresolvedReference && ValueOption.isNone entity.TryDeref | _ -> false let checkEntityIsResolved(entity:EntityRef) = @@ -756,10 +756,10 @@ and FSharpUnionCase(cenv, v: UnionCaseRef) = let isUnresolved() = - entityIsUnresolved v.TyconRef || v.TryUnionCase.IsNone + entityIsUnresolved v.TyconRef || ValueOption.isNone v.TryUnionCase let checkIsResolved() = checkEntityIsResolved v.TyconRef - if v.TryUnionCase.IsNone then + if ValueOption.isNone v.TryUnionCase then invalidOp (sprintf "The union case '%s' could not be found in the target type" v.CaseName) member __.IsUnresolved = @@ -874,8 +874,8 @@ and FSharpField(cenv: SymbolEnv, d: FSharpFieldData) = d.TryDeclaringTyconRef |> Option.exists entityIsUnresolved || match d with | AnonField _ -> false - | RecdOrClass v -> v.TryRecdField.IsNone - | Union (v, _) -> v.TryUnionCase.IsNone + | RecdOrClass v -> ValueOption.isNone v.TryRecdField + | Union (v, _) -> ValueOption.isNone v.TryUnionCase | ILField _ -> false let checkIsResolved() = @@ -883,10 +883,10 @@ and FSharpField(cenv: SymbolEnv, d: FSharpFieldData) = match d with | AnonField _ -> () | RecdOrClass v -> - if v.TryRecdField.IsNone then + if ValueOption.isNone v.TryRecdField then invalidOp (sprintf "The record field '%s' could not be found in the target type" v.FieldName) | Union (v, _) -> - if v.TryUnionCase.IsNone then + if ValueOption.isNone v.TryUnionCase then invalidOp (sprintf "The union case '%s' could not be found in the target type" v.CaseName) | ILField _ -> () @@ -1378,7 +1378,7 @@ and FSharpMemberOrFunctionOrValue(cenv, d:FSharpMemberOrValData, item) = let isUnresolved() = match fsharpInfo() with | None -> false - | Some v -> v.TryDeref.IsNone + | Some v -> ValueOption.isNone v.TryDeref let checkIsResolved() = if isUnresolved() then diff --git a/src/fsharp/tast.fs b/src/fsharp/tast.fs index a7fd3b28c56..fc8354e3432 100644 --- a/src/fsharp/tast.fs +++ b/src/fsharp/tast.fs @@ -3263,7 +3263,7 @@ and ValueSome tcr.binding /// Is the destination assembly available? - member tcr.CanDeref = tcr.TryDeref.IsSome + member tcr.CanDeref = ValueOption.isSome tcr.TryDeref /// Gets the data indicating the compiled representation of a type or module in terms of Abstract IL data structures. member x.CompiledRepresentation = x.Deref.CompiledRepresentation @@ -5199,6 +5199,7 @@ let arityOfVal (v:Val) = (match v.ValReprInfo with None -> ValReprInfo.emptyValD let tupInfoRef = TupInfo.Const false let tupInfoStruct = TupInfo.Const true +let mkTupInfo b = if b then tupInfoStruct else tupInfoRef let structnessDefault = false let mkRawRefTupleTy tys = TType_tuple (tupInfoRef, tys) let mkRawStructTupleTy tys = TType_tuple (tupInfoStruct, tys) From d5a52cc55c9954636853e9a1618a5f887aefeb55 Mon Sep 17 00:00:00 2001 From: Don Syme Date: Wed, 24 Oct 2018 02:40:27 +0100 Subject: [PATCH 090/160] Update DotnetCLIToolsVersion.txt (#5809) --- DotnetCLIToolsVersion.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DotnetCLIToolsVersion.txt b/DotnetCLIToolsVersion.txt index 6e840019a3b..c735fa77fd7 100644 --- a/DotnetCLIToolsVersion.txt +++ b/DotnetCLIToolsVersion.txt @@ -1 +1 @@ - 2.1.400-preview-009197 + 2.1.403 From dc8373a3e73b82c9ca60d764f4326316bb7047b6 Mon Sep 17 00:00:00 2001 From: "Kevin Ransom (msft)" Date: Wed, 24 Oct 2018 08:49:30 -0700 Subject: [PATCH 091/160] Fix: 713439 (#5810) --- .../ConsoleProject/Template/ConsoleApplication.vstemplate | 4 ++-- .../LibraryProject/Template/Library.vstemplate | 4 ++-- .../TutorialProject/Template/Tutorial.vstemplate | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/vsintegration/ProjectTemplates/ConsoleProject/Template/ConsoleApplication.vstemplate b/vsintegration/ProjectTemplates/ConsoleProject/Template/ConsoleApplication.vstemplate index fccc228384f..5717c132c33 100644 --- a/vsintegration/ProjectTemplates/ConsoleProject/Template/ConsoleApplication.vstemplate +++ b/vsintegration/ProjectTemplates/ConsoleProject/Template/ConsoleApplication.vstemplate @@ -26,8 +26,8 @@ - - + + diff --git a/vsintegration/ProjectTemplates/LibraryProject/Template/Library.vstemplate b/vsintegration/ProjectTemplates/LibraryProject/Template/Library.vstemplate index bbfb2d3f25e..c74a2d18227 100644 --- a/vsintegration/ProjectTemplates/LibraryProject/Template/Library.vstemplate +++ b/vsintegration/ProjectTemplates/LibraryProject/Template/Library.vstemplate @@ -26,8 +26,8 @@ - - + + diff --git a/vsintegration/ProjectTemplates/TutorialProject/Template/Tutorial.vstemplate b/vsintegration/ProjectTemplates/TutorialProject/Template/Tutorial.vstemplate index 62ae09d17e2..76fd069d5f8 100644 --- a/vsintegration/ProjectTemplates/TutorialProject/Template/Tutorial.vstemplate +++ b/vsintegration/ProjectTemplates/TutorialProject/Template/Tutorial.vstemplate @@ -24,8 +24,8 @@ - - + + From f77583afd6321c0019a9d1a818c5811f5e044842 Mon Sep 17 00:00:00 2001 From: Will Smith Date: Wed, 24 Oct 2018 13:22:55 -0700 Subject: [PATCH 092/160] Cherry picking cross project reference fix into master (#5818) * Fixed referencing cross projects (#5698) * Fixed referencing cross projects * Fixed legacy project referencing CPS style project * Fixed tooling issues when changing solutions (#5721) --- .../FSharp.Editor/LanguageService/ProjectSitesAndFiles.fs | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/vsintegration/src/FSharp.Editor/LanguageService/ProjectSitesAndFiles.fs b/vsintegration/src/FSharp.Editor/LanguageService/ProjectSitesAndFiles.fs index 1bea848dae2..e9ce1769584 100644 --- a/vsintegration/src/FSharp.Editor/LanguageService/ProjectSitesAndFiles.fs +++ b/vsintegration/src/FSharp.Editor/LanguageService/ProjectSitesAndFiles.fs @@ -241,13 +241,15 @@ type internal ProjectSitesAndFiles() = yield Some project.Id, project.FilePath, outputPath, siteProvider | _ -> () - | (Some references), _ -> + | (Some references), Some (:? VisualStudioWorkspaceImpl as workspace) -> for p in references do match solutionService.GetProjectOfUniqueName(p.UniqueName) with | VSConstants.S_OK, (:? IProvideProjectSite as ps) -> - yield None, p.FileName, (fullOutputAssemblyPath p) |> Option.defaultValue "", ps + let path = ps.GetProjectSite().ProjectFileName + let projectId = workspace.ProjectTracker.GetOrCreateProjectIdForPath(path, projectDisplayNameOf path) + yield Some projectId, p.FileName, (fullOutputAssemblyPath p) |> Option.defaultValue "", ps | _ -> () - | None, _ -> () + | _ -> () |] let solutionService = try Some (serviceProvider.GetService(typeof) :?> IVsSolution) with _ -> None seq { match solutionService with From 4a368d41e1d81465b28b8e64f89c062055af20b8 Mon Sep 17 00:00:00 2001 From: Don Syme Date: Thu, 25 Oct 2018 19:14:01 +0100 Subject: [PATCH 093/160] [CompilerPerf] Fix large ranges (#4476) * Fix large ranges * update FCS * I can't add up * fix build * test fix * fix tests * fix tests * fix tests --- fcs/docsrc/content/ja/tokenizer.fsx | 2 +- fcs/docsrc/content/tokenizer.fsx | 2 +- fcs/samples/Tokenizer/Program.fs | 2 +- src/fsharp/range.fs | 138 +++++++++--------- src/fsharp/range.fsi | 6 +- src/fsharp/service/IncrementalBuild.fs | 5 +- src/fsharp/service/ServiceLexing.fs | 76 +++++----- src/fsharp/service/ServiceLexing.fsi | 19 ++- src/fsharp/service/service.fs | 16 +- src/fsharp/service/service.fsi | 2 +- tests/fsharp/tests.fs | 13 +- tests/fsharp/typecheck/sigs/neg102.fs | 2 +- tests/fsharp/typecheck/sigs/neg102.vsbsl | 18 +++ tests/fsharp/typecheck/sigs/neg103.vsbsl | 25 ++++ tests/fsharp/typecheck/sigs/neg110.bsl | 14 ++ tests/fsharp/typecheck/sigs/neg110.fs | 5 + tests/service/TokenizerTests.fs | 4 +- .../LanguageService/Tokenizer.fs | 8 +- .../src/FSharp.LanguageService/Colorize.fs | 4 +- 19 files changed, 223 insertions(+), 138 deletions(-) create mode 100644 tests/fsharp/typecheck/sigs/neg102.vsbsl create mode 100644 tests/fsharp/typecheck/sigs/neg103.vsbsl create mode 100644 tests/fsharp/typecheck/sigs/neg110.bsl create mode 100644 tests/fsharp/typecheck/sigs/neg110.fs diff --git a/fcs/docsrc/content/ja/tokenizer.fsx b/fcs/docsrc/content/ja/tokenizer.fsx index 589061e0b0a..cf5117bfbd0 100644 --- a/fcs/docsrc/content/ja/tokenizer.fsx +++ b/fcs/docsrc/content/ja/tokenizer.fsx @@ -73,7 +73,7 @@ let rec tokenizeLine (tokenizer:FSharpLineTokenizer) state = 必要となるような新しい状態を返します。 初期値としては `0L` を指定します: *) -tokenizeLine tokenizer 0L +tokenizeLine tokenizer FSharpTokenizerLexState.Initial (** この結果は LET WHITESPACE IDENT EQUALS INT32 という トークン名のシーケンスになります。 diff --git a/fcs/docsrc/content/tokenizer.fsx b/fcs/docsrc/content/tokenizer.fsx index 09d842ba8aa..9ac3d6f34d4 100644 --- a/fcs/docsrc/content/tokenizer.fsx +++ b/fcs/docsrc/content/tokenizer.fsx @@ -65,7 +65,7 @@ let rec tokenizeLine (tokenizer:FSharpLineTokenizer) state = The function returns the new state, which is needed if you need to tokenize multiple lines and an earlier line ends with a multi-line comment. As an initial state, we can use `0L`: *) -tokenizeLine tokenizer 0L +tokenizeLine tokenizer FSharpTokenizerLexState.Initial (** The result is a sequence of tokens with names LET, WHITESPACE, IDENT, EQUALS and INT32. There is a number of interesting properties on `FSharpTokenInfo` including: diff --git a/fcs/samples/Tokenizer/Program.fs b/fcs/samples/Tokenizer/Program.fs index 402fcc30295..9cc79e699f4 100644 --- a/fcs/samples/Tokenizer/Program.fs +++ b/fcs/samples/Tokenizer/Program.fs @@ -3,7 +3,7 @@ let sourceTok = FSharpSourceTokenizer([], Some "C:\\test.fsx") let tokenizeLines (lines:string[]) = - [ let state = ref 0L + [ let state = ref FSharpTokenizerLexState.Initial for n, line in lines |> Seq.zip [ 0 .. lines.Length ] do let tokenizer = sourceTok.CreateLineTokenizer(line) let rec parseLine() = seq { diff --git a/src/fsharp/range.fs b/src/fsharp/range.fs index 8649b700867..7f31e032a9f 100755 --- a/src/fsharp/range.fs +++ b/src/fsharp/range.fs @@ -6,98 +6,99 @@ module Microsoft.FSharp.Compiler.Range open System open System.IO open System.Collections.Generic +open System.Collections.Concurrent open Microsoft.FSharp.Core.Printf -open Internal.Utilities -open Microsoft.FSharp.Compiler.AbstractIL -open Microsoft.FSharp.Compiler.AbstractIL.Internal open Microsoft.FSharp.Compiler.AbstractIL.Internal.Library -open Microsoft.FSharp.Compiler open Microsoft.FSharp.Compiler.Lib open Microsoft.FSharp.Compiler.Lib.Bits type FileIndex = int32 [] -let columnBitCount = 9 +let columnBitCount = 20 [] -let lineBitCount = 16 +let lineBitCount = 31 let posBitCount = lineBitCount + columnBitCount -let _ = assert (posBitCount <= 32) -let posColumnMask = mask32 0 columnBitCount -let lineColumnMask = mask32 columnBitCount lineBitCount -let inline (lsr) (x:int) (y:int) = int32 (uint32 x >>> y) +let _ = assert (posBitCount <= 64) +let posColumnMask = mask64 0 columnBitCount +let lineColumnMask = mask64 columnBitCount lineBitCount [] [] -type pos(code:int32) = +type pos(code:int64) = new (l, c) = let l = max 0 l let c = max 0 c - let p = ( c &&& posColumnMask) - ||| ((l <<< columnBitCount) &&& lineColumnMask) + let p = (int64 c &&& posColumnMask) + ||| ((int64 l <<< columnBitCount) &&& lineColumnMask) pos p - member p.Line = (code lsr columnBitCount) - member p.Column = (code &&& posColumnMask) + member p.Line = int32 (uint64 code >>> columnBitCount) + member p.Column = int32 (code &&& posColumnMask) member r.Encoding = code static member EncodingSize = posBitCount - static member Decode (code:int32) : pos = pos code + static member Decode (code:int64) : pos = pos code override p.Equals(obj) = match obj with :? pos as p2 -> code = p2.Encoding | _ -> false override p.GetHashCode() = hash code override p.ToString() = sprintf "(%d,%d)" p.Line p.Column [] -let fileIndexBitCount = 14 +let fileIndexBitCount = 24 [] -let startLineBitCount = lineBitCount +let startColumnBitCount = columnBitCount // 20 [] -let startColumnBitCount = columnBitCount +let endColumnBitCount = columnBitCount // 20 + [] -let heightBitCount = 15 // If necessary, could probably deduct one or two bits here without ill effect. +let startLineBitCount = lineBitCount // 31 [] -let endColumnBitCount = columnBitCount +let heightBitCount = 27 [] let isSyntheticBitCount = 1 #if DEBUG -let _ = assert (fileIndexBitCount + startLineBitCount + startColumnBitCount + heightBitCount + endColumnBitCount + isSyntheticBitCount = 64) +let _ = assert (fileIndexBitCount + startColumnBitCount + endColumnBitCount <= 64) +let _ = assert (startLineBitCount + heightBitCount + isSyntheticBitCount <= 64) #endif [] let fileIndexShift = 0 [] -let startLineShift = 14 +let startColumnShift = 24 [] -let startColumnShift = 30 +let endColumnShift = 44 + [] -let heightShift = 39 +let startLineShift = 0 [] -let endColumnShift = 54 +let heightShift = 31 [] -let isSyntheticShift = 63 +let isSyntheticShift = 58 [] -let fileIndexMask = 0b0000000000000000000000000000000000000000000000000011111111111111L +let fileIndexMask = 0b0000000000000000000000000000000000000000111111111111111111111111L [] -let startLineMask = 0b0000000000000000000000000000000000111111111111111100000000000000L +let startColumnMask = 0b0000000000000000000011111111111111111111000000000000000000000000L [] -let startColumnMask = 0b0000000000000000000000000111111111000000000000000000000000000000L +let endColumnMask = 0b1111111111111111111100000000000000000000000000000000000000000000L + [] -let heightMask = 0b0000000000111111111111111000000000000000000000000000000000000000L +let startLineMask = 0b0000000000000000000000000000000001111111111111111111111111111111L [] -let endColumnMask = 0b0111111111000000000000000000000000000000000000000000000000000000L +let heightMask = 0b0000001111111111111111111111111110000000000000000000000000000000L [] -let isSyntheticMask = 0b1000000000000000000000000000000000000000000000000000000000000000L +let isSyntheticMask = 0b0000010000000000000000000000000000000000000000000000000000000000L #if DEBUG -let _ = assert (startLineShift = fileIndexShift + fileIndexBitCount) -let _ = assert (startColumnShift = startLineShift + startLineBitCount) -let _ = assert (heightShift = startColumnShift + startColumnBitCount) -let _ = assert (endColumnShift = heightShift + heightBitCount) -let _ = assert (isSyntheticShift = endColumnShift + endColumnBitCount) -let _ = assert (fileIndexMask = mask64 0 fileIndexBitCount) +let _ = assert (startColumnShift = fileIndexShift + fileIndexBitCount) +let _ = assert (endColumnShift = startColumnShift + startColumnBitCount) + +let _ = assert (heightShift = startLineShift + startLineBitCount) +let _ = assert (isSyntheticShift = heightShift + heightBitCount) + +let _ = assert (fileIndexMask = mask64 fileIndexShift fileIndexBitCount) let _ = assert (startLineMask = mask64 startLineShift startLineBitCount) let _ = assert (startColumnMask = mask64 startColumnShift startColumnBitCount) let _ = assert (heightMask = mask64 heightShift heightBitCount) @@ -108,21 +109,17 @@ let _ = assert (isSyntheticMask = mask64 isSyntheticShift isSyntheticBitCount) // This is just a standard unique-index table type FileIndexTable() = let indexToFileTable = new ResizeArray<_>(11) - let fileToIndexTable = new Dictionary(11) + let fileToIndexTable = new ConcurrentDictionary() member t.FileToIndex f = let mutable res = 0 let ok = fileToIndexTable.TryGetValue(f, &res) if ok then res else lock fileToIndexTable (fun () -> - let mutable res = 0 in - let ok = fileToIndexTable.TryGetValue(f, &res) in - if ok then res - else - let n = indexToFileTable.Count in - indexToFileTable.Add(f) - fileToIndexTable.[f] <- n - n) + let n = indexToFileTable.Count in + indexToFileTable.Add(f) + fileToIndexTable.[f] <- n + n) member t.IndexToFile n = (if n < 0 then failwithf "fileOfFileIndex: negative argument: n = %d\n" n) @@ -147,28 +144,35 @@ let mkPos l c = pos (l, c) #else [] #endif -type range(code:int64) = - static member Zero = range(0L) +type range(code1:int64, code2: int64) = + static member Zero = range(0L, 0L) new (fidx, bl, bc, el, ec) = - range( int64 fidx - ||| (int64 bl <<< startLineShift) - ||| (int64 bc <<< startColumnShift) - ||| (int64 (el-bl) <<< heightShift) - ||| (int64 ec <<< endColumnShift) ) + let code1 = ((int64 fidx) &&& fileIndexMask) + ||| ((int64 bc <<< startColumnShift) &&& startColumnMask) + ||| ((int64 ec <<< endColumnShift) &&& endColumnMask) + let code2 = + ((int64 bl <<< startLineShift) &&& startLineMask) + ||| ((int64 (el-bl) <<< heightShift) &&& heightMask) + range(code1, code2) new (fidx, b:pos, e:pos) = range(fidx, b.Line, b.Column, e.Line, e.Column) - member r.StartLine = int32((code &&& startLineMask) >>> startLineShift) - member r.StartColumn = int32((code &&& startColumnMask) >>> startColumnShift) - member r.EndLine = int32((code &&& heightMask) >>> heightShift) + r.StartLine - member r.EndColumn = int32((code &&& endColumnMask) >>> endColumnShift) - member r.IsSynthetic = int32((code &&& isSyntheticMask) >>> isSyntheticShift) <> 0 + member r.StartLine = int32((code2 &&& startLineMask) >>> startLineShift) + member r.StartColumn = int32((code1 &&& startColumnMask) >>> startColumnShift) + member r.EndLine = int32((code2 &&& heightMask) >>> heightShift) + r.StartLine + member r.EndColumn = int32((code1 &&& endColumnMask) >>> endColumnShift) + member r.IsSynthetic = int32((code2 &&& isSyntheticMask) >>> isSyntheticShift) <> 0 member r.Start = pos (r.StartLine, r.StartColumn) member r.End = pos (r.EndLine, r.EndColumn) - member r.FileIndex = int32(code &&& fileIndexMask) + member r.FileIndex = int32(code1 &&& fileIndexMask) member m.StartRange = range (m.FileIndex, m.Start, m.Start) member m.EndRange = range (m.FileIndex, m.End, m.End) member r.FileName = fileOfFileIndex r.FileIndex + member r.MakeSynthetic() = range(code1, code2 ||| isSyntheticMask) + + member r.Code1 = code1 + member r.Code2 = code2 + #if DEBUG member r.DebugCode = try @@ -182,12 +186,14 @@ type range(code:int64) = with e -> e.ToString() #endif - member r.MakeSynthetic() = range(code ||| isSyntheticMask) - override r.ToString() = sprintf "%s (%d,%d--%d,%d) IsSynthetic=%b" r.FileName r.StartLine r.StartColumn r.EndLine r.EndColumn r.IsSynthetic + member r.ToShortString() = sprintf "(%d,%d--%d,%d)" r.StartLine r.StartColumn r.EndLine r.EndColumn - member r.Code = code - override r.Equals(obj) = match obj with :? range as r2 -> code = r2.Code | _ -> false - override r.GetHashCode() = hash code + + override r.Equals(obj) = match obj with :? range as r2 -> code1 = r2.Code1 && code2 = r2.Code2 | _ -> false + + override r.GetHashCode() = hash code1 + hash code2 + + override r.ToString() = sprintf "%s (%d,%d--%d,%d) IsSynthetic=%b" r.FileName r.StartLine r.StartColumn r.EndLine r.EndColumn r.IsSynthetic let mkRange f b e = // remove relative parts from full path diff --git a/src/fsharp/range.fsi b/src/fsharp/range.fsi index c3805f4659a..5b3ea1e24d7 100755 --- a/src/fsharp/range.fsi +++ b/src/fsharp/range.fsi @@ -20,10 +20,10 @@ type pos = member Line : int member Column : int - member Encoding : int32 - static member Decode : int32 -> pos + member Encoding : int64 + static member Decode : int64 -> pos /// The maximum number of bits needed to store an encoded position - static member EncodingSize : int32 + static member EncodingSize : int /// Create a position for the given line and column val mkPos : line:int -> column:int -> pos diff --git a/src/fsharp/service/IncrementalBuild.fs b/src/fsharp/service/IncrementalBuild.fs index 7065d72a6f0..e441ad16dac 100755 --- a/src/fsharp/service/IncrementalBuild.fs +++ b/src/fsharp/service/IncrementalBuild.fs @@ -1282,8 +1282,9 @@ type IncrementalBuilder(tcGlobals, frameworkTcImports, nonFrameworkAssemblyInput result, sourceRange, filename, errorLogger.GetErrors () with exn -> - System.Diagnostics.Debug.Assert(false, sprintf "unexpected failure in IncrementalFSharpBuild.Parse\nerror = %s" (exn.ToString())) - failwith "last chance failure" + let msg = sprintf "unexpected failure in IncrementalFSharpBuild.Parse\nerror = %s" (exn.ToString()) + System.Diagnostics.Debug.Assert(false, msg) + failwith msg /// This is a build task function that gets placed into the build rules as the computation for a Vector.Stamp diff --git a/src/fsharp/service/ServiceLexing.fs b/src/fsharp/service/ServiceLexing.fs index abf3cde1c70..6b266bf91ef 100755 --- a/src/fsharp/service/ServiceLexing.fs +++ b/src/fsharp/service/ServiceLexing.fs @@ -307,7 +307,14 @@ module internal TestExpose = //---------------------------------------------------------------------------- // Lexer states encoded to/from integers //-------------------------------------------------------------------------- -type FSharpTokenizerLexState = int64 +[] +type FSharpTokenizerLexState = + { PosBits: int64 + OtherBits: int64 } + static member Initial = { PosBits = 0L; OtherBits = 0L } + member this.Equals (other: FSharpTokenizerLexState) = (this.PosBits = other.PosBits) && (this.OtherBits = other.OtherBits) + override this.Equals (obj: obj) = match obj with :? FSharpTokenizerLexState as other -> this.Equals(other) | _ -> false + override this.GetHashCode () = hash this.PosBits + hash this.OtherBits type FSharpTokenizerColorState = | Token = 1 @@ -323,7 +330,6 @@ type FSharpTokenizerColorState = | EndLineThenToken = 12 | TripleQuoteString = 13 | TripleQuoteStringInComment = 14 - | InitialState = 0 @@ -348,31 +354,25 @@ module internal LexerStateEncoding = // Note that this will discard all lexcont state, including the ifdefStack. let revertToDefaultLexCont = LexCont.Token [] - let resize32 (i:int32) : FSharpTokenizerLexState = int64 i - let lexstateNumBits = 4 - let ncommentsNumBits = 2 - let startPosNumBits = pos.EncodingSize + let ncommentsNumBits = 4 let hardwhiteNumBits = 1 - let ifdefstackCountNumBits = 4 - let ifdefstackNumBits = 16 // 0 means if, 1 means else + let ifdefstackCountNumBits = 8 + let ifdefstackNumBits = 24 // 0 means if, 1 means else let _ = assert (lexstateNumBits + ncommentsNumBits - + startPosNumBits + hardwhiteNumBits + ifdefstackCountNumBits + ifdefstackNumBits <= 64) let lexstateStart = 0 let ncommentsStart = lexstateNumBits - let startPosStart = lexstateNumBits+ncommentsNumBits - let hardwhitePosStart = lexstateNumBits+ncommentsNumBits+startPosNumBits - let ifdefstackCountStart = lexstateNumBits+ncommentsNumBits+startPosNumBits+hardwhiteNumBits - let ifdefstackStart = lexstateNumBits+ncommentsNumBits+startPosNumBits+hardwhiteNumBits+ifdefstackCountNumBits + let hardwhitePosStart = lexstateNumBits+ncommentsNumBits + let ifdefstackCountStart = lexstateNumBits+ncommentsNumBits+hardwhiteNumBits + let ifdefstackStart = lexstateNumBits+ncommentsNumBits+hardwhiteNumBits+ifdefstackCountNumBits let lexstateMask = Bits.mask64 lexstateStart lexstateNumBits let ncommentsMask = Bits.mask64 ncommentsStart ncommentsNumBits - let startPosMask = Bits.mask64 startPosStart startPosNumBits let hardwhitePosMask = Bits.mask64 hardwhitePosStart hardwhiteNumBits let ifdefstackCountMask = Bits.mask64 ifdefstackCountStart ifdefstackCountNumBits let ifdefstackMask = Bits.mask64 ifdefstackStart ifdefstackNumBits @@ -381,7 +381,7 @@ module internal LexerStateEncoding = let boolOfBit n = (n = 1L) let inline colorStateOfLexState (state: FSharpTokenizerLexState) = - enum (int32 ((state &&& lexstateMask) >>> lexstateStart)) + enum (int32 ((state.OtherBits &&& lexstateMask) >>> lexstateStart)) let inline lexStateOfColorState (state: FSharpTokenizerColorState) = (int64 state <<< lexstateStart) &&& lexstateMask @@ -396,42 +396,46 @@ module internal LexerStateEncoding = ifdefStackBits <- (ifdefStackBits ||| (1 <<< ifdefStackCount)) ifdefStackCount <- ifdefStackCount + 1 - lexStateOfColorState colorState - ||| ((ncomments <<< ncommentsStart) &&& ncommentsMask) - ||| ((resize32 b.Encoding <<< startPosStart) &&& startPosMask) - ||| ((resize32 (bitOfBool light) <<< hardwhitePosStart) &&& hardwhitePosMask) - ||| ((resize32 ifdefStackCount <<< ifdefstackCountStart) &&& ifdefstackCountMask) - ||| ((resize32 ifdefStackBits <<< ifdefstackStart) &&& ifdefstackMask) + let bits = + lexStateOfColorState colorState + ||| ((ncomments <<< ncommentsStart) &&& ncommentsMask) + ||| ((int64 (bitOfBool light) <<< hardwhitePosStart) &&& hardwhitePosMask) + ||| ((int64 ifdefStackCount <<< ifdefstackCountStart) &&& ifdefstackCountMask) + ||| ((int64 ifdefStackBits <<< ifdefstackStart) &&& ifdefstackMask) + { PosBits = b.Encoding + OtherBits = bits } + let decodeLexCont (state:FSharpTokenizerLexState) = let mutable ifDefs = [] - let ifdefStackCount = (int32) ((state &&& ifdefstackCountMask) >>> ifdefstackCountStart) + let bits = state.OtherBits + let ifdefStackCount = (int32) ((bits &&& ifdefstackCountMask) >>> ifdefstackCountStart) if ifdefStackCount>0 then - let ifdefStack = (int32) ((state &&& ifdefstackMask) >>> ifdefstackStart) + let ifdefStack = (int32) ((bits &&& ifdefstackMask) >>> ifdefstackStart) for i in 1..ifdefStackCount do let bit = ifdefStackCount-i let mask = 1 <<< bit let ifDef = (if ifdefStack &&& mask = 0 then IfDefIf else IfDefElse) ifDefs<-(ifDef,range0)::ifDefs colorStateOfLexState state, - (int32) ((state &&& ncommentsMask) >>> ncommentsStart), - pos.Decode (int32 ((state &&& startPosMask) >>> startPosStart)), + int32 ((bits &&& ncommentsMask) >>> ncommentsStart), + pos.Decode state.PosBits, ifDefs, - boolOfBit ((state &&& hardwhitePosMask) >>> hardwhitePosStart) + boolOfBit ((bits &&& hardwhitePosMask) >>> hardwhitePosStart) let encodeLexInt lightSyntaxStatus (lexcont:LexerWhitespaceContinuation) = let tag,n1,p1,ifd = match lexcont with | LexCont.Token ifd -> FSharpTokenizerColorState.Token, 0L, pos0, ifd - | LexCont.IfDefSkip (ifd,n,m) -> FSharpTokenizerColorState.IfDefSkip, resize32 n, m.Start, ifd - | LexCont.EndLine(LexerEndlineContinuation.Skip(ifd,n,m)) -> FSharpTokenizerColorState.EndLineThenSkip, resize32 n, m.Start, ifd + | LexCont.IfDefSkip (ifd,n,m) -> FSharpTokenizerColorState.IfDefSkip, int64 n, m.Start, ifd + | LexCont.EndLine(LexerEndlineContinuation.Skip(ifd,n,m)) -> FSharpTokenizerColorState.EndLineThenSkip, int64 n, m.Start, ifd | LexCont.EndLine(LexerEndlineContinuation.Token(ifd)) -> FSharpTokenizerColorState.EndLineThenToken, 0L, pos0, ifd | LexCont.String (ifd,m) -> FSharpTokenizerColorState.String, 0L, m.Start, ifd - | LexCont.Comment (ifd,n,m) -> FSharpTokenizerColorState.Comment, resize32 n, m.Start, ifd - | LexCont.SingleLineComment (ifd,n,m) -> FSharpTokenizerColorState.SingleLineComment, resize32 n, m.Start, ifd - | LexCont.StringInComment (ifd,n,m) -> FSharpTokenizerColorState.StringInComment, resize32 n, m.Start, ifd - | LexCont.VerbatimStringInComment (ifd,n,m) -> FSharpTokenizerColorState.VerbatimStringInComment, resize32 n, m.Start, ifd - | LexCont.TripleQuoteStringInComment (ifd,n,m) -> FSharpTokenizerColorState.TripleQuoteStringInComment,resize32 n, m.Start, ifd + | LexCont.Comment (ifd,n,m) -> FSharpTokenizerColorState.Comment, int64 n, m.Start, ifd + | LexCont.SingleLineComment (ifd,n,m) -> FSharpTokenizerColorState.SingleLineComment, int64 n, m.Start, ifd + | LexCont.StringInComment (ifd,n,m) -> FSharpTokenizerColorState.StringInComment, int64 n, m.Start, ifd + | LexCont.VerbatimStringInComment (ifd,n,m) -> FSharpTokenizerColorState.VerbatimStringInComment, int64 n, m.Start, ifd + | LexCont.TripleQuoteStringInComment (ifd,n,m) -> FSharpTokenizerColorState.TripleQuoteStringInComment,int64 n, m.Start, ifd | LexCont.MLOnly (ifd,m) -> FSharpTokenizerColorState.CamlOnly, 0L, m.Start, ifd | LexCont.VerbatimString (ifd,m) -> FSharpTokenizerColorState.VerbatimString, 0L, m.Start, ifd | LexCont.TripleQuoteString (ifd,m) -> FSharpTokenizerColorState.TripleQuoteString, 0L, m.Start, ifd @@ -576,7 +580,7 @@ type FSharpLineTokenizer(lexbuf: UnicodeLexing.Lexbuf, | None -> lexbuf.EndPos <- Internal.Utilities.Text.Lexing.Position.Empty | Some(value) -> resetLexbufPos value lexbuf - member x.ScanToken(lexintInitial) : Option * FSharpTokenizerLexState = + member x.ScanToken(lexintInitial) : FSharpTokenInfo option * FSharpTokenizerLexState = use unwindBP = PushThreadBuildPhaseUntilUnwind BuildPhase.Parse use unwindEL = PushErrorLoggerPhaseUntilUnwind (fun _ -> DiscardErrorsLogger) @@ -749,10 +753,10 @@ type FSharpLineTokenizer(lexbuf: UnicodeLexing.Lexbuf, LexerStateEncoding.colorStateOfLexState lexState static member LexStateOfColorState(colorState: FSharpTokenizerColorState) = - LexerStateEncoding.lexStateOfColorState colorState + { PosBits = 0L; OtherBits = LexerStateEncoding.lexStateOfColorState colorState } [] -type FSharpSourceTokenizer(defineConstants : string list, filename : Option) = +type FSharpSourceTokenizer(defineConstants : string list, filename : string option) = let lexResourceManager = new Lexhelp.LexResourceManager() let lexArgsLightOn = mkLexargs(filename,defineConstants,LightSyntaxStatus(true,false),lexResourceManager, ref [],DiscardErrorsLogger) diff --git a/src/fsharp/service/ServiceLexing.fsi b/src/fsharp/service/ServiceLexing.fsi index 1501f45415b..d354e452e1c 100755 --- a/src/fsharp/service/ServiceLexing.fsi +++ b/src/fsharp/service/ServiceLexing.fsi @@ -8,7 +8,12 @@ type Position = int * int type Range = Position * Position /// Represents encoded information for the end-of-line continuation of lexing -type FSharpTokenizerLexState = int64 +[] +type FSharpTokenizerLexState = + { PosBits: int64 + OtherBits: int64 } + static member Initial : FSharpTokenizerLexState + member Equals : FSharpTokenizerLexState -> bool /// Represents stable information for the state of the laxing engine at the end of a line type FSharpTokenizerColorState = @@ -27,7 +32,6 @@ type FSharpTokenizerColorState = | TripleQuoteStringInComment = 14 | InitialState = 0 - /// Gives an indicattion of the color class to assign to the token an IDE type FSharpTokenColorKind = | Default = 0 @@ -193,21 +197,28 @@ module FSharpTokenTag = type FSharpTokenInfo = { /// Left column of the token. LeftColumn:int + /// Right column of the token. RightColumn:int + ColorClass:FSharpTokenColorKind + /// Gives an indication of the class to assign to the token an IDE CharClass:FSharpTokenCharKind + /// Actions taken when the token is typed FSharpTokenTriggerClass:FSharpTokenTriggerClass + /// The tag is an integer identifier for the token Tag:int + /// Provides additional information about the token TokenName:string; + /// The full length consumed by this match, including delayed tokens (which can be ignored in naive lexers) FullMatchedLength: int } -/// Object to tokenize a line of F# source code, starting with the given lexState. The lexState should be 0 for +/// Object to tokenize a line of F# source code, starting with the given lexState. The lexState should be FSharpTokenizerLexState.Initial for /// the first line of text. Returns an array of ranges of the text and two enumerations categorizing the /// tokens and characters covered by that range, i.e. FSharpTokenColorKind and FSharpTokenCharKind. The enumerations /// are somewhat adhoc but useful enough to give good colorization options to the user in an IDE. @@ -221,7 +232,6 @@ type FSharpLineTokenizer = static member ColorStateOfLexState : FSharpTokenizerLexState -> FSharpTokenizerColorState static member LexStateOfColorState : FSharpTokenizerColorState -> FSharpTokenizerLexState - /// Tokenizer for a source file. Holds some expensive-to-compute resources at the scope of the file. [] type FSharpSourceTokenizer = @@ -229,7 +239,6 @@ type FSharpSourceTokenizer = member CreateLineTokenizer : lineText:string -> FSharpLineTokenizer member CreateBufferTokenizer : bufferFiller:(char[] * int * int -> int) -> FSharpLineTokenizer - module internal TestExpose = val TokenInfo : Parser.token -> (FSharpTokenColorKind * FSharpTokenCharKind * FSharpTokenTriggerClass) diff --git a/src/fsharp/service/service.fs b/src/fsharp/service/service.fs index be7157ddde7..fc4c3b67dc1 100644 --- a/src/fsharp/service/service.fs +++ b/src/fsharp/service/service.fs @@ -3288,23 +3288,23 @@ type FSharpChecker(legacyReferenceResolver, projectCacheSize, keepAssemblyConten member internal __.FrameworkImportsCache = backgroundCompiler.FrameworkImportsCache /// Tokenize a single line, returning token information and a tokenization state represented by an integer - member x.TokenizeLine (line: string, state: int64) : FSharpTokenInfo[] * int64 = + member x.TokenizeLine (line: string, state: FSharpTokenizerLexState) = let tokenizer = FSharpSourceTokenizer([], None) let lineTokenizer = tokenizer.CreateLineTokenizer line - let state = ref (None, state) + let mutable state = (None, state) let tokens = - [| while (state := lineTokenizer.ScanToken (snd !state); (fst !state).IsSome) do - yield (fst !state).Value |] - tokens, snd !state + [| while (state <- lineTokenizer.ScanToken (snd state); (fst state).IsSome) do + yield (fst state).Value |] + tokens, snd state /// Tokenize an entire file, line by line member x.TokenizeFile (source: string) : FSharpTokenInfo[][] = let lines = source.Split('\n') let tokens = - [| let state = ref 0L + [| let mutable state = FSharpTokenizerLexState.Initial for line in lines do - let tokens, n = x.TokenizeLine(line, !state) - state := n + let tokens, n = x.TokenizeLine(line, state) + state <- n yield tokens |] tokens diff --git a/src/fsharp/service/service.fsi b/src/fsharp/service/service.fsi index 5ccb31e4502..2d07c235614 100755 --- a/src/fsharp/service/service.fsi +++ b/src/fsharp/service/service.fsi @@ -711,7 +711,7 @@ type public FSharpChecker = member internal ReferenceResolver : ReferenceResolver.Resolver /// Tokenize a single line, returning token information and a tokenization state represented by an integer - member TokenizeLine: line:string * state:int64 -> FSharpTokenInfo [] * int64 + member TokenizeLine: line:string * state:FSharpTokenizerLexState-> FSharpTokenInfo [] * FSharpTokenizerLexState /// Tokenize an entire file, line by line member TokenizeFile: source:string -> FSharpTokenInfo [] [] diff --git a/tests/fsharp/tests.fs b/tests/fsharp/tests.fs index 72e48f87e90..d29f92e5e79 100644 --- a/tests/fsharp/tests.fs +++ b/tests/fsharp/tests.fs @@ -2389,6 +2389,12 @@ module TypecheckTests = [] let ``type check neg102`` () = singleNegTest (testConfig "typecheck/sigs") "neg102" + [] + let ``type check neg103`` () = singleNegTest (testConfig "typecheck/sigs") "neg103" + + [] + let ``type check neg104`` () = singleNegTest (testConfig "typecheck/sigs") "neg104" + [] let ``type check neg106`` () = singleNegTest (testConfig "typecheck/sigs") "neg106" @@ -2401,11 +2407,8 @@ module TypecheckTests = [] let ``type check neg109`` () = singleNegTest (testConfig "typecheck/sigs") "neg109" - [] - let ``type check neg103`` () = singleNegTest (testConfig "typecheck/sigs") "neg103" - - [] - let ``type check neg104`` () = singleNegTest (testConfig "typecheck/sigs") "neg104" + [] + let ``type check neg110`` () = singleNegTest (testConfig "typecheck/sigs") "neg110" [] let ``type check neg_issue_3752`` () = singleNegTest (testConfig "typecheck/sigs") "neg_issue_3752" diff --git a/tests/fsharp/typecheck/sigs/neg102.fs b/tests/fsharp/typecheck/sigs/neg102.fs index 5eb13cdc79f..972967ae8eb 100644 --- a/tests/fsharp/typecheck/sigs/neg102.fs +++ b/tests/fsharp/typecheck/sigs/neg102.fs @@ -44,4 +44,4 @@ module FS0104 = let f3 = function | System.DateTimeKind.Unspecified -> "Unspecified" | System.DateTimeKind.Utc -> "Utc" - | System.DateTimeKind.Local -> "Local" \ No newline at end of file + | System.DateTimeKind.Local -> "Local" diff --git a/tests/fsharp/typecheck/sigs/neg102.vsbsl b/tests/fsharp/typecheck/sigs/neg102.vsbsl new file mode 100644 index 00000000000..333f0e34d17 --- /dev/null +++ b/tests/fsharp/typecheck/sigs/neg102.vsbsl @@ -0,0 +1,18 @@ + +neg102.fs(9,14,9,22): typecheck error FS0025: Incomplete pattern matches on this expression. For example, the value 'B' may indicate a case not covered by the pattern(s). + +neg102.fs(12,14,12,22): typecheck error FS0025: Incomplete pattern matches on this expression. For example, the value '0' may indicate a case not covered by the pattern(s). + +neg102.fs(15,14,15,22): typecheck error FS0025: Incomplete pattern matches on this expression. For example, the value 'EnumABC.B' may indicate a case not covered by the pattern(s). + +neg102.fs(18,14,18,22): typecheck error FS0025: Incomplete pattern matches on this expression. For example, the value 'EnumABC.C' may indicate a case not covered by the pattern(s). + +neg102.fs(22,14,22,22): typecheck error FS0025: Incomplete pattern matches on this expression. For example, the value 'Some (EnumABC.C)' may indicate a case not covered by the pattern(s). + +neg102.fs(27,14,27,22): typecheck error FS0025: Incomplete pattern matches on this expression. For example, the value 'System.DateTimeKind.Utc' may indicate a case not covered by the pattern(s). + +neg102.fs(32,14,32,22): typecheck error FS0104: Enums may take values outside known cases. For example, the value 'enum (2)' may indicate a case not covered by the pattern(s). + +neg102.fs(37,14,37,22): typecheck error FS0104: Enums may take values outside known cases. For example, the value 'Some (enum (2))' may indicate a case not covered by the pattern(s). + +neg102.fs(44,14,44,22): typecheck error FS0104: Enums may take values outside known cases. For example, the value 'enum (3)' may indicate a case not covered by the pattern(s). diff --git a/tests/fsharp/typecheck/sigs/neg103.vsbsl b/tests/fsharp/typecheck/sigs/neg103.vsbsl new file mode 100644 index 00000000000..422a9e3bf81 --- /dev/null +++ b/tests/fsharp/typecheck/sigs/neg103.vsbsl @@ -0,0 +1,25 @@ + +neg103.fs(7,12,7,22): typecheck error FS0001: This expression was expected to have type + 'Async<'a>' +but here has type + 'string' + +neg103.fs(12,7,12,15): typecheck error FS0001: This expression was expected to have type + 'int' +but here has type + 'MyUnion' + +neg103.fs(17,7,17,15): typecheck error FS0001: This expression was expected to have type + 'int' +but here has type + 'MyUnion' + +neg103.fs(21,7,21,9): typecheck error FS0001: This expression was expected to have type + 'Async' +but here has type + 'int' + +neg103.fs(25,11,25,19): typecheck error FS0001: This expression was expected to have type + 'int' +but here has type + 'MyUnion' diff --git a/tests/fsharp/typecheck/sigs/neg110.bsl b/tests/fsharp/typecheck/sigs/neg110.bsl new file mode 100644 index 00000000000..084a852ba7b --- /dev/null +++ b/tests/fsharp/typecheck/sigs/neg110.bsl @@ -0,0 +1,14 @@ + +neg110.fs(2,552,2,557): typecheck error FS0039: The type 'fail1' is not defined. + +neg110.fs(2,552,2,557): typecheck error FS0039: The type 'fail1' is not defined. + +neg110.fs(3,624,3,629): typecheck error FS0039: The value or constructor 'fail2' is not defined. Maybe you want one of the following: + + Failure + + failwith + + failwithf + +neg110.fs(5,538,5,540): typecheck error FS0003: This value is not a function and cannot be applied. diff --git a/tests/fsharp/typecheck/sigs/neg110.fs b/tests/fsharp/typecheck/sigs/neg110.fs new file mode 100644 index 00000000000..109f5de8402 --- /dev/null +++ b/tests/fsharp/typecheck/sigs/neg110.fs @@ -0,0 +1,5 @@ +module Neg110 +type TestDU = | A1 of string | A2 of string | A3 of string | A4 of string | A5 of string | A6 of string | A7 of string | A8 of string | A9 of string | A10 of string | A11 of string | A12 | A13 | A14 | A15 | A16 | A17 | A18 | A19 | A20 | A21 | A22 | A23 | A24 | A25 | A26 | A27 | A28 | A29 | A30 | A31 | A32 | A33 | A34 | A35 | A36 | A37 | A38 | A39 | A40 | A41 | A42 | A43 | A44 | A45 | A46 | A47 | A48 | A49 | A50 | A51 | A52 | A53 | A54 | A55 | A56 | A57 | A58 | A59 | A60 | A61 | A62 | A63 | A64 | A65 | A66 | A67AAAAAAAAAAAAAAAAAAAAAAAA of string fail1 +type TestRec = { Naaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaammmmmmmmmmmmeeeeeeeeeeee : string; Name2 : string } member x.P = fail2 +module SomeRidiculouslyLongNaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaammmmmmmmmmmmeeeeeeeeeeee = + let testFunctionNaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaammmmmmmmmmmmeeeeeeeeeeee () = () fail4 diff --git a/tests/service/TokenizerTests.fs b/tests/service/TokenizerTests.fs index 4973d398f29..84b95e5175e 100644 --- a/tests/service/TokenizerTests.fs +++ b/tests/service/TokenizerTests.fs @@ -20,7 +20,7 @@ open System.IO let sourceTok = FSharpSourceTokenizer([], Some "C:\\test.fsx") -let rec parseLine(line: string, state: int64 ref, tokenizer: FSharpLineTokenizer) = seq { +let rec parseLine(line: string, state: FSharpTokenizerLexState ref, tokenizer: FSharpLineTokenizer) = seq { match tokenizer.ScanToken(!state) with | Some(tok), nstate -> let str = line.Substring(tok.LeftColumn, tok.RightColumn - tok.LeftColumn + 1) @@ -31,7 +31,7 @@ let rec parseLine(line: string, state: int64 ref, tokenizer: FSharpLineTokenizer state := nstate } let tokenizeLines (lines:string[]) = - [ let state = ref 0L + [ let state = ref FSharpTokenizerLexState.Initial for n, line in lines |> Seq.zip [ 0 .. lines.Length-1 ] do let tokenizer = sourceTok.CreateLineTokenizer(line) yield n, parseLine(line, state, tokenizer) |> List.ofSeq ] diff --git a/vsintegration/src/FSharp.Editor/LanguageService/Tokenizer.fs b/vsintegration/src/FSharp.Editor/LanguageService/Tokenizer.fs index 66bb9018f3c..c131374ece0 100644 --- a/vsintegration/src/FSharp.Editor/LanguageService/Tokenizer.fs +++ b/vsintegration/src/FSharp.Editor/LanguageService/Tokenizer.fs @@ -556,7 +556,7 @@ module internal Tokenizer = i // Rescan the lines if necessary and report the information let result = new List() - let mutable lexState = if scanStartLine = 0 then 0L else sourceTextData.[scanStartLine - 1].Value.LexStateAtEndOfLine + let mutable lexState = if scanStartLine = 0 then FSharpTokenizerLexState.Initial else sourceTextData.[scanStartLine - 1].Value.LexStateAtEndOfLine for i = scanStartLine to endLine do cancellationToken.ThrowIfCancellationRequested() @@ -569,7 +569,7 @@ module internal Tokenizer = // 2. the hash codes match // 3. the start-of-line lex states are the same match sourceTextData.[i] with - | Some data when data.IsValid(textLine) && data.LexStateAtStartOfLine = lexState -> + | Some data when data.IsValid(textLine) && data.LexStateAtStartOfLine.Equals(lexState) -> data | _ -> // Otherwise, we recompute @@ -589,7 +589,7 @@ module internal Tokenizer = if endLine < lines.Count - 1 then match sourceTextData.[endLine+1] with | Some data -> - if data.LexStateAtStartOfLine <> lexState then + if not (data.LexStateAtStartOfLine.Equals(lexState)) then sourceTextData.ClearFrom (endLine+1) | None -> () result @@ -729,7 +729,7 @@ module internal Tokenizer = ) do i <- i - 1 i - let lexState = if scanStartLine = 0 then 0L else sourceTextData.[scanStartLine - 1].Value.LexStateAtEndOfLine + let lexState = if scanStartLine = 0 then FSharpTokenizerLexState.Initial else sourceTextData.[scanStartLine - 1].Value.LexStateAtEndOfLine let lineContents = textLine.Text.ToString(textLine.Span) // We can reuse the old data when diff --git a/vsintegration/src/FSharp.LanguageService/Colorize.fs b/vsintegration/src/FSharp.LanguageService/Colorize.fs index 3a52e74397b..1f292c7c92a 100644 --- a/vsintegration/src/FSharp.LanguageService/Colorize.fs +++ b/vsintegration/src/FSharp.LanguageService/Colorize.fs @@ -44,7 +44,7 @@ module internal ColorStateLookup_DEPRECATED = toLexState.Add(result,lexState) result - do Add(0L)|>ignore // Add the 'unknown' state. + do Add(FSharpTokenizerLexState.Initial)|>ignore // Add the 'unknown' state. static member private TryGet<'tKey,'tVal>(dict:Dictionary<'tKey,'tVal>,key:'tKey) : 'tVal option = let mutable result = Unchecked.defaultof<'tVal> @@ -198,7 +198,7 @@ type internal FSharpColorizer_DEPRECATED /// Start state at the beginning of parsing a file. override c.GetStartState(state) = - state <- ColorStateLookup_DEPRECATED.ColorStateOfLexState(0L) + state <- ColorStateLookup_DEPRECATED.ColorStateOfLexState(FSharpTokenizerLexState.Initial) VSConstants.S_OK /// Colorize a line of text. Resulting per-character attributes are stored into attrs From 0f4299d769b4dd5e592f2f9157f04df90f0d14f6 Mon Sep 17 00:00:00 2001 From: BooksBaum <15612932+Booksbaum@users.noreply.github.com> Date: Thu, 25 Oct 2018 18:16:23 +0000 Subject: [PATCH 094/160] Fix #5794: Module Suffix is added in rec module even if type with the same name is generic (#5796) * Add tests * Add detection of generic types in rec modules --- src/fsharp/TypeChecker.fs | 8 +-- tests/fsharp/core/longnames/test.fsx | 74 +++++++++++++++++++++++++++- 2 files changed, 77 insertions(+), 5 deletions(-) diff --git a/src/fsharp/TypeChecker.fs b/src/fsharp/TypeChecker.fs index c558602ffa9..a14ff8af5d4 100755 --- a/src/fsharp/TypeChecker.fs +++ b/src/fsharp/TypeChecker.fs @@ -14699,11 +14699,11 @@ module EstablishTypeDefinitionCores = let AdjustModuleName modKind nm = (match modKind with FSharpModuleWithSuffix -> nm+FSharpModuleSuffix | _ -> nm) - let TypeNamesInMutRecDecls (compDecls: MutRecShapes) = + let TypeNamesInMutRecDecls cenv env (compDecls: MutRecShapes) = [ for d in compDecls do match d with - | MutRecShape.Tycon (MutRecDefnsPhase1DataForTycon(ComponentInfo(_, _, _, ids, _, _, _, _), _, _, _, _, isAtOriginalTyconDefn), _) -> - if isAtOriginalTyconDefn then + | MutRecShape.Tycon (MutRecDefnsPhase1DataForTycon(ComponentInfo(_, typars, _, ids, _, _, _, _), _, _, _, _, isAtOriginalTyconDefn), _) -> + if isAtOriginalTyconDefn && (TcTyparDecls cenv env typars |> List.forall (fun p -> p.Kind = TyparKind.Measure)) then yield (List.last ids).idText | _ -> () ] |> set @@ -14750,7 +14750,7 @@ module EstablishTypeDefinitionCores = let envForDecls, mtypeAcc = MakeInnerEnv envInitial id modKind let mspec = NewModuleOrNamespace (Some envInitial.eCompPath) vis id (xml.ToXmlDoc()) modAttrs (MaybeLazy.Strict (NewEmptyModuleOrNamespaceType modKind)) let innerParent = Parent (mkLocalModRef mspec) - let innerTypeNames = TypeNamesInMutRecDecls decls + let innerTypeNames = TypeNamesInMutRecDecls cenv envForDecls decls MutRecDefnsPhase2DataForModule (mtypeAcc, mspec), (innerParent, innerTypeNames, envForDecls) /// Establish 'type C < T1... TN > = ...' including diff --git a/tests/fsharp/core/longnames/test.fsx b/tests/fsharp/core/longnames/test.fsx index aa1579ef2b8..780037a4896 100644 --- a/tests/fsharp/core/longnames/test.fsx +++ b/tests/fsharp/core/longnames/test.fsx @@ -615,6 +615,79 @@ module rec Ok15 = test "lkneecec09iew15" (not (typeof.FullName.Contains("AModule") )) +module rec Ok16 = + + type A<'a> = A of 'a + + module A = + type Dummy = A | B + + test "lkneecec09iew16" (not (typeof.FullName.Contains("AModule") )) + +module rec Ok17 = + + type A<'a> = A of 'a + type A = A of int + + module A = + type Dummy = A | B + + test "lkneecec09iew17" (typeof.FullName.Contains("AModule") ) + +module rec Ok18 = + + type A<[]'u> = A of int<'u> + + module A = + type Dummy = A | B + + test "lkneecec09iew18" (typeof.FullName.Contains("AModule") ) + +module rec Ok19 = + + type A<[]'u, 'a> = | A of int<'u> | B of 'a + + module A = + type Dummy = A | B + + test "lkneecec09iew19" (not (typeof.FullName.Contains("AModule") )) + +module rec Ok20 = + + type A<'a, []'u> = A of int<'u> | B of 'a + + module A = + type Dummy = A | B + + test "lkneecec09iew20" (not (typeof.FullName.Contains("AModule") )) + +module rec Ok21 = + + type A<'a, 'b> = A of 'a | B of 'b + + module A = + type Dummy = A | B + + test "lkneecec09iew21" (not (typeof.FullName.Contains("AModule") )) + +module rec Ok22 = + + module A = + type Dummy = A | B + + type A<'a> = A of 'a + + test "lkneecec09iew22" (not (typeof.FullName.Contains("AModule") )) + +module rec Ok23 = + + module A = + type Dummy = A | B + + type A = A of int + + test "lkneecec09iew23" (typeof.FullName.Contains("AModule") ) + #if TESTS_AS_APP let RUN() = !failures #else @@ -628,4 +701,3 @@ let aa = stdout.WriteLine "Test Failed" exit 1 #endif - From d6a94981bf02e96c3b42160c920c1bb7d1018e71 Mon Sep 17 00:00:00 2001 From: khoiph1 Date: Fri, 26 Oct 2018 10:42:16 -0700 Subject: [PATCH 095/160] Loc Checkin --- .../FSharp.Build/xlf/FSBuild.txt.cs.xlf | 2 +- .../FSharp.Build/xlf/FSBuild.txt.de.xlf | 2 +- .../FSharp.Build/xlf/FSBuild.txt.es.xlf | 2 +- .../FSharp.Build/xlf/FSBuild.txt.fr.xlf | 2 +- .../FSharp.Build/xlf/FSBuild.txt.it.xlf | 2 +- .../FSharp.Build/xlf/FSBuild.txt.ja.xlf | 2 +- .../FSharp.Build/xlf/FSBuild.txt.ko.xlf | 2 +- .../FSharp.Build/xlf/FSBuild.txt.pl.xlf | 2 +- .../FSharp.Build/xlf/FSBuild.txt.pt-BR.xlf | 2 +- .../FSharp.Build/xlf/FSBuild.txt.ru.xlf | 2 +- .../FSharp.Build/xlf/FSBuild.txt.tr.xlf | 2 +- .../FSharp.Build/xlf/FSBuild.txt.zh-Hant.xlf | 2 +- src/fsharp/FSharp.Core/xlf/FSCore.cs.xlf | 2 +- src/fsharp/FSharp.Core/xlf/FSCore.de.xlf | 2 +- src/fsharp/FSharp.Core/xlf/FSCore.es.xlf | 2 +- src/fsharp/FSharp.Core/xlf/FSCore.fr.xlf | 2 +- src/fsharp/FSharp.Core/xlf/FSCore.it.xlf | 2 +- src/fsharp/FSharp.Core/xlf/FSCore.ja.xlf | 2 +- src/fsharp/FSharp.Core/xlf/FSCore.ko.xlf | 2 +- src/fsharp/FSharp.Core/xlf/FSCore.pl.xlf | 2 +- src/fsharp/FSharp.Core/xlf/FSCore.pt-BR.xlf | 2 +- src/fsharp/FSharp.Core/xlf/FSCore.ru.xlf | 2 +- src/fsharp/FSharp.Core/xlf/FSCore.tr.xlf | 2 +- src/fsharp/FSharp.Core/xlf/FSCore.zh-Hant.xlf | 2 +- src/fsharp/fsi/xlf/FSIstrings.txt.cs.xlf | 2 +- src/fsharp/fsi/xlf/FSIstrings.txt.de.xlf | 2 +- src/fsharp/fsi/xlf/FSIstrings.txt.es.xlf | 2 +- src/fsharp/fsi/xlf/FSIstrings.txt.fr.xlf | 8 ++--- src/fsharp/fsi/xlf/FSIstrings.txt.it.xlf | 4 +-- src/fsharp/fsi/xlf/FSIstrings.txt.ja.xlf | 6 ++-- src/fsharp/fsi/xlf/FSIstrings.txt.ko.xlf | 10 +++--- src/fsharp/fsi/xlf/FSIstrings.txt.pl.xlf | 2 +- src/fsharp/fsi/xlf/FSIstrings.txt.pt-BR.xlf | 8 ++--- src/fsharp/fsi/xlf/FSIstrings.txt.ru.xlf | 4 +-- src/fsharp/fsi/xlf/FSIstrings.txt.tr.xlf | 4 +-- src/fsharp/fsi/xlf/FSIstrings.txt.zh-Hans.xlf | 2 +- src/fsharp/fsi/xlf/FSIstrings.txt.zh-Hant.xlf | 4 +-- src/fsharp/xlf/FSComp.txt.cs.xlf | 20 ++++++------ src/fsharp/xlf/FSComp.txt.de.xlf | 16 +++++----- src/fsharp/xlf/FSComp.txt.es.xlf | 30 ++++++++--------- src/fsharp/xlf/FSComp.txt.fr.xlf | 24 +++++++------- src/fsharp/xlf/FSComp.txt.it.xlf | 26 +++++++-------- src/fsharp/xlf/FSComp.txt.ja.xlf | 32 +++++++++---------- src/fsharp/xlf/FSComp.txt.ko.xlf | 22 ++++++------- src/fsharp/xlf/FSComp.txt.pl.xlf | 24 +++++++------- src/fsharp/xlf/FSComp.txt.pt-BR.xlf | 28 ++++++++-------- src/fsharp/xlf/FSComp.txt.ru.xlf | 26 +++++++-------- src/fsharp/xlf/FSComp.txt.tr.xlf | 26 +++++++-------- src/fsharp/xlf/FSComp.txt.zh-Hans.xlf | 16 +++++----- src/fsharp/xlf/FSComp.txt.zh-Hant.xlf | 20 ++++++------ src/fsharp/xlf/FSStrings.cs.xlf | 6 ++-- src/fsharp/xlf/FSStrings.de.xlf | 4 +-- src/fsharp/xlf/FSStrings.es.xlf | 6 ++-- src/fsharp/xlf/FSStrings.fr.xlf | 6 ++-- src/fsharp/xlf/FSStrings.it.xlf | 6 ++-- src/fsharp/xlf/FSStrings.ja.xlf | 2 +- src/fsharp/xlf/FSStrings.ko.xlf | 6 ++-- src/fsharp/xlf/FSStrings.pl.xlf | 6 ++-- src/fsharp/xlf/FSStrings.pt-BR.xlf | 6 ++-- src/fsharp/xlf/FSStrings.ru.xlf | 6 ++-- src/fsharp/xlf/FSStrings.tr.xlf | 6 ++-- src/fsharp/xlf/FSStrings.zh-Hans.xlf | 4 +-- src/fsharp/xlf/FSStrings.zh-Hant.xlf | 6 ++-- 63 files changed, 243 insertions(+), 243 deletions(-) diff --git a/src/fsharp/FSharp.Build/xlf/FSBuild.txt.cs.xlf b/src/fsharp/FSharp.Build/xlf/FSBuild.txt.cs.xlf index d4e4bac23e6..1c2cebf36fe 100644 --- a/src/fsharp/FSharp.Build/xlf/FSBuild.txt.cs.xlf +++ b/src/fsharp/FSharp.Build/xlf/FSBuild.txt.cs.xlf @@ -1,4 +1,4 @@ - + diff --git a/src/fsharp/FSharp.Build/xlf/FSBuild.txt.de.xlf b/src/fsharp/FSharp.Build/xlf/FSBuild.txt.de.xlf index 604ba262f77..ece2090bed3 100644 --- a/src/fsharp/FSharp.Build/xlf/FSBuild.txt.de.xlf +++ b/src/fsharp/FSharp.Build/xlf/FSBuild.txt.de.xlf @@ -1,4 +1,4 @@ - + diff --git a/src/fsharp/FSharp.Build/xlf/FSBuild.txt.es.xlf b/src/fsharp/FSharp.Build/xlf/FSBuild.txt.es.xlf index 47f7b770a59..4149a8ac602 100644 --- a/src/fsharp/FSharp.Build/xlf/FSBuild.txt.es.xlf +++ b/src/fsharp/FSharp.Build/xlf/FSBuild.txt.es.xlf @@ -1,4 +1,4 @@ - + diff --git a/src/fsharp/FSharp.Build/xlf/FSBuild.txt.fr.xlf b/src/fsharp/FSharp.Build/xlf/FSBuild.txt.fr.xlf index 2d08c442466..050b697ac10 100644 --- a/src/fsharp/FSharp.Build/xlf/FSBuild.txt.fr.xlf +++ b/src/fsharp/FSharp.Build/xlf/FSBuild.txt.fr.xlf @@ -1,4 +1,4 @@ - + diff --git a/src/fsharp/FSharp.Build/xlf/FSBuild.txt.it.xlf b/src/fsharp/FSharp.Build/xlf/FSBuild.txt.it.xlf index f4df6a25059..3d1ba6fb8ca 100644 --- a/src/fsharp/FSharp.Build/xlf/FSBuild.txt.it.xlf +++ b/src/fsharp/FSharp.Build/xlf/FSBuild.txt.it.xlf @@ -1,4 +1,4 @@ - + diff --git a/src/fsharp/FSharp.Build/xlf/FSBuild.txt.ja.xlf b/src/fsharp/FSharp.Build/xlf/FSBuild.txt.ja.xlf index 6c430cb50b0..7801f66a5c1 100644 --- a/src/fsharp/FSharp.Build/xlf/FSBuild.txt.ja.xlf +++ b/src/fsharp/FSharp.Build/xlf/FSBuild.txt.ja.xlf @@ -1,4 +1,4 @@ - + diff --git a/src/fsharp/FSharp.Build/xlf/FSBuild.txt.ko.xlf b/src/fsharp/FSharp.Build/xlf/FSBuild.txt.ko.xlf index 7b689385a7e..3e943447be7 100644 --- a/src/fsharp/FSharp.Build/xlf/FSBuild.txt.ko.xlf +++ b/src/fsharp/FSharp.Build/xlf/FSBuild.txt.ko.xlf @@ -1,4 +1,4 @@ - + diff --git a/src/fsharp/FSharp.Build/xlf/FSBuild.txt.pl.xlf b/src/fsharp/FSharp.Build/xlf/FSBuild.txt.pl.xlf index d3a0e4f9761..1d707eca51d 100644 --- a/src/fsharp/FSharp.Build/xlf/FSBuild.txt.pl.xlf +++ b/src/fsharp/FSharp.Build/xlf/FSBuild.txt.pl.xlf @@ -1,4 +1,4 @@ - + diff --git a/src/fsharp/FSharp.Build/xlf/FSBuild.txt.pt-BR.xlf b/src/fsharp/FSharp.Build/xlf/FSBuild.txt.pt-BR.xlf index 4bdb28cd9f7..ac11dee3e50 100644 --- a/src/fsharp/FSharp.Build/xlf/FSBuild.txt.pt-BR.xlf +++ b/src/fsharp/FSharp.Build/xlf/FSBuild.txt.pt-BR.xlf @@ -1,4 +1,4 @@ - + diff --git a/src/fsharp/FSharp.Build/xlf/FSBuild.txt.ru.xlf b/src/fsharp/FSharp.Build/xlf/FSBuild.txt.ru.xlf index ed2d4a5d09f..6970cd9d52b 100644 --- a/src/fsharp/FSharp.Build/xlf/FSBuild.txt.ru.xlf +++ b/src/fsharp/FSharp.Build/xlf/FSBuild.txt.ru.xlf @@ -1,4 +1,4 @@ - + diff --git a/src/fsharp/FSharp.Build/xlf/FSBuild.txt.tr.xlf b/src/fsharp/FSharp.Build/xlf/FSBuild.txt.tr.xlf index b2332af2b82..49b20a79f18 100644 --- a/src/fsharp/FSharp.Build/xlf/FSBuild.txt.tr.xlf +++ b/src/fsharp/FSharp.Build/xlf/FSBuild.txt.tr.xlf @@ -1,4 +1,4 @@ - + diff --git a/src/fsharp/FSharp.Build/xlf/FSBuild.txt.zh-Hant.xlf b/src/fsharp/FSharp.Build/xlf/FSBuild.txt.zh-Hant.xlf index 94447e27905..9dce8b27d36 100644 --- a/src/fsharp/FSharp.Build/xlf/FSBuild.txt.zh-Hant.xlf +++ b/src/fsharp/FSharp.Build/xlf/FSBuild.txt.zh-Hant.xlf @@ -1,4 +1,4 @@ - + diff --git a/src/fsharp/FSharp.Core/xlf/FSCore.cs.xlf b/src/fsharp/FSharp.Core/xlf/FSCore.cs.xlf index 7c8e97d6501..b5d21ee48fb 100644 --- a/src/fsharp/FSharp.Core/xlf/FSCore.cs.xlf +++ b/src/fsharp/FSharp.Core/xlf/FSCore.cs.xlf @@ -1,4 +1,4 @@ - + diff --git a/src/fsharp/FSharp.Core/xlf/FSCore.de.xlf b/src/fsharp/FSharp.Core/xlf/FSCore.de.xlf index cfcd71290fa..01d60b65b31 100644 --- a/src/fsharp/FSharp.Core/xlf/FSCore.de.xlf +++ b/src/fsharp/FSharp.Core/xlf/FSCore.de.xlf @@ -1,4 +1,4 @@ - + diff --git a/src/fsharp/FSharp.Core/xlf/FSCore.es.xlf b/src/fsharp/FSharp.Core/xlf/FSCore.es.xlf index 46a617777f6..86bcc129825 100644 --- a/src/fsharp/FSharp.Core/xlf/FSCore.es.xlf +++ b/src/fsharp/FSharp.Core/xlf/FSCore.es.xlf @@ -1,4 +1,4 @@ - + diff --git a/src/fsharp/FSharp.Core/xlf/FSCore.fr.xlf b/src/fsharp/FSharp.Core/xlf/FSCore.fr.xlf index 09dfb48a62c..3c12f6109a2 100644 --- a/src/fsharp/FSharp.Core/xlf/FSCore.fr.xlf +++ b/src/fsharp/FSharp.Core/xlf/FSCore.fr.xlf @@ -1,4 +1,4 @@ - + diff --git a/src/fsharp/FSharp.Core/xlf/FSCore.it.xlf b/src/fsharp/FSharp.Core/xlf/FSCore.it.xlf index 5598638a5f4..4991f7ffaf9 100644 --- a/src/fsharp/FSharp.Core/xlf/FSCore.it.xlf +++ b/src/fsharp/FSharp.Core/xlf/FSCore.it.xlf @@ -1,4 +1,4 @@ - + diff --git a/src/fsharp/FSharp.Core/xlf/FSCore.ja.xlf b/src/fsharp/FSharp.Core/xlf/FSCore.ja.xlf index 51440221431..ae165167480 100644 --- a/src/fsharp/FSharp.Core/xlf/FSCore.ja.xlf +++ b/src/fsharp/FSharp.Core/xlf/FSCore.ja.xlf @@ -1,4 +1,4 @@ - + diff --git a/src/fsharp/FSharp.Core/xlf/FSCore.ko.xlf b/src/fsharp/FSharp.Core/xlf/FSCore.ko.xlf index 76a111799a3..49b8be6efb8 100644 --- a/src/fsharp/FSharp.Core/xlf/FSCore.ko.xlf +++ b/src/fsharp/FSharp.Core/xlf/FSCore.ko.xlf @@ -1,4 +1,4 @@ - + diff --git a/src/fsharp/FSharp.Core/xlf/FSCore.pl.xlf b/src/fsharp/FSharp.Core/xlf/FSCore.pl.xlf index 3d869bc263b..d435fc3f80a 100644 --- a/src/fsharp/FSharp.Core/xlf/FSCore.pl.xlf +++ b/src/fsharp/FSharp.Core/xlf/FSCore.pl.xlf @@ -1,4 +1,4 @@ - + diff --git a/src/fsharp/FSharp.Core/xlf/FSCore.pt-BR.xlf b/src/fsharp/FSharp.Core/xlf/FSCore.pt-BR.xlf index 48c0450f629..43296899d7c 100644 --- a/src/fsharp/FSharp.Core/xlf/FSCore.pt-BR.xlf +++ b/src/fsharp/FSharp.Core/xlf/FSCore.pt-BR.xlf @@ -1,4 +1,4 @@ - + diff --git a/src/fsharp/FSharp.Core/xlf/FSCore.ru.xlf b/src/fsharp/FSharp.Core/xlf/FSCore.ru.xlf index 6daf52715c5..51162715a61 100644 --- a/src/fsharp/FSharp.Core/xlf/FSCore.ru.xlf +++ b/src/fsharp/FSharp.Core/xlf/FSCore.ru.xlf @@ -1,4 +1,4 @@ - + diff --git a/src/fsharp/FSharp.Core/xlf/FSCore.tr.xlf b/src/fsharp/FSharp.Core/xlf/FSCore.tr.xlf index 2baf7f4b07b..33601727b60 100644 --- a/src/fsharp/FSharp.Core/xlf/FSCore.tr.xlf +++ b/src/fsharp/FSharp.Core/xlf/FSCore.tr.xlf @@ -1,4 +1,4 @@ - + diff --git a/src/fsharp/FSharp.Core/xlf/FSCore.zh-Hant.xlf b/src/fsharp/FSharp.Core/xlf/FSCore.zh-Hant.xlf index e75ede8758c..de92b3ac758 100644 --- a/src/fsharp/FSharp.Core/xlf/FSCore.zh-Hant.xlf +++ b/src/fsharp/FSharp.Core/xlf/FSCore.zh-Hant.xlf @@ -1,4 +1,4 @@ - + diff --git a/src/fsharp/fsi/xlf/FSIstrings.txt.cs.xlf b/src/fsharp/fsi/xlf/FSIstrings.txt.cs.xlf index 2567d3f26f2..8ff4646967d 100644 --- a/src/fsharp/fsi/xlf/FSIstrings.txt.cs.xlf +++ b/src/fsharp/fsi/xlf/FSIstrings.txt.cs.xlf @@ -1,4 +1,4 @@ - + diff --git a/src/fsharp/fsi/xlf/FSIstrings.txt.de.xlf b/src/fsharp/fsi/xlf/FSIstrings.txt.de.xlf index ec345eadd3d..f159881dd8e 100644 --- a/src/fsharp/fsi/xlf/FSIstrings.txt.de.xlf +++ b/src/fsharp/fsi/xlf/FSIstrings.txt.de.xlf @@ -1,4 +1,4 @@ - + diff --git a/src/fsharp/fsi/xlf/FSIstrings.txt.es.xlf b/src/fsharp/fsi/xlf/FSIstrings.txt.es.xlf index a43b278bb13..146c3f9cf5d 100644 --- a/src/fsharp/fsi/xlf/FSIstrings.txt.es.xlf +++ b/src/fsharp/fsi/xlf/FSIstrings.txt.es.xlf @@ -1,4 +1,4 @@ - + diff --git a/src/fsharp/fsi/xlf/FSIstrings.txt.fr.xlf b/src/fsharp/fsi/xlf/FSIstrings.txt.fr.xlf index 4343c88666b..b69c71103d4 100644 --- a/src/fsharp/fsi/xlf/FSIstrings.txt.fr.xlf +++ b/src/fsharp/fsi/xlf/FSIstrings.txt.fr.xlf @@ -1,4 +1,4 @@ - + @@ -134,7 +134,7 @@ \n\nException raised during pretty printing.\nPlease report this so it can be fixed.\nTrace: {0}\n - \n\nException déclenchée durant l'impression en mode Pretty.\nSignalez ce problème afin qu'il soit corrigé.\nTrace : {0}\n + \n\nException déclenchée durant l'impression automatique.\nSignalez ce problème afin qu'il soit corrigé.\nTrace : {0}\n @@ -184,7 +184,7 @@ Loading - Chargement en cours + Chargement @@ -264,7 +264,7 @@ Prevents references from being locked by the F# Interactive process - Empêche le blocage des références par le processus interactif F# + Empêche le blocage des références par le processus de F# Interactive diff --git a/src/fsharp/fsi/xlf/FSIstrings.txt.it.xlf b/src/fsharp/fsi/xlf/FSIstrings.txt.it.xlf index bdba37d1c78..51a94aabb2a 100644 --- a/src/fsharp/fsi/xlf/FSIstrings.txt.it.xlf +++ b/src/fsharp/fsi/xlf/FSIstrings.txt.it.xlf @@ -1,4 +1,4 @@ - + @@ -114,7 +114,7 @@ Invalid directive '#{0} {1}' - Direttiva non valida '#{0} {1}' + Direttiva '#{0} {1}' non valida diff --git a/src/fsharp/fsi/xlf/FSIstrings.txt.ja.xlf b/src/fsharp/fsi/xlf/FSIstrings.txt.ja.xlf index 8697e6da83b..060deb12475 100644 --- a/src/fsharp/fsi/xlf/FSIstrings.txt.ja.xlf +++ b/src/fsharp/fsi/xlf/FSIstrings.txt.ja.xlf @@ -139,7 +139,7 @@ F# Interactive directives: - F# Interactive ディレクティブ: + F# インタラクティブ ディレクティブ: @@ -174,7 +174,7 @@ F# Interactive command line options: - F# Interactive コマンド ライン オプション: + F# インタラクティブ コマンド ライン オプション: @@ -254,7 +254,7 @@ Microsoft (R) F# Interactive version {0} - Microsoft (R) F# Interactive Version {0} + Microsoft (R) F# インタラクティブ バージョン {0} diff --git a/src/fsharp/fsi/xlf/FSIstrings.txt.ko.xlf b/src/fsharp/fsi/xlf/FSIstrings.txt.ko.xlf index 6f6d927ebf0..a5857105143 100644 --- a/src/fsharp/fsi/xlf/FSIstrings.txt.ko.xlf +++ b/src/fsharp/fsi/xlf/FSIstrings.txt.ko.xlf @@ -1,4 +1,4 @@ - + @@ -139,7 +139,7 @@ F# Interactive directives: - F# Interactive 지시문: + F# 대화형 지시문: @@ -214,7 +214,7 @@ --> Referenced '{0}' (file may be locked by F# Interactive process) - --> '{0}' 참조됨(파일은 F# Interactive 프로세스에 의해 잠길 수 있음) + --> '{0}' 참조됨(파일은 F# 대화형 프로세스에 의해 잠길 수 있음) @@ -259,12 +259,12 @@ F# Interactive for F# {0} - F# {0}에 대한 F# Interactive + F# {0}에 대한 F# 대화형 Prevents references from being locked by the F# Interactive process - 참조가 F# Interactive 프로세스에 의해 잠기지 않도록 합니다. + 참조가 F# 대화형 프로세스에 의해 잠기지 않도록 합니다. diff --git a/src/fsharp/fsi/xlf/FSIstrings.txt.pl.xlf b/src/fsharp/fsi/xlf/FSIstrings.txt.pl.xlf index 82960cad8fd..f6b3de9b345 100644 --- a/src/fsharp/fsi/xlf/FSIstrings.txt.pl.xlf +++ b/src/fsharp/fsi/xlf/FSIstrings.txt.pl.xlf @@ -1,4 +1,4 @@ - + diff --git a/src/fsharp/fsi/xlf/FSIstrings.txt.pt-BR.xlf b/src/fsharp/fsi/xlf/FSIstrings.txt.pt-BR.xlf index 7d8838f24f4..66af6500830 100644 --- a/src/fsharp/fsi/xlf/FSIstrings.txt.pt-BR.xlf +++ b/src/fsharp/fsi/xlf/FSIstrings.txt.pt-BR.xlf @@ -1,4 +1,4 @@ - + @@ -139,7 +139,7 @@ F# Interactive directives: - Diretrizes interativas F#: + Diretrizes F# Interativo: @@ -174,7 +174,7 @@ F# Interactive command line options: - Opções de linha de comando F# interativo: + Opções de linha de comando F# Interativo: @@ -254,7 +254,7 @@ Microsoft (R) F# Interactive version {0} - Microsoft (R) F# Interactive versão {0} + Microsoft (R) F# Interativo versão {0} diff --git a/src/fsharp/fsi/xlf/FSIstrings.txt.ru.xlf b/src/fsharp/fsi/xlf/FSIstrings.txt.ru.xlf index 1d6ce4e9633..f3b41bee024 100644 --- a/src/fsharp/fsi/xlf/FSIstrings.txt.ru.xlf +++ b/src/fsharp/fsi/xlf/FSIstrings.txt.ru.xlf @@ -1,4 +1,4 @@ - + @@ -99,7 +99,7 @@ A problem occurred starting the F# Interactive process. This may be due to a known problem with background process console support for Unicode-enabled applications on some Windows systems. Try selecting Tools->Options->F# Interactive for Visual Studio and enter '--fsi-server-no-unicode'. - Возникла проблема при запуске процесса F# Interactive. Это может быть вызвано известной проблемой с поддержкой консоли фонового процесса для приложений с поддержкой Юникода в некоторых системах Windows. Попробуйте выбрать "Сервис->Параметры->F# Interactive для Visual Studio" и ввести "--fsi-server-no-unicode". + Возникла проблема при запуске процесса F# Interactive. Это может быть вызвано известной проблемой с поддержкой консоли фонового процесса для приложений с поддержкой Юникода в некоторых системах Windows. Попробуйте выбрать "Сервис" -> "Параметры" -> "F# Interactive для Visual Studio" и ввести "--fsi-server-no-unicode". diff --git a/src/fsharp/fsi/xlf/FSIstrings.txt.tr.xlf b/src/fsharp/fsi/xlf/FSIstrings.txt.tr.xlf index 7393283389d..c9a52ba5e8f 100644 --- a/src/fsharp/fsi/xlf/FSIstrings.txt.tr.xlf +++ b/src/fsharp/fsi/xlf/FSIstrings.txt.tr.xlf @@ -1,4 +1,4 @@ - + @@ -174,7 +174,7 @@ F# Interactive command line options: - F# Interactive komut satırı seçenekleri: + F# Etkileşimli komut satırı seçenekleri: diff --git a/src/fsharp/fsi/xlf/FSIstrings.txt.zh-Hans.xlf b/src/fsharp/fsi/xlf/FSIstrings.txt.zh-Hans.xlf index 317abba3c1b..5d81aa592b0 100644 --- a/src/fsharp/fsi/xlf/FSIstrings.txt.zh-Hans.xlf +++ b/src/fsharp/fsi/xlf/FSIstrings.txt.zh-Hans.xlf @@ -139,7 +139,7 @@ F# Interactive directives: - F# 交互指令: + F# 交互窗口指令: diff --git a/src/fsharp/fsi/xlf/FSIstrings.txt.zh-Hant.xlf b/src/fsharp/fsi/xlf/FSIstrings.txt.zh-Hant.xlf index 84501a17e14..295ea674957 100644 --- a/src/fsharp/fsi/xlf/FSIstrings.txt.zh-Hant.xlf +++ b/src/fsharp/fsi/xlf/FSIstrings.txt.zh-Hant.xlf @@ -254,12 +254,12 @@ Microsoft (R) F# Interactive version {0} - Microsoft (R) F# Interactive 版本 {0} + Microsoft (R) F# 互動版本 {0} F# Interactive for F# {0} - 適用於 F# {0} 的 F# Interactive + 適用於 F# {0} 的 F# 互動 diff --git a/src/fsharp/xlf/FSComp.txt.cs.xlf b/src/fsharp/xlf/FSComp.txt.cs.xlf index 8399e9aa75c..62976f975f3 100644 --- a/src/fsharp/xlf/FSComp.txt.cs.xlf +++ b/src/fsharp/xlf/FSComp.txt.cs.xlf @@ -1,4 +1,4 @@ - + @@ -109,7 +109,7 @@ All branches of a pattern match expression must return values of the same type. The first branch returned a value of type '{0}', but this branch returned a value of type '{1}'. - Všechny větve výrazu porovnání vzorů musí vracet hodnoty stejného typu. První větev vrátila hodnotu typu {0}, ale tato větev vrátila hodnotu typu {1}. + Všechny větve výrazu porovnávacího vzorku musí vracet hodnoty stejného typu. První větev vrátila hodnotu typu {0}, ale tato větev vrátila hodnotu typu {1}. @@ -1949,7 +1949,7 @@ Syntax error - Chyba syntaxe + chyba syntaxe @@ -4069,7 +4069,7 @@ Copyright (c) Microsoft Corporation. All Rights Reserved. - Copyright (c) Microsoft Corporation. Všechna práva vyhrazena. + Copyright (C) Microsoft Corporation. Všechna práva vyhrazena. @@ -4544,7 +4544,7 @@ argument - argument + Argument @@ -7059,27 +7059,27 @@ Byref types are not allowed to have optional type extensions. - Byref types are not allowed to have optional type extensions. + Typy ByRef nesmí mít rozšíření volitelného typu. The parameter '{0}' has an invalid type '{1}'. This is not permitted by the rules of Common IL. - The parameter '{0}' has an invalid type '{1}'. This is not permitted by the rules of Common IL. + Parametr {0} má neplatný typ {1}. To nepovolují pravidla Common IL. The function or method has an invalid return type '{0}'. This is not permitted by the rules of Common IL. - The function or method has an invalid return type '{0}'. This is not permitted by the rules of Common IL. + Funkce nebo metoda má neplatný návratový typ {0}. To nepovolují pravidla Common IL. Cannot call the byref extension method '{0}. The first parameter requires the value to be mutable or a non-readonly byref type. - Cannot call the byref extension method '{0}. The first parameter requires the value to be mutable or a non-readonly byref type. + Nejde volat metodu rozšíření byref {0}. První parametr vyžaduje, aby hodnota byla měnitelná nebo typu byref, která není jen pro čtení. Cannot partially apply the extension method '{0}' because the first parameter is a byref type. - Cannot partially apply the extension method '{0}' because the first parameter is a byref type. + Nejde částečně použít rozšiřující metodu {0}, protože první parametr je typu byref. diff --git a/src/fsharp/xlf/FSComp.txt.de.xlf b/src/fsharp/xlf/FSComp.txt.de.xlf index afa58d4bef5..1a703578fb2 100644 --- a/src/fsharp/xlf/FSComp.txt.de.xlf +++ b/src/fsharp/xlf/FSComp.txt.de.xlf @@ -1,4 +1,4 @@ - + @@ -109,7 +109,7 @@ All branches of a pattern match expression must return values of the same type. The first branch returned a value of type '{0}', but this branch returned a value of type '{1}'. - Alle Branches eines Musterübereinstimmungsausdrucks müssen Werte des gleichen Typs zurückgeben. Der erste Branch hat einen Wert vom Typ "{0}" zurückgegeben, aber dieser Branch gab einen Wert vom Typ "{1}" zurück. + Alle Verzweigungen eines Musterübereinstimmungsausdrucks müssen Werte des gleichen Typs zurückgeben. Die erste Verzweigung hat einen Wert vom Typ "{0}", diese Verzweigung jedoch einen Wert vom Typ "{1}" zurückgegeben. @@ -4069,7 +4069,7 @@ Copyright (c) Microsoft Corporation. All Rights Reserved. - Copyright (c) Microsoft Corporation. Alle Rechte vorbehalten. + Copyright (C) Microsoft Corporation. Alle Rechte vorbehalten. @@ -7059,27 +7059,27 @@ Byref types are not allowed to have optional type extensions. - Byref types are not allowed to have optional type extensions. + ByRef-Typen dürfen keine optionalen Typerweiterungen aufweisen. The parameter '{0}' has an invalid type '{1}'. This is not permitted by the rules of Common IL. - The parameter '{0}' has an invalid type '{1}'. This is not permitted by the rules of Common IL. + Der Parameter "{0}" weist einen ungültigen Typ "{1}" auf. Dies ist gemäß den Regeln von Common IL unzulässig. The function or method has an invalid return type '{0}'. This is not permitted by the rules of Common IL. - The function or method has an invalid return type '{0}'. This is not permitted by the rules of Common IL. + Die Funktion oder Methode weist einen ungültigen Rückgabetyp "{0}" auf. Dies ist gemäß den Regeln von Common IL unzulässig. Cannot call the byref extension method '{0}. The first parameter requires the value to be mutable or a non-readonly byref type. - Cannot call the byref extension method '{0}. The first parameter requires the value to be mutable or a non-readonly byref type. + Die ByRef-Erweiterungsmethode "{0}" kann nicht aufgerufen werden. Für den ersten Parameter muss der Wert änderbar sein oder einem nicht schreibgeschützten ByRef-Typ entsprechen. Cannot partially apply the extension method '{0}' because the first parameter is a byref type. - Cannot partially apply the extension method '{0}' because the first parameter is a byref type. + Die Erweiterungsmethode "{0}" kann nicht teilweise angewendet werden, da der erste Parameter ein Byref-Typ ist. diff --git a/src/fsharp/xlf/FSComp.txt.es.xlf b/src/fsharp/xlf/FSComp.txt.es.xlf index 11cb00df84b..a36b14f9ed2 100644 --- a/src/fsharp/xlf/FSComp.txt.es.xlf +++ b/src/fsharp/xlf/FSComp.txt.es.xlf @@ -1,4 +1,4 @@ - + @@ -109,7 +109,7 @@ All branches of a pattern match expression must return values of the same type. The first branch returned a value of type '{0}', but this branch returned a value of type '{1}'. - Todas las ramas de una expresión de coincidencia de patrón deben devolver valores del mismo tipo. La primera rama devolvió un valor de tipo "{0}", pero esta rama devolvió un valor de tipo "\{1 \}". + Todas las ramas de una expresión de coincidencia de patrón deben devolver valores del mismo tipo. La primera rama devuelve un valor de tipo "{0}", pero esta rama devuelve un valor de tipo "{1}". @@ -1949,7 +1949,7 @@ Syntax error - Error de sintaxis + error de sintaxis @@ -4069,7 +4069,7 @@ Copyright (c) Microsoft Corporation. All Rights Reserved. - (C) Microsoft Corporation. Todos los derechos reservados. + Copyright (C) Microsoft Corporation. Todos los derechos reservados. @@ -4289,7 +4289,7 @@ Read response file for more options - Leer el archivo de respuesta para ver más opciones + Leer el archivo de respuesta para obtener más opciones @@ -4519,7 +4519,7 @@ field - campo + Campo @@ -4529,12 +4529,12 @@ property - propiedad + Propiedad extension - extensión + Extensión @@ -4544,7 +4544,7 @@ argument - argumento + Argumento @@ -5229,7 +5229,7 @@ The FieldOffset attribute can only be placed on members of types marked with the StructLayout(LayoutKind.Explicit) - El atributo FieldOffset sólo se puede colocar en miembros de tipos marcados con StructLayout(LayoutKind.Explicit) + El atributo FieldOffset solo se puede colocar en miembros de tipos marcados con StructLayout(LayoutKind.Explicit) @@ -7059,27 +7059,27 @@ Byref types are not allowed to have optional type extensions. - Byref types are not allowed to have optional type extensions. + Los tipos de ByRef no pueden tener extensiones de tipo opcional. The parameter '{0}' has an invalid type '{1}'. This is not permitted by the rules of Common IL. - The parameter '{0}' has an invalid type '{1}'. This is not permitted by the rules of Common IL. + El parámetro "{0}" tiene un tipo no válido "{1}". Esto no está permitido por las reglas de Common IL. The function or method has an invalid return type '{0}'. This is not permitted by the rules of Common IL. - The function or method has an invalid return type '{0}'. This is not permitted by the rules of Common IL. + La función o método tiene un tipo de valor devuelto no válido "{0}". Esto no está permitido por las reglas de Common IL. Cannot call the byref extension method '{0}. The first parameter requires the value to be mutable or a non-readonly byref type. - Cannot call the byref extension method '{0}. The first parameter requires the value to be mutable or a non-readonly byref type. + No se puede llamar al método de extensión de byref "{0}". El primer parámetro requiere que el valor sea mutable o un tipo de byref que no sea de solo lectura. Cannot partially apply the extension method '{0}' because the first parameter is a byref type. - Cannot partially apply the extension method '{0}' because the first parameter is a byref type. + No se puede aplicar parcialmente el método de extensión "{0}" porque el primer parámetro es un tipo byref. diff --git a/src/fsharp/xlf/FSComp.txt.fr.xlf b/src/fsharp/xlf/FSComp.txt.fr.xlf index 28bf771e2d5..114895f4aae 100644 --- a/src/fsharp/xlf/FSComp.txt.fr.xlf +++ b/src/fsharp/xlf/FSComp.txt.fr.xlf @@ -1,4 +1,4 @@ - + @@ -109,7 +109,7 @@ All branches of a pattern match expression must return values of the same type. The first branch returned a value of type '{0}', but this branch returned a value of type '{1}'. - Toutes les branches d'une expression comportant des critères spéciaux doivent retourner des valeurs du même type. La première branche a retourné une valeur de type '{0}', mais cette branche a retourné une valeur de type '{1}'. + Toutes les branches d'une expression de correspondance de modèle doivent retourner des valeurs du même type. La première branche a retourné une valeur de type « {0} », mais cette branche a retourné une valeur de type « {1} ». @@ -1949,7 +1949,7 @@ Syntax error - Erreur de syntaxe + erreur de syntaxe @@ -4069,7 +4069,7 @@ Copyright (c) Microsoft Corporation. All Rights Reserved. - Copyright (c) Microsoft Corporation. Tous droits réservés. + Copyright (C) Microsoft Corporation. Tous droits réservés. @@ -4519,7 +4519,7 @@ field - champ + Champ @@ -4534,7 +4534,7 @@ extension - extension + Extension @@ -4544,7 +4544,7 @@ argument - argument + Argument @@ -7059,27 +7059,27 @@ Byref types are not allowed to have optional type extensions. - Byref types are not allowed to have optional type extensions. + Les types ByRef ne sont pas autorisés à avoir des extensions de type en option. The parameter '{0}' has an invalid type '{1}'. This is not permitted by the rules of Common IL. - The parameter '{0}' has an invalid type '{1}'. This is not permitted by the rules of Common IL. + Le paramètre « {0} » a un type non valide (« {1} »), ce qui n'est pas autorisé par les règles de Common IL. The function or method has an invalid return type '{0}'. This is not permitted by the rules of Common IL. - The function or method has an invalid return type '{0}'. This is not permitted by the rules of Common IL. + La méthode ou la fonction a un type de retour non valide (« {0} »), ce qui n’est pas autorisé par les règles de Common IL. Cannot call the byref extension method '{0}. The first parameter requires the value to be mutable or a non-readonly byref type. - Cannot call the byref extension method '{0}. The first parameter requires the value to be mutable or a non-readonly byref type. + Impossible d’appeler la méthode d’extension byref « {0} ». Le premier paramètre nécessite que la valeur soit mutable ou un type byref autre qu'en lecture seule. Cannot partially apply the extension method '{0}' because the first parameter is a byref type. - Cannot partially apply the extension method '{0}' because the first parameter is a byref type. + Impossible d'appliquer partiellement la méthode d’extension « {0} » car le premier paramètre est un type byref. diff --git a/src/fsharp/xlf/FSComp.txt.it.xlf b/src/fsharp/xlf/FSComp.txt.it.xlf index 1736dad5bba..9803659f35a 100644 --- a/src/fsharp/xlf/FSComp.txt.it.xlf +++ b/src/fsharp/xlf/FSComp.txt.it.xlf @@ -1,4 +1,4 @@ - + @@ -1949,7 +1949,7 @@ Syntax error - Errore di sintassi + errore di sintassi @@ -3029,7 +3029,7 @@ Objects must be initialized by an object construction expression that calls an inherited object constructor and assigns a value to each field - Gli oggetti devono essere inizializzati da un'espressione di costruzione degli oggetti che chiama un costruttore di oggetti ereditato e assegna un valore a ogni campo + Gli oggetti devono essere inizializzati da un'espressione di costruzione degli oggetti che chiama un costruttore di oggetto ereditato e assegna un valore a ogni campo @@ -4069,7 +4069,7 @@ Copyright (c) Microsoft Corporation. All Rights Reserved. - Copyright (c) Microsoft Corporation. Tutti i diritti sono riservati. + Copyright (C) Microsoft Corporation. Tutti i diritti sono riservati. @@ -4289,7 +4289,7 @@ Read response file for more options - Legge il file di risposta per ulteriori opzioni + Per ulteriori opzioni, leggere il file di risposta @@ -4529,12 +4529,12 @@ property - proprietà + Proprietà. extension - estensione + Estensione @@ -4544,7 +4544,7 @@ argument - argomento + Argomento @@ -7059,27 +7059,27 @@ Byref types are not allowed to have optional type extensions. - Byref types are not allowed to have optional type extensions. + Con i tipi byref non sono consentite estensioni di tipo facoltative. The parameter '{0}' has an invalid type '{1}'. This is not permitted by the rules of Common IL. - The parameter '{0}' has an invalid type '{1}'. This is not permitted by the rules of Common IL. + Il parametro '{0}' contiene un tipo non valido '{1}'. Questo comportamento non è consentito dalle regole di Common IL. The function or method has an invalid return type '{0}'. This is not permitted by the rules of Common IL. - The function or method has an invalid return type '{0}'. This is not permitted by the rules of Common IL. + La funzione o il metodo contiene un tipo restituito non valido '{0}'. Questo comportamento non è consentito dalle regole di Common IL. Cannot call the byref extension method '{0}. The first parameter requires the value to be mutable or a non-readonly byref type. - Cannot call the byref extension method '{0}. The first parameter requires the value to be mutable or a non-readonly byref type. + Non è possibile chiamare il metodo di estensione byref '{0}. Il valore del primo parametro deve essere modificabile oppure un tipo byref non di sola lettura. Cannot partially apply the extension method '{0}' because the first parameter is a byref type. - Cannot partially apply the extension method '{0}' because the first parameter is a byref type. + Non è possibile applicare parzialmente il metodo di estensione '{0}' perché il primo parametro è un tipo byref. diff --git a/src/fsharp/xlf/FSComp.txt.ja.xlf b/src/fsharp/xlf/FSComp.txt.ja.xlf index a96b750bb5e..87e1dd04741 100644 --- a/src/fsharp/xlf/FSComp.txt.ja.xlf +++ b/src/fsharp/xlf/FSComp.txt.ja.xlf @@ -109,7 +109,7 @@ All branches of a pattern match expression must return values of the same type. The first branch returned a value of type '{0}', but this branch returned a value of type '{1}'. - パターン マッチ式のすべてのブランチは、同じ型の値を返す必要があります。最初のブランチが返した値の型は '{0}' ですが、このブランチが返した値の型は '{1}' です。 + パターン一致式のすべてのブランチは同じ型の値を返す必要があります。最初のブランチは、型 '{0}' の値を返しましたが、このブランチは型 '{1}' の値を返しました。 @@ -209,7 +209,7 @@ Unrecognized privacy setting '{0}' for managed resource, valid options are 'public' and 'private' - マネージド リソースの認識されないプライバシー設定 '{0}'。有効なオプションは 'public' および 'private' です。 + マネージ リソースの認識されないプライバシー設定 '{0}'。有効なオプションは 'public' および 'private' です。 @@ -354,7 +354,7 @@ Error reading/writing metadata for the F# compiled DLL '{0}'. Was the DLL compiled with an earlier version of the F# compiler? (error: '{1}'). - F# でコンパイルした DLL '{0}' のメタデータの読み取り/書き込み中にエラーが発生しました。旧バージョンの F# コンパイラでコンパイルした DLL ですか? (エラー: '{1}') + F# でコンパイルした DLL '{0}' のメタデータの読み取り/書き込み中にエラーが発生しました。旧バージョンの F# コンパイラーでコンパイルした DLL ですか? (エラー: '{1}') @@ -1949,7 +1949,7 @@ Syntax error - 構文エラー + 構文エラーです @@ -2969,7 +2969,7 @@ The member '{0}' does not correspond to any abstract or virtual method available to override or implement. - メンバー '{0}' は、オーバーライドまたは実装に使用できるどの抽象メソッドまたは仮想メソッドにも対応していません。 + メンバー '{0}' は、無視または実装に使用できるどの抽象メソッドまたは仮想メソッドにも対応していません。 @@ -4069,7 +4069,7 @@ Copyright (c) Microsoft Corporation. All Rights Reserved. - Copyright (c) Microsoft Corporation. All Rights Reserved. + Copyright (C) Microsoft Corporation. All rights reserved. @@ -4279,7 +4279,7 @@ @@ -4434,7 +4434,7 @@ The command-line option '{0}' has been deprecated - コマンド ライン オプション '{0}' は非推奨になりました + コマンド ライン オプション '{0}' は使用されなくなりました @@ -4444,7 +4444,7 @@ The command-line option '{0}' has been deprecated. HTML document generation is now part of the F# Power Pack, via the tool FsHtmlDoc.exe. - コマンド ライン オプション '{0}' は非推奨になりました。HTML ドキュメントの生成は、F# Power Pack のツール FsHtmlDoc.exe で実行できるようになりました。 + コマンド ライン オプション '{0}' は使用されなくなりました。HTML ドキュメントの生成は、F# Power Pack のツール FsHtmlDoc.exe で実行できるようになりました。 @@ -5459,7 +5459,7 @@ Static linking may not include a mixed managed/unmanaged DLL - 静的リンクでは、混合マネージド/アンマネージド DLL がインクルードされない可能性があります + 静的リンクでは、混合マネージ/アンマネージ DLL がインクルードされない可能性があります @@ -6504,7 +6504,7 @@ The CallerMemberNameAttribute applied to parameter '{0}' will have no effect. It is overridden by the CallerFilePathAttribute. - パラメーター '{0}' に適用される CallerMemberNameAttribute は無効になります。CallerFilePathAttribute に上書きされます。 + パラメーター '{0}' に適用された CallerMemberNameAttribute は、CallerFilePathAttribute.によってオーバーライドされるため無効となります。 @@ -7059,27 +7059,27 @@ Byref types are not allowed to have optional type extensions. - Byref types are not allowed to have optional type extensions. + byref 型には、オプションの型拡張子を指定することはできません。 The parameter '{0}' has an invalid type '{1}'. This is not permitted by the rules of Common IL. - The parameter '{0}' has an invalid type '{1}'. This is not permitted by the rules of Common IL. + パラメーター '{0}' には無効な型 '{1}' が指定されています。これは Common IL の規則では許可されていません。 The function or method has an invalid return type '{0}'. This is not permitted by the rules of Common IL. - The function or method has an invalid return type '{0}'. This is not permitted by the rules of Common IL. + 関数またはメソッドには、無効な戻り値の型 '{0}' が指定されています。これは Common IL の規則では許可されていません。 Cannot call the byref extension method '{0}. The first parameter requires the value to be mutable or a non-readonly byref type. - Cannot call the byref extension method '{0}. The first parameter requires the value to be mutable or a non-readonly byref type. + byref 拡張メソッド '{0} を呼び出すことはできません。最初のパラメーターでは、値を変更可能な byref 型または読み取り専用以外の byref 型にする必要があります。 Cannot partially apply the extension method '{0}' because the first parameter is a byref type. - Cannot partially apply the extension method '{0}' because the first parameter is a byref type. + 最初のパラメーターは byref 型なので、拡張メソッド '{0}' を部分的に適用することはできません。 diff --git a/src/fsharp/xlf/FSComp.txt.ko.xlf b/src/fsharp/xlf/FSComp.txt.ko.xlf index 02bdabada87..867ffc1b972 100644 --- a/src/fsharp/xlf/FSComp.txt.ko.xlf +++ b/src/fsharp/xlf/FSComp.txt.ko.xlf @@ -1,4 +1,4 @@ - + @@ -109,7 +109,7 @@ All branches of a pattern match expression must return values of the same type. The first branch returned a value of type '{0}', but this branch returned a value of type '{1}'. - 패턴 일치 식의 모든 분기는 동일한 형식의 값을 반환해야 합니다. 첫 번째 분기는 '{0}' 형식의 값을 반환했지만 이 분기는 '{1}' 형식의 값을 반환했습니다. + 패턴 일치 식의 모든 분기는 동일한 형식의 값을 반환해야 합니다. 첫 번째 분기는 '{0}' 형식의 값을 반환했지만, 이 분기는 '{1}' 형식의 값을 반환했습니다. @@ -814,7 +814,7 @@ Invalid value - 값이 잘못되었습니다. + 잘못된 값 @@ -1949,7 +1949,7 @@ Syntax error - 구문 오류 + 구문 오류입니다. @@ -4069,7 +4069,7 @@ Copyright (c) Microsoft Corporation. All Rights Reserved. - Copyright (c) Microsoft Corporation. All rights reserved. + Copyright (C) Microsoft Corporation. All rights reserved. @@ -6504,7 +6504,7 @@ The CallerMemberNameAttribute applied to parameter '{0}' will have no effect. It is overridden by the CallerFilePathAttribute. - '{0}' 매개 변수에 적용된 CallerMemberNameAttribute는 효과가 없습니다. CallerFilePathAttribute로 재정의됩니다. + {0}' 매개 변수에 적용되는 CallerMemberNameAttribute는 효과가 없습니다. CallerFilePathAttribute에서 재정의합니다. @@ -7059,27 +7059,27 @@ Byref types are not allowed to have optional type extensions. - Byref types are not allowed to have optional type extensions. + byref 형식에는 선택적 형식 확장을 사용할 수 없습니다. The parameter '{0}' has an invalid type '{1}'. This is not permitted by the rules of Common IL. - The parameter '{0}' has an invalid type '{1}'. This is not permitted by the rules of Common IL. + '{0}' 매개 변수에 잘못된 형식 '{1}'이(가) 있습니다. 이 형식은 공통 IL의 규칙에서 허용하지 않습니다. The function or method has an invalid return type '{0}'. This is not permitted by the rules of Common IL. - The function or method has an invalid return type '{0}'. This is not permitted by the rules of Common IL. + 함수 또는 메서드에 잘못된 반환 형식 '{0}'이(가) 있습니다. 이는 공통 IL의 규칙에서 허용하지 않습니다. Cannot call the byref extension method '{0}. The first parameter requires the value to be mutable or a non-readonly byref type. - Cannot call the byref extension method '{0}. The first parameter requires the value to be mutable or a non-readonly byref type. + byref 확장 메서드 '{0}'을(를) 호출할 수 없습니다. 첫 번째 매개 변수는 변경할 수 있거나 읽기 전용이 아닌 byref 형식인 값이 필요합니다. Cannot partially apply the extension method '{0}' because the first parameter is a byref type. - Cannot partially apply the extension method '{0}' because the first parameter is a byref type. + 첫 번째 매개 변수가 byref 형식이므로 '{0}' 확장 메서드를 부분적으로 적용할 수 없습니다. diff --git a/src/fsharp/xlf/FSComp.txt.pl.xlf b/src/fsharp/xlf/FSComp.txt.pl.xlf index 8dde36da4c2..600ed8a428b 100644 --- a/src/fsharp/xlf/FSComp.txt.pl.xlf +++ b/src/fsharp/xlf/FSComp.txt.pl.xlf @@ -1,4 +1,4 @@ - + @@ -109,7 +109,7 @@ All branches of a pattern match expression must return values of the same type. The first branch returned a value of type '{0}', but this branch returned a value of type '{1}'. - Wszystkie gałęzie wyrażenia dopasowania do wzorca muszą zwracać wartości tego samego typu. Pierwsza gałąź zwróciła wartość typu „{0}”, ale ta gałąź zwróciła wartość typu „{1}” + Wszystkie gałęzie wyrażenia dopasowywania wzorca muszą zwracać wartości tego samego typu. Pierwsza gałąź zwróciła wartość typu „{0}”, ale ta gałąź zwróciła wartość typu „{1}”. @@ -1949,7 +1949,7 @@ Syntax error - Błąd składni + błąd składni @@ -4069,7 +4069,7 @@ Copyright (c) Microsoft Corporation. All Rights Reserved. - Copyright (c) Microsoft Corporation. Wszelkie prawa zastrzeżone. + Copyright (C) Microsoft Corporation. Wszelkie prawa zastrzeżone. @@ -4544,7 +4544,7 @@ argument - argument + Argument @@ -5229,7 +5229,7 @@ The FieldOffset attribute can only be placed on members of types marked with the StructLayout(LayoutKind.Explicit) - Atrybut FieldOffset można umieścić tylko w elementach członkowskich o typie oznaczonym przy użyciu atrybutu StructLayout(LayoutKind.Explicit). + Atrybut FieldOffset można umieścić tylko w składowych o typie oznaczonym przy użyciu atrybutu StructLayout(LayoutKind.Explicit). @@ -6504,7 +6504,7 @@ The CallerMemberNameAttribute applied to parameter '{0}' will have no effect. It is overridden by the CallerFilePathAttribute. - Zastosowanie elementu CallerMemberNameAttribute do parametru „{0}” nie odniesie żadnego skutku. Jest on przesłonięty przez element CallerFilePathAttribute. + Zastosowanie elementu CallerMemberNameAttribute do parametru „{0}” nie odniesie żadnego skutku. Jest on przesłaniany przez element CallerFilePathAttribute. @@ -7059,27 +7059,27 @@ Byref types are not allowed to have optional type extensions. - Byref types are not allowed to have optional type extensions. + Typy Byref nie mogą mieć opcjonalnych rozszerzeń typu. The parameter '{0}' has an invalid type '{1}'. This is not permitted by the rules of Common IL. - The parameter '{0}' has an invalid type '{1}'. This is not permitted by the rules of Common IL. + Parametr „{0}” ma nieprawidłowy typ „{1}”. Nie jest to dozwolone przez reguły języka Common IL. The function or method has an invalid return type '{0}'. This is not permitted by the rules of Common IL. - The function or method has an invalid return type '{0}'. This is not permitted by the rules of Common IL. + Funkcja lub metoda ma nieprawidłowy zwracany typ „{0}”. Nie jest to dozwolone przez reguły języka Common IL. Cannot call the byref extension method '{0}. The first parameter requires the value to be mutable or a non-readonly byref type. - Cannot call the byref extension method '{0}. The first parameter requires the value to be mutable or a non-readonly byref type. + Nie można wywołać metody rozszerzenia byref „{0}”. Pierwszy parametr wymaga, aby wartość była typem byref zmiennym lub innym niż tylko do odczytu. Cannot partially apply the extension method '{0}' because the first parameter is a byref type. - Cannot partially apply the extension method '{0}' because the first parameter is a byref type. + Nie można częściowo zastosować metody rozszerzenia „{0}”, ponieważ pierwszy parametr jest typu byref. diff --git a/src/fsharp/xlf/FSComp.txt.pt-BR.xlf b/src/fsharp/xlf/FSComp.txt.pt-BR.xlf index c3357c079ae..eeb07e363c8 100644 --- a/src/fsharp/xlf/FSComp.txt.pt-BR.xlf +++ b/src/fsharp/xlf/FSComp.txt.pt-BR.xlf @@ -1,4 +1,4 @@ - + @@ -109,7 +109,7 @@ All branches of a pattern match expression must return values of the same type. The first branch returned a value of type '{0}', but this branch returned a value of type '{1}'. - Todos os branches de uma expressão correspondente ao padrão precisam retornar valores do mesmo tipo. O primeiro branch retornou um valor do tipo '{0}', mas este branch retornou um valor do tipo '{1}'. + Todos as ramificações de uma expressão de correspondência de padrão devem retornar valores do mesmo tipo. A primeira ramificação retornou um valor de tipo '{0}', mas este ramo retornou um valor de tipo '{1}'. @@ -1949,7 +1949,7 @@ Syntax error - Erro de sintaxe + erro de sintaxe @@ -4069,7 +4069,7 @@ Copyright (c) Microsoft Corporation. All Rights Reserved. - Copyright (c) Microsoft Corporation. Todos direitos reservados. + Copyright (C) Microsoft Corporation. Todos os direitos reservados. @@ -4519,7 +4519,7 @@ field - campo + Campo @@ -4529,12 +4529,12 @@ property - propriedade + Propriedade. extension - extensão + Extensão @@ -4544,7 +4544,7 @@ argument - argumento + Argumento @@ -6504,7 +6504,7 @@ The CallerMemberNameAttribute applied to parameter '{0}' will have no effect. It is overridden by the CallerFilePathAttribute. - O CallerMemberNameAttribute aplicado ao parâmetro '{0}' não terá nenhum efeito. Ele será substituído pelo CallerFilePathAttribute. + O CallerMemberNameAttribute aplicado ao parâmetro "{0}" não terá efeito. Ele é substituído pelo CallerFilePathAttribute. @@ -7059,27 +7059,27 @@ Byref types are not allowed to have optional type extensions. - Byref types are not allowed to have optional type extensions. + Tipos de ByRef não podem ter extensões de tipo opcionais. The parameter '{0}' has an invalid type '{1}'. This is not permitted by the rules of Common IL. - The parameter '{0}' has an invalid type '{1}'. This is not permitted by the rules of Common IL. + O parâmetro '{0}' tem um tipo inválido '{1}'. Isso não é permitido pelas regras do IL comum. The function or method has an invalid return type '{0}'. This is not permitted by the rules of Common IL. - The function or method has an invalid return type '{0}'. This is not permitted by the rules of Common IL. + A função ou método tem um tipo de retorno inválido '{0}'. Isso não é permitido pelas regras do IL Comum. Cannot call the byref extension method '{0}. The first parameter requires the value to be mutable or a non-readonly byref type. - Cannot call the byref extension method '{0}. The first parameter requires the value to be mutable or a non-readonly byref type. + Não é possível chamar o método de extensão de byref '{0}. O primeiro parâmetro requer que o valor seja mutável ou não seja byref somente leitura. Cannot partially apply the extension method '{0}' because the first parameter is a byref type. - Cannot partially apply the extension method '{0}' because the first parameter is a byref type. + Não é possível aplicar parcialmente o método de extensão '{0}' porque o primeiro parâmetro é um tipo de byref. diff --git a/src/fsharp/xlf/FSComp.txt.ru.xlf b/src/fsharp/xlf/FSComp.txt.ru.xlf index af8a812a968..ae05f05094c 100644 --- a/src/fsharp/xlf/FSComp.txt.ru.xlf +++ b/src/fsharp/xlf/FSComp.txt.ru.xlf @@ -1,4 +1,4 @@ - + @@ -109,7 +109,7 @@ All branches of a pattern match expression must return values of the same type. The first branch returned a value of type '{0}', but this branch returned a value of type '{1}'. - Все ветви выражения сопоставления шаблонов должны возвращать значения одного типа. Первая ветвь возвратила значение типа "{0}", а эта ветвь — типа "{1}". + Все ветви выражения сопоставления шаблона должны возвращать значения одного и того же типа. Первая ветвь возвратила значение типа "{0}", однако эта ветвь возвратила выражение типа "{1}". @@ -1949,7 +1949,7 @@ Syntax error - Синтаксическая ошибка + синтаксическая ошибка @@ -4069,7 +4069,7 @@ Copyright (c) Microsoft Corporation. All Rights Reserved. - (c) Корпорация Майкрософт (Microsoft Corp.). Все права защищены. + © Корпорация Майкрософт (Microsoft Corporation). Все права защищены. @@ -4519,7 +4519,7 @@ field - поле + Поле @@ -4529,12 +4529,12 @@ property - свойство + Свойство extension - расширение + Расширение @@ -4544,7 +4544,7 @@ argument - аргумент + Аргумент @@ -7059,27 +7059,27 @@ Byref types are not allowed to have optional type extensions. - Byref types are not allowed to have optional type extensions. + Типы byref не могут иметь расширения необязательного типа. The parameter '{0}' has an invalid type '{1}'. This is not permitted by the rules of Common IL. - The parameter '{0}' has an invalid type '{1}'. This is not permitted by the rules of Common IL. + Параметр "{0}" имеет недопустимый тип "{1}". Это не допускается правилами общего промежуточного языка. The function or method has an invalid return type '{0}'. This is not permitted by the rules of Common IL. - The function or method has an invalid return type '{0}'. This is not permitted by the rules of Common IL. + Функция или метод имеет недопустимый возвращаемый тип "{0}". Это не допускается правилами общего промежуточного языка. Cannot call the byref extension method '{0}. The first parameter requires the value to be mutable or a non-readonly byref type. - Cannot call the byref extension method '{0}. The first parameter requires the value to be mutable or a non-readonly byref type. + Не удается вызвать метод расширения byref "{0}". В качестве первого параметра необходимо указать изменяемое значение или значение типа byref, доступное не только для чтения. Cannot partially apply the extension method '{0}' because the first parameter is a byref type. - Cannot partially apply the extension method '{0}' because the first parameter is a byref type. + Не удается частично применить метод расширения "{0}", так как первый параметр имеет тип byref. diff --git a/src/fsharp/xlf/FSComp.txt.tr.xlf b/src/fsharp/xlf/FSComp.txt.tr.xlf index d7f55a56de9..42132ab2790 100644 --- a/src/fsharp/xlf/FSComp.txt.tr.xlf +++ b/src/fsharp/xlf/FSComp.txt.tr.xlf @@ -1,4 +1,4 @@ - + @@ -109,7 +109,7 @@ All branches of a pattern match expression must return values of the same type. The first branch returned a value of type '{0}', but this branch returned a value of type '{1}'. - Bir desen eşleştirme ifadesinin tüm dalları aynı türdeki değerleri döndürmelidir. Birinci dal '{0}' türünde bir değer döndürdü ancak bu dal '{1}' türünde bir değer döndürdü. + Desen eşleştirme ifadesinin tüm dalları aynı türde değerler döndürmelidir. İlk dal '{0}' türünde değer döndürdü ancak bu dal '{1}' türünde değer döndürdü. @@ -1949,7 +1949,7 @@ Syntax error - Sözdizimi hatası + sözdizimi hatası @@ -4069,7 +4069,7 @@ Copyright (c) Microsoft Corporation. All Rights Reserved. - Telif hakkı (c) Microsoft Corporation. Tüm hakları saklıdır. + Telif hakkı (C) Microsoft Corporation. Tüm hakları saklıdır. @@ -4544,7 +4544,7 @@ argument - bağımsız değişken + Bağımsız değişken @@ -4569,7 +4569,7 @@ from {0} - {0} dalından + Şuradan: {0} @@ -6504,7 +6504,7 @@ The CallerMemberNameAttribute applied to parameter '{0}' will have no effect. It is overridden by the CallerFilePathAttribute. - '{0}' parametresine uygulanan CallerMemberNameAttribute etkisiz olacak. Bu işlem CallerFilePathAttribute tarafından geçersiz kılınmış. + {0}' parametresi için geçerli olan CallerMemberNameAttribute öğesinin hiçbir etkisi olmaz. CallerFilePathAttribute tarafından geçersiz kılındı. @@ -6924,7 +6924,7 @@ is - : + olan @@ -7059,27 +7059,27 @@ Byref types are not allowed to have optional type extensions. - Byref types are not allowed to have optional type extensions. + Byref türlerinin isteğe bağlı tür genişletmelerine sahip olmasına izin verilmez. The parameter '{0}' has an invalid type '{1}'. This is not permitted by the rules of Common IL. - The parameter '{0}' has an invalid type '{1}'. This is not permitted by the rules of Common IL. + '{0}' parametresi geçersiz '{1}' türünde. Ortak IL kuralları uyarınca buna izin verilmez. The function or method has an invalid return type '{0}'. This is not permitted by the rules of Common IL. - The function or method has an invalid return type '{0}'. This is not permitted by the rules of Common IL. + İşlev veya metot geçersiz '{0}' dönüş türüne sahip. Ortak IL kuralları uyarınca buna izin verilmez. Cannot call the byref extension method '{0}. The first parameter requires the value to be mutable or a non-readonly byref type. - Cannot call the byref extension method '{0}. The first parameter requires the value to be mutable or a non-readonly byref type. + '{0}' byref genişletme metodu çağrılamıyor. İlk parametre, değerin değişebilir olmasını veya salt okunur olmayan bir byref türünde olmasını gerektiriyor. Cannot partially apply the extension method '{0}' because the first parameter is a byref type. - Cannot partially apply the extension method '{0}' because the first parameter is a byref type. + İlk parametre bir byref türü olduğundan '{0}' genişletme metodunu kısmi olarak uygulayamazsınız. diff --git a/src/fsharp/xlf/FSComp.txt.zh-Hans.xlf b/src/fsharp/xlf/FSComp.txt.zh-Hans.xlf index ed0d6bfe422..26edd2ee9fd 100644 --- a/src/fsharp/xlf/FSComp.txt.zh-Hans.xlf +++ b/src/fsharp/xlf/FSComp.txt.zh-Hans.xlf @@ -109,7 +109,7 @@ All branches of a pattern match expression must return values of the same type. The first branch returned a value of type '{0}', but this branch returned a value of type '{1}'. - 模式匹配表达式的所有分支必须返回相同类型的值。第一个分支返回“{0}”类型的值,但此分支返回“{1}”类型的值。 + 模式匹配表达式的所有分支必须返回相同类型的值。第一个分支返回类型为“{0}”的值,但此分支返回类型为“{1}”的值。 @@ -344,7 +344,7 @@ Unrecognized option: '{0}' - 无法识别的选项: '{0}' + 无法识别的选项:“{0}” @@ -814,7 +814,7 @@ Invalid value - 值无效 + 无效值 @@ -7059,27 +7059,27 @@ Byref types are not allowed to have optional type extensions. - Byref types are not allowed to have optional type extensions. + 不允许 byref 类型具有可选类型扩展名。 The parameter '{0}' has an invalid type '{1}'. This is not permitted by the rules of Common IL. - The parameter '{0}' has an invalid type '{1}'. This is not permitted by the rules of Common IL. + 参数 "{0}" 的类型 "{1}" 无效。通用 IL 的规则不允许使用此类型。 The function or method has an invalid return type '{0}'. This is not permitted by the rules of Common IL. - The function or method has an invalid return type '{0}'. This is not permitted by the rules of Common IL. + 函数或方法的返回类型 "{0}" 无效。通用 IL 的规则不允许使用此类型。 Cannot call the byref extension method '{0}. The first parameter requires the value to be mutable or a non-readonly byref type. - Cannot call the byref extension method '{0}. The first parameter requires the value to be mutable or a non-readonly byref type. + 无法调用 byref 扩展方法 "{0}"。第一个参数要求该值是可变的或非只读的 byref 类型。 Cannot partially apply the extension method '{0}' because the first parameter is a byref type. - Cannot partially apply the extension method '{0}' because the first parameter is a byref type. + 无法部分应用扩展方法 "{0}", 因为第一个参数是 byref 类型。 diff --git a/src/fsharp/xlf/FSComp.txt.zh-Hant.xlf b/src/fsharp/xlf/FSComp.txt.zh-Hant.xlf index f0b9be6cd54..665a77cdb05 100644 --- a/src/fsharp/xlf/FSComp.txt.zh-Hant.xlf +++ b/src/fsharp/xlf/FSComp.txt.zh-Hant.xlf @@ -1,4 +1,4 @@ - + @@ -109,7 +109,7 @@ All branches of a pattern match expression must return values of the same type. The first branch returned a value of type '{0}', but this branch returned a value of type '{1}'. - 模式比對運算式的所有分支,都必須傳回相同類型的值。第一個分支傳回了類型 '{0}' 的值,但此分支卻傳回了類型 '{1}' 的值。 + 符合運算式的所有模式分支都必須傳回相同類型的值。第一個分支傳回了類型 '{0}' 的值,但此分支卻傳回類型 '{1}' 的值。 @@ -814,7 +814,7 @@ Invalid value - 無效值 + 值無效 @@ -4069,7 +4069,7 @@ Copyright (c) Microsoft Corporation. All Rights Reserved. - Copyright (c) Microsoft Corporation. 著作權所有,並保留一切權利。 + Copyright (C) Microsoft Corporation. 著作權所有,並保留一切權利。 @@ -5459,7 +5459,7 @@ Static linking may not include a mixed managed/unmanaged DLL - 靜態連結不可包含混合的受控/非受控 DLL + 靜態連結不可包含混合的 Managed/Unmanaged DLL @@ -7059,27 +7059,27 @@ Byref types are not allowed to have optional type extensions. - Byref types are not allowed to have optional type extensions. + Byref 類型不得有選擇性類型延伸模組。 The parameter '{0}' has an invalid type '{1}'. This is not permitted by the rules of Common IL. - The parameter '{0}' has an invalid type '{1}'. This is not permitted by the rules of Common IL. + 參數 '{0}' 的類型 '{1}' 無效。Common IL 的規則不允許此狀況。 The function or method has an invalid return type '{0}'. This is not permitted by the rules of Common IL. - The function or method has an invalid return type '{0}'. This is not permitted by the rules of Common IL. + 函式或方法的傳回型別 '{0}' 無效。Common IL 的規則不允許此狀況。 Cannot call the byref extension method '{0}. The first parameter requires the value to be mutable or a non-readonly byref type. - Cannot call the byref extension method '{0}. The first parameter requires the value to be mutable or a non-readonly byref type. + 無法呼叫 byref 擴充方法 '{0}。第一個參數需要值可變動,或為非唯讀 byref 類型。 Cannot partially apply the extension method '{0}' because the first parameter is a byref type. - Cannot partially apply the extension method '{0}' because the first parameter is a byref type. + 因為第一個參數是 byref 類型,所以無法部分套用擴充方法 '{0}'。 diff --git a/src/fsharp/xlf/FSStrings.cs.xlf b/src/fsharp/xlf/FSStrings.cs.xlf index dd20d2c3294..f139d218700 100644 --- a/src/fsharp/xlf/FSStrings.cs.xlf +++ b/src/fsharp/xlf/FSStrings.cs.xlf @@ -1,4 +1,4 @@ - + @@ -959,7 +959,7 @@ comment - komentář + Komentář @@ -1174,7 +1174,7 @@ keyword - klíčové slovo + Klíčové slovo diff --git a/src/fsharp/xlf/FSStrings.de.xlf b/src/fsharp/xlf/FSStrings.de.xlf index 11c588c25a1..e1e33d4ce4d 100644 --- a/src/fsharp/xlf/FSStrings.de.xlf +++ b/src/fsharp/xlf/FSStrings.de.xlf @@ -1,4 +1,4 @@ - + @@ -1174,7 +1174,7 @@ keyword - Schlüsselwort + Schlüsselwort diff --git a/src/fsharp/xlf/FSStrings.es.xlf b/src/fsharp/xlf/FSStrings.es.xlf index a64fb622684..82682ec3f85 100644 --- a/src/fsharp/xlf/FSStrings.es.xlf +++ b/src/fsharp/xlf/FSStrings.es.xlf @@ -1,4 +1,4 @@ - + @@ -959,7 +959,7 @@ comment - comentario + Comentario @@ -1174,7 +1174,7 @@ keyword - palabra clave + Palabra clave diff --git a/src/fsharp/xlf/FSStrings.fr.xlf b/src/fsharp/xlf/FSStrings.fr.xlf index a56bd5baadd..abde80b4884 100644 --- a/src/fsharp/xlf/FSStrings.fr.xlf +++ b/src/fsharp/xlf/FSStrings.fr.xlf @@ -1,4 +1,4 @@ - + @@ -959,7 +959,7 @@ comment - commentaire + Commentaire @@ -1174,7 +1174,7 @@ keyword - mot clé + Mot clé diff --git a/src/fsharp/xlf/FSStrings.it.xlf b/src/fsharp/xlf/FSStrings.it.xlf index b8a0c2aa385..e682cc48c94 100644 --- a/src/fsharp/xlf/FSStrings.it.xlf +++ b/src/fsharp/xlf/FSStrings.it.xlf @@ -1,4 +1,4 @@ - + @@ -959,7 +959,7 @@ comment - commento + Commento @@ -1174,7 +1174,7 @@ keyword - parola chiave + Parola chiave diff --git a/src/fsharp/xlf/FSStrings.ja.xlf b/src/fsharp/xlf/FSStrings.ja.xlf index e2bc61160be..c5de25e5332 100644 --- a/src/fsharp/xlf/FSStrings.ja.xlf +++ b/src/fsharp/xlf/FSStrings.ja.xlf @@ -1174,7 +1174,7 @@ keyword - キーワード + キーワード diff --git a/src/fsharp/xlf/FSStrings.ko.xlf b/src/fsharp/xlf/FSStrings.ko.xlf index 8f398f713c4..c8ea229e136 100644 --- a/src/fsharp/xlf/FSStrings.ko.xlf +++ b/src/fsharp/xlf/FSStrings.ko.xlf @@ -1,4 +1,4 @@ - + @@ -1174,7 +1174,7 @@ keyword - 키워드 + 키워드 @@ -1454,7 +1454,7 @@ . {0} - {0} + . {0} diff --git a/src/fsharp/xlf/FSStrings.pl.xlf b/src/fsharp/xlf/FSStrings.pl.xlf index b634fb8ab9d..0fcd149429f 100644 --- a/src/fsharp/xlf/FSStrings.pl.xlf +++ b/src/fsharp/xlf/FSStrings.pl.xlf @@ -1,4 +1,4 @@ - + @@ -959,7 +959,7 @@ comment - komentarz + Komentarz @@ -1174,7 +1174,7 @@ keyword - słowo kluczowe + Słowo kluczowe diff --git a/src/fsharp/xlf/FSStrings.pt-BR.xlf b/src/fsharp/xlf/FSStrings.pt-BR.xlf index 0d185ea82f5..d22bd360fb6 100644 --- a/src/fsharp/xlf/FSStrings.pt-BR.xlf +++ b/src/fsharp/xlf/FSStrings.pt-BR.xlf @@ -1,4 +1,4 @@ - + @@ -959,7 +959,7 @@ comment - comentário + Comentário @@ -1174,7 +1174,7 @@ keyword - palavra-chave + Palavra-chave diff --git a/src/fsharp/xlf/FSStrings.ru.xlf b/src/fsharp/xlf/FSStrings.ru.xlf index ebae0bf0ec3..3b74661d0bf 100644 --- a/src/fsharp/xlf/FSStrings.ru.xlf +++ b/src/fsharp/xlf/FSStrings.ru.xlf @@ -1,4 +1,4 @@ - + @@ -959,7 +959,7 @@ comment - комментарий + Комментарий @@ -1174,7 +1174,7 @@ keyword - ключевое слово + Ключевое слово diff --git a/src/fsharp/xlf/FSStrings.tr.xlf b/src/fsharp/xlf/FSStrings.tr.xlf index bc70825fa2c..d6c9603244f 100644 --- a/src/fsharp/xlf/FSStrings.tr.xlf +++ b/src/fsharp/xlf/FSStrings.tr.xlf @@ -1,4 +1,4 @@ - + @@ -959,7 +959,7 @@ comment - açıklama + Açıklama @@ -1174,7 +1174,7 @@ keyword - anahtar sözcük + Anahtar Sözcük diff --git a/src/fsharp/xlf/FSStrings.zh-Hans.xlf b/src/fsharp/xlf/FSStrings.zh-Hans.xlf index 12be2851596..c35cb9b6d2f 100644 --- a/src/fsharp/xlf/FSStrings.zh-Hans.xlf +++ b/src/fsharp/xlf/FSStrings.zh-Hans.xlf @@ -1,4 +1,4 @@ - + @@ -1174,7 +1174,7 @@ keyword - 关键字 + 关键字 diff --git a/src/fsharp/xlf/FSStrings.zh-Hant.xlf b/src/fsharp/xlf/FSStrings.zh-Hant.xlf index 81cad28dd59..ede43bb126e 100644 --- a/src/fsharp/xlf/FSStrings.zh-Hant.xlf +++ b/src/fsharp/xlf/FSStrings.zh-Hant.xlf @@ -1,4 +1,4 @@ - + @@ -1174,7 +1174,7 @@ keyword - 關鍵字 + 關鍵字 @@ -1454,7 +1454,7 @@ . {0} - 。{0} + . {0} From d38481ed20fc27af9e767646b22e8da5fb037689 Mon Sep 17 00:00:00 2001 From: Phillip Carter Date: Tue, 30 Oct 2018 01:11:22 -0700 Subject: [PATCH 096/160] Remove FSharpTeamVersion (#5837) --- src/utils/CompilerLocationUtils.fs | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/src/utils/CompilerLocationUtils.fs b/src/utils/CompilerLocationUtils.fs index 3499e7e5b21..55dcac8ccc0 100644 --- a/src/utils/CompilerLocationUtils.fs +++ b/src/utils/CompilerLocationUtils.fs @@ -37,19 +37,6 @@ module internal FSharpEnvironment = | s -> Some(s) with _ -> None - - // The F# team version number. This version number is used for - // - the F# version number reported by the fsc.exe and fsi.exe banners in the CTP release - // - the F# version number printed in the HTML documentation generator - // - the .NET DLL version number for all VS2008 DLLs - // - the VS2008 registry key, written by the VS2008 installer - // HKEY_LOCAL_MACHINE\Software\Microsoft\.NETFramework\AssemblyFolders\Microsoft.FSharp-" + FSharpTeamVersionNumber - // Also - // - for Beta2, the language revision number indicated on the F# language spec - // - // It is NOT the version number listed on FSharp.Core.dll - let FSharpTeamVersionNumber = "2.0.0.0" - // The F# binary format revision number. The first three digits of this form the significant part of the // format revision number for F# binary signature and optimization metadata. The last digit is not significant. // From f3d55f286278fcd7dc81fc3636e4b1fdc16218e0 Mon Sep 17 00:00:00 2001 From: Don Syme Date: Tue, 30 Oct 2018 19:47:16 +0000 Subject: [PATCH 097/160] record some perf test results --- tests/scripts/compiler-perf-results.txt | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/tests/scripts/compiler-perf-results.txt b/tests/scripts/compiler-perf-results.txt index 65201821cef..9e2fdb99db4 100644 --- a/tests/scripts/compiler-perf-results.txt +++ b/tests/scripts/compiler-perf-results.txt @@ -183,3 +183,12 @@ https://github.com/dsyme/visualfsharp.git fix-5136 c9a7678e5 https://github.com/Microsoft/visualfsharp master 7bcbd1abbace1a41e0c6e12723957d87405c4cba 7bcbd1abbace1a41e0c6e12723957d87405c4cba MSRC-3617253 251.16 9.83 34.52 45.45 57.97 58.65 https://github.com/dsyme/visualfsharp.git fix-5136 c9a7678e508dc2ff847c82ee4933f464aa23bee0 7bcbd1abbace1a41e0c6e12723957d87405c4cba MSRC-3617253 257.62 10.34 35.18 45.40 56.07 57.88 https://github.com/Microsoft/visualfsharp master 7bcbd1abbace1a41e0c6e12723957d87405c4cba 7bcbd1abbace1a41e0c6e12723957d87405c4cba MSRC-3617253 250.59 10.10 34.82 45.33 58.62 63.86 +https://github.com/realvictorprm/visualfsharp.git 20181011_ConstraintSolverRefactoring 375b87881327532ffa6fe653d3d57668814db95e d38481ed20fc27af9e767646b22e8da5fb037689 MSRC-3617253 291.86 10.38 35.79 45.87 55.86 58.29 +https://github.com/realvictorprm/visualfsharp.git 20181011_ConstraintSolverRefactoring e531753de12e648cef21b8d7feff2c4619f1fbe4 d38481ed20fc27af9e767646b22e8da5fb037689 MSRC-3617253 275.17 10.24 35.76 44.80 55.18 58.95 +https://github.com/manofstick/visualfsharp.git notagged 73faf347d22716da3a7e1d3bcfabeeb505b8c80f d38481ed20fc27af9e767646b22e8da5fb037689 MSRC-3617253 279.33 10.53 35.73 42.43 52.15 59.65 +https://github.com/manofstick/visualfsharp.git faster_map_3 df2e8dd09726e86ef62b71b23f8c14bbf9bd540c d38481ed20fc27af9e767646b22e8da5fb037689 MSRC-3617253 274.98 10.69 36.03 43.64 52.48 57.74 +https://github.com/manofstick/visualfsharp.git nobox_reflection 3a4f0b7356fafb2f8aef9f6360ab26585a3a20f8 d38481ed20fc27af9e767646b22e8da5fb037689 MSRC-3617253 265.57 10.24 36.23 42.52 59.23 59.87 +https://github.com/manofstick/visualfsharp.git nobox_comparer f5298fd5e407956d506da6e14623c1f698f90113 d38481ed20fc27af9e767646b22e8da5fb037689 MSRC-3617253 266.58 10.38 36.33 41.24 52.01 58.60 +https://github.com/manofstick/visualfsharp.git nobox 5b80e902e50d9ffc43de1d48748ad735d6319403 d38481ed20fc27af9e767646b22e8da5fb037689 MSRC-3617253 269.76 10.40 35.36 42.61 51.98 58.77 +https://github.com/Microsoft/visualfsharp master d38481ed20fc27af9e767646b22e8da5fb037689 d38481ed20fc27af9e767646b22e8da5fb037689 MSRC-3617253 264.61 10.62 36.12 45.58 56.80 58.41 +https://github.com/realvictorprm/visualfsharp.git 20181011_ConstraintSolverRefactoring e531753de12e648cef21b8d7feff2c4619f1fbe4 d38481ed20fc27af9e767646b22e8da5fb037689 MSRC-3617253 260.77 10.01 35.35 45.31 56.67 59.00 From 24ed23a4f277fa24b23a93494770b1ced6a02c5c Mon Sep 17 00:00:00 2001 From: Don Syme Date: Tue, 30 Oct 2018 20:51:18 +0000 Subject: [PATCH 098/160] record some perf test results --- tests/scripts/compiler-perf-results.txt | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/tests/scripts/compiler-perf-results.txt b/tests/scripts/compiler-perf-results.txt index 9e2fdb99db4..4fdb2b27fd0 100644 --- a/tests/scripts/compiler-perf-results.txt +++ b/tests/scripts/compiler-perf-results.txt @@ -183,12 +183,14 @@ https://github.com/dsyme/visualfsharp.git fix-5136 c9a7678e5 https://github.com/Microsoft/visualfsharp master 7bcbd1abbace1a41e0c6e12723957d87405c4cba 7bcbd1abbace1a41e0c6e12723957d87405c4cba MSRC-3617253 251.16 9.83 34.52 45.45 57.97 58.65 https://github.com/dsyme/visualfsharp.git fix-5136 c9a7678e508dc2ff847c82ee4933f464aa23bee0 7bcbd1abbace1a41e0c6e12723957d87405c4cba MSRC-3617253 257.62 10.34 35.18 45.40 56.07 57.88 https://github.com/Microsoft/visualfsharp master 7bcbd1abbace1a41e0c6e12723957d87405c4cba 7bcbd1abbace1a41e0c6e12723957d87405c4cba MSRC-3617253 250.59 10.10 34.82 45.33 58.62 63.86 -https://github.com/realvictorprm/visualfsharp.git 20181011_ConstraintSolverRefactoring 375b87881327532ffa6fe653d3d57668814db95e d38481ed20fc27af9e767646b22e8da5fb037689 MSRC-3617253 291.86 10.38 35.79 45.87 55.86 58.29 https://github.com/realvictorprm/visualfsharp.git 20181011_ConstraintSolverRefactoring e531753de12e648cef21b8d7feff2c4619f1fbe4 d38481ed20fc27af9e767646b22e8da5fb037689 MSRC-3617253 275.17 10.24 35.76 44.80 55.18 58.95 -https://github.com/manofstick/visualfsharp.git notagged 73faf347d22716da3a7e1d3bcfabeeb505b8c80f d38481ed20fc27af9e767646b22e8da5fb037689 MSRC-3617253 279.33 10.53 35.73 42.43 52.15 59.65 -https://github.com/manofstick/visualfsharp.git faster_map_3 df2e8dd09726e86ef62b71b23f8c14bbf9bd540c d38481ed20fc27af9e767646b22e8da5fb037689 MSRC-3617253 274.98 10.69 36.03 43.64 52.48 57.74 -https://github.com/manofstick/visualfsharp.git nobox_reflection 3a4f0b7356fafb2f8aef9f6360ab26585a3a20f8 d38481ed20fc27af9e767646b22e8da5fb037689 MSRC-3617253 265.57 10.24 36.23 42.52 59.23 59.87 -https://github.com/manofstick/visualfsharp.git nobox_comparer f5298fd5e407956d506da6e14623c1f698f90113 d38481ed20fc27af9e767646b22e8da5fb037689 MSRC-3617253 266.58 10.38 36.33 41.24 52.01 58.60 -https://github.com/manofstick/visualfsharp.git nobox 5b80e902e50d9ffc43de1d48748ad735d6319403 d38481ed20fc27af9e767646b22e8da5fb037689 MSRC-3617253 269.76 10.40 35.36 42.61 51.98 58.77 -https://github.com/Microsoft/visualfsharp master d38481ed20fc27af9e767646b22e8da5fb037689 d38481ed20fc27af9e767646b22e8da5fb037689 MSRC-3617253 264.61 10.62 36.12 45.58 56.80 58.41 +https://github.com/manofstick/visualfsharp.git notagged 73faf347d22716da3a7e1d3bcfabeeb505b8c80f d38481ed20fc27af9e767646b22e8da5fb037689 MSRC-3617253 279.33 10.53 35.73 42.43 52.15 59.65 +https://github.com/manofstick/visualfsharp.git faster_map_3 df2e8dd09726e86ef62b71b23f8c14bbf9bd540c d38481ed20fc27af9e767646b22e8da5fb037689 MSRC-3617253 274.98 10.69 36.03 43.64 52.48 57.74 +https://github.com/manofstick/visualfsharp.git nobox_reflection 3a4f0b7356fafb2f8aef9f6360ab26585a3a20f8 d38481ed20fc27af9e767646b22e8da5fb037689 MSRC-3617253 265.57 10.24 36.23 42.52 59.23 59.87 +https://github.com/manofstick/visualfsharp.git nobox_comparer f5298fd5e407956d506da6e14623c1f698f90113 d38481ed20fc27af9e767646b22e8da5fb037689 MSRC-3617253 266.58 10.38 36.33 41.24 52.01 58.60 +https://github.com/manofstick/visualfsharp.git nobox 5b80e902e50d9ffc43de1d48748ad735d6319403 d38481ed20fc27af9e767646b22e8da5fb037689 MSRC-3617253 269.76 10.40 35.36 42.61 51.98 58.77 +https://github.com/Microsoft/visualfsharp master d38481ed20fc27af9e767646b22e8da5fb037689 d38481ed20fc27af9e767646b22e8da5fb037689 MSRC-3617253 264.61 10.62 36.12 45.58 56.80 58.41 https://github.com/realvictorprm/visualfsharp.git 20181011_ConstraintSolverRefactoring e531753de12e648cef21b8d7feff2c4619f1fbe4 d38481ed20fc27af9e767646b22e8da5fb037689 MSRC-3617253 260.77 10.01 35.35 45.31 56.67 59.00 +https://github.com/realvictorprm/visualfsharp.git 20181011_ConstraintSolverRefactoring e531753de12e648cef21b8d7feff2c4619f1fbe4 f3d55f286278fcd7dc81fc3636e4b1fdc16218e0 MSRC-3617253 270.06 10.33 35.78 46.71 57.46 59.77 +https://github.com/manofstick/visualfsharp.git notagged 73faf347d22716da3a7e1d3bcfabeeb505b8c80f f3d55f286278fcd7dc81fc3636e4b1fdc16218e0 MSRC-3617253 263.89 10.19 34.69 41.24 51.90 59.00 +https://github.com/manofstick/visualfsharp.git faster_map_3 df2e8dd09726e86ef62b71b23f8c14bbf9bd540c f3d55f286278fcd7dc81fc3636e4b1fdc16218e0 MSRC-3617253 259.13 10.44 34.32 41.14 51.28 58.82 From ed2aa70a861ee091a2e9a1eaac6f556feac4f1d7 Mon Sep 17 00:00:00 2001 From: Phillip Carter Date: Tue, 30 Oct 2018 22:45:05 -0700 Subject: [PATCH 099/160] Remove fsiPackage.fs (#5838) --- vsintegration/src/FSharp.VS.FSI/FSharp.VS.FSI.fsproj | 1 - vsintegration/src/FSharp.VS.FSI/fsiPackage.fs | 4 ---- 2 files changed, 5 deletions(-) delete mode 100644 vsintegration/src/FSharp.VS.FSI/fsiPackage.fs diff --git a/vsintegration/src/FSharp.VS.FSI/FSharp.VS.FSI.fsproj b/vsintegration/src/FSharp.VS.FSI/FSharp.VS.FSI.fsproj index 29f70484239..c69f5d51005 100644 --- a/vsintegration/src/FSharp.VS.FSI/FSharp.VS.FSI.fsproj +++ b/vsintegration/src/FSharp.VS.FSI/FSharp.VS.FSI.fsproj @@ -37,7 +37,6 @@ - true Microsoft.VisualStudio.FSharp.Interactive.SRProperties diff --git a/vsintegration/src/FSharp.VS.FSI/fsiPackage.fs b/vsintegration/src/FSharp.VS.FSI/fsiPackage.fs deleted file mode 100644 index 1f36d5b7d81..00000000000 --- a/vsintegration/src/FSharp.VS.FSI/fsiPackage.fs +++ /dev/null @@ -1,4 +0,0 @@ -// Copyright (c) Microsoft Corporation. All Rights Reserved. See License.txt in the project root for license information. - -namespace Microsoft.VisualStudio.FSharp.Interactive - From f620df65d2a0d2010ba69102afde99062a1729fe Mon Sep 17 00:00:00 2001 From: Don Syme Date: Wed, 31 Oct 2018 14:30:44 +0000 Subject: [PATCH 100/160] more compiler perf results --- tests/scripts/compiler-perf-results.txt | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/tests/scripts/compiler-perf-results.txt b/tests/scripts/compiler-perf-results.txt index 4fdb2b27fd0..cf6e5b315ab 100644 --- a/tests/scripts/compiler-perf-results.txt +++ b/tests/scripts/compiler-perf-results.txt @@ -183,14 +183,21 @@ https://github.com/dsyme/visualfsharp.git fix-5136 c9a7678e5 https://github.com/Microsoft/visualfsharp master 7bcbd1abbace1a41e0c6e12723957d87405c4cba 7bcbd1abbace1a41e0c6e12723957d87405c4cba MSRC-3617253 251.16 9.83 34.52 45.45 57.97 58.65 https://github.com/dsyme/visualfsharp.git fix-5136 c9a7678e508dc2ff847c82ee4933f464aa23bee0 7bcbd1abbace1a41e0c6e12723957d87405c4cba MSRC-3617253 257.62 10.34 35.18 45.40 56.07 57.88 https://github.com/Microsoft/visualfsharp master 7bcbd1abbace1a41e0c6e12723957d87405c4cba 7bcbd1abbace1a41e0c6e12723957d87405c4cba MSRC-3617253 250.59 10.10 34.82 45.33 58.62 63.86 -https://github.com/realvictorprm/visualfsharp.git 20181011_ConstraintSolverRefactoring e531753de12e648cef21b8d7feff2c4619f1fbe4 d38481ed20fc27af9e767646b22e8da5fb037689 MSRC-3617253 275.17 10.24 35.76 44.80 55.18 58.95 +https://github.com/Microsoft/visualfsharp master d38481ed20fc27af9e767646b22e8da5fb037689 d38481ed20fc27af9e767646b22e8da5fb037689 MSRC-3617253 264.61 10.62 36.12 45.58 56.80 58.41 +https://github.com/Microsoft/visualfsharp master 24ed23a4f277fa24b23a93494770b1ced6a02c5c 24ed23a4f277fa24b23a93494770b1ced6a02c5c MSRC-3617253 266.80 10.34 37.16 47.67 58.73 58.82 https://github.com/manofstick/visualfsharp.git notagged 73faf347d22716da3a7e1d3bcfabeeb505b8c80f d38481ed20fc27af9e767646b22e8da5fb037689 MSRC-3617253 279.33 10.53 35.73 42.43 52.15 59.65 -https://github.com/manofstick/visualfsharp.git faster_map_3 df2e8dd09726e86ef62b71b23f8c14bbf9bd540c d38481ed20fc27af9e767646b22e8da5fb037689 MSRC-3617253 274.98 10.69 36.03 43.64 52.48 57.74 -https://github.com/manofstick/visualfsharp.git nobox_reflection 3a4f0b7356fafb2f8aef9f6360ab26585a3a20f8 d38481ed20fc27af9e767646b22e8da5fb037689 MSRC-3617253 265.57 10.24 36.23 42.52 59.23 59.87 +https://github.com/manofstick/visualfsharp.git notagged 73faf347d22716da3a7e1d3bcfabeeb505b8c80f f3d55f286278fcd7dc81fc3636e4b1fdc16218e0 MSRC-3617253 263.89 10.19 34.69 41.24 51.90 59.00 +https://github.com/manofstick/visualfsharp.git notagged 73faf347d22716da3a7e1d3bcfabeeb505b8c80f 24ed23a4f277fa24b23a93494770b1ced6a02c5c MSRC-3617253 264.92 10.70 34.44 41.29 52.49 59.16 https://github.com/manofstick/visualfsharp.git nobox_comparer f5298fd5e407956d506da6e14623c1f698f90113 d38481ed20fc27af9e767646b22e8da5fb037689 MSRC-3617253 266.58 10.38 36.33 41.24 52.01 58.60 +https://github.com/manofstick/visualfsharp.git nobox_comparer f5298fd5e407956d506da6e14623c1f698f90113 24ed23a4f277fa24b23a93494770b1ced6a02c5c MSRC-3617253 266.91 10.36 34.71 41.20 52.88 59.43 https://github.com/manofstick/visualfsharp.git nobox 5b80e902e50d9ffc43de1d48748ad735d6319403 d38481ed20fc27af9e767646b22e8da5fb037689 MSRC-3617253 269.76 10.40 35.36 42.61 51.98 58.77 -https://github.com/Microsoft/visualfsharp master d38481ed20fc27af9e767646b22e8da5fb037689 d38481ed20fc27af9e767646b22e8da5fb037689 MSRC-3617253 264.61 10.62 36.12 45.58 56.80 58.41 +https://github.com/manofstick/visualfsharp.git nobox 5b80e902e50d9ffc43de1d48748ad735d6319403 24ed23a4f277fa24b23a93494770b1ced6a02c5c MSRC-3617253 263.90 10.33 35.20 42.92 53.58 56.52 +https://github.com/realvictorprm/visualfsharp.git 20181011_ConstraintSolverRefactoring e531753de12e648cef21b8d7feff2c4619f1fbe4 d38481ed20fc27af9e767646b22e8da5fb037689 MSRC-3617253 275.17 10.24 35.76 44.80 55.18 58.95 https://github.com/realvictorprm/visualfsharp.git 20181011_ConstraintSolverRefactoring e531753de12e648cef21b8d7feff2c4619f1fbe4 d38481ed20fc27af9e767646b22e8da5fb037689 MSRC-3617253 260.77 10.01 35.35 45.31 56.67 59.00 https://github.com/realvictorprm/visualfsharp.git 20181011_ConstraintSolverRefactoring e531753de12e648cef21b8d7feff2c4619f1fbe4 f3d55f286278fcd7dc81fc3636e4b1fdc16218e0 MSRC-3617253 270.06 10.33 35.78 46.71 57.46 59.77 -https://github.com/manofstick/visualfsharp.git notagged 73faf347d22716da3a7e1d3bcfabeeb505b8c80f f3d55f286278fcd7dc81fc3636e4b1fdc16218e0 MSRC-3617253 263.89 10.19 34.69 41.24 51.90 59.00 +https://github.com/realvictorprm/visualfsharp.git 20181011_ConstraintSolverRefactoring e531753de12e648cef21b8d7feff2c4619f1fbe4 24ed23a4f277fa24b23a93494770b1ced6a02c5c MSRC-3617253 273.90 10.79 35.08 46.55 58.12 59.74 +https://github.com/manofstick/visualfsharp.git faster_map_3 df2e8dd09726e86ef62b71b23f8c14bbf9bd540c 24ed23a4f277fa24b23a93494770b1ced6a02c5c MSRC-3617253 263.89 10.44 34.44 42.21 51.63 60.27 https://github.com/manofstick/visualfsharp.git faster_map_3 df2e8dd09726e86ef62b71b23f8c14bbf9bd540c f3d55f286278fcd7dc81fc3636e4b1fdc16218e0 MSRC-3617253 259.13 10.44 34.32 41.14 51.28 58.82 +https://github.com/manofstick/visualfsharp.git faster_map_3 df2e8dd09726e86ef62b71b23f8c14bbf9bd540c d38481ed20fc27af9e767646b22e8da5fb037689 MSRC-3617253 274.98 10.69 36.03 43.64 52.48 57.74 +https://github.com/manofstick/visualfsharp.git nobox_reflection 3a4f0b7356fafb2f8aef9f6360ab26585a3a20f8 24ed23a4f277fa24b23a93494770b1ced6a02c5c MSRC-3617253 262.95 10.58 34.71 43.21 53.43 59.23 +https://github.com/manofstick/visualfsharp.git nobox_reflection 3a4f0b7356fafb2f8aef9f6360ab26585a3a20f8 d38481ed20fc27af9e767646b22e8da5fb037689 MSRC-3617253 265.57 10.24 36.23 42.52 59.23 59.87 From 14630668cdec7a872bbd3096bd317d11ba3a7d2f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Victor=20Peter=20Rouven=20M=C3=BCller?= Date: Wed, 31 Oct 2018 16:47:36 +0100 Subject: [PATCH 101/160] [CompilerPerf] Starting refactoring of ConstraintSolver.fs (#5766) * Starting refactoring of ConstraintSolver.fs Signed-off-by: realvictorprm * more refactoring of ++ operator Signed-off-by: realvictorprm * Trying to apply correct style. Signed-off-by: realvictorprm * replaced most usage of IterateD + styling Signed-off-by: realvictorprm * More style cleanup to reduce diff. Signed-off-by: realvictorprm * big restore of original spacing Signed-off-by: realvictorprm * Applying review. Signed-off-by: realvictorprm * whitespace fix * update FSComp.fs --- src/fsharp/ConstraintSolver.fs | 468 +++++++++++++++++---------------- src/fsharp/ErrorLogger.fs | 14 +- 2 files changed, 257 insertions(+), 225 deletions(-) diff --git a/src/fsharp/ConstraintSolver.fs b/src/fsharp/ConstraintSolver.fs index 8363ea03d6c..e5052b6f740 100644 --- a/src/fsharp/ConstraintSolver.fs +++ b/src/fsharp/ConstraintSolver.fs @@ -471,7 +471,10 @@ and SolveTypStaticReq (csenv:ConstraintSolverEnv) trace req ty = match stripTyparEqns ty with | TType_measure ms -> let vs = ListMeasureVarOccsWithNonZeroExponents ms - IterateD (fun ((tpr:Typar), _) -> SolveTypStaticReqTypar csenv trace req tpr) vs + trackErrors { + for (tpr, _) in vs do + return! SolveTypStaticReqTypar csenv trace req tpr + } | _ -> match tryAnyParTy csenv.g ty with | ValueSome tpr -> SolveTypStaticReqTypar csenv trace req tpr @@ -504,20 +507,22 @@ let SolveTypIsCompatFlex (csenv:ConstraintSolverEnv) trace req ty = else CompleteD -let SubstMeasureWarnIfRigid (csenv:ConstraintSolverEnv) trace (v:Typar) ms = +let SubstMeasureWarnIfRigid (csenv:ConstraintSolverEnv) trace (v:Typar) ms = trackErrors { if v.Rigidity.WarnIfUnified && not (isAnyParTy csenv.g (TType_measure ms)) then // NOTE: we grab the name eagerly to make sure the type variable prints as a type variable - let tpnmOpt = if v.IsCompilerGenerated then None else Some v.Name - SolveTypStaticReq csenv trace v.StaticReq (TType_measure ms) ++ (fun () -> + let tpnmOpt = if v.IsCompilerGenerated then None else Some v.Name + do! SolveTypStaticReq csenv trace v.StaticReq (TType_measure ms) SubstMeasure v ms - WarnD(NonRigidTypar(csenv.DisplayEnv, tpnmOpt, v.Range, TType_measure (Measure.Var v), TType_measure ms, csenv.m))) + return! WarnD(NonRigidTypar(csenv.DisplayEnv, tpnmOpt, v.Range, TType_measure (Measure.Var v), TType_measure ms, csenv.m)) else // Propagate static requirements from 'tp' to 'ty' - SolveTypStaticReq csenv trace v.StaticReq (TType_measure ms) ++ (fun () -> + do! SolveTypStaticReq csenv trace v.StaticReq (TType_measure ms) SubstMeasure v ms if v.Rigidity = TyparRigidity.Anon && measureEquiv csenv.g ms Measure.One then - WarnD(Error(FSComp.SR.csCodeLessGeneric(), v.Range)) - else CompleteD) + return! WarnD(Error(FSComp.SR.csCodeLessGeneric(), v.Range)) + else + () + } /// Imperatively unify the unit-of-measure expression ms against 1. /// There are three cases @@ -703,21 +708,17 @@ let CheckWarnIfRigid (csenv:ConstraintSolverEnv) ty1 (r:Typar) ty = /// Add the constraint "ty1 = ty" to the constraint problem, where ty1 is a type variable. /// Propagate all effects of adding this constraint, e.g. to solve other variables -let rec SolveTyparEqualsType (csenv:ConstraintSolverEnv) ndeep m2 (trace:OptionalTrace) ty1 ty = +let rec SolveTyparEqualsType (csenv:ConstraintSolverEnv) ndeep m2 (trace:OptionalTrace) ty1 ty = trackErrors { let m = csenv.m - - DepthCheck ndeep m ++ (fun () -> + do! DepthCheck ndeep m match ty1 with | TType_var r | TType_measure (Measure.Var r) -> // The types may still be equivalent due to abbreviations, which we are trying not to eliminate - if typeEquiv csenv.g ty1 ty then CompleteD else - + if typeEquiv csenv.g ty1 ty then () else // The famous 'occursCheck' check to catch "infinite types" like 'a = list<'a> - see also https://github.com/Microsoft/visualfsharp/issues/1170 - if occursCheck csenv.g r ty then ErrorD (ConstraintSolverInfiniteTypes(csenv.eContextInfo, csenv.DisplayEnv, ty1, ty, m, m2)) else - + if occursCheck csenv.g r ty then return! ErrorD (ConstraintSolverInfiniteTypes(csenv.eContextInfo, csenv.DisplayEnv, ty1, ty, m, m2)) else // Note: warn _and_ continue! - CheckWarnIfRigid csenv ty1 r ty ++ (fun () -> - + do! CheckWarnIfRigid csenv ty1 r ty // Record the solution before we solve the constraints, since // We may need to make use of the equation when solving the constraints. // Record a entry in the undo trace if one is provided @@ -726,33 +727,32 @@ let rec SolveTyparEqualsType (csenv:ConstraintSolverEnv) ndeep m2 (trace:Optiona (* dprintf "setting typar %d to type %s at %a\n" r.Stamp ((DebugPrint.showType ty)) outputRange m; *) // Only solve constraints if this is not an error var - if r.IsFromError then CompleteD else - + if r.IsFromError then () else // Check to see if this type variable is relevant to any trait constraints. // If so, re-solve the relevant constraints. - (if csenv.SolverState.ExtraCxs.ContainsKey r.Stamp then - RepeatWhileD ndeep (fun ndeep -> SolveRelevantMemberConstraintsForTypar csenv ndeep false trace r) - else - CompleteD) ++ (fun _ -> - + if csenv.SolverState.ExtraCxs.ContainsKey r.Stamp then + do! RepeatWhileD ndeep (fun ndeep -> SolveRelevantMemberConstraintsForTypar csenv ndeep false trace r) // Re-solve the other constraints associated with this type variable - solveTypMeetsTyparConstraints csenv ndeep m2 trace ty r)) + return! solveTypMeetsTyparConstraints csenv ndeep m2 trace ty r - | _ -> failwith "SolveTyparEqualsType") + | _ -> failwith "SolveTyparEqualsType" + } /// Apply the constraints on 'typar' to the type 'ty' -and solveTypMeetsTyparConstraints (csenv:ConstraintSolverEnv) ndeep m2 trace ty (r: Typar) = +and solveTypMeetsTyparConstraints (csenv:ConstraintSolverEnv) ndeep m2 trace ty (r: Typar) = trackErrors { let g = csenv.g // Propagate compat flex requirements from 'tp' to 'ty' - SolveTypIsCompatFlex csenv trace r.IsCompatFlex ty ++ (fun () -> + do! SolveTypIsCompatFlex csenv trace r.IsCompatFlex ty // Propagate dynamic requirements from 'tp' to 'ty' - SolveTypDynamicReq csenv trace r.DynamicReq ty ++ (fun () -> + do! SolveTypDynamicReq csenv trace r.DynamicReq ty // Propagate static requirements from 'tp' to 'ty' - SolveTypStaticReq csenv trace r.StaticReq ty ++ (fun () -> + do! SolveTypStaticReq csenv trace r.StaticReq ty // Solve constraints on 'tp' w.r.t. 'ty' - r.Constraints |> IterateD (function + for e in r.Constraints do + do! + match e with | TyparConstraint.DefaultsTo (priority, dty, m) -> if typeEquiv g ty dty then CompleteD @@ -774,8 +774,8 @@ and solveTypMeetsTyparConstraints (csenv:ConstraintSolverEnv) ndeep m2 trace ty | TyparConstraint.SimpleChoice(tys, m2) -> SolveTypeChoice csenv ndeep m2 trace ty tys | TyparConstraint.CoercesTo(ty2, m2) -> SolveTypeSubsumesTypeKeepAbbrevs csenv ndeep m2 trace None ty2 ty | TyparConstraint.MayResolveMember(traitInfo, m2) -> - SolveMemberConstraint csenv false false ndeep m2 trace traitInfo ++ (fun _ -> CompleteD) - )))) + SolveMemberConstraint csenv false false ndeep m2 trace traitInfo |> OperationResult.ignore + } /// Add the constraint "ty1 = ty2" to the constraint problem. @@ -854,9 +854,10 @@ and SolveTypeEqualsTypeEqns csenv ndeep m2 trace cxsln origl1 origl2 = ErrorD(ConstraintSolverTupleDiffLengths(csenv.DisplayEnv, origl1, origl2, csenv.m, m2)) loop origl1 origl2 -and SolveFunTypeEqn csenv ndeep m2 trace cxsln d1 d2 r1 r2 = - SolveTypeEqualsTypeKeepAbbrevsWithCxsln csenv ndeep m2 trace cxsln d1 d2 ++ (fun () -> - SolveTypeEqualsTypeKeepAbbrevsWithCxsln csenv ndeep m2 trace cxsln r1 r2) +and SolveFunTypeEqn csenv ndeep m2 trace cxsln d1 d2 r1 r2 = trackErrors { + do! SolveTypeEqualsTypeKeepAbbrevsWithCxsln csenv ndeep m2 trace cxsln d1 d2 + return! SolveTypeEqualsTypeKeepAbbrevsWithCxsln csenv ndeep m2 trace cxsln r1 r2 + } // ty1: expected // ty2: actual @@ -902,13 +903,14 @@ and SolveTypeSubsumesType (csenv:ConstraintSolverEnv) ndeep m2 (trace: OptionalT // Special subsumption rule for byref tags | TType_app (tc1, l1) , TType_app (tc2, l2) when tyconRefEq g tc1 tc2 && g.byref2_tcr.CanDeref && tyconRefEq g g.byref2_tcr tc1 -> match l1, l2 with - | [ h1; tag1 ], [ h2; tag2 ] -> - SolveTypeEqualsType csenv ndeep m2 trace None h1 h2 ++ (fun () -> + | [ h1; tag1 ], [ h2; tag2 ] -> trackErrors { + do! SolveTypeEqualsType csenv ndeep m2 trace None h1 h2 match stripTyEqnsA csenv.g canShortcut tag1, stripTyEqnsA csenv.g canShortcut tag2 with | TType_app(tagc1, []), TType_app(tagc2, []) when (tyconRefEq g tagc2 g.byrefkind_InOut_tcr && - (tyconRefEq g tagc1 g.byrefkind_In_tcr || tyconRefEq g tagc1 g.byrefkind_Out_tcr) ) -> CompleteD - | _ -> SolveTypeEqualsType csenv ndeep m2 trace cxsln tag1 tag2) + (tyconRefEq g tagc1 g.byrefkind_In_tcr || tyconRefEq g tagc1 g.byrefkind_Out_tcr) ) -> () + | _ -> return! SolveTypeEqualsType csenv ndeep m2 trace cxsln tag1 tag2 + } | _ -> SolveTypeEqualsTypeEqns csenv ndeep m2 trace cxsln l1 l2 | TType_app (tc1, l1) , TType_app (tc2, l2) when tyconRefEq g tc1 tc2 -> @@ -988,16 +990,16 @@ and SolveDimensionlessNumericType (csenv:ConstraintSolverEnv) ndeep m2 trace ty /// We pretend int and other types support a number of operators. In the actual IL for mscorlib they /// don't, however the type-directed static optimization rules in the library code that makes use of this /// will deal with the problem. -and SolveMemberConstraint (csenv:ConstraintSolverEnv) ignoreUnresolvedOverload permitWeakResolution ndeep m2 trace (TTrait(tys, nm, memFlags, argtys, rty, sln)): OperationResult = +and SolveMemberConstraint (csenv:ConstraintSolverEnv) ignoreUnresolvedOverload permitWeakResolution ndeep m2 trace (TTrait(tys, nm, memFlags, argtys, rty, sln)): OperationResult = trackErrors { // Do not re-solve if already solved - if sln.Value.IsSome then ResultD true else + if sln.Value.IsSome then return! ResultD true else let g = csenv.g let m = csenv.m let amap = csenv.amap let aenv = csenv.EquivEnv let denv = csenv.DisplayEnv let ndeep = ndeep + 1 - DepthCheck ndeep m ++ (fun () -> + do! DepthCheck ndeep m // Remove duplicates from the set of types in the support let tys = ListSet.setify (typeAEquiv g aenv) tys @@ -1008,19 +1010,19 @@ and SolveMemberConstraint (csenv:ConstraintSolverEnv) ignoreUnresolvedOverload p // Assert the object type if the constraint is for an instance member if memFlags.IsInstance then match tys, argtys with - | [ty], (h :: _) -> SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace h ty - | _ -> ErrorD (ConstraintSolverError(FSComp.SR.csExpectedArguments(), m, m2)) - else CompleteD - ++ (fun () -> - + | [ty], (h :: _) -> do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace h ty + | _ -> do! ErrorD (ConstraintSolverError(FSComp.SR.csExpectedArguments(), m, m2)) // Trait calls are only supported on pseudo type (variables) - tys |> IterateD (SolveTypStaticReq csenv trace HeadTypeStaticReq)) ++ (fun () -> + for e in tys do + do! SolveTypStaticReq csenv trace HeadTypeStaticReq e let argtys = if memFlags.IsInstance then List.tail argtys else argtys let minfos = GetRelevantMethodsForTrait csenv permitWeakResolution nm traitInfo - match minfos, tys, memFlags.IsInstance, nm, argtys with + let! res = + trackErrors { + match minfos, tys, memFlags.IsInstance, nm, argtys with | _, _, false, ("op_Division" | "op_Multiply"), [argty1;argty2] when // This simulates the existence of @@ -1063,153 +1065,155 @@ and SolveMemberConstraint (csenv:ConstraintSolverEnv) ignoreUnresolvedOverload p checkRuleAppliesInPreferenceToMethods argty2 argty1) -> match GetMeasureOfType g argty1 with - | Some (tcref, ms1) -> + | Some (tcref, ms1) -> let ms2 = freshMeasure () - SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace argty2 (mkAppTy tcref [TType_measure ms2]) ++ (fun () -> - SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace rty (mkAppTy tcref [TType_measure (Measure.Prod(ms1, if nm = "op_Multiply" then ms2 else Measure.Inv ms2))]) ++ (fun () -> - ResultD TTraitBuiltIn)) + do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace argty2 (mkAppTy tcref [TType_measure ms2]) + do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace rty (mkAppTy tcref [TType_measure (Measure.Prod(ms1, if nm = "op_Multiply" then ms2 else Measure.Inv ms2))]) + return! ResultD TTraitBuiltIn | _ -> match GetMeasureOfType g argty2 with - | Some (tcref, ms2) -> + | Some (tcref, ms2) -> let ms1 = freshMeasure () - SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace argty1 (mkAppTy tcref [TType_measure ms1]) ++ (fun () -> - SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace rty (mkAppTy tcref [TType_measure (Measure.Prod(ms1, if nm = "op_Multiply" then ms2 else Measure.Inv ms2))]) ++ (fun () -> - ResultD TTraitBuiltIn)) - | _ -> - SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace argty2 argty1 ++ (fun () -> - SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace rty argty1 ++ (fun () -> - ResultD TTraitBuiltIn)) + do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace argty1 (mkAppTy tcref [TType_measure ms1]) + do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace rty (mkAppTy tcref [TType_measure (Measure.Prod(ms1, if nm = "op_Multiply" then ms2 else Measure.Inv ms2))]) + return! ResultD TTraitBuiltIn + | _ -> + do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace argty2 argty1 + do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace rty argty1 + return! ResultD TTraitBuiltIn | _, _, false, ("op_Addition" | "op_Subtraction" | "op_Modulus"), [argty1;argty2] when // Ignore any explicit +/- overloads from any basic integral types (minfos |> List.forall (fun minfo -> isIntegerTy g minfo.ApparentEnclosingType ) && ( (IsNumericOrIntegralEnumType g argty1 || (nm = "op_Addition" && (isCharTy g argty1 || isStringTy g argty1))) && (permitWeakResolution || not (isTyparTy g argty2)) - || (IsNumericOrIntegralEnumType g argty2 || (nm = "op_Addition" && (isCharTy g argty2 || isStringTy g argty2))) && (permitWeakResolution || not (isTyparTy g argty1)))) -> - SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace argty2 argty1 ++ (fun () -> - SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace rty argty1 ++ (fun () -> - ResultD TTraitBuiltIn)) + || (IsNumericOrIntegralEnumType g argty2 || (nm = "op_Addition" && (isCharTy g argty2 || isStringTy g argty2))) && (permitWeakResolution || not (isTyparTy g argty1)))) -> + do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace argty2 argty1 + do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace rty argty1 + return! ResultD TTraitBuiltIn | _, _, false, ("op_LessThan" | "op_LessThanOrEqual" | "op_GreaterThan" | "op_GreaterThanOrEqual" | "op_Equality" | "op_Inequality" ), [argty1;argty2] when // Ignore any explicit overloads from any basic integral types (minfos |> List.forall (fun minfo -> isIntegerTy g minfo.ApparentEnclosingType ) && ( (IsRelationalType g argty1 && (permitWeakResolution || not (isTyparTy g argty2))) - || (IsRelationalType g argty2 && (permitWeakResolution || not (isTyparTy g argty1))))) -> - SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace argty2 argty1 ++ (fun () -> - SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace rty g.bool_ty ++ (fun () -> - ResultD TTraitBuiltIn)) + || (IsRelationalType g argty2 && (permitWeakResolution || not (isTyparTy g argty1))))) -> + do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace argty2 argty1 + do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace rty g.bool_ty + return! ResultD TTraitBuiltIn // We pretend for uniformity that the numeric types have a static property called Zero and One // As with constants, only zero is polymorphic in its units | [], [ty], false, "get_Zero", [] - when IsNumericType g ty -> - SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace rty ty ++ (fun () -> - ResultD TTraitBuiltIn) + when IsNumericType g ty -> + do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace rty ty + return! ResultD TTraitBuiltIn | [], [ty], false, "get_One", [] - when IsNumericType g ty || isCharTy g ty -> - SolveDimensionlessNumericType csenv ndeep m2 trace ty ++ (fun () -> - SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace rty ty ++ (fun () -> - ResultD TTraitBuiltIn)) + when IsNumericType g ty || isCharTy g ty -> + do! SolveDimensionlessNumericType csenv ndeep m2 trace ty + do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace rty ty + return! ResultD TTraitBuiltIn | [], _, false, ("DivideByInt"), [argty1;argty2] - when isFpTy g argty1 || isDecimalTy g argty1 -> - SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace argty2 g.int_ty ++ (fun () -> - SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace rty argty1 ++ (fun () -> - ResultD TTraitBuiltIn)) + when isFpTy g argty1 || isDecimalTy g argty1 -> + do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace argty2 g.int_ty + do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace rty argty1 + return! ResultD TTraitBuiltIn // We pretend for uniformity that the 'string' and 'array' types have an indexer property called 'Item' | [], [ty], true, ("get_Item"), [argty1] - when isStringTy g ty -> + when isStringTy g ty -> - SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace argty1 g.int_ty ++ (fun () -> - SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace rty g.char_ty ++ (fun () -> - ResultD TTraitBuiltIn)) + do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace argty1 g.int_ty + do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace rty g.char_ty + return! ResultD TTraitBuiltIn | [], [ty], true, ("get_Item"), argtys - when isArrayTy g ty -> + when isArrayTy g ty -> - (if rankOfArrayTy g ty <> argtys.Length then ErrorD(ConstraintSolverError(FSComp.SR.csIndexArgumentMismatch((rankOfArrayTy g ty), argtys.Length), m, m2)) else CompleteD) ++ (fun () -> - (argtys |> IterateD (fun argty -> SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace argty g.int_ty)) ++ (fun () -> + if rankOfArrayTy g ty <> argtys.Length then do! ErrorD(ConstraintSolverError(FSComp.SR.csIndexArgumentMismatch((rankOfArrayTy g ty), argtys.Length), m, m2)) + for argty in argtys do + do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace argty g.int_ty let ety = destArrayTy g ty - SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace rty ety ++ (fun () -> - ResultD TTraitBuiltIn))) + do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace rty ety + return! ResultD TTraitBuiltIn | [], [ty], true, ("set_Item"), argtys - when isArrayTy g ty -> + when isArrayTy g ty -> - (if rankOfArrayTy g ty <> argtys.Length - 1 then ErrorD(ConstraintSolverError(FSComp.SR.csIndexArgumentMismatch((rankOfArrayTy g ty), (argtys.Length - 1)), m, m2)) else CompleteD) ++ (fun () -> + if rankOfArrayTy g ty <> argtys.Length - 1 then do! ErrorD(ConstraintSolverError(FSComp.SR.csIndexArgumentMismatch((rankOfArrayTy g ty), (argtys.Length - 1)), m, m2)) let argtys, ety = List.frontAndBack argtys - (argtys |> IterateD (fun argty -> SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace argty g.int_ty)) ++ (fun () -> + for argty in argtys do + do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace argty g.int_ty let etys = destArrayTy g ty - SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace ety etys ++ (fun () -> - ResultD TTraitBuiltIn))) + do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace ety etys + return! ResultD TTraitBuiltIn | [], _, false, ("op_BitwiseAnd" | "op_BitwiseOr" | "op_ExclusiveOr"), [argty1;argty2] when (isIntegerOrIntegerEnumTy g argty1 || (isEnumTy g argty1)) && (permitWeakResolution || not (isTyparTy g argty2)) - || (isIntegerOrIntegerEnumTy g argty2 || (isEnumTy g argty2)) && (permitWeakResolution || not (isTyparTy g argty1)) -> + || (isIntegerOrIntegerEnumTy g argty2 || (isEnumTy g argty2)) && (permitWeakResolution || not (isTyparTy g argty1)) -> - SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace argty2 argty1 ++ (fun () -> - SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace rty argty1 ++ (fun () -> - SolveDimensionlessNumericType csenv ndeep m2 trace argty1 ++ (fun () -> - ResultD TTraitBuiltIn))); + do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace argty2 argty1 + do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace rty argty1 + do! SolveDimensionlessNumericType csenv ndeep m2 trace argty1 + return! ResultD TTraitBuiltIn | [], _, false, ("op_LeftShift" | "op_RightShift"), [argty1;argty2] - when isIntegerOrIntegerEnumTy g argty1 -> + when isIntegerOrIntegerEnumTy g argty1 -> - SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace argty2 g.int_ty ++ (fun () -> - SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace rty argty1 ++ (fun () -> - SolveDimensionlessNumericType csenv ndeep m2 trace argty1 ++ (fun () -> - ResultD TTraitBuiltIn))) + do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace argty2 g.int_ty + do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace rty argty1 + do! SolveDimensionlessNumericType csenv ndeep m2 trace argty1 + return! ResultD TTraitBuiltIn | _, _, false, ("op_UnaryPlus"), [argty] - when IsNumericOrIntegralEnumType g argty -> + when IsNumericOrIntegralEnumType g argty -> - SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace rty argty ++ (fun () -> - ResultD TTraitBuiltIn) + do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace rty argty + return! ResultD TTraitBuiltIn | _, _, false, ("op_UnaryNegation"), [argty] - when isSignedIntegerTy g argty || isFpTy g argty || isDecimalTy g argty -> + when isSignedIntegerTy g argty || isFpTy g argty || isDecimalTy g argty -> - SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace rty argty ++ (fun () -> - ResultD TTraitBuiltIn) + do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace rty argty + return! ResultD TTraitBuiltIn | _, _, true, ("get_Sign"), [] - when (let argty = tys.Head in isSignedIntegerTy g argty || isFpTy g argty || isDecimalTy g argty) -> + when (let argty = tys.Head in isSignedIntegerTy g argty || isFpTy g argty || isDecimalTy g argty) -> - SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace rty g.int32_ty ++ (fun () -> - ResultD TTraitBuiltIn) + do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace rty g.int32_ty + return! ResultD TTraitBuiltIn | _, _, false, ("op_LogicalNot" | "op_OnesComplement"), [argty] - when isIntegerOrIntegerEnumTy g argty -> + when isIntegerOrIntegerEnumTy g argty -> - SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace rty argty ++ (fun () -> - SolveDimensionlessNumericType csenv ndeep m2 trace argty ++ (fun () -> - ResultD TTraitBuiltIn)) + do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace rty argty + do! SolveDimensionlessNumericType csenv ndeep m2 trace argty + return! ResultD TTraitBuiltIn | _, _, false, ("Abs"), [argty] - when isSignedIntegerTy g argty || isFpTy g argty || isDecimalTy g argty -> + when isSignedIntegerTy g argty || isFpTy g argty || isDecimalTy g argty -> - SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace rty argty ++ (fun () -> - ResultD TTraitBuiltIn) + do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace rty argty + return! ResultD TTraitBuiltIn | _, _, false, "Sqrt", [argty1] when isFpTy g argty1 -> match GetMeasureOfType g argty1 with - | Some (tcref, _) -> + | Some (tcref, _) -> let ms1 = freshMeasure () - SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace argty1 (mkAppTy tcref [TType_measure (Measure.Prod (ms1, ms1))]) ++ (fun () -> - SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace rty (mkAppTy tcref [TType_measure ms1]) ++ (fun () -> - ResultD TTraitBuiltIn)) - | None -> - SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace rty argty1 ++ (fun () -> - ResultD TTraitBuiltIn) + do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace argty1 (mkAppTy tcref [TType_measure (Measure.Prod (ms1, ms1))]) + do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace rty (mkAppTy tcref [TType_measure ms1]) + return! ResultD TTraitBuiltIn + | None -> + do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace rty argty1 + return! ResultD TTraitBuiltIn | _, _, false, ("Sin" | "Cos" | "Tan" | "Sinh" | "Cosh" | "Tanh" | "Atan" | "Acos" | "Asin" | "Exp" | "Ceiling" | "Floor" | "Round" | "Truncate" | "Log10" | "Log" | "Sqrt"), [argty] - when isFpTy g argty -> + when isFpTy g argty -> - SolveDimensionlessNumericType csenv ndeep m2 trace argty ++ (fun () -> - SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace rty argty ++ (fun () -> - ResultD TTraitBuiltIn)) + do! SolveDimensionlessNumericType csenv ndeep m2 trace argty + do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace rty argty + return! ResultD TTraitBuiltIn | _, _, false, ("op_Explicit"), [argty] when (// The input type. @@ -1221,7 +1225,7 @@ and SolveMemberConstraint (csenv:ConstraintSolverEnv) ignoreUnresolvedOverload p // Exclusion: No conversion from char to decimal not (isCharTy g argty && isDecimalTy g rty)) -> - ResultD TTraitBuiltIn + return! ResultD TTraitBuiltIn | _, _, false, ("op_Explicit"), [argty] @@ -1230,23 +1234,23 @@ and SolveMemberConstraint (csenv:ConstraintSolverEnv) ignoreUnresolvedOverload p // The output type (isDecimalTy g rty)) -> - ResultD TTraitBuiltIn + return! ResultD TTraitBuiltIn | [], _, false, "Pow", [argty1; argty2] - when isFpTy g argty1 -> + when isFpTy g argty1 -> - SolveDimensionlessNumericType csenv ndeep m2 trace argty1 ++ (fun () -> - SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace argty2 argty1 ++ (fun () -> - SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace rty argty1 ++ (fun () -> - ResultD TTraitBuiltIn))) + do! SolveDimensionlessNumericType csenv ndeep m2 trace argty1 + do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace argty2 argty1 + do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace rty argty1 + return! ResultD TTraitBuiltIn | _, _, false, ("Atan2"), [argty1; argty2] - when isFpTy g argty1 -> - SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace argty2 argty1 ++ (fun () -> + when isFpTy g argty1 -> + do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace argty2 argty1 match GetMeasureOfType g argty1 with - | None -> SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace rty argty1 - | Some (tcref, _) -> SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace rty (mkAppTy tcref [TType_measure Measure.One])) ++ (fun () -> - ResultD TTraitBuiltIn) + | None -> do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace rty argty1 + | Some (tcref, _) -> do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace rty (mkAppTy tcref [TType_measure Measure.One]) + return! ResultD TTraitBuiltIn | _ -> // OK, this is not solved by a built-in constraint. @@ -1279,12 +1283,12 @@ and SolveMemberConstraint (csenv:ConstraintSolverEnv) ignoreUnresolvedOverload p match minfos, recdPropSearch with | [], None when not (tys |> List.exists (isAnyParTy g)) -> if tys |> List.exists (isFunTy g) then - ErrorD (ConstraintSolverError(FSComp.SR.csExpectTypeWithOperatorButGivenFunction(DecompileOpName nm), m, m2)) + return! ErrorD (ConstraintSolverError(FSComp.SR.csExpectTypeWithOperatorButGivenFunction(DecompileOpName nm), m, m2)) elif tys |> List.exists (isAnyTupleTy g) then - ErrorD (ConstraintSolverError(FSComp.SR.csExpectTypeWithOperatorButGivenTuple(DecompileOpName nm), m, m2)) + return! ErrorD (ConstraintSolverError(FSComp.SR.csExpectTypeWithOperatorButGivenTuple(DecompileOpName nm), m, m2)) else match nm, argtys with - | "op_Explicit", [argty] -> ErrorD (ConstraintSolverError(FSComp.SR.csTypeDoesNotSupportConversion((NicePrint.prettyStringOfTy denv argty), (NicePrint.prettyStringOfTy denv rty)), m, m2)) + | "op_Explicit", [argty] -> return! ErrorD (ConstraintSolverError(FSComp.SR.csTypeDoesNotSupportConversion((NicePrint.prettyStringOfTy denv argty), (NicePrint.prettyStringOfTy denv rty)), m, m2)) | _ -> let tyString = match tys with @@ -1301,10 +1305,9 @@ and SolveMemberConstraint (csenv:ConstraintSolverEnv) ignoreUnresolvedOverload p | _ -> if tys.Length = 1 then FSComp.SR.csTypeDoesNotSupportOperator(tyString, opName) else FSComp.SR.csTypesDoNotSupportOperator(tyString, opName) - ErrorD(ConstraintSolverError(err, m, m2)) + return! ErrorD(ConstraintSolverError(err, m, m2)) | _ -> - let dummyExpr = mkUnit g m let calledMethGroup = minfos @@ -1323,38 +1326,38 @@ and SolveMemberConstraint (csenv:ConstraintSolverEnv) ignoreUnresolvedOverload p | Some (rfinfo, isSetProp), None -> // OK, the constraint is solved by a record property. Assert that the return types match. let rty2 = if isSetProp then g.unit_ty else rfinfo.FieldType - SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace rty rty2 ++ (fun () -> - ResultD (TTraitSolvedRecdProp(rfinfo, isSetProp))) + do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace rty rty2 + return! ResultD (TTraitSolvedRecdProp(rfinfo, isSetProp)) | None, Some (calledMeth:CalledMeth<_>) -> // OK, the constraint is solved. let minfo = calledMeth.Method - errors ++ (fun () -> - let isInstance = minfo.IsInstance - if isInstance <> memFlags.IsInstance then + do! errors + let isInstance = minfo.IsInstance + if isInstance <> memFlags.IsInstance then + return! if isInstance then ErrorD(ConstraintSolverError(FSComp.SR.csMethodFoundButIsNotStatic((NicePrint.minimalStringOfType denv minfo.ApparentEnclosingType), (DecompileOpName nm), nm), m, m2 )) else ErrorD(ConstraintSolverError(FSComp.SR.csMethodFoundButIsStatic((NicePrint.minimalStringOfType denv minfo.ApparentEnclosingType), (DecompileOpName nm), nm), m, m2 )) - else - CheckMethInfoAttributes g m None minfo ++ (fun () -> - ResultD (TTraitSolved (minfo, calledMeth.CalledTyArgs)))) + else + do! CheckMethInfoAttributes g m None minfo + return! ResultD (TTraitSolved (minfo, calledMeth.CalledTyArgs)) - | _ -> + | _ -> let support = GetSupportOfMemberConstraint csenv traitInfo let frees = GetFreeTyparsOfMemberConstraint csenv traitInfo - // If there's nothing left to learn then raise the errors - (if (permitWeakResolution && isNil support) || isNil frees then errors - // Otherwise re-record the trait waiting for canonicalization - else AddMemberConstraint csenv ndeep m2 trace traitInfo support frees) ++ (fun () -> + if (permitWeakResolution && isNil support) || isNil frees then do! errors + // Otherwise re-record the trait waiting for canonicalization + else do! AddMemberConstraint csenv ndeep m2 trace traitInfo support frees + return! match errors with | ErrorResult (_, UnresolvedOverloading _) when not ignoreUnresolvedOverload && (not (nm = "op_Explicit" || nm = "op_Implicit")) -> ErrorD LocallyAbortOperationThatFailsToResolveOverload - | _ -> ResultD TTraitUnsolved) - ) - ++ - (fun res -> RecordMemberConstraintSolution csenv.SolverState m trace traitInfo res)) - + | _ -> ResultD TTraitUnsolved + } + return! RecordMemberConstraintSolution csenv.SolverState m trace traitInfo res + } /// Record the solution to a member constraint in the mutable reference cell attached to /// each member constraint. @@ -1518,7 +1521,10 @@ and AddMemberConstraint (csenv:ConstraintSolverEnv) ndeep m2 trace traitInfo sup // Associate the constraint with each type variable in the support, so if the type variable // gets generalized then this constraint is attached at the binding site. - support |> IterateD (fun tp -> AddConstraint csenv ndeep m2 trace tp (TyparConstraint.MayResolveMember(traitInfo, m2))) + trackErrors { + for tp in support do + do! AddConstraint csenv ndeep m2 trace tp (TyparConstraint.MayResolveMember(traitInfo, m2)) + } /// Record a constraint on an inference type variable. @@ -1548,9 +1554,11 @@ and AddConstraint (csenv:ConstraintSolverEnv) ndeep m2 trace tp newConstraint = let rty1 = GetFSharpViewOfReturnType g rty1 let rty2 = GetFSharpViewOfReturnType g rty2 - Iterate2D (SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace) argtys1 argtys2 ++ (fun () -> - SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace rty1 rty2 ++ (fun () -> - CompleteD)) + trackErrors { + do! Iterate2D (SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace) argtys1 argtys2 + do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace rty1 rty2 + () + } | (TyparConstraint.CoercesTo(ty1, _), TyparConstraint.CoercesTo(ty2, _)) -> @@ -1564,19 +1572,22 @@ and AddConstraint (csenv:ConstraintSolverEnv) ndeep m2 trace tp newConstraint = List.rev !res let parents1 = collect ty1 let parents2 = collect ty2 - parents1 |> IterateD (fun ty1Parent -> - parents2 |> IterateD (fun ty2Parent -> - if not (HaveSameHeadType g ty1Parent ty2Parent) then CompleteD else - SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace ty1Parent ty2Parent)) + trackErrors { + for ty1Parent in parents1 do + for ty2Parent in parents2 do + do! if not (HaveSameHeadType g ty1Parent ty2Parent) then CompleteD else + SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace ty1Parent ty2Parent + } | (TyparConstraint.IsEnum (u1, _), TyparConstraint.IsEnum (u2, m2)) -> SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace u1 u2 | (TyparConstraint.IsDelegate (aty1, bty1, _), - TyparConstraint.IsDelegate (aty2, bty2, m2)) -> - SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace aty1 aty2 ++ (fun () -> - SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace bty1 bty2) + TyparConstraint.IsDelegate (aty2, bty2, m2)) -> trackErrors { + do! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace aty1 aty2 + return! SolveTypeEqualsTypeKeepAbbrevs csenv ndeep m2 trace bty1 bty2 + } | TyparConstraint.SupportsComparison _, TyparConstraint.IsDelegate _ | TyparConstraint.IsDelegate _ , TyparConstraint.SupportsComparison _ @@ -1635,36 +1646,34 @@ and AddConstraint (csenv:ConstraintSolverEnv) ndeep m2 trace tp newConstraint = let existingConstraints = tp.Constraints let allCxs = newConstraint :: List.rev existingConstraints - begin + trackErrors { let rec enforceMutualConsistency i cxs = match cxs with | [] -> CompleteD - | cx :: rest -> IterateIdxD (fun j cx2 -> if i = j then CompleteD else consistent cx cx2) allCxs ++ (fun () -> enforceMutualConsistency (i+1) rest) - - enforceMutualConsistency 0 allCxs - end ++ (fun () -> + | cx :: rest -> + trackErrors { + do! IterateIdxD (fun j cx2 -> if i = j then CompleteD else consistent cx cx2) allCxs + return! enforceMutualConsistency (i+1) rest + } + do! enforceMutualConsistency 0 allCxs - let impliedByExistingConstraints = existingConstraints |> List.exists (fun tpc2 -> implies tpc2 newConstraint) + let impliedByExistingConstraints = existingConstraints |> List.exists (fun tpc2 -> implies tpc2 newConstraint) - if impliedByExistingConstraints then - CompleteD - // "Default" constraints propagate softly and can be omitted from explicit declarations of type parameters - elif (match tp.Rigidity, newConstraint with - | (TyparRigidity.Rigid | TyparRigidity.WillBeRigid), TyparConstraint.DefaultsTo _ -> true - | _ -> false) then - CompleteD - elif tp.Rigidity = TyparRigidity.Rigid then - ErrorD (ConstraintSolverMissingConstraint(denv, tp, newConstraint, m, m2)) - else - (// It is important that we give a warning if a constraint is missing from a + if impliedByExistingConstraints then () + // "Default" constraints propagate softly and can be omitted from explicit declarations of type parameters + elif (match tp.Rigidity, newConstraint with + | (TyparRigidity.Rigid | TyparRigidity.WillBeRigid), TyparConstraint.DefaultsTo _ -> true + | _ -> false) then + () + elif tp.Rigidity = TyparRigidity.Rigid then + return! ErrorD (ConstraintSolverMissingConstraint(denv, tp, newConstraint, m, m2)) + else + // It is important that we give a warning if a constraint is missing from a // will-be-made-rigid type variable. This is because the existence of these warnings // is relevant to the overload resolution rules (see 'candidateWarnCount' in the overload resolution // implementation). See also FSharp 1.0 bug 5461 - (if tp.Rigidity.WarnIfMissingConstraint then - WarnD (ConstraintSolverMissingConstraint(denv, tp, newConstraint, m, m2)) - else - CompleteD) ++ (fun () -> - + if tp.Rigidity.WarnIfMissingConstraint then + do! WarnD (ConstraintSolverMissingConstraint(denv, tp, newConstraint, m, m2)) let newConstraints = // Eliminate any constraints where one constraint implies another // Keep constraints in the left-to-right form according to the order they are asserted. @@ -1676,14 +1685,14 @@ and AddConstraint (csenv:ConstraintSolverEnv) ndeep m2 trace tp newConstraint = eliminateRedundant rest (if List.exists (fun cx2 -> implies cx2 cx) acc then acc else (cx::acc)) eliminateRedundant allCxs [] - // Write the constraint into the type variable // Record a entry in the undo trace if one is provided let orig = tp.Constraints trace.Exec (fun () -> tp.SetConstraints newConstraints) (fun () -> tp.SetConstraints orig) + () + } - CompleteD))) and SolveTypeSupportsNull (csenv:ConstraintSolverEnv) ndeep m2 trace ty = let g = csenv.g @@ -2029,17 +2038,16 @@ and ArgsMustSubsumeOrConvert cxsln isConstraint (calledArg: CalledArg) - (callerArg: CallerArg<'T>) = + (callerArg: CallerArg<'T>) = trackErrors { let g = csenv.g let m = callerArg.Range let calledArgTy = AdjustCalledArgType csenv.InfoReader isConstraint calledArg callerArg - SolveTypeSubsumesTypeWithReport csenv ndeep m trace cxsln calledArgTy callerArg.Type ++ (fun () -> - + do! SolveTypeSubsumesTypeWithReport csenv ndeep m trace cxsln calledArgTy callerArg.Type if calledArg.IsParamArray && isArray1DTy g calledArgTy && not (isArray1DTy g callerArg.Type) then - ErrorD(Error(FSComp.SR.csMethodExpectsParams(), m)) - else - CompleteD) + return! ErrorD(Error(FSComp.SR.csMethodExpectsParams(), m)) + else () + } and MustUnify csenv ndeep trace cxsln ty1 ty2 = SolveTypeEqualsTypeWithReport csenv ndeep csenv.m trace cxsln ty1 ty2 @@ -2462,11 +2470,12 @@ and ResolveOverloading match calledMethOpt with | Some calledMeth -> calledMethOpt, - errors ++ (fun () -> + trackErrors { + do! errors let cxsln = Option.map (fun traitInfo -> (traitInfo, MemberConstraintSolutionOfMethInfo csenv.SolverState m calledMeth.Method calledMeth.CalledTyArgs)) cx match calledMethTrace with | NoTrace -> - + return! // No trace available for CanMemberSigsMatchUpToCheck with ArgsMustSubsumeOrConvert CanMemberSigsMatchUpToCheck csenv @@ -2484,14 +2493,15 @@ and ResolveOverloading // Unify return type match reqdRetTyOpt with - | None -> CompleteD - | Some _ when calledMeth.Method.IsConstructor -> CompleteD + | None -> () + | Some _ when calledMeth.Method.IsConstructor -> () | Some reqdRetTy -> let actualRetTy = calledMeth.CalledReturnTypeAfterOutArgTupling if isByrefTy g reqdRetTy then - ErrorD(Error(FSComp.SR.tcByrefReturnImplicitlyDereferenced(), m)) + return! ErrorD(Error(FSComp.SR.tcByrefReturnImplicitlyDereferenced(), m)) else - MustUnify csenv ndeep trace cxsln reqdRetTy actualRetTy) + return! MustUnify csenv ndeep trace cxsln reqdRetTy actualRetTy + } | None -> None, errors @@ -2511,7 +2521,8 @@ let UnifyUniqueOverloading let candidates = calledMethGroup |> List.filter (fun cmeth -> cmeth.IsCandidate(m, ad)) let ndeep = 0 match calledMethGroup, candidates with - | _, [calledMeth] -> + | _, [calledMeth] -> trackErrors { + do! // Only one candidate found - we thus know the types we expect of arguments CanMemberSigsMatchUpToCheck csenv @@ -2522,13 +2533,15 @@ let UnifyUniqueOverloading (ArgsMustSubsumeOrConvert csenv ndeep NoTrace None false) // UnifyUniqueOverloading is not called in case of trait call - pass isConstraint=false (Some reqdRetTy) calledMeth - ++ (fun () -> ResultD true) + return! ResultD true + } | [], _ -> ErrorD (Error (FSComp.SR.csMethodNotFound(methodName), m)) - | _, [] -> - ReportNoCandidatesErrorSynExpr csenv callerArgCounts methodName ad calledMethGroup - ++ (fun () -> ResultD false) + | _, [] -> trackErrors { + do! ReportNoCandidatesErrorSynExpr csenv callerArgCounts methodName ad calledMethGroup + return! ResultD false + } | _ -> ResultD false @@ -2591,7 +2604,12 @@ let AddCxTypeMustSubsumeType contextInfo denv css m trace ty1 ty2 = |> RaiseOperationResult let AddCxMethodConstraint denv css m trace traitInfo = - TryD (fun () -> SolveMemberConstraint (MakeConstraintSolverEnv ContextInfo.NoContext css m denv) true false 0 m trace traitInfo ++ (fun _ -> CompleteD)) + TryD (fun () -> + trackErrors { + do! + SolveMemberConstraint (MakeConstraintSolverEnv ContextInfo.NoContext css m denv) true false 0 m trace traitInfo + |> OperationResult.ignore + }) (fun res -> ErrorD (ErrorFromAddingConstraint(denv, res, m))) |> RaiseOperationResult @@ -2640,7 +2658,7 @@ let AddCxTypeIsDelegate denv css m trace ty aty bty = (fun res -> ErrorD (ErrorFromAddingConstraint(denv, res, m))) |> RaiseOperationResult -let CodegenWitnessThatTypeSupportsTraitConstraint tcVal g amap m (traitInfo:TraitConstraintInfo) argExprs = +let CodegenWitnessThatTypeSupportsTraitConstraint tcVal g amap m (traitInfo:TraitConstraintInfo) argExprs = trackErrors { let css = { g = g amap = amap @@ -2649,8 +2667,8 @@ let CodegenWitnessThatTypeSupportsTraitConstraint tcVal g amap m (traitInfo:Trai InfoReader = new InfoReader(g, amap) } let csenv = MakeConstraintSolverEnv ContextInfo.NoContext css m (DisplayEnv.Empty g) - SolveMemberConstraint csenv true true 0 m NoTrace traitInfo ++ (fun _res -> - let sln = + let! _res = SolveMemberConstraint csenv true true 0 m NoTrace traitInfo + let sln = match traitInfo.Solution with | None -> Choice4Of4() | Some sln -> @@ -2674,6 +2692,7 @@ let CodegenWitnessThatTypeSupportsTraitConstraint tcVal g amap m (traitInfo:Trai Choice4Of4 () | ClosedExprSln expr -> Choice3Of4 expr + return! match sln with | Choice1Of4(minfo, methArgTys) -> let argExprs = @@ -2730,7 +2749,8 @@ let CodegenWitnessThatTypeSupportsTraitConstraint tcVal g amap m (traitInfo:Trai | _ -> None ResultD res | Choice3Of4 expr -> ResultD (Some (MakeApplicationAndBetaReduce g (expr, tyOfExpr g expr, [], argExprs, m))) - | Choice4Of4 () -> ResultD None) + | Choice4Of4 () -> ResultD None + } let ChooseTyparSolutionAndSolve css denv tp = diff --git a/src/fsharp/ErrorLogger.fs b/src/fsharp/ErrorLogger.fs index d29874bb0d5..41be3768ed2 100755 --- a/src/fsharp/ErrorLogger.fs +++ b/src/fsharp/ErrorLogger.fs @@ -596,15 +596,27 @@ let rec Iterate2D f xs ys = | h1 :: t1, h2::t2 -> f h1 h2 ++ (fun () -> Iterate2D f t1 t2) | _ -> failwith "Iterate2D" +/// Keep the warnings, propagate the error to the exception continuation. let TryD f g = match f() with - | ErrorResult(warns, err) -> (OkResult(warns, ())) ++ (fun () -> g err) + | ErrorResult(warns, err) -> + trackErrors { + do! OkResult(warns, ()) + return! g err + } | res -> res let rec RepeatWhileD ndeep body = body ndeep ++ (fun x -> if x then RepeatWhileD (ndeep+1) body else CompleteD) let AtLeastOneD f l = MapD f l ++ (fun res -> ResultD (List.exists id res)) +[] +module OperationResult = + let inline ignore (res: OperationResult<'a>) = + match res with + | OkResult(warnings, _) -> OkResult(warnings, ()) + | ErrorResult(warnings, err) -> ErrorResult(warnings, err) + // Code below is for --flaterrors flag that is only used by the IDE let stringThatIsAProxyForANewlineInFlatErrors = new System.String [|char 29 |] From 932450022e21f0110ae716af4007561d4203ac94 Mon Sep 17 00:00:00 2001 From: khoiph1 Date: Wed, 31 Oct 2018 13:30:55 -0700 Subject: [PATCH 102/160] Loc Update --- .../Template/xlf/AssemblyInfo.fs.cs.xlf | 2 +- .../Template/xlf/AssemblyInfo.fs.de.xlf | 2 +- .../Template/xlf/AssemblyInfo.fs.es.xlf | 2 +- .../Template/xlf/AssemblyInfo.fs.fr.xlf | 2 +- .../Template/xlf/AssemblyInfo.fs.it.xlf | 2 +- .../Template/xlf/AssemblyInfo.fs.ko.xlf | 2 +- .../Template/xlf/AssemblyInfo.fs.pl.xlf | 2 +- .../Template/xlf/AssemblyInfo.fs.pt-BR.xlf | 2 +- .../Template/xlf/AssemblyInfo.fs.ru.xlf | 4 +- .../Template/xlf/AssemblyInfo.fs.tr.xlf | 2 +- .../Template/xlf/AssemblyInfo.fs.zh-Hans.xlf | 2 +- .../Template/xlf/Program.fs.cs.xlf | 2 +- .../Template/xlf/Program.fs.de.xlf | 2 +- .../Template/xlf/Program.fs.es.xlf | 2 +- .../Template/xlf/Program.fs.fr.xlf | 2 +- .../Template/xlf/Program.fs.it.xlf | 2 +- .../Template/xlf/Program.fs.ko.xlf | 2 +- .../Template/xlf/Program.fs.pl.xlf | 2 +- .../Template/xlf/Program.fs.pt-BR.xlf | 2 +- .../Template/xlf/Program.fs.ru.xlf | 2 +- .../Template/xlf/Program.fs.tr.xlf | 2 +- .../Template/xlf/Program.fs.zh-Hans.xlf | 2 +- .../Template/xlf/Program.fs.zh-Hant.xlf | 2 +- .../Template/xlf/AssemblyInfo.fs.cs.xlf | 2 +- .../Template/xlf/AssemblyInfo.fs.de.xlf | 2 +- .../Template/xlf/AssemblyInfo.fs.es.xlf | 2 +- .../Template/xlf/AssemblyInfo.fs.fr.xlf | 2 +- .../Template/xlf/AssemblyInfo.fs.it.xlf | 2 +- .../Template/xlf/AssemblyInfo.fs.ko.xlf | 2 +- .../Template/xlf/AssemblyInfo.fs.pl.xlf | 2 +- .../Template/xlf/AssemblyInfo.fs.pt-BR.xlf | 2 +- .../Template/xlf/AssemblyInfo.fs.ru.xlf | 4 +- .../Template/xlf/AssemblyInfo.fs.tr.xlf | 2 +- .../Template/xlf/AssemblyInfo.fs.zh-Hans.xlf | 2 +- .../Template/xlf/Script.fsx.cs.xlf | 2 +- .../Template/xlf/Script.fsx.de.xlf | 2 +- .../Template/xlf/Script.fsx.es.xlf | 2 +- .../Template/xlf/Script.fsx.fr.xlf | 2 +- .../Template/xlf/Script.fsx.it.xlf | 2 +- .../Template/xlf/Script.fsx.ko.xlf | 2 +- .../Template/xlf/Script.fsx.pl.xlf | 2 +- .../Template/xlf/Script.fsx.pt-BR.xlf | 2 +- .../Template/xlf/Script.fsx.ru.xlf | 2 +- .../Template/xlf/Script.fsx.tr.xlf | 2 +- .../Template/xlf/Script.fsx.zh-Hans.xlf | 2 +- .../Template/xlf/Script.fsx.zh-Hant.xlf | 2 +- .../Template/xlf/Tutorial.fsx.cs.xlf | 2 +- .../Template/xlf/Tutorial.fsx.de.xlf | 8 ++-- .../Template/xlf/Tutorial.fsx.es.xlf | 8 ++-- .../Template/xlf/Tutorial.fsx.fr.xlf | 6 +-- .../Template/xlf/Tutorial.fsx.it.xlf | 4 +- .../Template/xlf/Tutorial.fsx.ja.xlf | 12 +++--- .../Template/xlf/Tutorial.fsx.ko.xlf | 10 ++--- .../Template/xlf/Tutorial.fsx.pl.xlf | 4 +- .../Template/xlf/Tutorial.fsx.pt-BR.xlf | 4 +- .../Template/xlf/Tutorial.fsx.ru.xlf | 6 +-- .../Template/xlf/Tutorial.fsx.tr.xlf | 2 +- .../Template/xlf/Tutorial.fsx.zh-Hans.xlf | 4 +- .../Template/xlf/Tutorial.fsx.zh-Hant.xlf | 6 +-- .../FSharp.Editor/xlf/FSharp.Editor.cs.xlf | 4 +- .../FSharp.Editor/xlf/FSharp.Editor.de.xlf | 2 +- .../FSharp.Editor/xlf/FSharp.Editor.es.xlf | 4 +- .../FSharp.Editor/xlf/FSharp.Editor.fr.xlf | 2 +- .../FSharp.Editor/xlf/FSharp.Editor.it.xlf | 2 +- .../FSharp.Editor/xlf/FSharp.Editor.ja.xlf | 4 +- .../FSharp.Editor/xlf/FSharp.Editor.ko.xlf | 2 +- .../FSharp.Editor/xlf/FSharp.Editor.pl.xlf | 4 +- .../FSharp.Editor/xlf/FSharp.Editor.pt-BR.xlf | 4 +- .../FSharp.Editor/xlf/FSharp.Editor.ru.xlf | 4 +- .../FSharp.Editor/xlf/FSharp.Editor.tr.xlf | 4 +- .../xlf/FSharp.Editor.zh-Hans.xlf | 6 +-- .../xlf/FSharp.Editor.zh-Hant.xlf | 4 +- ...isualStudio.Package.LanguageService.cs.xlf | 2 +- ...isualStudio.Package.LanguageService.de.xlf | 4 +- ...isualStudio.Package.LanguageService.es.xlf | 2 +- ...isualStudio.Package.LanguageService.fr.xlf | 2 +- ...isualStudio.Package.LanguageService.it.xlf | 2 +- ...isualStudio.Package.LanguageService.ja.xlf | 2 +- ...isualStudio.Package.LanguageService.ko.xlf | 2 +- ...isualStudio.Package.LanguageService.pl.xlf | 2 +- ...alStudio.Package.LanguageService.pt-BR.xlf | 2 +- ...isualStudio.Package.LanguageService.ru.xlf | 4 +- ...isualStudio.Package.LanguageService.tr.xlf | 2 +- ...Studio.Package.LanguageService.zh-Hans.xlf | 2 +- ...Studio.Package.LanguageService.zh-Hant.xlf | 4 +- .../xlf/FSLangSvcStrings.cs.xlf | 2 +- .../xlf/FSLangSvcStrings.de.xlf | 4 +- .../xlf/FSLangSvcStrings.es.xlf | 2 +- .../xlf/FSLangSvcStrings.fr.xlf | 2 +- .../xlf/FSLangSvcStrings.it.xlf | 2 +- .../xlf/FSLangSvcStrings.ko.xlf | 2 +- .../xlf/FSLangSvcStrings.pl.xlf | 2 +- .../xlf/FSLangSvcStrings.pt-BR.xlf | 4 +- .../xlf/FSLangSvcStrings.ru.xlf | 4 +- .../xlf/FSLangSvcStrings.tr.xlf | 2 +- .../xlf/FSLangSvcStrings.zh-Hans.xlf | 2 +- .../xlf/FSLangSvcStrings.zh-Hant.xlf | 2 +- .../xlf/VSPackage.cs.xlf | 6 +-- .../xlf/VSPackage.de.xlf | 2 +- .../xlf/VSPackage.es.xlf | 2 +- .../xlf/VSPackage.fr.xlf | 4 +- .../xlf/VSPackage.it.xlf | 6 +-- .../xlf/VSPackage.ko.xlf | 8 ++-- .../xlf/VSPackage.pl.xlf | 6 +-- .../xlf/VSPackage.pt-BR.xlf | 4 +- .../xlf/VSPackage.ru.xlf | 6 +-- .../xlf/VSPackage.tr.xlf | 6 +-- .../xlf/VSPackage.zh-Hans.xlf | 2 +- .../xlf/VSPackage.zh-Hant.xlf | 2 +- ...rosoft.VisualStudio.Package.Project.cs.xlf | 14 +++--- ...rosoft.VisualStudio.Package.Project.de.xlf | 34 +++++++-------- ...rosoft.VisualStudio.Package.Project.es.xlf | 38 ++++++++-------- ...rosoft.VisualStudio.Package.Project.fr.xlf | 16 +++---- ...rosoft.VisualStudio.Package.Project.it.xlf | 22 +++++----- ...rosoft.VisualStudio.Package.Project.ja.xlf | 6 +-- ...rosoft.VisualStudio.Package.Project.ko.xlf | 22 +++++----- ...rosoft.VisualStudio.Package.Project.pl.xlf | 16 +++---- ...oft.VisualStudio.Package.Project.pt-BR.xlf | 26 +++++------ ...rosoft.VisualStudio.Package.Project.ru.xlf | 28 ++++++------ ...rosoft.VisualStudio.Package.Project.tr.xlf | 24 +++++------ ...t.VisualStudio.Package.Project.zh-Hans.xlf | 24 +++++------ ...t.VisualStudio.Package.Project.zh-Hant.xlf | 8 ++-- .../xlf/MenusAndCommands.vsct.cs.xlf | 2 +- .../xlf/MenusAndCommands.vsct.de.xlf | 2 +- .../xlf/MenusAndCommands.vsct.es.xlf | 2 +- .../xlf/MenusAndCommands.vsct.fr.xlf | 2 +- .../xlf/MenusAndCommands.vsct.it.xlf | 2 +- .../xlf/MenusAndCommands.vsct.ja.xlf | 2 +- .../xlf/MenusAndCommands.vsct.ko.xlf | 12 +++--- .../xlf/MenusAndCommands.vsct.pl.xlf | 4 +- .../xlf/MenusAndCommands.vsct.pt-BR.xlf | 2 +- .../xlf/MenusAndCommands.vsct.ru.xlf | 2 +- .../xlf/MenusAndCommands.vsct.tr.xlf | 10 ++--- .../xlf/MenusAndCommands.vsct.zh-Hans.xlf | 8 ++-- .../xlf/MenusAndCommands.vsct.zh-Hant.xlf | 6 +-- .../xlf/VSPackage.cs.xlf | 2 +- .../xlf/VSPackage.de.xlf | 4 +- .../xlf/VSPackage.es.xlf | 10 ++--- .../xlf/VSPackage.fr.xlf | 4 +- .../xlf/VSPackage.it.xlf | 14 +++--- .../xlf/VSPackage.ja.xlf | 10 ++--- .../xlf/VSPackage.ko.xlf | 4 +- .../xlf/VSPackage.pl.xlf | 8 ++-- .../xlf/VSPackage.pt-BR.xlf | 2 +- .../xlf/VSPackage.ru.xlf | 2 +- .../xlf/VSPackage.tr.xlf | 8 ++-- .../xlf/VSPackage.zh-Hans.xlf | 6 +-- .../xlf/VSPackage.zh-Hant.xlf | 8 ++-- .../xlf/ApplicationPropPage.cs.xlf | 4 +- .../xlf/ApplicationPropPage.de.xlf | 4 +- .../xlf/ApplicationPropPage.es.xlf | 2 +- .../xlf/ApplicationPropPage.fr.xlf | 2 +- .../xlf/ApplicationPropPage.it.xlf | 2 +- .../xlf/ApplicationPropPage.ko.xlf | 2 +- .../xlf/ApplicationPropPage.pl.xlf | 2 +- .../xlf/ApplicationPropPage.pt-BR.xlf | 6 +-- .../xlf/ApplicationPropPage.ru.xlf | 4 +- .../xlf/ApplicationPropPage.tr.xlf | 4 +- .../xlf/ApplicationPropPage.zh-Hans.xlf | 6 +-- .../xlf/BuildEventCommandLineDialog.cs.xlf | 2 +- .../xlf/BuildEventCommandLineDialog.de.xlf | 2 +- .../xlf/BuildEventCommandLineDialog.es.xlf | 2 +- .../xlf/BuildEventCommandLineDialog.fr.xlf | 2 +- .../xlf/BuildEventCommandLineDialog.it.xlf | 2 +- .../xlf/BuildEventCommandLineDialog.ja.xlf | 2 +- .../xlf/BuildEventCommandLineDialog.ko.xlf | 2 +- .../xlf/BuildEventCommandLineDialog.pl.xlf | 2 +- .../xlf/BuildEventCommandLineDialog.pt-BR.xlf | 2 +- .../xlf/BuildEventCommandLineDialog.ru.xlf | 2 +- .../xlf/BuildEventCommandLineDialog.tr.xlf | 2 +- .../BuildEventCommandLineDialog.zh-Hans.xlf | 2 +- .../BuildEventCommandLineDialog.zh-Hant.xlf | 2 +- .../xlf/BuildEventsPropPage.cs.xlf | 2 +- .../xlf/BuildEventsPropPage.de.xlf | 6 +-- .../xlf/BuildEventsPropPage.es.xlf | 2 +- .../xlf/BuildEventsPropPage.fr.xlf | 2 +- .../xlf/BuildEventsPropPage.it.xlf | 2 +- .../xlf/BuildEventsPropPage.ja.xlf | 2 +- .../xlf/BuildEventsPropPage.ko.xlf | 4 +- .../xlf/BuildEventsPropPage.pl.xlf | 2 +- .../xlf/BuildEventsPropPage.pt-BR.xlf | 2 +- .../xlf/BuildEventsPropPage.ru.xlf | 2 +- .../xlf/BuildEventsPropPage.tr.xlf | 4 +- .../xlf/BuildEventsPropPage.zh-Hans.xlf | 2 +- .../PropertyPages/xlf/BuildPropPage.cs.xlf | 2 +- .../PropertyPages/xlf/BuildPropPage.de.xlf | 2 +- .../PropertyPages/xlf/BuildPropPage.es.xlf | 4 +- .../PropertyPages/xlf/BuildPropPage.fr.xlf | 12 +++--- .../PropertyPages/xlf/BuildPropPage.it.xlf | 4 +- .../PropertyPages/xlf/BuildPropPage.ja.xlf | 2 +- .../PropertyPages/xlf/BuildPropPage.ko.xlf | 2 +- .../PropertyPages/xlf/BuildPropPage.pl.xlf | 2 +- .../PropertyPages/xlf/BuildPropPage.pt-BR.xlf | 6 +-- .../PropertyPages/xlf/BuildPropPage.ru.xlf | 4 +- .../PropertyPages/xlf/BuildPropPage.tr.xlf | 10 ++--- .../xlf/BuildPropPage.zh-Hans.xlf | 8 ++-- .../xlf/BuildPropPage.zh-Hant.xlf | 2 +- .../PropertyPages/xlf/DebugPropPage.cs.xlf | 2 +- .../PropertyPages/xlf/DebugPropPage.de.xlf | 2 +- .../PropertyPages/xlf/DebugPropPage.es.xlf | 6 +-- .../PropertyPages/xlf/DebugPropPage.fr.xlf | 2 +- .../PropertyPages/xlf/DebugPropPage.it.xlf | 2 +- .../PropertyPages/xlf/DebugPropPage.pl.xlf | 2 +- .../PropertyPages/xlf/DebugPropPage.pt-BR.xlf | 4 +- .../PropertyPages/xlf/DebugPropPage.ru.xlf | 6 +-- .../PropertyPages/xlf/DebugPropPage.tr.xlf | 6 +-- .../xlf/DebugPropPage.zh-Hans.xlf | 2 +- .../xlf/DebugPropPage.zh-Hant.xlf | 4 +- .../xlf/PropPageHostDialog.cs.xlf | 2 +- .../xlf/PropPageHostDialog.de.xlf | 2 +- .../xlf/PropPageHostDialog.es.xlf | 2 +- .../xlf/PropPageHostDialog.fr.xlf | 2 +- .../xlf/PropPageHostDialog.it.xlf | 2 +- .../xlf/PropPageHostDialog.ja.xlf | 2 +- .../xlf/PropPageHostDialog.ko.xlf | 2 +- .../xlf/PropPageHostDialog.pl.xlf | 2 +- .../xlf/PropPageHostDialog.pt-BR.xlf | 2 +- .../xlf/PropPageHostDialog.ru.xlf | 2 +- .../xlf/PropPageHostDialog.tr.xlf | 2 +- .../xlf/PropPageHostDialog.zh-Hans.xlf | 2 +- .../xlf/PropPageHostDialog.zh-Hant.xlf | 2 +- .../xlf/PropPageUserControlBase.cs.xlf | 2 +- .../xlf/PropPageUserControlBase.de.xlf | 2 +- .../xlf/PropPageUserControlBase.es.xlf | 2 +- .../xlf/PropPageUserControlBase.fr.xlf | 2 +- .../xlf/PropPageUserControlBase.it.xlf | 2 +- .../xlf/PropPageUserControlBase.ja.xlf | 2 +- .../xlf/PropPageUserControlBase.ko.xlf | 2 +- .../xlf/PropPageUserControlBase.pl.xlf | 2 +- .../xlf/PropPageUserControlBase.pt-BR.xlf | 2 +- .../xlf/PropPageUserControlBase.ru.xlf | 2 +- .../xlf/PropPageUserControlBase.tr.xlf | 2 +- .../xlf/PropPageUserControlBase.zh-Hans.xlf | 2 +- .../xlf/PropPageUserControlBase.zh-Hant.xlf | 2 +- .../xlf/ReferencePathsPropPage.cs.xlf | 4 +- .../xlf/ReferencePathsPropPage.de.xlf | 4 +- .../xlf/ReferencePathsPropPage.es.xlf | 2 +- .../xlf/ReferencePathsPropPage.fr.xlf | 4 +- .../xlf/ReferencePathsPropPage.it.xlf | 2 +- .../xlf/ReferencePathsPropPage.ja.xlf | 4 +- .../xlf/ReferencePathsPropPage.ko.xlf | 2 +- .../xlf/ReferencePathsPropPage.pl.xlf | 2 +- .../xlf/ReferencePathsPropPage.pt-BR.xlf | 2 +- .../xlf/ReferencePathsPropPage.ru.xlf | 8 ++-- .../xlf/ReferencePathsPropPage.tr.xlf | 2 +- .../xlf/ReferencePathsPropPage.zh-Hans.xlf | 4 +- .../xlf/ReferencePathsPropPage.zh-Hant.xlf | 2 +- ...osoft.VisualStudio.Editors.Designer.cs.xlf | 27 ++++++------ ...osoft.VisualStudio.Editors.Designer.de.xlf | 19 ++++---- ...osoft.VisualStudio.Editors.Designer.es.xlf | 35 ++++++++------- ...osoft.VisualStudio.Editors.Designer.fr.xlf | 41 +++++++++--------- ...osoft.VisualStudio.Editors.Designer.it.xlf | 23 +++++----- ...osoft.VisualStudio.Editors.Designer.ja.xlf | 17 ++++---- ...osoft.VisualStudio.Editors.Designer.ko.xlf | 33 +++++++------- ...osoft.VisualStudio.Editors.Designer.pl.xlf | 27 ++++++------ ...ft.VisualStudio.Editors.Designer.pt-BR.xlf | 37 ++++++++-------- ...osoft.VisualStudio.Editors.Designer.ru.xlf | 43 +++++++++---------- ...osoft.VisualStudio.Editors.Designer.tr.xlf | 35 ++++++++------- ....VisualStudio.Editors.Designer.zh-Hans.xlf | 9 ++-- ....VisualStudio.Editors.Designer.zh-Hant.xlf | 11 +++-- .../Resources/xlf/MyExtensibilityRes.cs.xlf | 2 +- .../Resources/xlf/MyExtensibilityRes.de.xlf | 2 +- .../Resources/xlf/MyExtensibilityRes.es.xlf | 2 +- .../Resources/xlf/MyExtensibilityRes.fr.xlf | 2 +- .../Resources/xlf/MyExtensibilityRes.it.xlf | 2 +- .../Resources/xlf/MyExtensibilityRes.pl.xlf | 2 +- .../xlf/MyExtensibilityRes.pt-BR.xlf | 2 +- .../Resources/xlf/MyExtensibilityRes.ru.xlf | 2 +- .../Resources/xlf/MyExtensibilityRes.tr.xlf | 2 +- .../xlf/MyExtensibilityRes.zh-Hans.xlf | 2 +- .../Resources/xlf/WCF.cs.xlf | 2 +- .../Resources/xlf/WCF.de.xlf | 2 +- .../Resources/xlf/WCF.es.xlf | 2 +- .../Resources/xlf/WCF.fr.xlf | 2 +- .../Resources/xlf/WCF.it.xlf | 2 +- .../Resources/xlf/WCF.ko.xlf | 2 +- .../Resources/xlf/WCF.pl.xlf | 2 +- .../Resources/xlf/WCF.pt-BR.xlf | 2 +- .../Resources/xlf/WCF.ru.xlf | 2 +- .../Resources/xlf/WCF.tr.xlf | 2 +- .../Resources/xlf/WCF.zh-Hant.xlf | 2 +- .../src/FSharp.UIResources/xlf/Strings.cs.xlf | 6 +-- .../src/FSharp.UIResources/xlf/Strings.de.xlf | 2 +- .../src/FSharp.UIResources/xlf/Strings.es.xlf | 4 +- .../src/FSharp.UIResources/xlf/Strings.fr.xlf | 2 +- .../src/FSharp.UIResources/xlf/Strings.it.xlf | 4 +- .../src/FSharp.UIResources/xlf/Strings.ko.xlf | 2 +- .../src/FSharp.UIResources/xlf/Strings.pl.xlf | 2 +- .../FSharp.UIResources/xlf/Strings.pt-BR.xlf | 2 +- .../src/FSharp.UIResources/xlf/Strings.ru.xlf | 2 +- .../src/FSharp.UIResources/xlf/Strings.tr.xlf | 2 +- .../xlf/Strings.zh-Hans.xlf | 2 +- .../xlf/Strings.zh-Hant.xlf | 2 +- .../src/FSharp.VS.FSI/xlf/Properties.cs.xlf | 2 +- .../src/FSharp.VS.FSI/xlf/Properties.de.xlf | 6 +-- .../src/FSharp.VS.FSI/xlf/Properties.es.xlf | 2 +- .../src/FSharp.VS.FSI/xlf/Properties.fr.xlf | 4 +- .../src/FSharp.VS.FSI/xlf/Properties.it.xlf | 2 +- .../src/FSharp.VS.FSI/xlf/Properties.ja.xlf | 10 ++--- .../src/FSharp.VS.FSI/xlf/Properties.ko.xlf | 16 +++---- .../src/FSharp.VS.FSI/xlf/Properties.pl.xlf | 8 ++-- .../FSharp.VS.FSI/xlf/Properties.pt-BR.xlf | 4 +- .../src/FSharp.VS.FSI/xlf/Properties.ru.xlf | 2 +- .../src/FSharp.VS.FSI/xlf/Properties.tr.xlf | 8 ++-- .../FSharp.VS.FSI/xlf/Properties.zh-Hans.xlf | 8 ++-- .../FSharp.VS.FSI/xlf/Properties.zh-Hant.xlf | 6 +-- .../FSharp.VS.FSI/xlf/VFSIstrings.txt.cs.xlf | 2 +- .../FSharp.VS.FSI/xlf/VFSIstrings.txt.de.xlf | 4 +- .../FSharp.VS.FSI/xlf/VFSIstrings.txt.es.xlf | 2 +- .../FSharp.VS.FSI/xlf/VFSIstrings.txt.fr.xlf | 2 +- .../FSharp.VS.FSI/xlf/VFSIstrings.txt.it.xlf | 2 +- .../FSharp.VS.FSI/xlf/VFSIstrings.txt.ja.xlf | 4 +- .../FSharp.VS.FSI/xlf/VFSIstrings.txt.ko.xlf | 6 +-- .../FSharp.VS.FSI/xlf/VFSIstrings.txt.pl.xlf | 4 +- .../xlf/VFSIstrings.txt.pt-BR.xlf | 4 +- .../FSharp.VS.FSI/xlf/VFSIstrings.txt.ru.xlf | 2 +- .../FSharp.VS.FSI/xlf/VFSIstrings.txt.tr.xlf | 6 +-- .../xlf/VFSIstrings.txt.zh-Hans.xlf | 4 +- .../xlf/VFSIstrings.txt.zh-Hant.xlf | 4 +- .../src/FSharp.VS.FSI/xlf/VSPackage.cs.xlf | 2 +- .../src/FSharp.VS.FSI/xlf/VSPackage.de.xlf | 2 +- .../src/FSharp.VS.FSI/xlf/VSPackage.es.xlf | 2 +- .../src/FSharp.VS.FSI/xlf/VSPackage.fr.xlf | 2 +- .../src/FSharp.VS.FSI/xlf/VSPackage.it.xlf | 2 +- .../src/FSharp.VS.FSI/xlf/VSPackage.ja.xlf | 2 +- .../src/FSharp.VS.FSI/xlf/VSPackage.ko.xlf | 2 +- .../src/FSharp.VS.FSI/xlf/VSPackage.pl.xlf | 2 +- .../src/FSharp.VS.FSI/xlf/VSPackage.pt-BR.xlf | 2 +- .../src/FSharp.VS.FSI/xlf/VSPackage.ru.xlf | 2 +- .../src/FSharp.VS.FSI/xlf/VSPackage.tr.xlf | 2 +- .../FSharp.VS.FSI/xlf/VSPackage.zh-Hans.xlf | 2 +- .../FSharp.VS.FSI/xlf/VSPackage.zh-Hant.xlf | 2 +- 332 files changed, 803 insertions(+), 816 deletions(-) diff --git a/vsintegration/ProjectTemplates/ConsoleProject/Template/xlf/AssemblyInfo.fs.cs.xlf b/vsintegration/ProjectTemplates/ConsoleProject/Template/xlf/AssemblyInfo.fs.cs.xlf index a580d9e396b..68ea0772d85 100644 --- a/vsintegration/ProjectTemplates/ConsoleProject/Template/xlf/AssemblyInfo.fs.cs.xlf +++ b/vsintegration/ProjectTemplates/ConsoleProject/Template/xlf/AssemblyInfo.fs.cs.xlf @@ -1,4 +1,4 @@ - + diff --git a/vsintegration/ProjectTemplates/ConsoleProject/Template/xlf/AssemblyInfo.fs.de.xlf b/vsintegration/ProjectTemplates/ConsoleProject/Template/xlf/AssemblyInfo.fs.de.xlf index 87fa85b31c9..6d38e4a5a9e 100644 --- a/vsintegration/ProjectTemplates/ConsoleProject/Template/xlf/AssemblyInfo.fs.de.xlf +++ b/vsintegration/ProjectTemplates/ConsoleProject/Template/xlf/AssemblyInfo.fs.de.xlf @@ -1,4 +1,4 @@ - + diff --git a/vsintegration/ProjectTemplates/ConsoleProject/Template/xlf/AssemblyInfo.fs.es.xlf b/vsintegration/ProjectTemplates/ConsoleProject/Template/xlf/AssemblyInfo.fs.es.xlf index 9beb403796f..159e61b4e79 100644 --- a/vsintegration/ProjectTemplates/ConsoleProject/Template/xlf/AssemblyInfo.fs.es.xlf +++ b/vsintegration/ProjectTemplates/ConsoleProject/Template/xlf/AssemblyInfo.fs.es.xlf @@ -1,4 +1,4 @@ - + diff --git a/vsintegration/ProjectTemplates/ConsoleProject/Template/xlf/AssemblyInfo.fs.fr.xlf b/vsintegration/ProjectTemplates/ConsoleProject/Template/xlf/AssemblyInfo.fs.fr.xlf index a259bd30511..ddea7c610e9 100644 --- a/vsintegration/ProjectTemplates/ConsoleProject/Template/xlf/AssemblyInfo.fs.fr.xlf +++ b/vsintegration/ProjectTemplates/ConsoleProject/Template/xlf/AssemblyInfo.fs.fr.xlf @@ -1,4 +1,4 @@ - + diff --git a/vsintegration/ProjectTemplates/ConsoleProject/Template/xlf/AssemblyInfo.fs.it.xlf b/vsintegration/ProjectTemplates/ConsoleProject/Template/xlf/AssemblyInfo.fs.it.xlf index d5fc6c75583..79e98a0f0b4 100644 --- a/vsintegration/ProjectTemplates/ConsoleProject/Template/xlf/AssemblyInfo.fs.it.xlf +++ b/vsintegration/ProjectTemplates/ConsoleProject/Template/xlf/AssemblyInfo.fs.it.xlf @@ -1,4 +1,4 @@ - + diff --git a/vsintegration/ProjectTemplates/ConsoleProject/Template/xlf/AssemblyInfo.fs.ko.xlf b/vsintegration/ProjectTemplates/ConsoleProject/Template/xlf/AssemblyInfo.fs.ko.xlf index 258b4ebab29..9382bec5e00 100644 --- a/vsintegration/ProjectTemplates/ConsoleProject/Template/xlf/AssemblyInfo.fs.ko.xlf +++ b/vsintegration/ProjectTemplates/ConsoleProject/Template/xlf/AssemblyInfo.fs.ko.xlf @@ -1,4 +1,4 @@ - + diff --git a/vsintegration/ProjectTemplates/ConsoleProject/Template/xlf/AssemblyInfo.fs.pl.xlf b/vsintegration/ProjectTemplates/ConsoleProject/Template/xlf/AssemblyInfo.fs.pl.xlf index ee3471fb557..4ba5555261b 100644 --- a/vsintegration/ProjectTemplates/ConsoleProject/Template/xlf/AssemblyInfo.fs.pl.xlf +++ b/vsintegration/ProjectTemplates/ConsoleProject/Template/xlf/AssemblyInfo.fs.pl.xlf @@ -1,4 +1,4 @@ - + diff --git a/vsintegration/ProjectTemplates/ConsoleProject/Template/xlf/AssemblyInfo.fs.pt-BR.xlf b/vsintegration/ProjectTemplates/ConsoleProject/Template/xlf/AssemblyInfo.fs.pt-BR.xlf index 48d258faa25..ba2e69fde6d 100644 --- a/vsintegration/ProjectTemplates/ConsoleProject/Template/xlf/AssemblyInfo.fs.pt-BR.xlf +++ b/vsintegration/ProjectTemplates/ConsoleProject/Template/xlf/AssemblyInfo.fs.pt-BR.xlf @@ -1,4 +1,4 @@ - + diff --git a/vsintegration/ProjectTemplates/ConsoleProject/Template/xlf/AssemblyInfo.fs.ru.xlf b/vsintegration/ProjectTemplates/ConsoleProject/Template/xlf/AssemblyInfo.fs.ru.xlf index 6ec9384612e..78261dfa3a2 100644 --- a/vsintegration/ProjectTemplates/ConsoleProject/Template/xlf/AssemblyInfo.fs.ru.xlf +++ b/vsintegration/ProjectTemplates/ConsoleProject/Template/xlf/AssemblyInfo.fs.ru.xlf @@ -1,4 +1,4 @@ - + @@ -49,7 +49,7 @@ Minor Version - Дополнительный номер версии + Вспомогательная версия diff --git a/vsintegration/ProjectTemplates/ConsoleProject/Template/xlf/AssemblyInfo.fs.tr.xlf b/vsintegration/ProjectTemplates/ConsoleProject/Template/xlf/AssemblyInfo.fs.tr.xlf index 906ec8f3ef1..896836c9c7e 100644 --- a/vsintegration/ProjectTemplates/ConsoleProject/Template/xlf/AssemblyInfo.fs.tr.xlf +++ b/vsintegration/ProjectTemplates/ConsoleProject/Template/xlf/AssemblyInfo.fs.tr.xlf @@ -1,4 +1,4 @@ - + diff --git a/vsintegration/ProjectTemplates/ConsoleProject/Template/xlf/AssemblyInfo.fs.zh-Hans.xlf b/vsintegration/ProjectTemplates/ConsoleProject/Template/xlf/AssemblyInfo.fs.zh-Hans.xlf index d76c9dbd18c..1c36b83e8aa 100644 --- a/vsintegration/ProjectTemplates/ConsoleProject/Template/xlf/AssemblyInfo.fs.zh-Hans.xlf +++ b/vsintegration/ProjectTemplates/ConsoleProject/Template/xlf/AssemblyInfo.fs.zh-Hans.xlf @@ -1,4 +1,4 @@ - + diff --git a/vsintegration/ProjectTemplates/ConsoleProject/Template/xlf/Program.fs.cs.xlf b/vsintegration/ProjectTemplates/ConsoleProject/Template/xlf/Program.fs.cs.xlf index 54f3d3c0c94..50135acb5d2 100644 --- a/vsintegration/ProjectTemplates/ConsoleProject/Template/xlf/Program.fs.cs.xlf +++ b/vsintegration/ProjectTemplates/ConsoleProject/Template/xlf/Program.fs.cs.xlf @@ -1,4 +1,4 @@ - + diff --git a/vsintegration/ProjectTemplates/ConsoleProject/Template/xlf/Program.fs.de.xlf b/vsintegration/ProjectTemplates/ConsoleProject/Template/xlf/Program.fs.de.xlf index e3b75382003..ec6378c9ed2 100644 --- a/vsintegration/ProjectTemplates/ConsoleProject/Template/xlf/Program.fs.de.xlf +++ b/vsintegration/ProjectTemplates/ConsoleProject/Template/xlf/Program.fs.de.xlf @@ -1,4 +1,4 @@ - + diff --git a/vsintegration/ProjectTemplates/ConsoleProject/Template/xlf/Program.fs.es.xlf b/vsintegration/ProjectTemplates/ConsoleProject/Template/xlf/Program.fs.es.xlf index 30efd4ece6a..4ff250e4b9c 100644 --- a/vsintegration/ProjectTemplates/ConsoleProject/Template/xlf/Program.fs.es.xlf +++ b/vsintegration/ProjectTemplates/ConsoleProject/Template/xlf/Program.fs.es.xlf @@ -1,4 +1,4 @@ - + diff --git a/vsintegration/ProjectTemplates/ConsoleProject/Template/xlf/Program.fs.fr.xlf b/vsintegration/ProjectTemplates/ConsoleProject/Template/xlf/Program.fs.fr.xlf index 315bebbcac2..c8f9baec854 100644 --- a/vsintegration/ProjectTemplates/ConsoleProject/Template/xlf/Program.fs.fr.xlf +++ b/vsintegration/ProjectTemplates/ConsoleProject/Template/xlf/Program.fs.fr.xlf @@ -1,4 +1,4 @@ - + diff --git a/vsintegration/ProjectTemplates/ConsoleProject/Template/xlf/Program.fs.it.xlf b/vsintegration/ProjectTemplates/ConsoleProject/Template/xlf/Program.fs.it.xlf index 3f1c17cb06d..7517936c7b5 100644 --- a/vsintegration/ProjectTemplates/ConsoleProject/Template/xlf/Program.fs.it.xlf +++ b/vsintegration/ProjectTemplates/ConsoleProject/Template/xlf/Program.fs.it.xlf @@ -1,4 +1,4 @@ - + diff --git a/vsintegration/ProjectTemplates/ConsoleProject/Template/xlf/Program.fs.ko.xlf b/vsintegration/ProjectTemplates/ConsoleProject/Template/xlf/Program.fs.ko.xlf index 3d4586af7d2..ad81379fa7f 100644 --- a/vsintegration/ProjectTemplates/ConsoleProject/Template/xlf/Program.fs.ko.xlf +++ b/vsintegration/ProjectTemplates/ConsoleProject/Template/xlf/Program.fs.ko.xlf @@ -1,4 +1,4 @@ - + diff --git a/vsintegration/ProjectTemplates/ConsoleProject/Template/xlf/Program.fs.pl.xlf b/vsintegration/ProjectTemplates/ConsoleProject/Template/xlf/Program.fs.pl.xlf index f8a5de8d777..e4440770c4a 100644 --- a/vsintegration/ProjectTemplates/ConsoleProject/Template/xlf/Program.fs.pl.xlf +++ b/vsintegration/ProjectTemplates/ConsoleProject/Template/xlf/Program.fs.pl.xlf @@ -1,4 +1,4 @@ - + diff --git a/vsintegration/ProjectTemplates/ConsoleProject/Template/xlf/Program.fs.pt-BR.xlf b/vsintegration/ProjectTemplates/ConsoleProject/Template/xlf/Program.fs.pt-BR.xlf index 30c89d53b94..fa58fbb608d 100644 --- a/vsintegration/ProjectTemplates/ConsoleProject/Template/xlf/Program.fs.pt-BR.xlf +++ b/vsintegration/ProjectTemplates/ConsoleProject/Template/xlf/Program.fs.pt-BR.xlf @@ -1,4 +1,4 @@ - + diff --git a/vsintegration/ProjectTemplates/ConsoleProject/Template/xlf/Program.fs.ru.xlf b/vsintegration/ProjectTemplates/ConsoleProject/Template/xlf/Program.fs.ru.xlf index 7d661660156..18d343feba6 100644 --- a/vsintegration/ProjectTemplates/ConsoleProject/Template/xlf/Program.fs.ru.xlf +++ b/vsintegration/ProjectTemplates/ConsoleProject/Template/xlf/Program.fs.ru.xlf @@ -1,4 +1,4 @@ - + diff --git a/vsintegration/ProjectTemplates/ConsoleProject/Template/xlf/Program.fs.tr.xlf b/vsintegration/ProjectTemplates/ConsoleProject/Template/xlf/Program.fs.tr.xlf index caa20c452c4..55b9e483481 100644 --- a/vsintegration/ProjectTemplates/ConsoleProject/Template/xlf/Program.fs.tr.xlf +++ b/vsintegration/ProjectTemplates/ConsoleProject/Template/xlf/Program.fs.tr.xlf @@ -1,4 +1,4 @@ - + diff --git a/vsintegration/ProjectTemplates/ConsoleProject/Template/xlf/Program.fs.zh-Hans.xlf b/vsintegration/ProjectTemplates/ConsoleProject/Template/xlf/Program.fs.zh-Hans.xlf index 83e038a60e0..3bb540ffff6 100644 --- a/vsintegration/ProjectTemplates/ConsoleProject/Template/xlf/Program.fs.zh-Hans.xlf +++ b/vsintegration/ProjectTemplates/ConsoleProject/Template/xlf/Program.fs.zh-Hans.xlf @@ -1,4 +1,4 @@ - + diff --git a/vsintegration/ProjectTemplates/ConsoleProject/Template/xlf/Program.fs.zh-Hant.xlf b/vsintegration/ProjectTemplates/ConsoleProject/Template/xlf/Program.fs.zh-Hant.xlf index 26ef14aae6b..29ef25458fa 100644 --- a/vsintegration/ProjectTemplates/ConsoleProject/Template/xlf/Program.fs.zh-Hant.xlf +++ b/vsintegration/ProjectTemplates/ConsoleProject/Template/xlf/Program.fs.zh-Hant.xlf @@ -1,4 +1,4 @@ - + diff --git a/vsintegration/ProjectTemplates/LibraryProject/Template/xlf/AssemblyInfo.fs.cs.xlf b/vsintegration/ProjectTemplates/LibraryProject/Template/xlf/AssemblyInfo.fs.cs.xlf index a580d9e396b..68ea0772d85 100644 --- a/vsintegration/ProjectTemplates/LibraryProject/Template/xlf/AssemblyInfo.fs.cs.xlf +++ b/vsintegration/ProjectTemplates/LibraryProject/Template/xlf/AssemblyInfo.fs.cs.xlf @@ -1,4 +1,4 @@ - + diff --git a/vsintegration/ProjectTemplates/LibraryProject/Template/xlf/AssemblyInfo.fs.de.xlf b/vsintegration/ProjectTemplates/LibraryProject/Template/xlf/AssemblyInfo.fs.de.xlf index 87fa85b31c9..6d38e4a5a9e 100644 --- a/vsintegration/ProjectTemplates/LibraryProject/Template/xlf/AssemblyInfo.fs.de.xlf +++ b/vsintegration/ProjectTemplates/LibraryProject/Template/xlf/AssemblyInfo.fs.de.xlf @@ -1,4 +1,4 @@ - + diff --git a/vsintegration/ProjectTemplates/LibraryProject/Template/xlf/AssemblyInfo.fs.es.xlf b/vsintegration/ProjectTemplates/LibraryProject/Template/xlf/AssemblyInfo.fs.es.xlf index 9beb403796f..159e61b4e79 100644 --- a/vsintegration/ProjectTemplates/LibraryProject/Template/xlf/AssemblyInfo.fs.es.xlf +++ b/vsintegration/ProjectTemplates/LibraryProject/Template/xlf/AssemblyInfo.fs.es.xlf @@ -1,4 +1,4 @@ - + diff --git a/vsintegration/ProjectTemplates/LibraryProject/Template/xlf/AssemblyInfo.fs.fr.xlf b/vsintegration/ProjectTemplates/LibraryProject/Template/xlf/AssemblyInfo.fs.fr.xlf index a259bd30511..ddea7c610e9 100644 --- a/vsintegration/ProjectTemplates/LibraryProject/Template/xlf/AssemblyInfo.fs.fr.xlf +++ b/vsintegration/ProjectTemplates/LibraryProject/Template/xlf/AssemblyInfo.fs.fr.xlf @@ -1,4 +1,4 @@ - + diff --git a/vsintegration/ProjectTemplates/LibraryProject/Template/xlf/AssemblyInfo.fs.it.xlf b/vsintegration/ProjectTemplates/LibraryProject/Template/xlf/AssemblyInfo.fs.it.xlf index d5fc6c75583..79e98a0f0b4 100644 --- a/vsintegration/ProjectTemplates/LibraryProject/Template/xlf/AssemblyInfo.fs.it.xlf +++ b/vsintegration/ProjectTemplates/LibraryProject/Template/xlf/AssemblyInfo.fs.it.xlf @@ -1,4 +1,4 @@ - + diff --git a/vsintegration/ProjectTemplates/LibraryProject/Template/xlf/AssemblyInfo.fs.ko.xlf b/vsintegration/ProjectTemplates/LibraryProject/Template/xlf/AssemblyInfo.fs.ko.xlf index 258b4ebab29..9382bec5e00 100644 --- a/vsintegration/ProjectTemplates/LibraryProject/Template/xlf/AssemblyInfo.fs.ko.xlf +++ b/vsintegration/ProjectTemplates/LibraryProject/Template/xlf/AssemblyInfo.fs.ko.xlf @@ -1,4 +1,4 @@ - + diff --git a/vsintegration/ProjectTemplates/LibraryProject/Template/xlf/AssemblyInfo.fs.pl.xlf b/vsintegration/ProjectTemplates/LibraryProject/Template/xlf/AssemblyInfo.fs.pl.xlf index ee3471fb557..4ba5555261b 100644 --- a/vsintegration/ProjectTemplates/LibraryProject/Template/xlf/AssemblyInfo.fs.pl.xlf +++ b/vsintegration/ProjectTemplates/LibraryProject/Template/xlf/AssemblyInfo.fs.pl.xlf @@ -1,4 +1,4 @@ - + diff --git a/vsintegration/ProjectTemplates/LibraryProject/Template/xlf/AssemblyInfo.fs.pt-BR.xlf b/vsintegration/ProjectTemplates/LibraryProject/Template/xlf/AssemblyInfo.fs.pt-BR.xlf index 48d258faa25..ba2e69fde6d 100644 --- a/vsintegration/ProjectTemplates/LibraryProject/Template/xlf/AssemblyInfo.fs.pt-BR.xlf +++ b/vsintegration/ProjectTemplates/LibraryProject/Template/xlf/AssemblyInfo.fs.pt-BR.xlf @@ -1,4 +1,4 @@ - + diff --git a/vsintegration/ProjectTemplates/LibraryProject/Template/xlf/AssemblyInfo.fs.ru.xlf b/vsintegration/ProjectTemplates/LibraryProject/Template/xlf/AssemblyInfo.fs.ru.xlf index 6ec9384612e..78261dfa3a2 100644 --- a/vsintegration/ProjectTemplates/LibraryProject/Template/xlf/AssemblyInfo.fs.ru.xlf +++ b/vsintegration/ProjectTemplates/LibraryProject/Template/xlf/AssemblyInfo.fs.ru.xlf @@ -1,4 +1,4 @@ - + @@ -49,7 +49,7 @@ Minor Version - Дополнительный номер версии + Вспомогательная версия diff --git a/vsintegration/ProjectTemplates/LibraryProject/Template/xlf/AssemblyInfo.fs.tr.xlf b/vsintegration/ProjectTemplates/LibraryProject/Template/xlf/AssemblyInfo.fs.tr.xlf index 906ec8f3ef1..896836c9c7e 100644 --- a/vsintegration/ProjectTemplates/LibraryProject/Template/xlf/AssemblyInfo.fs.tr.xlf +++ b/vsintegration/ProjectTemplates/LibraryProject/Template/xlf/AssemblyInfo.fs.tr.xlf @@ -1,4 +1,4 @@ - + diff --git a/vsintegration/ProjectTemplates/LibraryProject/Template/xlf/AssemblyInfo.fs.zh-Hans.xlf b/vsintegration/ProjectTemplates/LibraryProject/Template/xlf/AssemblyInfo.fs.zh-Hans.xlf index d76c9dbd18c..1c36b83e8aa 100644 --- a/vsintegration/ProjectTemplates/LibraryProject/Template/xlf/AssemblyInfo.fs.zh-Hans.xlf +++ b/vsintegration/ProjectTemplates/LibraryProject/Template/xlf/AssemblyInfo.fs.zh-Hans.xlf @@ -1,4 +1,4 @@ - + diff --git a/vsintegration/ProjectTemplates/LibraryProject/Template/xlf/Script.fsx.cs.xlf b/vsintegration/ProjectTemplates/LibraryProject/Template/xlf/Script.fsx.cs.xlf index 985099ec87c..7894dfcbdab 100644 --- a/vsintegration/ProjectTemplates/LibraryProject/Template/xlf/Script.fsx.cs.xlf +++ b/vsintegration/ProjectTemplates/LibraryProject/Template/xlf/Script.fsx.cs.xlf @@ -1,4 +1,4 @@ - + diff --git a/vsintegration/ProjectTemplates/LibraryProject/Template/xlf/Script.fsx.de.xlf b/vsintegration/ProjectTemplates/LibraryProject/Template/xlf/Script.fsx.de.xlf index 0e507996fb1..ea2c666e1d6 100644 --- a/vsintegration/ProjectTemplates/LibraryProject/Template/xlf/Script.fsx.de.xlf +++ b/vsintegration/ProjectTemplates/LibraryProject/Template/xlf/Script.fsx.de.xlf @@ -1,4 +1,4 @@ - + diff --git a/vsintegration/ProjectTemplates/LibraryProject/Template/xlf/Script.fsx.es.xlf b/vsintegration/ProjectTemplates/LibraryProject/Template/xlf/Script.fsx.es.xlf index 64e2f3bd158..a341541098d 100644 --- a/vsintegration/ProjectTemplates/LibraryProject/Template/xlf/Script.fsx.es.xlf +++ b/vsintegration/ProjectTemplates/LibraryProject/Template/xlf/Script.fsx.es.xlf @@ -1,4 +1,4 @@ - + diff --git a/vsintegration/ProjectTemplates/LibraryProject/Template/xlf/Script.fsx.fr.xlf b/vsintegration/ProjectTemplates/LibraryProject/Template/xlf/Script.fsx.fr.xlf index 59fc3c21d0a..6397f046408 100644 --- a/vsintegration/ProjectTemplates/LibraryProject/Template/xlf/Script.fsx.fr.xlf +++ b/vsintegration/ProjectTemplates/LibraryProject/Template/xlf/Script.fsx.fr.xlf @@ -1,4 +1,4 @@ - + diff --git a/vsintegration/ProjectTemplates/LibraryProject/Template/xlf/Script.fsx.it.xlf b/vsintegration/ProjectTemplates/LibraryProject/Template/xlf/Script.fsx.it.xlf index 32a62ec6536..d8c92ea17e0 100644 --- a/vsintegration/ProjectTemplates/LibraryProject/Template/xlf/Script.fsx.it.xlf +++ b/vsintegration/ProjectTemplates/LibraryProject/Template/xlf/Script.fsx.it.xlf @@ -1,4 +1,4 @@ - + diff --git a/vsintegration/ProjectTemplates/LibraryProject/Template/xlf/Script.fsx.ko.xlf b/vsintegration/ProjectTemplates/LibraryProject/Template/xlf/Script.fsx.ko.xlf index b8477614c17..d1dcac5cd83 100644 --- a/vsintegration/ProjectTemplates/LibraryProject/Template/xlf/Script.fsx.ko.xlf +++ b/vsintegration/ProjectTemplates/LibraryProject/Template/xlf/Script.fsx.ko.xlf @@ -1,4 +1,4 @@ - + diff --git a/vsintegration/ProjectTemplates/LibraryProject/Template/xlf/Script.fsx.pl.xlf b/vsintegration/ProjectTemplates/LibraryProject/Template/xlf/Script.fsx.pl.xlf index 26abdffefef..993d2765315 100644 --- a/vsintegration/ProjectTemplates/LibraryProject/Template/xlf/Script.fsx.pl.xlf +++ b/vsintegration/ProjectTemplates/LibraryProject/Template/xlf/Script.fsx.pl.xlf @@ -1,4 +1,4 @@ - + diff --git a/vsintegration/ProjectTemplates/LibraryProject/Template/xlf/Script.fsx.pt-BR.xlf b/vsintegration/ProjectTemplates/LibraryProject/Template/xlf/Script.fsx.pt-BR.xlf index d1e9d07a6ee..e7d07e9d09a 100644 --- a/vsintegration/ProjectTemplates/LibraryProject/Template/xlf/Script.fsx.pt-BR.xlf +++ b/vsintegration/ProjectTemplates/LibraryProject/Template/xlf/Script.fsx.pt-BR.xlf @@ -1,4 +1,4 @@ - + diff --git a/vsintegration/ProjectTemplates/LibraryProject/Template/xlf/Script.fsx.ru.xlf b/vsintegration/ProjectTemplates/LibraryProject/Template/xlf/Script.fsx.ru.xlf index b8dd108a583..a3df917ca5f 100644 --- a/vsintegration/ProjectTemplates/LibraryProject/Template/xlf/Script.fsx.ru.xlf +++ b/vsintegration/ProjectTemplates/LibraryProject/Template/xlf/Script.fsx.ru.xlf @@ -1,4 +1,4 @@ - + diff --git a/vsintegration/ProjectTemplates/LibraryProject/Template/xlf/Script.fsx.tr.xlf b/vsintegration/ProjectTemplates/LibraryProject/Template/xlf/Script.fsx.tr.xlf index 2b4bb37062f..85a2f18ea61 100644 --- a/vsintegration/ProjectTemplates/LibraryProject/Template/xlf/Script.fsx.tr.xlf +++ b/vsintegration/ProjectTemplates/LibraryProject/Template/xlf/Script.fsx.tr.xlf @@ -1,4 +1,4 @@ - + diff --git a/vsintegration/ProjectTemplates/LibraryProject/Template/xlf/Script.fsx.zh-Hans.xlf b/vsintegration/ProjectTemplates/LibraryProject/Template/xlf/Script.fsx.zh-Hans.xlf index 332774539b1..d3641659034 100644 --- a/vsintegration/ProjectTemplates/LibraryProject/Template/xlf/Script.fsx.zh-Hans.xlf +++ b/vsintegration/ProjectTemplates/LibraryProject/Template/xlf/Script.fsx.zh-Hans.xlf @@ -1,4 +1,4 @@ - + diff --git a/vsintegration/ProjectTemplates/LibraryProject/Template/xlf/Script.fsx.zh-Hant.xlf b/vsintegration/ProjectTemplates/LibraryProject/Template/xlf/Script.fsx.zh-Hant.xlf index 9106b3e72cd..1d2d23cfe91 100644 --- a/vsintegration/ProjectTemplates/LibraryProject/Template/xlf/Script.fsx.zh-Hant.xlf +++ b/vsintegration/ProjectTemplates/LibraryProject/Template/xlf/Script.fsx.zh-Hant.xlf @@ -1,4 +1,4 @@ - + diff --git a/vsintegration/ProjectTemplates/TutorialProject/Template/xlf/Tutorial.fsx.cs.xlf b/vsintegration/ProjectTemplates/TutorialProject/Template/xlf/Tutorial.fsx.cs.xlf index e7f408b7ac6..9658c4b6005 100644 --- a/vsintegration/ProjectTemplates/TutorialProject/Template/xlf/Tutorial.fsx.cs.xlf +++ b/vsintegration/ProjectTemplates/TutorialProject/Template/xlf/Tutorial.fsx.cs.xlf @@ -1,4 +1,4 @@ - + diff --git a/vsintegration/ProjectTemplates/TutorialProject/Template/xlf/Tutorial.fsx.de.xlf b/vsintegration/ProjectTemplates/TutorialProject/Template/xlf/Tutorial.fsx.de.xlf index eda7363478f..e47d46ac9e7 100644 --- a/vsintegration/ProjectTemplates/TutorialProject/Template/xlf/Tutorial.fsx.de.xlf +++ b/vsintegration/ProjectTemplates/TutorialProject/Template/xlf/Tutorial.fsx.de.xlf @@ -1,4 +1,4 @@ - + @@ -14,7 +14,7 @@ and select "Execute in Interactive". You can open the F# Interactive Window from the "View" menu. - und wählen Sie "Interaktiv ausführen" aus. Sie können das F# Interactive-Fenster über das Menü "Ansicht" öffnen. + und wählen Sie "In Interactive ausführen" aus. Sie können das F# Interactive-Fenster über das Menü "Ansicht" öffnen. @@ -284,7 +284,7 @@ and - und + Und @@ -1479,7 +1479,7 @@ To learn more, see: https://docs.microsoft.com/en-us/dotnet/articles/fsharp/language-reference/generics/ - Weitere Informationen finden Sie unter:: https://docs.microsoft.com/de-de/dotnet/articles/fsharp/language-reference/generics/ + Weitere Informationen finden Sie unter: https://docs.microsoft.com/de-de/dotnet/articles/fsharp/language-reference/generics/ diff --git a/vsintegration/ProjectTemplates/TutorialProject/Template/xlf/Tutorial.fsx.es.xlf b/vsintegration/ProjectTemplates/TutorialProject/Template/xlf/Tutorial.fsx.es.xlf index d57b4b8df17..30b02b2a50d 100644 --- a/vsintegration/ProjectTemplates/TutorialProject/Template/xlf/Tutorial.fsx.es.xlf +++ b/vsintegration/ProjectTemplates/TutorialProject/Template/xlf/Tutorial.fsx.es.xlf @@ -1,4 +1,4 @@ - + @@ -9,12 +9,12 @@ To execute the code in F# Interactive, highlight a section of code and press Alt-Enter or right-click - Para ejecutar el código en F# interactivo, resalte una sección de código y presione Alt-Entrar, o haga clic con el botón secundario + Para ejecutar el código en F# interactivo, resalte una sección de código y presione Alt+Entrar, o bien haga clic con el botón secundario and select "Execute in Interactive". You can open the F# Interactive Window from the "View" menu. - y seleccione "Ejecutar en modo interactivo". Puede abrir la ventana de F# interactivo desde el menú "Ver". + y seleccione "Ejecutar en modo interactivo". Puede abrir la ventana de F# interactivo desde el menú "Ver". @@ -284,7 +284,7 @@ and - y + Y diff --git a/vsintegration/ProjectTemplates/TutorialProject/Template/xlf/Tutorial.fsx.fr.xlf b/vsintegration/ProjectTemplates/TutorialProject/Template/xlf/Tutorial.fsx.fr.xlf index 8521a7d3e63..397d2af096c 100644 --- a/vsintegration/ProjectTemplates/TutorialProject/Template/xlf/Tutorial.fsx.fr.xlf +++ b/vsintegration/ProjectTemplates/TutorialProject/Template/xlf/Tutorial.fsx.fr.xlf @@ -1,4 +1,4 @@ - + @@ -159,7 +159,7 @@ Values in F# are immutable by default. They cannot be changed - Les valeurs dans F# sont immuables par défaut. Elles ne peuvent pas être changées + Les valeurs en F# sont immuables par défaut. Elles ne peuvent pas être changées @@ -284,7 +284,7 @@ and - et + Et diff --git a/vsintegration/ProjectTemplates/TutorialProject/Template/xlf/Tutorial.fsx.it.xlf b/vsintegration/ProjectTemplates/TutorialProject/Template/xlf/Tutorial.fsx.it.xlf index cd81ada44f9..904d0d8007c 100644 --- a/vsintegration/ProjectTemplates/TutorialProject/Template/xlf/Tutorial.fsx.it.xlf +++ b/vsintegration/ProjectTemplates/TutorialProject/Template/xlf/Tutorial.fsx.it.xlf @@ -1,4 +1,4 @@ - + @@ -699,7 +699,7 @@ they are generally faster and support fast random access. This comes at the cost of being less safe by being mutable. - sono in genere più veloci e supportano l'accesso casuale rapido. La maggiore velocità implica però una minore sicurezza in quanto questi elementi sono modificabili. + sono in genere più veloci e supportano l'accesso casuale rapido. La maggiore velocità implica però una minore sicurezza perché questi elementi sono modificabili. diff --git a/vsintegration/ProjectTemplates/TutorialProject/Template/xlf/Tutorial.fsx.ja.xlf b/vsintegration/ProjectTemplates/TutorialProject/Template/xlf/Tutorial.fsx.ja.xlf index 6e1fe4af58b..77ea6bc45a8 100644 --- a/vsintegration/ProjectTemplates/TutorialProject/Template/xlf/Tutorial.fsx.ja.xlf +++ b/vsintegration/ProjectTemplates/TutorialProject/Template/xlf/Tutorial.fsx.ja.xlf @@ -1,4 +1,4 @@ - + @@ -9,12 +9,12 @@ To execute the code in F# Interactive, highlight a section of code and press Alt-Enter or right-click - F# Interactive でコードを実行するには、コードの一部を強調表示して、Alt キーを押しながら Enter キーを押すか、右マウス ボタンをクリックし + F# インタラクティブでコードを実行するには、コードの一部を強調表示して、Alt キーを押しながら Enter キーを押すか、右マウス ボタンをクリックし and select "Execute in Interactive". You can open the F# Interactive Window from the "View" menu. - [対話形式で実行]5D; を選択します。[表示]5D; メニューから F# Interactive ウィンドウを開くことができます。 + [対話形式で実行]5D; を選択します。[表示]5D; メニューから F# インタラクティブ ウィンドウを開くことができます。 @@ -284,7 +284,7 @@ and - 」および「 + AND @@ -949,7 +949,7 @@ This example shows how to write a function that processes a record value. - この例では、レコード値を処理する関数を記述する方法を示します。 + この例では、レコード値を処理する関数を書き込む方法を示します。 @@ -994,7 +994,7 @@ Data stored in DUs can be one of several distinct values. - DU に格納されるデータは、複数の個別の値のいずれかになります。 + DU の格納データは、複数の個別の値のいずれかになります。 diff --git a/vsintegration/ProjectTemplates/TutorialProject/Template/xlf/Tutorial.fsx.ko.xlf b/vsintegration/ProjectTemplates/TutorialProject/Template/xlf/Tutorial.fsx.ko.xlf index 98adbab0874..6537a73fefe 100644 --- a/vsintegration/ProjectTemplates/TutorialProject/Template/xlf/Tutorial.fsx.ko.xlf +++ b/vsintegration/ProjectTemplates/TutorialProject/Template/xlf/Tutorial.fsx.ko.xlf @@ -1,4 +1,4 @@ - + @@ -9,17 +9,17 @@ To execute the code in F# Interactive, highlight a section of code and press Alt-Enter or right-click - F# Interactive에서 코드를 실행하려면 코드 섹션을 강조 표시하고 Alt-Enter를 누르거나 마우스 오른쪽 단추를 클릭한 다음 + F# 대화형에서 코드를 실행하려면 코드 섹션을 강조 표시하고 <Alt+Enter>를 누르거나 마우스 오른쪽 단추를 클릭한 다음 and select "Execute in Interactive". You can open the F# Interactive Window from the "View" menu. - "대화형으로 실행"을 선택하세요. "보기" 메뉴에서 F# Interactive 창을 열 수 있습니다. + "대화형으로 실행"을 선택하세요. "보기" 메뉴에서 F# 대화형 창을 열 수 있습니다. For more about F#, see: - F#에 대한 자세한 내용은 다음을 참조하십시오: + F#에 대한 자세한 내용은 다음을 참조하세요. @@ -284,7 +284,7 @@ and - + 그리고 diff --git a/vsintegration/ProjectTemplates/TutorialProject/Template/xlf/Tutorial.fsx.pl.xlf b/vsintegration/ProjectTemplates/TutorialProject/Template/xlf/Tutorial.fsx.pl.xlf index bbc054b3b30..de11e7fa2b5 100644 --- a/vsintegration/ProjectTemplates/TutorialProject/Template/xlf/Tutorial.fsx.pl.xlf +++ b/vsintegration/ProjectTemplates/TutorialProject/Template/xlf/Tutorial.fsx.pl.xlf @@ -1,4 +1,4 @@ - + @@ -14,7 +14,7 @@ and select "Execute in Interactive". You can open the F# Interactive Window from the "View" menu. - a następnie wybierz opcję „Wykonaj w programie Interactive”. Okno programu F# Interactive można otworzyć z menu „Widok”. + a następnie wybierz opcję „Wykonaj w trybie interaktywnym”. Okno narzędzia F# Interactive można otworzyć z menu „Widok”. diff --git a/vsintegration/ProjectTemplates/TutorialProject/Template/xlf/Tutorial.fsx.pt-BR.xlf b/vsintegration/ProjectTemplates/TutorialProject/Template/xlf/Tutorial.fsx.pt-BR.xlf index a917ce2ce47..96dfb6b780b 100644 --- a/vsintegration/ProjectTemplates/TutorialProject/Template/xlf/Tutorial.fsx.pt-BR.xlf +++ b/vsintegration/ProjectTemplates/TutorialProject/Template/xlf/Tutorial.fsx.pt-BR.xlf @@ -1,4 +1,4 @@ - + @@ -284,7 +284,7 @@ and - e + E diff --git a/vsintegration/ProjectTemplates/TutorialProject/Template/xlf/Tutorial.fsx.ru.xlf b/vsintegration/ProjectTemplates/TutorialProject/Template/xlf/Tutorial.fsx.ru.xlf index 81bf3a4523f..39e5f369436 100644 --- a/vsintegration/ProjectTemplates/TutorialProject/Template/xlf/Tutorial.fsx.ru.xlf +++ b/vsintegration/ProjectTemplates/TutorialProject/Template/xlf/Tutorial.fsx.ru.xlf @@ -1,4 +1,4 @@ - + @@ -9,7 +9,7 @@ To execute the code in F# Interactive, highlight a section of code and press Alt-Enter or right-click - Чтобы выполнить код в интерактивном режиме F#, выделите фрагмент кода и нажмите ALT+ВВОД или щелкните правой кнопкой мыши + Чтобы выполнить код в F# Interactive, выделите фрагмент кода и нажмите ALT+ВВОД или щелкните правой кнопкой мыши @@ -284,7 +284,7 @@ and - и + И diff --git a/vsintegration/ProjectTemplates/TutorialProject/Template/xlf/Tutorial.fsx.tr.xlf b/vsintegration/ProjectTemplates/TutorialProject/Template/xlf/Tutorial.fsx.tr.xlf index ee608d25f20..119bf03b7c0 100644 --- a/vsintegration/ProjectTemplates/TutorialProject/Template/xlf/Tutorial.fsx.tr.xlf +++ b/vsintegration/ProjectTemplates/TutorialProject/Template/xlf/Tutorial.fsx.tr.xlf @@ -1,4 +1,4 @@ - + diff --git a/vsintegration/ProjectTemplates/TutorialProject/Template/xlf/Tutorial.fsx.zh-Hans.xlf b/vsintegration/ProjectTemplates/TutorialProject/Template/xlf/Tutorial.fsx.zh-Hans.xlf index 99965aaf194..c87d96c67bc 100644 --- a/vsintegration/ProjectTemplates/TutorialProject/Template/xlf/Tutorial.fsx.zh-Hans.xlf +++ b/vsintegration/ProjectTemplates/TutorialProject/Template/xlf/Tutorial.fsx.zh-Hans.xlf @@ -1,4 +1,4 @@ - + @@ -9,7 +9,7 @@ To execute the code in F# Interactive, highlight a section of code and press Alt-Enter or right-click - 若要在 F# 交互中执行代码,请突出显示一个代码节并按 Alt-Enter 或右击 + 若要在 F# 交互窗口中执行代码,请突出显示一个代码节并按 Alt-Enter 或右击 diff --git a/vsintegration/ProjectTemplates/TutorialProject/Template/xlf/Tutorial.fsx.zh-Hant.xlf b/vsintegration/ProjectTemplates/TutorialProject/Template/xlf/Tutorial.fsx.zh-Hant.xlf index b9a80b8d0dc..014ecb876d4 100644 --- a/vsintegration/ProjectTemplates/TutorialProject/Template/xlf/Tutorial.fsx.zh-Hant.xlf +++ b/vsintegration/ProjectTemplates/TutorialProject/Template/xlf/Tutorial.fsx.zh-Hant.xlf @@ -1,4 +1,4 @@ - + @@ -9,7 +9,7 @@ To execute the code in F# Interactive, highlight a section of code and press Alt-Enter or right-click - 若要執行 F# Interactive 中的程式碼,請反白顯示某個程式碼區段並按下 Alt-Enter,或者以滑鼠右鍵按一下 + 若要執行 F# 互動中的程式碼,請反白顯示某個程式碼區段並按下 Alt-Enter,或者以滑鼠右鍵按一下 @@ -284,7 +284,7 @@ and - + diff --git a/vsintegration/src/FSharp.Editor/xlf/FSharp.Editor.cs.xlf b/vsintegration/src/FSharp.Editor/xlf/FSharp.Editor.cs.xlf index 73d205eca82..9ccd659d163 100644 --- a/vsintegration/src/FSharp.Editor/xlf/FSharp.Editor.cs.xlf +++ b/vsintegration/src/FSharp.Editor/xlf/FSharp.Editor.cs.xlf @@ -1,4 +1,4 @@ - + @@ -34,7 +34,7 @@ Name can be simplified. - Název nelze zjednodušit. + Název se dá zjednodušit. diff --git a/vsintegration/src/FSharp.Editor/xlf/FSharp.Editor.de.xlf b/vsintegration/src/FSharp.Editor/xlf/FSharp.Editor.de.xlf index b728e57410b..0fe6cd7725b 100644 --- a/vsintegration/src/FSharp.Editor/xlf/FSharp.Editor.de.xlf +++ b/vsintegration/src/FSharp.Editor/xlf/FSharp.Editor.de.xlf @@ -1,4 +1,4 @@ - + diff --git a/vsintegration/src/FSharp.Editor/xlf/FSharp.Editor.es.xlf b/vsintegration/src/FSharp.Editor/xlf/FSharp.Editor.es.xlf index 26758d30cf8..3123e2a965a 100644 --- a/vsintegration/src/FSharp.Editor/xlf/FSharp.Editor.es.xlf +++ b/vsintegration/src/FSharp.Editor/xlf/FSharp.Editor.es.xlf @@ -1,4 +1,4 @@ - + @@ -149,7 +149,7 @@ Advanced - Avanzadas + Opciones avanzadas diff --git a/vsintegration/src/FSharp.Editor/xlf/FSharp.Editor.fr.xlf b/vsintegration/src/FSharp.Editor/xlf/FSharp.Editor.fr.xlf index eadd06f5dbd..8053a073fa0 100644 --- a/vsintegration/src/FSharp.Editor/xlf/FSharp.Editor.fr.xlf +++ b/vsintegration/src/FSharp.Editor/xlf/FSharp.Editor.fr.xlf @@ -1,4 +1,4 @@ - + diff --git a/vsintegration/src/FSharp.Editor/xlf/FSharp.Editor.it.xlf b/vsintegration/src/FSharp.Editor/xlf/FSharp.Editor.it.xlf index d288d6839fc..8024aa8891c 100644 --- a/vsintegration/src/FSharp.Editor/xlf/FSharp.Editor.it.xlf +++ b/vsintegration/src/FSharp.Editor/xlf/FSharp.Editor.it.xlf @@ -1,4 +1,4 @@ - + diff --git a/vsintegration/src/FSharp.Editor/xlf/FSharp.Editor.ja.xlf b/vsintegration/src/FSharp.Editor/xlf/FSharp.Editor.ja.xlf index 8b05b335d8f..125e03ea8c4 100644 --- a/vsintegration/src/FSharp.Editor/xlf/FSharp.Editor.ja.xlf +++ b/vsintegration/src/FSharp.Editor/xlf/FSharp.Editor.ja.xlf @@ -9,7 +9,7 @@ Implement interface - インターフェイスを実装する + インターフェイスを実装します。 @@ -34,7 +34,7 @@ Name can be simplified. - 名前を単純化できます。 + 名前を簡略化できます。 diff --git a/vsintegration/src/FSharp.Editor/xlf/FSharp.Editor.ko.xlf b/vsintegration/src/FSharp.Editor/xlf/FSharp.Editor.ko.xlf index b017a3562e1..293c9a8e273 100644 --- a/vsintegration/src/FSharp.Editor/xlf/FSharp.Editor.ko.xlf +++ b/vsintegration/src/FSharp.Editor/xlf/FSharp.Editor.ko.xlf @@ -1,4 +1,4 @@ - + diff --git a/vsintegration/src/FSharp.Editor/xlf/FSharp.Editor.pl.xlf b/vsintegration/src/FSharp.Editor/xlf/FSharp.Editor.pl.xlf index e0898181ecb..9a747f099a4 100644 --- a/vsintegration/src/FSharp.Editor/xlf/FSharp.Editor.pl.xlf +++ b/vsintegration/src/FSharp.Editor/xlf/FSharp.Editor.pl.xlf @@ -1,4 +1,4 @@ - + @@ -34,7 +34,7 @@ Name can be simplified. - Nazwę można uprościć. + Nazwa może zostać uproszczona. diff --git a/vsintegration/src/FSharp.Editor/xlf/FSharp.Editor.pt-BR.xlf b/vsintegration/src/FSharp.Editor/xlf/FSharp.Editor.pt-BR.xlf index 03c3c7bf667..23428c6df54 100644 --- a/vsintegration/src/FSharp.Editor/xlf/FSharp.Editor.pt-BR.xlf +++ b/vsintegration/src/FSharp.Editor/xlf/FSharp.Editor.pt-BR.xlf @@ -1,4 +1,4 @@ - + @@ -34,7 +34,7 @@ Name can be simplified. - O nome pode ser simplificado. + Nome pode ser simplificado. diff --git a/vsintegration/src/FSharp.Editor/xlf/FSharp.Editor.ru.xlf b/vsintegration/src/FSharp.Editor/xlf/FSharp.Editor.ru.xlf index 16a1bba37ae..8a716e2fc06 100644 --- a/vsintegration/src/FSharp.Editor/xlf/FSharp.Editor.ru.xlf +++ b/vsintegration/src/FSharp.Editor/xlf/FSharp.Editor.ru.xlf @@ -34,7 +34,7 @@ Name can be simplified. - Имя можно упростить. + Имя может быть упрощено. @@ -149,7 +149,7 @@ Advanced - Дополнительно + Дополнительный diff --git a/vsintegration/src/FSharp.Editor/xlf/FSharp.Editor.tr.xlf b/vsintegration/src/FSharp.Editor/xlf/FSharp.Editor.tr.xlf index dd4dd7d6c03..07e6e3eda98 100644 --- a/vsintegration/src/FSharp.Editor/xlf/FSharp.Editor.tr.xlf +++ b/vsintegration/src/FSharp.Editor/xlf/FSharp.Editor.tr.xlf @@ -1,4 +1,4 @@ - + @@ -9,7 +9,7 @@ Implement interface - Arabirim uygulama + Arabirimi uygula diff --git a/vsintegration/src/FSharp.Editor/xlf/FSharp.Editor.zh-Hans.xlf b/vsintegration/src/FSharp.Editor/xlf/FSharp.Editor.zh-Hans.xlf index 1c301f002c1..bb079481de3 100644 --- a/vsintegration/src/FSharp.Editor/xlf/FSharp.Editor.zh-Hans.xlf +++ b/vsintegration/src/FSharp.Editor/xlf/FSharp.Editor.zh-Hans.xlf @@ -34,7 +34,7 @@ Name can be simplified. - 可简化名称。 + 可以简化名称。 @@ -74,7 +74,7 @@ IntelliSense - Intellisense + IntelliSense @@ -134,7 +134,7 @@ Exceptions: - 异常: + 异常: diff --git a/vsintegration/src/FSharp.Editor/xlf/FSharp.Editor.zh-Hant.xlf b/vsintegration/src/FSharp.Editor/xlf/FSharp.Editor.zh-Hant.xlf index bcbd222af0d..33e014eed25 100644 --- a/vsintegration/src/FSharp.Editor/xlf/FSharp.Editor.zh-Hant.xlf +++ b/vsintegration/src/FSharp.Editor/xlf/FSharp.Editor.zh-Hant.xlf @@ -1,4 +1,4 @@ - + @@ -134,7 +134,7 @@ Exceptions: - 例外狀況: + 例外狀況: diff --git a/vsintegration/src/FSharp.LanguageService.Base/xlf/Microsoft.VisualStudio.Package.LanguageService.cs.xlf b/vsintegration/src/FSharp.LanguageService.Base/xlf/Microsoft.VisualStudio.Package.LanguageService.cs.xlf index 5fa17a956f2..01935ee0ac0 100644 --- a/vsintegration/src/FSharp.LanguageService.Base/xlf/Microsoft.VisualStudio.Package.LanguageService.cs.xlf +++ b/vsintegration/src/FSharp.LanguageService.Base/xlf/Microsoft.VisualStudio.Package.LanguageService.cs.xlf @@ -1,4 +1,4 @@ - + diff --git a/vsintegration/src/FSharp.LanguageService.Base/xlf/Microsoft.VisualStudio.Package.LanguageService.de.xlf b/vsintegration/src/FSharp.LanguageService.Base/xlf/Microsoft.VisualStudio.Package.LanguageService.de.xlf index 6c5d961e316..f14709b11e9 100644 --- a/vsintegration/src/FSharp.LanguageService.Base/xlf/Microsoft.VisualStudio.Package.LanguageService.de.xlf +++ b/vsintegration/src/FSharp.LanguageService.Base/xlf/Microsoft.VisualStudio.Package.LanguageService.de.xlf @@ -1,4 +1,4 @@ - + @@ -14,7 +14,7 @@ Members - Member + Mitglieder Tooltip for the drop down combo at top of document window showing list of known members. diff --git a/vsintegration/src/FSharp.LanguageService.Base/xlf/Microsoft.VisualStudio.Package.LanguageService.es.xlf b/vsintegration/src/FSharp.LanguageService.Base/xlf/Microsoft.VisualStudio.Package.LanguageService.es.xlf index 4f51649f109..9c41be20344 100644 --- a/vsintegration/src/FSharp.LanguageService.Base/xlf/Microsoft.VisualStudio.Package.LanguageService.es.xlf +++ b/vsintegration/src/FSharp.LanguageService.Base/xlf/Microsoft.VisualStudio.Package.LanguageService.es.xlf @@ -1,4 +1,4 @@ - + diff --git a/vsintegration/src/FSharp.LanguageService.Base/xlf/Microsoft.VisualStudio.Package.LanguageService.fr.xlf b/vsintegration/src/FSharp.LanguageService.Base/xlf/Microsoft.VisualStudio.Package.LanguageService.fr.xlf index 542a43a5b08..87150eb42ea 100644 --- a/vsintegration/src/FSharp.LanguageService.Base/xlf/Microsoft.VisualStudio.Package.LanguageService.fr.xlf +++ b/vsintegration/src/FSharp.LanguageService.Base/xlf/Microsoft.VisualStudio.Package.LanguageService.fr.xlf @@ -1,4 +1,4 @@ - + diff --git a/vsintegration/src/FSharp.LanguageService.Base/xlf/Microsoft.VisualStudio.Package.LanguageService.it.xlf b/vsintegration/src/FSharp.LanguageService.Base/xlf/Microsoft.VisualStudio.Package.LanguageService.it.xlf index 832c7cbb24d..1827234227d 100644 --- a/vsintegration/src/FSharp.LanguageService.Base/xlf/Microsoft.VisualStudio.Package.LanguageService.it.xlf +++ b/vsintegration/src/FSharp.LanguageService.Base/xlf/Microsoft.VisualStudio.Package.LanguageService.it.xlf @@ -1,4 +1,4 @@ - + diff --git a/vsintegration/src/FSharp.LanguageService.Base/xlf/Microsoft.VisualStudio.Package.LanguageService.ja.xlf b/vsintegration/src/FSharp.LanguageService.Base/xlf/Microsoft.VisualStudio.Package.LanguageService.ja.xlf index c2165bf9f9d..680fb1b9941 100644 --- a/vsintegration/src/FSharp.LanguageService.Base/xlf/Microsoft.VisualStudio.Package.LanguageService.ja.xlf +++ b/vsintegration/src/FSharp.LanguageService.Base/xlf/Microsoft.VisualStudio.Package.LanguageService.ja.xlf @@ -1,4 +1,4 @@ - + diff --git a/vsintegration/src/FSharp.LanguageService.Base/xlf/Microsoft.VisualStudio.Package.LanguageService.ko.xlf b/vsintegration/src/FSharp.LanguageService.Base/xlf/Microsoft.VisualStudio.Package.LanguageService.ko.xlf index 31b6b01633e..2b10d5448fa 100644 --- a/vsintegration/src/FSharp.LanguageService.Base/xlf/Microsoft.VisualStudio.Package.LanguageService.ko.xlf +++ b/vsintegration/src/FSharp.LanguageService.Base/xlf/Microsoft.VisualStudio.Package.LanguageService.ko.xlf @@ -1,4 +1,4 @@ - + diff --git a/vsintegration/src/FSharp.LanguageService.Base/xlf/Microsoft.VisualStudio.Package.LanguageService.pl.xlf b/vsintegration/src/FSharp.LanguageService.Base/xlf/Microsoft.VisualStudio.Package.LanguageService.pl.xlf index 53bfacf4caf..0f8ca025c20 100644 --- a/vsintegration/src/FSharp.LanguageService.Base/xlf/Microsoft.VisualStudio.Package.LanguageService.pl.xlf +++ b/vsintegration/src/FSharp.LanguageService.Base/xlf/Microsoft.VisualStudio.Package.LanguageService.pl.xlf @@ -1,4 +1,4 @@ - + diff --git a/vsintegration/src/FSharp.LanguageService.Base/xlf/Microsoft.VisualStudio.Package.LanguageService.pt-BR.xlf b/vsintegration/src/FSharp.LanguageService.Base/xlf/Microsoft.VisualStudio.Package.LanguageService.pt-BR.xlf index 8916fcb57e1..c341f4d3bf7 100644 --- a/vsintegration/src/FSharp.LanguageService.Base/xlf/Microsoft.VisualStudio.Package.LanguageService.pt-BR.xlf +++ b/vsintegration/src/FSharp.LanguageService.Base/xlf/Microsoft.VisualStudio.Package.LanguageService.pt-BR.xlf @@ -1,4 +1,4 @@ - + diff --git a/vsintegration/src/FSharp.LanguageService.Base/xlf/Microsoft.VisualStudio.Package.LanguageService.ru.xlf b/vsintegration/src/FSharp.LanguageService.Base/xlf/Microsoft.VisualStudio.Package.LanguageService.ru.xlf index 235eaa60242..b08e84f46b8 100644 --- a/vsintegration/src/FSharp.LanguageService.Base/xlf/Microsoft.VisualStudio.Package.LanguageService.ru.xlf +++ b/vsintegration/src/FSharp.LanguageService.Base/xlf/Microsoft.VisualStudio.Package.LanguageService.ru.xlf @@ -1,4 +1,4 @@ - + @@ -14,7 +14,7 @@ Members - Члены + Элементы Tooltip for the drop down combo at top of document window showing list of known members. diff --git a/vsintegration/src/FSharp.LanguageService.Base/xlf/Microsoft.VisualStudio.Package.LanguageService.tr.xlf b/vsintegration/src/FSharp.LanguageService.Base/xlf/Microsoft.VisualStudio.Package.LanguageService.tr.xlf index 4b600678ae4..78658d3f00c 100644 --- a/vsintegration/src/FSharp.LanguageService.Base/xlf/Microsoft.VisualStudio.Package.LanguageService.tr.xlf +++ b/vsintegration/src/FSharp.LanguageService.Base/xlf/Microsoft.VisualStudio.Package.LanguageService.tr.xlf @@ -1,4 +1,4 @@ - + diff --git a/vsintegration/src/FSharp.LanguageService.Base/xlf/Microsoft.VisualStudio.Package.LanguageService.zh-Hans.xlf b/vsintegration/src/FSharp.LanguageService.Base/xlf/Microsoft.VisualStudio.Package.LanguageService.zh-Hans.xlf index c3422f9abf8..a78d09aee63 100644 --- a/vsintegration/src/FSharp.LanguageService.Base/xlf/Microsoft.VisualStudio.Package.LanguageService.zh-Hans.xlf +++ b/vsintegration/src/FSharp.LanguageService.Base/xlf/Microsoft.VisualStudio.Package.LanguageService.zh-Hans.xlf @@ -1,4 +1,4 @@ - + diff --git a/vsintegration/src/FSharp.LanguageService.Base/xlf/Microsoft.VisualStudio.Package.LanguageService.zh-Hant.xlf b/vsintegration/src/FSharp.LanguageService.Base/xlf/Microsoft.VisualStudio.Package.LanguageService.zh-Hant.xlf index ac809d8d5fd..3fa4e9f803a 100644 --- a/vsintegration/src/FSharp.LanguageService.Base/xlf/Microsoft.VisualStudio.Package.LanguageService.zh-Hant.xlf +++ b/vsintegration/src/FSharp.LanguageService.Base/xlf/Microsoft.VisualStudio.Package.LanguageService.zh-Hant.xlf @@ -1,4 +1,4 @@ - + @@ -19,7 +19,7 @@ Types - 類型 + 型別 Tooltip for the drop down combo at top of document window showing list of known types. diff --git a/vsintegration/src/FSharp.LanguageService/xlf/FSLangSvcStrings.cs.xlf b/vsintegration/src/FSharp.LanguageService/xlf/FSLangSvcStrings.cs.xlf index c1fcfdca7b1..1b98c0b95c1 100644 --- a/vsintegration/src/FSharp.LanguageService/xlf/FSLangSvcStrings.cs.xlf +++ b/vsintegration/src/FSharp.LanguageService/xlf/FSLangSvcStrings.cs.xlf @@ -1,4 +1,4 @@ - + diff --git a/vsintegration/src/FSharp.LanguageService/xlf/FSLangSvcStrings.de.xlf b/vsintegration/src/FSharp.LanguageService/xlf/FSLangSvcStrings.de.xlf index c97b2e2cab0..8c2cdb0e764 100644 --- a/vsintegration/src/FSharp.LanguageService/xlf/FSLangSvcStrings.de.xlf +++ b/vsintegration/src/FSharp.LanguageService/xlf/FSLangSvcStrings.de.xlf @@ -1,4 +1,4 @@ - + @@ -19,7 +19,7 @@ Cannot navigate to definition. - Wechseln zur Definition ist nicht möglich. + Das Wechseln zur Definition ist nicht möglich. diff --git a/vsintegration/src/FSharp.LanguageService/xlf/FSLangSvcStrings.es.xlf b/vsintegration/src/FSharp.LanguageService/xlf/FSLangSvcStrings.es.xlf index d3d7a07a053..093e6c85782 100644 --- a/vsintegration/src/FSharp.LanguageService/xlf/FSLangSvcStrings.es.xlf +++ b/vsintegration/src/FSharp.LanguageService/xlf/FSLangSvcStrings.es.xlf @@ -1,4 +1,4 @@ - + diff --git a/vsintegration/src/FSharp.LanguageService/xlf/FSLangSvcStrings.fr.xlf b/vsintegration/src/FSharp.LanguageService/xlf/FSLangSvcStrings.fr.xlf index e3a42fd1d9b..c771efc2acc 100644 --- a/vsintegration/src/FSharp.LanguageService/xlf/FSLangSvcStrings.fr.xlf +++ b/vsintegration/src/FSharp.LanguageService/xlf/FSLangSvcStrings.fr.xlf @@ -1,4 +1,4 @@ - + diff --git a/vsintegration/src/FSharp.LanguageService/xlf/FSLangSvcStrings.it.xlf b/vsintegration/src/FSharp.LanguageService/xlf/FSLangSvcStrings.it.xlf index abb983ddd86..119ff1788de 100644 --- a/vsintegration/src/FSharp.LanguageService/xlf/FSLangSvcStrings.it.xlf +++ b/vsintegration/src/FSharp.LanguageService/xlf/FSLangSvcStrings.it.xlf @@ -1,4 +1,4 @@ - + diff --git a/vsintegration/src/FSharp.LanguageService/xlf/FSLangSvcStrings.ko.xlf b/vsintegration/src/FSharp.LanguageService/xlf/FSLangSvcStrings.ko.xlf index d9ebb322541..0727b9aa5e0 100644 --- a/vsintegration/src/FSharp.LanguageService/xlf/FSLangSvcStrings.ko.xlf +++ b/vsintegration/src/FSharp.LanguageService/xlf/FSLangSvcStrings.ko.xlf @@ -1,4 +1,4 @@ - + diff --git a/vsintegration/src/FSharp.LanguageService/xlf/FSLangSvcStrings.pl.xlf b/vsintegration/src/FSharp.LanguageService/xlf/FSLangSvcStrings.pl.xlf index 9f9ef85b76c..54d0db78033 100644 --- a/vsintegration/src/FSharp.LanguageService/xlf/FSLangSvcStrings.pl.xlf +++ b/vsintegration/src/FSharp.LanguageService/xlf/FSLangSvcStrings.pl.xlf @@ -1,4 +1,4 @@ - + diff --git a/vsintegration/src/FSharp.LanguageService/xlf/FSLangSvcStrings.pt-BR.xlf b/vsintegration/src/FSharp.LanguageService/xlf/FSLangSvcStrings.pt-BR.xlf index 7fb96cdc6a1..fec1904bb9b 100644 --- a/vsintegration/src/FSharp.LanguageService/xlf/FSLangSvcStrings.pt-BR.xlf +++ b/vsintegration/src/FSharp.LanguageService/xlf/FSLangSvcStrings.pt-BR.xlf @@ -1,4 +1,4 @@ - + @@ -19,7 +19,7 @@ Cannot navigate to definition. - Não é possível navegar para definição. + Não é possível navegar até a definição. diff --git a/vsintegration/src/FSharp.LanguageService/xlf/FSLangSvcStrings.ru.xlf b/vsintegration/src/FSharp.LanguageService/xlf/FSLangSvcStrings.ru.xlf index 5d09ca8300f..7f2313345a8 100644 --- a/vsintegration/src/FSharp.LanguageService/xlf/FSLangSvcStrings.ru.xlf +++ b/vsintegration/src/FSharp.LanguageService/xlf/FSLangSvcStrings.ru.xlf @@ -1,4 +1,4 @@ - + @@ -14,7 +14,7 @@ Loading... - Идет загрузка... + Загрузка... displayed when waiting for IntelliSense to load diff --git a/vsintegration/src/FSharp.LanguageService/xlf/FSLangSvcStrings.tr.xlf b/vsintegration/src/FSharp.LanguageService/xlf/FSLangSvcStrings.tr.xlf index 73ab05a5533..fafc7d644ff 100644 --- a/vsintegration/src/FSharp.LanguageService/xlf/FSLangSvcStrings.tr.xlf +++ b/vsintegration/src/FSharp.LanguageService/xlf/FSLangSvcStrings.tr.xlf @@ -1,4 +1,4 @@ - + diff --git a/vsintegration/src/FSharp.LanguageService/xlf/FSLangSvcStrings.zh-Hans.xlf b/vsintegration/src/FSharp.LanguageService/xlf/FSLangSvcStrings.zh-Hans.xlf index e33ea35ca76..115c4f86972 100644 --- a/vsintegration/src/FSharp.LanguageService/xlf/FSLangSvcStrings.zh-Hans.xlf +++ b/vsintegration/src/FSharp.LanguageService/xlf/FSLangSvcStrings.zh-Hans.xlf @@ -1,4 +1,4 @@ - + diff --git a/vsintegration/src/FSharp.LanguageService/xlf/FSLangSvcStrings.zh-Hant.xlf b/vsintegration/src/FSharp.LanguageService/xlf/FSLangSvcStrings.zh-Hant.xlf index 534256ae15c..b11b0ab3d74 100644 --- a/vsintegration/src/FSharp.LanguageService/xlf/FSLangSvcStrings.zh-Hant.xlf +++ b/vsintegration/src/FSharp.LanguageService/xlf/FSLangSvcStrings.zh-Hant.xlf @@ -1,4 +1,4 @@ - + diff --git a/vsintegration/src/FSharp.LanguageService/xlf/VSPackage.cs.xlf b/vsintegration/src/FSharp.LanguageService/xlf/VSPackage.cs.xlf index acacfc13502..558cc1afec2 100644 --- a/vsintegration/src/FSharp.LanguageService/xlf/VSPackage.cs.xlf +++ b/vsintegration/src/FSharp.LanguageService/xlf/VSPackage.cs.xlf @@ -1,4 +1,4 @@ - + @@ -19,7 +19,7 @@ Operator - Operátor + operátor @@ -49,7 +49,7 @@ Identifier - Identifikátor + identifikátor diff --git a/vsintegration/src/FSharp.LanguageService/xlf/VSPackage.de.xlf b/vsintegration/src/FSharp.LanguageService/xlf/VSPackage.de.xlf index ffc095348b1..7ffbbe10328 100644 --- a/vsintegration/src/FSharp.LanguageService/xlf/VSPackage.de.xlf +++ b/vsintegration/src/FSharp.LanguageService/xlf/VSPackage.de.xlf @@ -1,4 +1,4 @@ - + diff --git a/vsintegration/src/FSharp.LanguageService/xlf/VSPackage.es.xlf b/vsintegration/src/FSharp.LanguageService/xlf/VSPackage.es.xlf index 76cd632ccd8..bbc6b2006b9 100644 --- a/vsintegration/src/FSharp.LanguageService/xlf/VSPackage.es.xlf +++ b/vsintegration/src/FSharp.LanguageService/xlf/VSPackage.es.xlf @@ -1,4 +1,4 @@ - + diff --git a/vsintegration/src/FSharp.LanguageService/xlf/VSPackage.fr.xlf b/vsintegration/src/FSharp.LanguageService/xlf/VSPackage.fr.xlf index f27ce75afcc..8eef0e1148c 100644 --- a/vsintegration/src/FSharp.LanguageService/xlf/VSPackage.fr.xlf +++ b/vsintegration/src/FSharp.LanguageService/xlf/VSPackage.fr.xlf @@ -1,4 +1,4 @@ - + @@ -49,7 +49,7 @@ Identifier - Identificateur + identificateur diff --git a/vsintegration/src/FSharp.LanguageService/xlf/VSPackage.it.xlf b/vsintegration/src/FSharp.LanguageService/xlf/VSPackage.it.xlf index a79fee23068..f095cc4c4f4 100644 --- a/vsintegration/src/FSharp.LanguageService/xlf/VSPackage.it.xlf +++ b/vsintegration/src/FSharp.LanguageService/xlf/VSPackage.it.xlf @@ -1,4 +1,4 @@ - + @@ -19,7 +19,7 @@ Operator - Operatore + operatore @@ -49,7 +49,7 @@ Identifier - Identificatore + identificatore diff --git a/vsintegration/src/FSharp.LanguageService/xlf/VSPackage.ko.xlf b/vsintegration/src/FSharp.LanguageService/xlf/VSPackage.ko.xlf index df123fca81b..19ef2f72867 100644 --- a/vsintegration/src/FSharp.LanguageService/xlf/VSPackage.ko.xlf +++ b/vsintegration/src/FSharp.LanguageService/xlf/VSPackage.ko.xlf @@ -1,4 +1,4 @@ - + @@ -19,7 +19,7 @@ Operator - 연산자 + 운영자 @@ -44,7 +44,7 @@ Comment - 설명 + 주석 @@ -59,7 +59,7 @@ Number - 숫자 + 번호 diff --git a/vsintegration/src/FSharp.LanguageService/xlf/VSPackage.pl.xlf b/vsintegration/src/FSharp.LanguageService/xlf/VSPackage.pl.xlf index bfc6fb43a8e..e37a4cd55c0 100644 --- a/vsintegration/src/FSharp.LanguageService/xlf/VSPackage.pl.xlf +++ b/vsintegration/src/FSharp.LanguageService/xlf/VSPackage.pl.xlf @@ -1,4 +1,4 @@ - + @@ -19,7 +19,7 @@ Operator - Operator + operator @@ -49,7 +49,7 @@ Identifier - Identyfikator + identyfikator diff --git a/vsintegration/src/FSharp.LanguageService/xlf/VSPackage.pt-BR.xlf b/vsintegration/src/FSharp.LanguageService/xlf/VSPackage.pt-BR.xlf index 502d5956dac..13092af472b 100644 --- a/vsintegration/src/FSharp.LanguageService/xlf/VSPackage.pt-BR.xlf +++ b/vsintegration/src/FSharp.LanguageService/xlf/VSPackage.pt-BR.xlf @@ -1,4 +1,4 @@ - + @@ -49,7 +49,7 @@ Identifier - Identificador + identificador diff --git a/vsintegration/src/FSharp.LanguageService/xlf/VSPackage.ru.xlf b/vsintegration/src/FSharp.LanguageService/xlf/VSPackage.ru.xlf index 9078f979baa..63b801d5bf9 100644 --- a/vsintegration/src/FSharp.LanguageService/xlf/VSPackage.ru.xlf +++ b/vsintegration/src/FSharp.LanguageService/xlf/VSPackage.ru.xlf @@ -1,4 +1,4 @@ - + @@ -49,7 +49,7 @@ Identifier - Идентификатор + идентификатор @@ -64,7 +64,7 @@ String - Строка + String diff --git a/vsintegration/src/FSharp.LanguageService/xlf/VSPackage.tr.xlf b/vsintegration/src/FSharp.LanguageService/xlf/VSPackage.tr.xlf index f5f7b1334b4..2a16efa550b 100644 --- a/vsintegration/src/FSharp.LanguageService/xlf/VSPackage.tr.xlf +++ b/vsintegration/src/FSharp.LanguageService/xlf/VSPackage.tr.xlf @@ -1,4 +1,4 @@ - + @@ -19,7 +19,7 @@ Operator - İşleç + işleç @@ -49,7 +49,7 @@ Identifier - Tanımlayıcı + tanımlayıcı diff --git a/vsintegration/src/FSharp.LanguageService/xlf/VSPackage.zh-Hans.xlf b/vsintegration/src/FSharp.LanguageService/xlf/VSPackage.zh-Hans.xlf index ffccb77de00..885f5df2fac 100644 --- a/vsintegration/src/FSharp.LanguageService/xlf/VSPackage.zh-Hans.xlf +++ b/vsintegration/src/FSharp.LanguageService/xlf/VSPackage.zh-Hans.xlf @@ -1,4 +1,4 @@ - + diff --git a/vsintegration/src/FSharp.LanguageService/xlf/VSPackage.zh-Hant.xlf b/vsintegration/src/FSharp.LanguageService/xlf/VSPackage.zh-Hant.xlf index 99888a55edb..434c6f8ea37 100644 --- a/vsintegration/src/FSharp.LanguageService/xlf/VSPackage.zh-Hant.xlf +++ b/vsintegration/src/FSharp.LanguageService/xlf/VSPackage.zh-Hant.xlf @@ -1,4 +1,4 @@ - + diff --git a/vsintegration/src/FSharp.ProjectSystem.Base/Project/xlf/Microsoft.VisualStudio.Package.Project.cs.xlf b/vsintegration/src/FSharp.ProjectSystem.Base/Project/xlf/Microsoft.VisualStudio.Package.Project.cs.xlf index 8fb69a16f23..ffeed383fc7 100644 --- a/vsintegration/src/FSharp.ProjectSystem.Base/Project/xlf/Microsoft.VisualStudio.Package.Project.cs.xlf +++ b/vsintegration/src/FSharp.ProjectSystem.Base/Project/xlf/Microsoft.VisualStudio.Package.Project.cs.xlf @@ -1,4 +1,4 @@ - + @@ -119,7 +119,7 @@ error - chyba + Chyba @@ -252,7 +252,7 @@ Minimal - Minimální + minimální @@ -262,7 +262,7 @@ None - Žádné + žádné @@ -387,7 +387,7 @@ warning - upozornění + Upozornění @@ -792,7 +792,7 @@ Path - Cesta + PATH @@ -802,7 +802,7 @@ Version - Verze + VERSION diff --git a/vsintegration/src/FSharp.ProjectSystem.Base/Project/xlf/Microsoft.VisualStudio.Package.Project.de.xlf b/vsintegration/src/FSharp.ProjectSystem.Base/Project/xlf/Microsoft.VisualStudio.Package.Project.de.xlf index 2f107ee3f27..10949f3119e 100644 --- a/vsintegration/src/FSharp.ProjectSystem.Base/Project/xlf/Microsoft.VisualStudio.Package.Project.de.xlf +++ b/vsintegration/src/FSharp.ProjectSystem.Base/Project/xlf/Microsoft.VisualStudio.Package.Project.de.xlf @@ -1,4 +1,4 @@ - + @@ -39,7 +39,7 @@ How the file relates to the build and deployment process - Gibt an, inwiefern sich die Datei auf den Build- und Bereitstellungsprozess bezieht. + Wie sich die Datei auf den Build- und Bereitstellungsprozess bezieht Project Build Property Description @@ -54,7 +54,7 @@ ECMA-335 CLI compatible framework (location must be provided) - ECMA-335 CLI-kompatibles Framework (Speicherort muss angegeben werden) + ECMA-335 CLI-kompatibles Framework (Ort muss angegeben werden) Target platform drop down option @@ -147,7 +147,7 @@ Error Saving File - Fehler beim Speichern der Datei. + Fehler beim Speichern der Datei @@ -212,7 +212,7 @@ The name of the file or folder - Der Name der Datei oder des Ordners + Der Name der Datei oder des Ordners. @@ -232,7 +232,7 @@ Location of the file - Speicherort der Datei + Dateiort @@ -242,7 +242,7 @@ Cannot save '{0}' outside the project directory. Linked items are not supported. - {0} kann nicht außerhalb des Projektverzeichnisses gespeichert werden. Verknüpfte Elemente werden nicht unterstützt. + {0}" kann nicht außerhalb des Projektverzeichnisses gespeichert werden. Verknüpfte Elemente werden nicht unterstützt. @@ -252,22 +252,22 @@ Minimal - Minimal + minimal Misc - Sonstiges + Verschiedenes None - Keine + NONE Normal - Normal + NORMAL @@ -282,7 +282,7 @@ Project - Projekt + Projekt @@ -487,7 +487,7 @@ Specifies the tool that transforms a file at design time and places the output of that transformation into another file. For example, a dataset (.xsd) file comes with a default custom tool. - Gibt das Tool an, das eine Datei zur Entwurfszeit transformiert und die Ausgabe in einer anderen Datei speichert. Datasetdateien (".xsd") verfügen beispielsweise über ein benutzerdefiniertes Standardtool. + Gibt das Tool an, das eine Datei zur Entwurfszeit transformiert und die Ausgabe in einer anderen Datei speichert. Datasetdateien (.xsd) enthalten z.B. ein benutzerdefiniertes Standardtool. @@ -587,7 +587,7 @@ A reference to {0} could not be added. Please make sure that the file is accessible, and that it is a valid assembly or COM component. - Ein Verweis auf "{0}" konnte nicht hinzugefügt werden. Stellen Sie sicher, dass auf die Datei zugegriffen werden kann und dass sie eine gültige Assembly oder COM-Komponente ist. + Es konnte kein Verweis auf "{0}" hinzugefügt werden. Achten Sie darauf, dass die Datei zugänglich ist und dass es sich um eine gültige Assembly- oder COM-Komponente handelt. @@ -662,12 +662,12 @@ Specific Version - Spezifische Version + Bestimmte Version Indicates whether this reference is to a specific version of an assembly. - Gibt an, ob sich dieser Verweis auf eine spezifische Version einer Assembly bezieht. + Gibt an, ob dieser Verweis auf eine bestimmte Version einer Assembly verweist. @@ -802,7 +802,7 @@ Version - Version + VERSION diff --git a/vsintegration/src/FSharp.ProjectSystem.Base/Project/xlf/Microsoft.VisualStudio.Package.Project.es.xlf b/vsintegration/src/FSharp.ProjectSystem.Base/Project/xlf/Microsoft.VisualStudio.Package.Project.es.xlf index a1b9309cd08..6677d941045 100644 --- a/vsintegration/src/FSharp.ProjectSystem.Base/Project/xlf/Microsoft.VisualStudio.Package.Project.es.xlf +++ b/vsintegration/src/FSharp.ProjectSystem.Base/Project/xlf/Microsoft.VisualStudio.Package.Project.es.xlf @@ -1,4 +1,4 @@ - + @@ -9,7 +9,7 @@ Advanced - Avanzadas + Opciones avanzadas Project Property Page Caption @@ -24,7 +24,7 @@ A reference to '{0}' (with assembly name '{1}') could not be added. A reference to the component '{2}' with the same assembly name already exists in the project. - No se pudo agregar una referencia a '{0}' (con el nombre de ensamblado '{1}'). Ya existe una referencia al componente '{2}' con el mismo nombre de ensamblado en el proyecto. + No se puede agregar una referencia a '{0}' (con el nombre de ensamblado '{1}'). Ya existe en el proyecto una referencia al componente '{2}' con el mismo nombre del ensamblado. ReferenceAlreadyExists error message @@ -39,7 +39,7 @@ How the file relates to the build and deployment process - Relación del archivo con el proceso de compilación e implementación. + Relación del archivo con el proceso de compilación e implementación Project Build Property Description @@ -54,7 +54,7 @@ ECMA-335 CLI compatible framework (location must be provided) - Marco de trabajo compatible con ECMA-335 CLI (se debe proporcionar la ubicación) + Versión de .NET Framework compatible con ECMA-335 CLI (se debe proporcionar la ubicación) Target platform drop down option @@ -119,7 +119,7 @@ error - error + Fehler @@ -147,7 +147,7 @@ Error Saving File - Error al guardar el archivo. + Error al guardar el archivo @@ -197,7 +197,7 @@ Error Copying File - Error al copiar el archivo. + Error al copiar el archivo @@ -217,7 +217,7 @@ Folder Name - Nombre de la carpeta + Nombre de carpeta @@ -252,7 +252,7 @@ Minimal - Mínimo + mínimo @@ -262,12 +262,12 @@ None - Ninguno + NONE Normal - Normal + NORMAL @@ -302,7 +302,7 @@ Project Folder - Carpeta de proyecto + Carpeta del proyecto @@ -342,7 +342,7 @@ Save? - ¿Guardar? + ¿Desea guardar? @@ -387,7 +387,7 @@ warning - advertencia + Advertencia @@ -472,7 +472,7 @@ The path to the primary output - Ruta de acceso al resultado principal + Ruta de acceso de la salida principal @@ -487,7 +487,7 @@ Specifies the tool that transforms a file at design time and places the output of that transformation into another file. For example, a dataset (.xsd) file comes with a default custom tool. - Especifica la herramienta que transforma un archivo en tiempo de diseño y pone la salida de esa transformación en otro archivo. Por ejemplo, un archivo de conjunto de datos (.xsd) viene con una herramienta personalizada predeterminada. + Especifica la herramienta que transforma el archivo en tiempo de diseño y coloca la salida de la transformación en otro archivo. Por ejemplo, un archivo de conjunto de datos (.xsd) viene con una herramienta personalizada predeterminada. @@ -587,7 +587,7 @@ A reference to {0} could not be added. Please make sure that the file is accessible, and that it is a valid assembly or COM component. - No se pudo agregar una referencia a {0}. Asegúrese de que el archivo está accesible y de que es un ensamblado o un componente COM válido. + No se pudo agregar una referencia a {0}. Asegúrese de que el archivo es accesible y de que se trata de un ensamblado o componente COM válido. @@ -792,7 +792,7 @@ Path - Ruta de acceso + PATH diff --git a/vsintegration/src/FSharp.ProjectSystem.Base/Project/xlf/Microsoft.VisualStudio.Package.Project.fr.xlf b/vsintegration/src/FSharp.ProjectSystem.Base/Project/xlf/Microsoft.VisualStudio.Package.Project.fr.xlf index 3377431434e..7c9efded080 100644 --- a/vsintegration/src/FSharp.ProjectSystem.Base/Project/xlf/Microsoft.VisualStudio.Package.Project.fr.xlf +++ b/vsintegration/src/FSharp.ProjectSystem.Base/Project/xlf/Microsoft.VisualStudio.Package.Project.fr.xlf @@ -1,4 +1,4 @@ - + @@ -119,7 +119,7 @@ error - erreur + Erreur @@ -252,7 +252,7 @@ Minimal - Minimal + minimal @@ -262,12 +262,12 @@ None - Aucun + Aucun(e) Normal - Normal + NORMAL @@ -387,7 +387,7 @@ warning - avertissement + Avertissement @@ -472,7 +472,7 @@ The path to the primary output - Chemin de la sortie principale + Le chemin de la sortie principale @@ -792,7 +792,7 @@ Path - Chemin + PATH diff --git a/vsintegration/src/FSharp.ProjectSystem.Base/Project/xlf/Microsoft.VisualStudio.Package.Project.it.xlf b/vsintegration/src/FSharp.ProjectSystem.Base/Project/xlf/Microsoft.VisualStudio.Package.Project.it.xlf index 7bcff058d42..78c38a31de4 100644 --- a/vsintegration/src/FSharp.ProjectSystem.Base/Project/xlf/Microsoft.VisualStudio.Package.Project.it.xlf +++ b/vsintegration/src/FSharp.ProjectSystem.Base/Project/xlf/Microsoft.VisualStudio.Package.Project.it.xlf @@ -1,4 +1,4 @@ - + @@ -119,7 +119,7 @@ error - errore + Errore @@ -207,7 +207,7 @@ File and folder names cannot contain a leading period. - I nomi di file e di cartella non possono iniziare con un punto. + I nomi di file e di cartelle non possono iniziare con un punto. @@ -222,7 +222,7 @@ Name of this folder - Nome di questa cartella + Nome della cartella corrente @@ -242,7 +242,7 @@ Cannot save '{0}' outside the project directory. Linked items are not supported. - Non è possibile salvare '{0}' all'esterno della directory del progetto. Gli elementi collegati non sono supportati. + Impossibile salvare '{0}' all'esterno della directory del progetto. Gli elementi collegati non sono supportati. @@ -252,7 +252,7 @@ Minimal - Minimo + minimal @@ -267,7 +267,7 @@ Normal - Normale + NORMAL @@ -282,7 +282,7 @@ Project - Progetto + PROGETTO @@ -387,7 +387,7 @@ warning - avviso + Avviso @@ -442,7 +442,7 @@ Project Properties - Proprietà del progetto + Proprietà progetto @@ -792,7 +792,7 @@ Path - Percorso + PERCORSO diff --git a/vsintegration/src/FSharp.ProjectSystem.Base/Project/xlf/Microsoft.VisualStudio.Package.Project.ja.xlf b/vsintegration/src/FSharp.ProjectSystem.Base/Project/xlf/Microsoft.VisualStudio.Package.Project.ja.xlf index e1bd019f916..9fca5b1025a 100644 --- a/vsintegration/src/FSharp.ProjectSystem.Base/Project/xlf/Microsoft.VisualStudio.Package.Project.ja.xlf +++ b/vsintegration/src/FSharp.ProjectSystem.Base/Project/xlf/Microsoft.VisualStudio.Package.Project.ja.xlf @@ -212,7 +212,7 @@ The name of the file or folder - ファイルまたはフォルダーの名前 + ファイルまたはフォルダーの名前です @@ -267,7 +267,7 @@ Normal - 標準 + NORMAL @@ -792,7 +792,7 @@ Path - パス + PATH diff --git a/vsintegration/src/FSharp.ProjectSystem.Base/Project/xlf/Microsoft.VisualStudio.Package.Project.ko.xlf b/vsintegration/src/FSharp.ProjectSystem.Base/Project/xlf/Microsoft.VisualStudio.Package.Project.ko.xlf index e276c7856ce..178ec108738 100644 --- a/vsintegration/src/FSharp.ProjectSystem.Base/Project/xlf/Microsoft.VisualStudio.Package.Project.ko.xlf +++ b/vsintegration/src/FSharp.ProjectSystem.Base/Project/xlf/Microsoft.VisualStudio.Package.Project.ko.xlf @@ -1,4 +1,4 @@ - + @@ -64,7 +64,7 @@ If you change a file name extension, the file may become unusable. Are you sure you want to change it? - 파일 확장명을 바꾸면 파일을 사용할 수 없게 될 수도 있습니다. 확장명을 바꾸시겠습니까? + 확장명을 바꾸면 파일을 사용할 수 없게 될 수도 있습니다. 확장명을 바꾸시겠습니까? @@ -89,7 +89,7 @@ Indicates whether the reference will be copied to the output directory. - 참조를 출력 디렉터리로 복사할지 여부를 나타냅니다. + 참조를 출력 디렉터리에 복사할지 여부를 나타냅니다. @@ -252,22 +252,22 @@ Minimal - 최소 + minimal Misc - 기타 + Misc None - 없음 + None Normal - 보통 + NORMAL @@ -532,7 +532,7 @@ XML Serialization Assemblies - XML Serialization 어셈블리 + XML 직렬화 어셈블리 @@ -587,7 +587,7 @@ A reference to {0} could not be added. Please make sure that the file is accessible, and that it is a valid assembly or COM component. - {0}에 대한 참조를 추가할 수 없습니다. 파일에 액세스할 수 있는지, 올바른 어셈블리 또는 COM 구성 요소인지 확인하세요. + {0}에 대한 참조를 추가할 수 없습니다. 파일이 액세스 가능한지, 올바른 어셈블리 또는 COM 구성 요소인지 확인하십시오. @@ -642,7 +642,7 @@ Copy to Output Directory - 출력 디렉터리에 복사 + 출력 디렉터리로 복사 @@ -792,7 +792,7 @@ Path - 경로 + PATH diff --git a/vsintegration/src/FSharp.ProjectSystem.Base/Project/xlf/Microsoft.VisualStudio.Package.Project.pl.xlf b/vsintegration/src/FSharp.ProjectSystem.Base/Project/xlf/Microsoft.VisualStudio.Package.Project.pl.xlf index 334907964f5..5bea4d9201f 100644 --- a/vsintegration/src/FSharp.ProjectSystem.Base/Project/xlf/Microsoft.VisualStudio.Package.Project.pl.xlf +++ b/vsintegration/src/FSharp.ProjectSystem.Base/Project/xlf/Microsoft.VisualStudio.Package.Project.pl.xlf @@ -1,4 +1,4 @@ - + @@ -119,7 +119,7 @@ error - błąd + Błąd @@ -252,17 +252,17 @@ Minimal - Minimalny + minimalne Misc - Różne + Misc None - Brak + brak @@ -387,7 +387,7 @@ warning - ostrzeżenie + Ostrzeżenie @@ -637,7 +637,7 @@ Copy always - Zawsze kopiuj + Zawsze Kopiuj CopyToOutputDirectory - drop down option @@ -792,7 +792,7 @@ Path - Ścieżka + ŚCIEŻKA diff --git a/vsintegration/src/FSharp.ProjectSystem.Base/Project/xlf/Microsoft.VisualStudio.Package.Project.pt-BR.xlf b/vsintegration/src/FSharp.ProjectSystem.Base/Project/xlf/Microsoft.VisualStudio.Package.Project.pt-BR.xlf index d0e04d11879..782ef79d2dc 100644 --- a/vsintegration/src/FSharp.ProjectSystem.Base/Project/xlf/Microsoft.VisualStudio.Package.Project.pt-BR.xlf +++ b/vsintegration/src/FSharp.ProjectSystem.Base/Project/xlf/Microsoft.VisualStudio.Package.Project.pt-BR.xlf @@ -1,4 +1,4 @@ - + @@ -34,7 +34,7 @@ Build Action - Ação de Compilação + Ação de compilação Project Build Property Name @@ -89,7 +89,7 @@ Indicates whether the reference will be copied to the output directory. - Indica se a referência será copiada no diretório de saída. + Indica se a referência será copiada para o diretório de saída. @@ -119,7 +119,7 @@ error - erro + Erro @@ -222,7 +222,7 @@ Name of this folder - Nome desta pasta + O nome desta pasta @@ -252,7 +252,7 @@ Minimal - Mínimo + mínimo @@ -262,12 +262,12 @@ None - Nenhum + NENHUM Normal - Normal + NORMAL @@ -287,7 +287,7 @@ A reference to library '{0}' cannot be added. Adding this project as a reference would cause a circular dependency. - Não é possível adicionar uma referência à biblioteca '{0}'. A adição deste projeto como uma referência causaria uma dependência circular. + Uma referência à biblioteca '{0}' não pode ser adicionada. A inserção deste projeto como uma referência pode causar uma dependência circular. @@ -387,7 +387,7 @@ warning - aviso + Aviso @@ -482,7 +482,7 @@ Custom Tool - Ferramenta Personalizada + Ferramenta personalizada @@ -587,7 +587,7 @@ A reference to {0} could not be added. Please make sure that the file is accessible, and that it is a valid assembly or COM component. - Não foi possível adicionar uma referência ao {0}. Certifique-se de que o arquivo está acessível e se ele é um assembly ou um componente COM válido. + Não foi possível adicionar uma referência a {0}. Verifique se esse arquivo está acessível e se é um assembly ou componente COM válido. @@ -792,7 +792,7 @@ Path - Caminho + PATH diff --git a/vsintegration/src/FSharp.ProjectSystem.Base/Project/xlf/Microsoft.VisualStudio.Package.Project.ru.xlf b/vsintegration/src/FSharp.ProjectSystem.Base/Project/xlf/Microsoft.VisualStudio.Package.Project.ru.xlf index 00f7ac219dc..71484ba3f3d 100644 --- a/vsintegration/src/FSharp.ProjectSystem.Base/Project/xlf/Microsoft.VisualStudio.Package.Project.ru.xlf +++ b/vsintegration/src/FSharp.ProjectSystem.Base/Project/xlf/Microsoft.VisualStudio.Package.Project.ru.xlf @@ -39,7 +39,7 @@ How the file relates to the build and deployment process - Роль этого файла в процессе сборки и развертывания + Роль этого файла в процессе построения и развертывания Project Build Property Description @@ -59,7 +59,7 @@ Compile - Компилировать + Компиляция Build Action - drop down option @@ -79,7 +79,7 @@ Content - Объект + Содержимое Build Action - drop down option @@ -99,7 +99,7 @@ Diagnostic - Диагностический + Диагностика @@ -119,7 +119,7 @@ error - ошибка + Ошибка @@ -252,7 +252,7 @@ Minimal - Минимальные + minimal @@ -262,12 +262,12 @@ None - Отсутствует + NONE Normal - Средний + NORMAL @@ -312,7 +312,7 @@ Quiet - Тихий режим + Тихий @@ -362,7 +362,7 @@ URL - URL + URL-адрес @@ -387,7 +387,7 @@ warning - предупреждение + Предупреждение @@ -507,7 +507,7 @@ Content Files - Файлы с содержимым + Файлы содержимого @@ -587,7 +587,7 @@ A reference to {0} could not be added. Please make sure that the file is accessible, and that it is a valid assembly or COM component. - Не удается добавить ссылку на "{0}". Убедитесь, что файл доступен и действительно представляет собой сборку или компонент COM. + Не удалось добавить ссылку на {0}. Убедитесь в том, что файл доступен и является допустимой сборкой или COM-компонентом. @@ -782,7 +782,7 @@ Identity - Удостоверение + Идентификатор diff --git a/vsintegration/src/FSharp.ProjectSystem.Base/Project/xlf/Microsoft.VisualStudio.Package.Project.tr.xlf b/vsintegration/src/FSharp.ProjectSystem.Base/Project/xlf/Microsoft.VisualStudio.Package.Project.tr.xlf index be3616f9b35..c382dc83183 100644 --- a/vsintegration/src/FSharp.ProjectSystem.Base/Project/xlf/Microsoft.VisualStudio.Package.Project.tr.xlf +++ b/vsintegration/src/FSharp.ProjectSystem.Base/Project/xlf/Microsoft.VisualStudio.Package.Project.tr.xlf @@ -1,4 +1,4 @@ - + @@ -119,7 +119,7 @@ error - hata + Hata @@ -227,7 +227,7 @@ Full Path - Tam Yol + Tam yol @@ -252,17 +252,17 @@ Minimal - En az + minimal Misc - Çeşitli + Misc None - Yok + yok @@ -282,7 +282,7 @@ Project - Proje + PROJE @@ -292,7 +292,7 @@ Project File - Proje Dosyası + Proje dosyası @@ -387,7 +387,7 @@ warning - uyarı + Uyarı @@ -432,7 +432,7 @@ File Properties - Dosya Özellikleri + Dosya özellikleri @@ -792,7 +792,7 @@ Path - Yol + PATH @@ -802,7 +802,7 @@ Version - Sürüm + SÜRÜM diff --git a/vsintegration/src/FSharp.ProjectSystem.Base/Project/xlf/Microsoft.VisualStudio.Package.Project.zh-Hans.xlf b/vsintegration/src/FSharp.ProjectSystem.Base/Project/xlf/Microsoft.VisualStudio.Package.Project.zh-Hans.xlf index c10c54a12dc..d9537fb1e18 100644 --- a/vsintegration/src/FSharp.ProjectSystem.Base/Project/xlf/Microsoft.VisualStudio.Package.Project.zh-Hans.xlf +++ b/vsintegration/src/FSharp.ProjectSystem.Base/Project/xlf/Microsoft.VisualStudio.Package.Project.zh-Hans.xlf @@ -1,4 +1,4 @@ - + @@ -24,12 +24,12 @@ A reference to '{0}' (with assembly name '{1}') could not be added. A reference to the component '{2}' with the same assembly name already exists in the project. - 未能添加对“{0}”的引用(使用程序集名称“{1}”)。该项目中已存在一个对具有相同程序集名称的组件“{2}”的引用。 + 无法添加对“{0}”(程序集名称为“{1}”)的引用。项目中已存在对具有相同程序集名称的组件“{2}”的引用。 ReferenceAlreadyExists error message Could not load attribute '{0}' from project file '{1}'. - 无法从项目文件“{1}”中加载属性“{0}”。 + 无法从项目文件“{1}”加载属性“{0}”。 @@ -242,7 +242,7 @@ Cannot save '{0}' outside the project directory. Linked items are not supported. - 无法在项目目录外保存“{0}”。不支持链接的项。 + 不能在项目目录外保存“{0}”。不支持链接的项。 @@ -252,7 +252,7 @@ Minimal - 最小 + 最少 @@ -262,12 +262,12 @@ None - + 没有 Normal - 常规 + 一般 @@ -282,12 +282,12 @@ Project - 项目 + PROJECT A reference to library '{0}' cannot be added. Adding this project as a reference would cause a circular dependency. - 无法添加对库“{0}”的引用。将此项目添加为引用将导致循环依赖。 + 无法添加对库“{0}”的引用。将此项目添加为引用将导致循环依赖关系。 @@ -352,7 +352,7 @@ The project file can only be saved into the project location '{0}'. - 此项目文件只能保存在项目位置“{0}”。 + 项目文件只能保存到项目位置“{0}”。 @@ -577,7 +577,7 @@ The nested project has failed to reload. - 未能重新加载此嵌套项目。 + 嵌套的项目重新加载失败。 @@ -792,7 +792,7 @@ Path - 路径 + PATH diff --git a/vsintegration/src/FSharp.ProjectSystem.Base/Project/xlf/Microsoft.VisualStudio.Package.Project.zh-Hant.xlf b/vsintegration/src/FSharp.ProjectSystem.Base/Project/xlf/Microsoft.VisualStudio.Package.Project.zh-Hant.xlf index fe5edae2aba..d1da28cf131 100644 --- a/vsintegration/src/FSharp.ProjectSystem.Base/Project/xlf/Microsoft.VisualStudio.Package.Project.zh-Hant.xlf +++ b/vsintegration/src/FSharp.ProjectSystem.Base/Project/xlf/Microsoft.VisualStudio.Package.Project.zh-Hant.xlf @@ -1,4 +1,4 @@ - + @@ -267,7 +267,7 @@ Normal - 標準 + NORMAL @@ -667,7 +667,7 @@ Indicates whether this reference is to a specific version of an assembly. - 指出這個參考是否為某一組件的特定版本。 + 指出這個參考是否指向某一組件的特定版本。 @@ -792,7 +792,7 @@ Path - 路徑 + PATH diff --git a/vsintegration/src/FSharp.ProjectSystem.FSharp/xlf/MenusAndCommands.vsct.cs.xlf b/vsintegration/src/FSharp.ProjectSystem.FSharp/xlf/MenusAndCommands.vsct.cs.xlf index 02128b8f00d..a4f0096f3ab 100644 --- a/vsintegration/src/FSharp.ProjectSystem.FSharp/xlf/MenusAndCommands.vsct.cs.xlf +++ b/vsintegration/src/FSharp.ProjectSystem.FSharp/xlf/MenusAndCommands.vsct.cs.xlf @@ -1,4 +1,4 @@ - + diff --git a/vsintegration/src/FSharp.ProjectSystem.FSharp/xlf/MenusAndCommands.vsct.de.xlf b/vsintegration/src/FSharp.ProjectSystem.FSharp/xlf/MenusAndCommands.vsct.de.xlf index 74b69acd487..81a9dcce028 100644 --- a/vsintegration/src/FSharp.ProjectSystem.FSharp/xlf/MenusAndCommands.vsct.de.xlf +++ b/vsintegration/src/FSharp.ProjectSystem.FSharp/xlf/MenusAndCommands.vsct.de.xlf @@ -1,4 +1,4 @@ - + diff --git a/vsintegration/src/FSharp.ProjectSystem.FSharp/xlf/MenusAndCommands.vsct.es.xlf b/vsintegration/src/FSharp.ProjectSystem.FSharp/xlf/MenusAndCommands.vsct.es.xlf index 5f286a95698..d15fea7358b 100644 --- a/vsintegration/src/FSharp.ProjectSystem.FSharp/xlf/MenusAndCommands.vsct.es.xlf +++ b/vsintegration/src/FSharp.ProjectSystem.FSharp/xlf/MenusAndCommands.vsct.es.xlf @@ -1,4 +1,4 @@ - + diff --git a/vsintegration/src/FSharp.ProjectSystem.FSharp/xlf/MenusAndCommands.vsct.fr.xlf b/vsintegration/src/FSharp.ProjectSystem.FSharp/xlf/MenusAndCommands.vsct.fr.xlf index 2e8a0c00453..c26cf5e9363 100644 --- a/vsintegration/src/FSharp.ProjectSystem.FSharp/xlf/MenusAndCommands.vsct.fr.xlf +++ b/vsintegration/src/FSharp.ProjectSystem.FSharp/xlf/MenusAndCommands.vsct.fr.xlf @@ -1,4 +1,4 @@ - + diff --git a/vsintegration/src/FSharp.ProjectSystem.FSharp/xlf/MenusAndCommands.vsct.it.xlf b/vsintegration/src/FSharp.ProjectSystem.FSharp/xlf/MenusAndCommands.vsct.it.xlf index 5b59a67af85..7efc02f0660 100644 --- a/vsintegration/src/FSharp.ProjectSystem.FSharp/xlf/MenusAndCommands.vsct.it.xlf +++ b/vsintegration/src/FSharp.ProjectSystem.FSharp/xlf/MenusAndCommands.vsct.it.xlf @@ -1,4 +1,4 @@ - + diff --git a/vsintegration/src/FSharp.ProjectSystem.FSharp/xlf/MenusAndCommands.vsct.ja.xlf b/vsintegration/src/FSharp.ProjectSystem.FSharp/xlf/MenusAndCommands.vsct.ja.xlf index 181e3e1d412..6518af6a1a9 100644 --- a/vsintegration/src/FSharp.ProjectSystem.FSharp/xlf/MenusAndCommands.vsct.ja.xlf +++ b/vsintegration/src/FSharp.ProjectSystem.FSharp/xlf/MenusAndCommands.vsct.ja.xlf @@ -1,4 +1,4 @@ - + diff --git a/vsintegration/src/FSharp.ProjectSystem.FSharp/xlf/MenusAndCommands.vsct.ko.xlf b/vsintegration/src/FSharp.ProjectSystem.FSharp/xlf/MenusAndCommands.vsct.ko.xlf index 4f24ffe248b..dc649c2d8cd 100644 --- a/vsintegration/src/FSharp.ProjectSystem.FSharp/xlf/MenusAndCommands.vsct.ko.xlf +++ b/vsintegration/src/FSharp.ProjectSystem.FSharp/xlf/MenusAndCommands.vsct.ko.xlf @@ -1,4 +1,4 @@ - + @@ -49,7 +49,7 @@ F# Interactive - F# Interactive + F# 대화형 @@ -84,12 +84,12 @@ &Send to F# Interactive - F# Interactive로 보내기(&S) + F# 대화형으로 보내기(&S) &Send to F# Interactive - F# Interactive로 보내기(&S) + F# 대화형으로 보내기(&S) @@ -114,12 +114,12 @@ &Send Project Output to F# Interactive - F# Interactive로 프로젝트 출력 보내기(&S) + F# 대화형으로 프로젝트 출력 보내기(&S) &Send Project Output to F# Interactive - F# Interactive로 프로젝트 출력 보내기(&S) + F# 대화형으로 프로젝트 출력 보내기(&S) diff --git a/vsintegration/src/FSharp.ProjectSystem.FSharp/xlf/MenusAndCommands.vsct.pl.xlf b/vsintegration/src/FSharp.ProjectSystem.FSharp/xlf/MenusAndCommands.vsct.pl.xlf index ed56d4a9d13..b1254473b28 100644 --- a/vsintegration/src/FSharp.ProjectSystem.FSharp/xlf/MenusAndCommands.vsct.pl.xlf +++ b/vsintegration/src/FSharp.ProjectSystem.FSharp/xlf/MenusAndCommands.vsct.pl.xlf @@ -1,4 +1,4 @@ - + @@ -74,7 +74,7 @@ Debug In Interactive - Debuguj w programie Interactive + Debuguj w trybie interaktywnym diff --git a/vsintegration/src/FSharp.ProjectSystem.FSharp/xlf/MenusAndCommands.vsct.pt-BR.xlf b/vsintegration/src/FSharp.ProjectSystem.FSharp/xlf/MenusAndCommands.vsct.pt-BR.xlf index e2a2158cf9e..88e975c7f34 100644 --- a/vsintegration/src/FSharp.ProjectSystem.FSharp/xlf/MenusAndCommands.vsct.pt-BR.xlf +++ b/vsintegration/src/FSharp.ProjectSystem.FSharp/xlf/MenusAndCommands.vsct.pt-BR.xlf @@ -1,4 +1,4 @@ - + diff --git a/vsintegration/src/FSharp.ProjectSystem.FSharp/xlf/MenusAndCommands.vsct.ru.xlf b/vsintegration/src/FSharp.ProjectSystem.FSharp/xlf/MenusAndCommands.vsct.ru.xlf index 77e44dc54ee..0be33285c3a 100644 --- a/vsintegration/src/FSharp.ProjectSystem.FSharp/xlf/MenusAndCommands.vsct.ru.xlf +++ b/vsintegration/src/FSharp.ProjectSystem.FSharp/xlf/MenusAndCommands.vsct.ru.xlf @@ -1,4 +1,4 @@ - + diff --git a/vsintegration/src/FSharp.ProjectSystem.FSharp/xlf/MenusAndCommands.vsct.tr.xlf b/vsintegration/src/FSharp.ProjectSystem.FSharp/xlf/MenusAndCommands.vsct.tr.xlf index 94f40d1055c..1ca887346d7 100644 --- a/vsintegration/src/FSharp.ProjectSystem.FSharp/xlf/MenusAndCommands.vsct.tr.xlf +++ b/vsintegration/src/FSharp.ProjectSystem.FSharp/xlf/MenusAndCommands.vsct.tr.xlf @@ -1,4 +1,4 @@ - + @@ -49,7 +49,7 @@ F# Interactive - F# Interactive + F# Etkileşimli @@ -74,7 +74,7 @@ Debug In Interactive - Etkileşimde Hata Ayıklama + Etkileşimli’de Hata Ayıklama @@ -84,12 +84,12 @@ &Send to F# Interactive - &F# Interactive'e Gönder + &F# Etkileşimli'ye Gönder &Send to F# Interactive - &F# Interactive'e Gönder + &F# Etkileşimli'ye Gönder diff --git a/vsintegration/src/FSharp.ProjectSystem.FSharp/xlf/MenusAndCommands.vsct.zh-Hans.xlf b/vsintegration/src/FSharp.ProjectSystem.FSharp/xlf/MenusAndCommands.vsct.zh-Hans.xlf index 102b31ba7b1..6456eeba61c 100644 --- a/vsintegration/src/FSharp.ProjectSystem.FSharp/xlf/MenusAndCommands.vsct.zh-Hans.xlf +++ b/vsintegration/src/FSharp.ProjectSystem.FSharp/xlf/MenusAndCommands.vsct.zh-Hans.xlf @@ -84,12 +84,12 @@ &Send to F# Interactive - 发送到 F# 交互(&S) + 发送到 F# 交互窗口(&S) &Send to F# Interactive - 发送到 F# 交互(&S) + 发送到 F# 交互窗口(&S) @@ -99,12 +99,12 @@ &Send References to F# Interactive - 将引用发送到 F# 交互(&S) + 将引用发送到 F# 交互窗口(&S) &Send References to F# Interactive - 将引用发送到 F# 交互(&S) + 将引用发送到 F# 交互窗口(&S) diff --git a/vsintegration/src/FSharp.ProjectSystem.FSharp/xlf/MenusAndCommands.vsct.zh-Hant.xlf b/vsintegration/src/FSharp.ProjectSystem.FSharp/xlf/MenusAndCommands.vsct.zh-Hant.xlf index be349e3b8e4..2434e63ee6a 100644 --- a/vsintegration/src/FSharp.ProjectSystem.FSharp/xlf/MenusAndCommands.vsct.zh-Hant.xlf +++ b/vsintegration/src/FSharp.ProjectSystem.FSharp/xlf/MenusAndCommands.vsct.zh-Hant.xlf @@ -1,4 +1,4 @@ - + @@ -99,12 +99,12 @@ &Send References to F# Interactive - 傳送參考到 F# Interactive(&S) + 傳送參考到 F# 互動 (&S) &Send References to F# Interactive - 傳送參考到 F# Interactive(&S) + 傳送參考到 F# 互動 (&S) diff --git a/vsintegration/src/FSharp.ProjectSystem.FSharp/xlf/VSPackage.cs.xlf b/vsintegration/src/FSharp.ProjectSystem.FSharp/xlf/VSPackage.cs.xlf index 5f16f51b7a6..d6e0544c20b 100644 --- a/vsintegration/src/FSharp.ProjectSystem.FSharp/xlf/VSPackage.cs.xlf +++ b/vsintegration/src/FSharp.ProjectSystem.FSharp/xlf/VSPackage.cs.xlf @@ -1,4 +1,4 @@ - + diff --git a/vsintegration/src/FSharp.ProjectSystem.FSharp/xlf/VSPackage.de.xlf b/vsintegration/src/FSharp.ProjectSystem.FSharp/xlf/VSPackage.de.xlf index 1171f11de40..61a1b07a85c 100644 --- a/vsintegration/src/FSharp.ProjectSystem.FSharp/xlf/VSPackage.de.xlf +++ b/vsintegration/src/FSharp.ProjectSystem.FSharp/xlf/VSPackage.de.xlf @@ -1,4 +1,4 @@ - + @@ -69,7 +69,7 @@ Project - Projekt + Projekt diff --git a/vsintegration/src/FSharp.ProjectSystem.FSharp/xlf/VSPackage.es.xlf b/vsintegration/src/FSharp.ProjectSystem.FSharp/xlf/VSPackage.es.xlf index 653304cb11a..b4806143a1f 100644 --- a/vsintegration/src/FSharp.ProjectSystem.FSharp/xlf/VSPackage.es.xlf +++ b/vsintegration/src/FSharp.ProjectSystem.FSharp/xlf/VSPackage.es.xlf @@ -1,4 +1,4 @@ - + @@ -84,7 +84,7 @@ Project Folder - Carpeta de proyecto + Carpeta del proyecto @@ -289,7 +289,7 @@ An empty text file - Archivo de texto vacío. + Archivo de texto vacío @@ -299,7 +299,7 @@ A blank XML file - Archivo XML en blanco. + Archivo XML en blanco @@ -399,7 +399,7 @@ A file for storing resources - Archivo para almacenar recursos. + Archivo para almacenar recursos diff --git a/vsintegration/src/FSharp.ProjectSystem.FSharp/xlf/VSPackage.fr.xlf b/vsintegration/src/FSharp.ProjectSystem.FSharp/xlf/VSPackage.fr.xlf index a587c08ae0f..677b679130c 100644 --- a/vsintegration/src/FSharp.ProjectSystem.FSharp/xlf/VSPackage.fr.xlf +++ b/vsintegration/src/FSharp.ProjectSystem.FSharp/xlf/VSPackage.fr.xlf @@ -1,4 +1,4 @@ - + @@ -399,7 +399,7 @@ A file for storing resources - Fichier de stockage des ressources + Fichier pour stocker les ressources diff --git a/vsintegration/src/FSharp.ProjectSystem.FSharp/xlf/VSPackage.it.xlf b/vsintegration/src/FSharp.ProjectSystem.FSharp/xlf/VSPackage.it.xlf index 08d29b24731..8cff31ef2b7 100644 --- a/vsintegration/src/FSharp.ProjectSystem.FSharp/xlf/VSPackage.it.xlf +++ b/vsintegration/src/FSharp.ProjectSystem.FSharp/xlf/VSPackage.it.xlf @@ -1,4 +1,4 @@ - + @@ -64,12 +64,12 @@ Sets the .ico file to use as your application icon. - Consente di impostare il file con estensione da usare come icona dell'applicazione. + Imposta il file ico da utilizzare come icona dell'applicazione. Project - Progetto + PROGETTO @@ -329,7 +329,7 @@ A project item for consuming a .NET Managed Resources File (Resx) using ResxFile type provider. - Elemento di progetto per l'utilizzo di un file di risorse gestite .NET (Resx) con il provider di tipi ResxFile. + Elemento di progetto per l'utilizzo di un file di risorse gestite .NET (Resx) utilizzando il provider di tipi ResxFile. @@ -339,7 +339,7 @@ A project item for using the SqlDataConnection (LINQ to SQL) type provider to generate types and consume data in a live SQL database. - Elemento di progetto per l'uso del provider di tipi SqlDataConnection (LINQ to SQL) per generare i tipi e utilizzare i dati in un database SQL attivo. + Elemento di progetto per l'utilizzo del provider di tipi SqlDataConnection (LINQ to SQL) per generare i tipi e utilizzare i dati in un database SQL attivo. @@ -349,7 +349,7 @@ A project item for using the SqlEntityConnection (Entity Data Model) type provider to generate types and consume data in a live SQL database. - Elemento di progetto per l'uso del provider di tipi SqlEntityConnection (Entity Data Model) per generare i tipi e utilizzare i dati in un database SQL attivo. + Elemento di progetto per l'utilizzo del provider di tipi SqlEntityConnection (Entity Data Model) per generare i tipi e utilizzare i dati in un database SQL attivo. @@ -539,7 +539,7 @@ All of the Framework assemblies are already referenced. Please use the Object Browser to explore the references in the Framework. - Si è già fatto riferimento a tutti gli assembly del framework. Usare Visualizzatore oggetti per esplorare i riferimenti nel framework. + Si è già fatto riferimento a tutti gli assembly del framework. Utilizzare Visualizzatore oggetti per esplorare i riferimenti nel framework. diff --git a/vsintegration/src/FSharp.ProjectSystem.FSharp/xlf/VSPackage.ja.xlf b/vsintegration/src/FSharp.ProjectSystem.FSharp/xlf/VSPackage.ja.xlf index 3bac34d1a98..742b365524a 100644 --- a/vsintegration/src/FSharp.ProjectSystem.FSharp/xlf/VSPackage.ja.xlf +++ b/vsintegration/src/FSharp.ProjectSystem.FSharp/xlf/VSPackage.ja.xlf @@ -1,4 +1,4 @@ - + @@ -399,7 +399,7 @@ A file for storing resources - リソースを格納するためのファイル + リソースを格納するファイル @@ -409,7 +409,7 @@ F# Interactive - F# インタラクティブ + F# Interactive @@ -459,7 +459,7 @@ F# Interactive - F# インタラクティブ + F# Interactive @@ -509,7 +509,7 @@ Change path and command line arguments passed to the F# Interactive - F# インタラクティブに渡されるパスとコマンド ライン引数を変更します + F# Interactive に渡されるパスとコマンド ライン引数を変更します diff --git a/vsintegration/src/FSharp.ProjectSystem.FSharp/xlf/VSPackage.ko.xlf b/vsintegration/src/FSharp.ProjectSystem.FSharp/xlf/VSPackage.ko.xlf index 2ddb349f1d2..611e3420a3c 100644 --- a/vsintegration/src/FSharp.ProjectSystem.FSharp/xlf/VSPackage.ko.xlf +++ b/vsintegration/src/FSharp.ProjectSystem.FSharp/xlf/VSPackage.ko.xlf @@ -1,4 +1,4 @@ - + @@ -509,7 +509,7 @@ Change path and command line arguments passed to the F# Interactive - F# 대화형에 전달된 경로 및 명령줄 인수를 변경합니다. + F# Interactive에 전달된 경로 및 명령줄 인수를 변경합니다. diff --git a/vsintegration/src/FSharp.ProjectSystem.FSharp/xlf/VSPackage.pl.xlf b/vsintegration/src/FSharp.ProjectSystem.FSharp/xlf/VSPackage.pl.xlf index 19db868b25a..436d177ce92 100644 --- a/vsintegration/src/FSharp.ProjectSystem.FSharp/xlf/VSPackage.pl.xlf +++ b/vsintegration/src/FSharp.ProjectSystem.FSharp/xlf/VSPackage.pl.xlf @@ -1,4 +1,4 @@ - + @@ -179,7 +179,7 @@ Windows - Windows + System Windows @@ -484,7 +484,7 @@ The project '{0}' could not be opened because opening it would cause a folder to be rendered multiple times in the solution explorer. One such problematic item is '{1}'. To open this project in Visual Studio, first edit the project file and fix the problem. - Nie można otworzyć projektu „{0}”, ponieważ spowodowałoby to wielokrotne renderowanie folderu w eksploratorze rozwiązań. Jednym z elementów powodujących problemy jest „{1}”. Aby otworzyć ten projekt w programie Visual Studio, najpierw edytuj plik projektu i rozwiąż problem. + Nie można otworzyć projektu „{0}”, ponieważ spowodowałoby to wielokrotne zrenderowanie folderu w eksploratorze rozwiązań. Jednym z elementów powodujących problemy jest „{1}”. Aby otworzyć ten projekt w programie Visual Studio, najpierw edytuj plik projektu i rozwiąż problem. @@ -509,7 +509,7 @@ Change path and command line arguments passed to the F# Interactive - Zmień ścieżkę i argumenty wiersza polecenia przekazywane do narzędzia F# Interactive + Zmień ścieżkę i argumenty wiersza polecenia przekazywane do programu F# Interactive diff --git a/vsintegration/src/FSharp.ProjectSystem.FSharp/xlf/VSPackage.pt-BR.xlf b/vsintegration/src/FSharp.ProjectSystem.FSharp/xlf/VSPackage.pt-BR.xlf index 845ca2cf553..dc9241bf161 100644 --- a/vsintegration/src/FSharp.ProjectSystem.FSharp/xlf/VSPackage.pt-BR.xlf +++ b/vsintegration/src/FSharp.ProjectSystem.FSharp/xlf/VSPackage.pt-BR.xlf @@ -1,4 +1,4 @@ - + diff --git a/vsintegration/src/FSharp.ProjectSystem.FSharp/xlf/VSPackage.ru.xlf b/vsintegration/src/FSharp.ProjectSystem.FSharp/xlf/VSPackage.ru.xlf index 7d372af31d6..7cccb1aa076 100644 --- a/vsintegration/src/FSharp.ProjectSystem.FSharp/xlf/VSPackage.ru.xlf +++ b/vsintegration/src/FSharp.ProjectSystem.FSharp/xlf/VSPackage.ru.xlf @@ -1,4 +1,4 @@ - + diff --git a/vsintegration/src/FSharp.ProjectSystem.FSharp/xlf/VSPackage.tr.xlf b/vsintegration/src/FSharp.ProjectSystem.FSharp/xlf/VSPackage.tr.xlf index 825c60397ef..739934c619d 100644 --- a/vsintegration/src/FSharp.ProjectSystem.FSharp/xlf/VSPackage.tr.xlf +++ b/vsintegration/src/FSharp.ProjectSystem.FSharp/xlf/VSPackage.tr.xlf @@ -1,4 +1,4 @@ - + @@ -29,7 +29,7 @@ Output Type - Çıktı Türü + Çıkış Türü @@ -69,12 +69,12 @@ Project - Proje + PROJE Project File - Proje Dosyası + Proje dosyası diff --git a/vsintegration/src/FSharp.ProjectSystem.FSharp/xlf/VSPackage.zh-Hans.xlf b/vsintegration/src/FSharp.ProjectSystem.FSharp/xlf/VSPackage.zh-Hans.xlf index 68a622d5f69..d6e1bc60642 100644 --- a/vsintegration/src/FSharp.ProjectSystem.FSharp/xlf/VSPackage.zh-Hans.xlf +++ b/vsintegration/src/FSharp.ProjectSystem.FSharp/xlf/VSPackage.zh-Hans.xlf @@ -69,7 +69,7 @@ Project - 项目 + PROJECT @@ -409,7 +409,7 @@ F# Interactive - F# 交互窗口 + F# 交互 @@ -459,7 +459,7 @@ F# Interactive - F# 交互窗口 + F# 交互 diff --git a/vsintegration/src/FSharp.ProjectSystem.FSharp/xlf/VSPackage.zh-Hant.xlf b/vsintegration/src/FSharp.ProjectSystem.FSharp/xlf/VSPackage.zh-Hant.xlf index 180e9957b9d..1ccc8023f3d 100644 --- a/vsintegration/src/FSharp.ProjectSystem.FSharp/xlf/VSPackage.zh-Hant.xlf +++ b/vsintegration/src/FSharp.ProjectSystem.FSharp/xlf/VSPackage.zh-Hant.xlf @@ -299,7 +299,7 @@ A blank XML file - 空白 XML 檔 + 空的 XML 檔 @@ -409,7 +409,7 @@ F# Interactive - F# 互動 + F# Interactive @@ -459,7 +459,7 @@ F# Interactive - F# 互動 + F# Interactive @@ -509,7 +509,7 @@ Change path and command line arguments passed to the F# Interactive - 變更傳遞到 F# 互動的路徑和命令列引數 + 變更傳遞到 F# Interactive 的路徑和命令列引數 diff --git a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/ApplicationPropPage.cs.xlf b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/ApplicationPropPage.cs.xlf index ec8edc0c8d7..4e2bdab5004 100644 --- a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/ApplicationPropPage.cs.xlf +++ b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/ApplicationPropPage.cs.xlf @@ -1,4 +1,4 @@ - + @@ -34,7 +34,7 @@ O&utput type: - Typ &výstupu: + Typ výstup&u: diff --git a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/ApplicationPropPage.de.xlf b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/ApplicationPropPage.de.xlf index 476df538616..f4cac58bb50 100644 --- a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/ApplicationPropPage.de.xlf +++ b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/ApplicationPropPage.de.xlf @@ -1,4 +1,4 @@ - + @@ -14,7 +14,7 @@ Specify how application resources will be managed: - Verwaltung von Anwendungsressourcen: + Geben Sie an, wie die Anwendungsressourcen verwaltet werden sollen: diff --git a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/ApplicationPropPage.es.xlf b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/ApplicationPropPage.es.xlf index 67b3ae1eb31..d1efc1ac634 100644 --- a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/ApplicationPropPage.es.xlf +++ b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/ApplicationPropPage.es.xlf @@ -1,4 +1,4 @@ - + diff --git a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/ApplicationPropPage.fr.xlf b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/ApplicationPropPage.fr.xlf index aef6cabab2f..535fba0b84d 100644 --- a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/ApplicationPropPage.fr.xlf +++ b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/ApplicationPropPage.fr.xlf @@ -1,4 +1,4 @@ - + diff --git a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/ApplicationPropPage.it.xlf b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/ApplicationPropPage.it.xlf index 8e8b37c8f64..0f42e210f47 100644 --- a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/ApplicationPropPage.it.xlf +++ b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/ApplicationPropPage.it.xlf @@ -1,4 +1,4 @@ - + diff --git a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/ApplicationPropPage.ko.xlf b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/ApplicationPropPage.ko.xlf index e1ef23f8dc1..eb9cef6d52d 100644 --- a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/ApplicationPropPage.ko.xlf +++ b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/ApplicationPropPage.ko.xlf @@ -1,4 +1,4 @@ - + diff --git a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/ApplicationPropPage.pl.xlf b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/ApplicationPropPage.pl.xlf index 4648179e594..cf9ac439157 100644 --- a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/ApplicationPropPage.pl.xlf +++ b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/ApplicationPropPage.pl.xlf @@ -1,4 +1,4 @@ - + diff --git a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/ApplicationPropPage.pt-BR.xlf b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/ApplicationPropPage.pt-BR.xlf index aaa6ab47b3c..c7f5eb16bf0 100644 --- a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/ApplicationPropPage.pt-BR.xlf +++ b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/ApplicationPropPage.pt-BR.xlf @@ -1,10 +1,10 @@ - + Assembly &name: - &Nome do Assembly: + &Nome do assembly: @@ -34,7 +34,7 @@ O&utput type: - Tipo de &saída: + Ti&po de saída: diff --git a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/ApplicationPropPage.ru.xlf b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/ApplicationPropPage.ru.xlf index 6d0281b6692..1c96a13b108 100644 --- a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/ApplicationPropPage.ru.xlf +++ b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/ApplicationPropPage.ru.xlf @@ -1,10 +1,10 @@ - + Assembly &name: - &Имя сборки: + Имя &сборки: diff --git a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/ApplicationPropPage.tr.xlf b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/ApplicationPropPage.tr.xlf index 92519e88aea..c0e340cf72c 100644 --- a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/ApplicationPropPage.tr.xlf +++ b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/ApplicationPropPage.tr.xlf @@ -1,4 +1,4 @@ - + @@ -34,7 +34,7 @@ O&utput type: - &Çıkış türü: + Ç&ıkış türü: diff --git a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/ApplicationPropPage.zh-Hans.xlf b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/ApplicationPropPage.zh-Hans.xlf index 6ac472f9381..f46d0dd37b0 100644 --- a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/ApplicationPropPage.zh-Hans.xlf +++ b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/ApplicationPropPage.zh-Hans.xlf @@ -1,10 +1,10 @@ - + Assembly &name: - 程序集名称(&N): + 程序集名称(&N): @@ -34,7 +34,7 @@ O&utput type: - 输出类型(&U): + 输出类型(&U): diff --git a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/BuildEventCommandLineDialog.cs.xlf b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/BuildEventCommandLineDialog.cs.xlf index d322a95b1b4..d22f9360568 100644 --- a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/BuildEventCommandLineDialog.cs.xlf +++ b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/BuildEventCommandLineDialog.cs.xlf @@ -1,4 +1,4 @@ - + diff --git a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/BuildEventCommandLineDialog.de.xlf b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/BuildEventCommandLineDialog.de.xlf index fec602bdf50..e4abf053c8a 100644 --- a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/BuildEventCommandLineDialog.de.xlf +++ b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/BuildEventCommandLineDialog.de.xlf @@ -1,4 +1,4 @@ - + diff --git a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/BuildEventCommandLineDialog.es.xlf b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/BuildEventCommandLineDialog.es.xlf index 4e3fbdd1b03..e7c5dfd783b 100644 --- a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/BuildEventCommandLineDialog.es.xlf +++ b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/BuildEventCommandLineDialog.es.xlf @@ -1,4 +1,4 @@ - + diff --git a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/BuildEventCommandLineDialog.fr.xlf b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/BuildEventCommandLineDialog.fr.xlf index 43a94c2473a..0e20482fc3f 100644 --- a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/BuildEventCommandLineDialog.fr.xlf +++ b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/BuildEventCommandLineDialog.fr.xlf @@ -1,4 +1,4 @@ - + diff --git a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/BuildEventCommandLineDialog.it.xlf b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/BuildEventCommandLineDialog.it.xlf index c6603dae24d..c541698888e 100644 --- a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/BuildEventCommandLineDialog.it.xlf +++ b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/BuildEventCommandLineDialog.it.xlf @@ -1,4 +1,4 @@ - + diff --git a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/BuildEventCommandLineDialog.ja.xlf b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/BuildEventCommandLineDialog.ja.xlf index cd6455ea64c..a2190934053 100644 --- a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/BuildEventCommandLineDialog.ja.xlf +++ b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/BuildEventCommandLineDialog.ja.xlf @@ -1,4 +1,4 @@ - + diff --git a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/BuildEventCommandLineDialog.ko.xlf b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/BuildEventCommandLineDialog.ko.xlf index 2f92bb4c707..fc64e68a250 100644 --- a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/BuildEventCommandLineDialog.ko.xlf +++ b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/BuildEventCommandLineDialog.ko.xlf @@ -1,4 +1,4 @@ - + diff --git a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/BuildEventCommandLineDialog.pl.xlf b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/BuildEventCommandLineDialog.pl.xlf index de9e2972dfb..559d3afb30b 100644 --- a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/BuildEventCommandLineDialog.pl.xlf +++ b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/BuildEventCommandLineDialog.pl.xlf @@ -1,4 +1,4 @@ - + diff --git a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/BuildEventCommandLineDialog.pt-BR.xlf b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/BuildEventCommandLineDialog.pt-BR.xlf index 4478e6ad561..639f2f4b7c1 100644 --- a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/BuildEventCommandLineDialog.pt-BR.xlf +++ b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/BuildEventCommandLineDialog.pt-BR.xlf @@ -1,4 +1,4 @@ - + diff --git a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/BuildEventCommandLineDialog.ru.xlf b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/BuildEventCommandLineDialog.ru.xlf index c9efae6f911..a04d10f5d56 100644 --- a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/BuildEventCommandLineDialog.ru.xlf +++ b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/BuildEventCommandLineDialog.ru.xlf @@ -1,4 +1,4 @@ - + diff --git a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/BuildEventCommandLineDialog.tr.xlf b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/BuildEventCommandLineDialog.tr.xlf index 9f9ac6466e7..f384ef2d891 100644 --- a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/BuildEventCommandLineDialog.tr.xlf +++ b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/BuildEventCommandLineDialog.tr.xlf @@ -1,4 +1,4 @@ - + diff --git a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/BuildEventCommandLineDialog.zh-Hans.xlf b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/BuildEventCommandLineDialog.zh-Hans.xlf index 5caf470b726..05d48d67ac2 100644 --- a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/BuildEventCommandLineDialog.zh-Hans.xlf +++ b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/BuildEventCommandLineDialog.zh-Hans.xlf @@ -1,4 +1,4 @@ - + diff --git a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/BuildEventCommandLineDialog.zh-Hant.xlf b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/BuildEventCommandLineDialog.zh-Hant.xlf index 669a3a874c9..1a2e070f542 100644 --- a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/BuildEventCommandLineDialog.zh-Hant.xlf +++ b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/BuildEventCommandLineDialog.zh-Hant.xlf @@ -1,4 +1,4 @@ - + diff --git a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/BuildEventsPropPage.cs.xlf b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/BuildEventsPropPage.cs.xlf index 6cc631bbbc7..25b8be2bb4d 100644 --- a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/BuildEventsPropPage.cs.xlf +++ b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/BuildEventsPropPage.cs.xlf @@ -1,4 +1,4 @@ - + diff --git a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/BuildEventsPropPage.de.xlf b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/BuildEventsPropPage.de.xlf index 4edb425a91d..efd390ea7d0 100644 --- a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/BuildEventsPropPage.de.xlf +++ b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/BuildEventsPropPage.de.xlf @@ -1,10 +1,10 @@ - + P&re-build event command line: - Befehlszeile für P&räbuildereignis + Befehlszeile für P&räbuildereignis: @@ -59,7 +59,7 @@ When the build updates the project output - Bei der Aktualisierung der Projektausgabe während der Erstellung + Wenn der Build die Projektausgabe aktualisiert diff --git a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/BuildEventsPropPage.es.xlf b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/BuildEventsPropPage.es.xlf index 8a687161774..fa7e8debee2 100644 --- a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/BuildEventsPropPage.es.xlf +++ b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/BuildEventsPropPage.es.xlf @@ -1,4 +1,4 @@ - + diff --git a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/BuildEventsPropPage.fr.xlf b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/BuildEventsPropPage.fr.xlf index 0f9892f65c0..f53e9b2d152 100644 --- a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/BuildEventsPropPage.fr.xlf +++ b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/BuildEventsPropPage.fr.xlf @@ -1,4 +1,4 @@ - + diff --git a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/BuildEventsPropPage.it.xlf b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/BuildEventsPropPage.it.xlf index ff6480bf0a3..d5578a8717c 100644 --- a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/BuildEventsPropPage.it.xlf +++ b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/BuildEventsPropPage.it.xlf @@ -1,4 +1,4 @@ - + diff --git a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/BuildEventsPropPage.ja.xlf b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/BuildEventsPropPage.ja.xlf index 1224d4e6cb3..34ef742a546 100644 --- a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/BuildEventsPropPage.ja.xlf +++ b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/BuildEventsPropPage.ja.xlf @@ -49,7 +49,7 @@ Always - 常時 + 常に行う diff --git a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/BuildEventsPropPage.ko.xlf b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/BuildEventsPropPage.ko.xlf index 2be535f212a..d24bbcb7111 100644 --- a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/BuildEventsPropPage.ko.xlf +++ b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/BuildEventsPropPage.ko.xlf @@ -1,10 +1,10 @@ - + P&re-build event command line: - 빌드 전 이벤트 명령줄(&R): + 빌드 이벤트 명령줄 대화 상자(&R): diff --git a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/BuildEventsPropPage.pl.xlf b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/BuildEventsPropPage.pl.xlf index e2dbc5bce5a..59ff337b414 100644 --- a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/BuildEventsPropPage.pl.xlf +++ b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/BuildEventsPropPage.pl.xlf @@ -1,4 +1,4 @@ - + diff --git a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/BuildEventsPropPage.pt-BR.xlf b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/BuildEventsPropPage.pt-BR.xlf index aec6e5568fa..93f6c1c59ea 100644 --- a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/BuildEventsPropPage.pt-BR.xlf +++ b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/BuildEventsPropPage.pt-BR.xlf @@ -1,4 +1,4 @@ - + diff --git a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/BuildEventsPropPage.ru.xlf b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/BuildEventsPropPage.ru.xlf index aa1a35894d7..1416b0f53ba 100644 --- a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/BuildEventsPropPage.ru.xlf +++ b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/BuildEventsPropPage.ru.xlf @@ -1,4 +1,4 @@ - + diff --git a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/BuildEventsPropPage.tr.xlf b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/BuildEventsPropPage.tr.xlf index b5f5bac5114..6cc5674746d 100644 --- a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/BuildEventsPropPage.tr.xlf +++ b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/BuildEventsPropPage.tr.xlf @@ -1,4 +1,4 @@ - + @@ -24,7 +24,7 @@ P&ost-build event command line: - &Oluşturma sonrası olay komut satırı: + D&erleme sonrası olay komut satırı: diff --git a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/BuildEventsPropPage.zh-Hans.xlf b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/BuildEventsPropPage.zh-Hans.xlf index 41abaed4108..a59ec76dfd8 100644 --- a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/BuildEventsPropPage.zh-Hans.xlf +++ b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/BuildEventsPropPage.zh-Hans.xlf @@ -49,7 +49,7 @@ Always - 始终 + 总是 diff --git a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/BuildPropPage.cs.xlf b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/BuildPropPage.cs.xlf index db4345b9870..d37993e8960 100644 --- a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/BuildPropPage.cs.xlf +++ b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/BuildPropPage.cs.xlf @@ -1,4 +1,4 @@ - + diff --git a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/BuildPropPage.de.xlf b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/BuildPropPage.de.xlf index 320147d129d..8b50d8a68ad 100644 --- a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/BuildPropPage.de.xlf +++ b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/BuildPropPage.de.xlf @@ -1,4 +1,4 @@ - + diff --git a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/BuildPropPage.es.xlf b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/BuildPropPage.es.xlf index d6fe8b01cb0..148b27b14c3 100644 --- a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/BuildPropPage.es.xlf +++ b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/BuildPropPage.es.xlf @@ -1,4 +1,4 @@ - + @@ -54,7 +54,7 @@ Specif&ic warnings: - Advertenc&ias específicas: + A&dvertencias específicas: diff --git a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/BuildPropPage.fr.xlf b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/BuildPropPage.fr.xlf index e0721064309..3b2937eba2d 100644 --- a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/BuildPropPage.fr.xlf +++ b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/BuildPropPage.fr.xlf @@ -1,4 +1,4 @@ - + @@ -9,7 +9,7 @@ &Prefer 32-bit - Préférer &32 bits + &Préférer 32 bits @@ -39,12 +39,12 @@ B&rowse... - Pa&rcourir... + P&arcourir... &Output path: - C&hemin de sortie : + Chemin de s&ortie : @@ -59,7 +59,7 @@ &None - Aucu&n + &Aucune @@ -104,7 +104,7 @@ Optimi&ze code - Op&timiser le code + Optimi&ser le code diff --git a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/BuildPropPage.it.xlf b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/BuildPropPage.it.xlf index 0890694a536..bfc4b4ca222 100644 --- a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/BuildPropPage.it.xlf +++ b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/BuildPropPage.it.xlf @@ -1,4 +1,4 @@ - + @@ -59,7 +59,7 @@ &None - &Nessuno + &Nessuna diff --git a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/BuildPropPage.ja.xlf b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/BuildPropPage.ja.xlf index d83b51700bf..10c7d9b936a 100644 --- a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/BuildPropPage.ja.xlf +++ b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/BuildPropPage.ja.xlf @@ -29,7 +29,7 @@ Errors and warnings - エラーと警告 + エラーおよび警告 diff --git a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/BuildPropPage.ko.xlf b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/BuildPropPage.ko.xlf index 537f14a12ca..90ac3d7d03b 100644 --- a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/BuildPropPage.ko.xlf +++ b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/BuildPropPage.ko.xlf @@ -1,4 +1,4 @@ - + diff --git a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/BuildPropPage.pl.xlf b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/BuildPropPage.pl.xlf index 1b4413c9b1d..25dfce21243 100644 --- a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/BuildPropPage.pl.xlf +++ b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/BuildPropPage.pl.xlf @@ -1,4 +1,4 @@ - + diff --git a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/BuildPropPage.pt-BR.xlf b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/BuildPropPage.pt-BR.xlf index a2ffb7e6c84..2c25e3468c9 100644 --- a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/BuildPropPage.pt-BR.xlf +++ b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/BuildPropPage.pt-BR.xlf @@ -1,4 +1,4 @@ - + @@ -44,12 +44,12 @@ &Output path: - Caminho de &saída: + Caminh&o de saída: A&ll - Tud&o + T&odos diff --git a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/BuildPropPage.ru.xlf b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/BuildPropPage.ru.xlf index 7d4a6afc0f1..f40632449a1 100644 --- a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/BuildPropPage.ru.xlf +++ b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/BuildPropPage.ru.xlf @@ -1,4 +1,4 @@ - + @@ -19,7 +19,7 @@ General - Общие + Общее diff --git a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/BuildPropPage.tr.xlf b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/BuildPropPage.tr.xlf index 7a55cc949b6..a519259ba20 100644 --- a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/BuildPropPage.tr.xlf +++ b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/BuildPropPage.tr.xlf @@ -1,10 +1,10 @@ - + Conditional compilation s&ymbols: - &Koşullu derleme simgeleri: + Koşullu derleme s&embolleri: @@ -34,7 +34,7 @@ &XML documentation file: - &XML belgesi dosyası: + &XML belge dosyası: @@ -104,7 +104,7 @@ Optimi&ze code - &Kodu iyileştir + Kodu iyileş&tir @@ -129,7 +129,7 @@ Define DEB&UG constant - HATA &AYIKLAMA sabiti tanımla + DEB&UG sabitini tanımla diff --git a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/BuildPropPage.zh-Hans.xlf b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/BuildPropPage.zh-Hans.xlf index 7189b489018..43f058d2d98 100644 --- a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/BuildPropPage.zh-Hans.xlf +++ b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/BuildPropPage.zh-Hans.xlf @@ -1,10 +1,10 @@ - + Conditional compilation s&ymbols: - 条件编译符号(&Y): + 条件编译符号(&Y): @@ -49,12 +49,12 @@ A&ll - 全部(&L) + 所有(&L) Specif&ic warnings: - 特定警告(&I): + 特定警告(&I): diff --git a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/BuildPropPage.zh-Hant.xlf b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/BuildPropPage.zh-Hant.xlf index b5d76de120c..73238eec1f7 100644 --- a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/BuildPropPage.zh-Hant.xlf +++ b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/BuildPropPage.zh-Hant.xlf @@ -1,4 +1,4 @@ - + diff --git a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/DebugPropPage.cs.xlf b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/DebugPropPage.cs.xlf index 4fbcdb22b63..b7f7db82845 100644 --- a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/DebugPropPage.cs.xlf +++ b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/DebugPropPage.cs.xlf @@ -1,4 +1,4 @@ - + diff --git a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/DebugPropPage.de.xlf b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/DebugPropPage.de.xlf index 2e570490493..de4a3a88349 100644 --- a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/DebugPropPage.de.xlf +++ b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/DebugPropPage.de.xlf @@ -1,4 +1,4 @@ - + diff --git a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/DebugPropPage.es.xlf b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/DebugPropPage.es.xlf index 6c4f55c9e71..623a095ee6c 100644 --- a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/DebugPropPage.es.xlf +++ b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/DebugPropPage.es.xlf @@ -1,4 +1,4 @@ - + @@ -39,7 +39,7 @@ Comma&nd line arguments: - &Argumentos de la línea de comandos: + Argume&ntos de la línea de comandos: @@ -74,7 +74,7 @@ Enable SQ&L Server debugging - &Habilitar depuración de SQL Server + Habilitar depuración de SQ&L Server diff --git a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/DebugPropPage.fr.xlf b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/DebugPropPage.fr.xlf index be876b43811..d7e927fcfbd 100644 --- a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/DebugPropPage.fr.xlf +++ b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/DebugPropPage.fr.xlf @@ -1,4 +1,4 @@ - + diff --git a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/DebugPropPage.it.xlf b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/DebugPropPage.it.xlf index cc4d9cd5c87..6628f68dda5 100644 --- a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/DebugPropPage.it.xlf +++ b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/DebugPropPage.it.xlf @@ -1,4 +1,4 @@ - + diff --git a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/DebugPropPage.pl.xlf b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/DebugPropPage.pl.xlf index bb6d9cc7666..3cb518e1054 100644 --- a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/DebugPropPage.pl.xlf +++ b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/DebugPropPage.pl.xlf @@ -1,4 +1,4 @@ - + diff --git a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/DebugPropPage.pt-BR.xlf b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/DebugPropPage.pt-BR.xlf index e9c3aa64ff7..bebb8eb708d 100644 --- a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/DebugPropPage.pt-BR.xlf +++ b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/DebugPropPage.pt-BR.xlf @@ -1,4 +1,4 @@ - + @@ -74,7 +74,7 @@ Enable SQ&L Server debugging - Habilitar depuração do SQ&L Server + Habilitar a depuração do SQ&L Server diff --git a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/DebugPropPage.ru.xlf b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/DebugPropPage.ru.xlf index e6efd612b58..f14f4e935de 100644 --- a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/DebugPropPage.ru.xlf +++ b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/DebugPropPage.ru.xlf @@ -1,4 +1,4 @@ - + @@ -9,12 +9,12 @@ &Start project - &Запустить проект + &Запуск проекта Start e&xternal program: - &Запуск внешней программы: + Запуск &внешней программы: diff --git a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/DebugPropPage.tr.xlf b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/DebugPropPage.tr.xlf index ba949c79550..833e0b33f42 100644 --- a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/DebugPropPage.tr.xlf +++ b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/DebugPropPage.tr.xlf @@ -1,4 +1,4 @@ - + @@ -19,7 +19,7 @@ Program to start - Başlatılacak Program + Başlatılacak program @@ -74,7 +74,7 @@ Enable SQ&L Server debugging - SQ&L Server üzerinde hata ayıklamayı etkinleştir + SQ&L Server hata ayıklamasını etkinleştir diff --git a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/DebugPropPage.zh-Hans.xlf b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/DebugPropPage.zh-Hans.xlf index 62204f8c922..d0d3cd5e240 100644 --- a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/DebugPropPage.zh-Hans.xlf +++ b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/DebugPropPage.zh-Hans.xlf @@ -14,7 +14,7 @@ Start e&xternal program: - 启动外部程序(&X): + 启动外部程序(&X): diff --git a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/DebugPropPage.zh-Hant.xlf b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/DebugPropPage.zh-Hant.xlf index 8363b99591c..8d12410079c 100644 --- a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/DebugPropPage.zh-Hant.xlf +++ b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/DebugPropPage.zh-Hant.xlf @@ -14,7 +14,7 @@ Start e&xternal program: - 起始外部程式(&X): + 啟動外部程式(&X): @@ -39,7 +39,7 @@ Comma&nd line arguments: - 命令列的引數(&N): + 命令列引數(&N): diff --git a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/PropPageHostDialog.cs.xlf b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/PropPageHostDialog.cs.xlf index 9fcb5feb91a..5341e67ab86 100644 --- a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/PropPageHostDialog.cs.xlf +++ b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/PropPageHostDialog.cs.xlf @@ -1,4 +1,4 @@ - + diff --git a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/PropPageHostDialog.de.xlf b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/PropPageHostDialog.de.xlf index e35db629104..1e49de26935 100644 --- a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/PropPageHostDialog.de.xlf +++ b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/PropPageHostDialog.de.xlf @@ -1,4 +1,4 @@ - + diff --git a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/PropPageHostDialog.es.xlf b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/PropPageHostDialog.es.xlf index 878c944cd3b..3e83917f8d0 100644 --- a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/PropPageHostDialog.es.xlf +++ b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/PropPageHostDialog.es.xlf @@ -1,4 +1,4 @@ - + diff --git a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/PropPageHostDialog.fr.xlf b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/PropPageHostDialog.fr.xlf index a50f390374c..8cf63e41f08 100644 --- a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/PropPageHostDialog.fr.xlf +++ b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/PropPageHostDialog.fr.xlf @@ -1,4 +1,4 @@ - + diff --git a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/PropPageHostDialog.it.xlf b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/PropPageHostDialog.it.xlf index f7f2c8a3adc..d6d276b1837 100644 --- a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/PropPageHostDialog.it.xlf +++ b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/PropPageHostDialog.it.xlf @@ -1,4 +1,4 @@ - + diff --git a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/PropPageHostDialog.ja.xlf b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/PropPageHostDialog.ja.xlf index d4d314ddee0..3c9bc7d0ded 100644 --- a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/PropPageHostDialog.ja.xlf +++ b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/PropPageHostDialog.ja.xlf @@ -1,4 +1,4 @@ - + diff --git a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/PropPageHostDialog.ko.xlf b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/PropPageHostDialog.ko.xlf index d17247b81e3..12804e7a3ee 100644 --- a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/PropPageHostDialog.ko.xlf +++ b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/PropPageHostDialog.ko.xlf @@ -1,4 +1,4 @@ - + diff --git a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/PropPageHostDialog.pl.xlf b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/PropPageHostDialog.pl.xlf index 170199c9055..9337c152112 100644 --- a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/PropPageHostDialog.pl.xlf +++ b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/PropPageHostDialog.pl.xlf @@ -1,4 +1,4 @@ - + diff --git a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/PropPageHostDialog.pt-BR.xlf b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/PropPageHostDialog.pt-BR.xlf index b8d2524a06e..c274532d09f 100644 --- a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/PropPageHostDialog.pt-BR.xlf +++ b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/PropPageHostDialog.pt-BR.xlf @@ -1,4 +1,4 @@ - + diff --git a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/PropPageHostDialog.ru.xlf b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/PropPageHostDialog.ru.xlf index 0be5d4aaa0b..afca4527299 100644 --- a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/PropPageHostDialog.ru.xlf +++ b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/PropPageHostDialog.ru.xlf @@ -1,4 +1,4 @@ - + diff --git a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/PropPageHostDialog.tr.xlf b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/PropPageHostDialog.tr.xlf index 6ef96b01cd7..f96c4a8da41 100644 --- a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/PropPageHostDialog.tr.xlf +++ b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/PropPageHostDialog.tr.xlf @@ -1,4 +1,4 @@ - + diff --git a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/PropPageHostDialog.zh-Hans.xlf b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/PropPageHostDialog.zh-Hans.xlf index 938d6024a47..97512aa0978 100644 --- a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/PropPageHostDialog.zh-Hans.xlf +++ b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/PropPageHostDialog.zh-Hans.xlf @@ -1,4 +1,4 @@ - + diff --git a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/PropPageHostDialog.zh-Hant.xlf b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/PropPageHostDialog.zh-Hant.xlf index a0ae25961e9..9dd06888ea3 100644 --- a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/PropPageHostDialog.zh-Hant.xlf +++ b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/PropPageHostDialog.zh-Hant.xlf @@ -1,4 +1,4 @@ - + diff --git a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/PropPageUserControlBase.cs.xlf b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/PropPageUserControlBase.cs.xlf index c8e5b7cd36a..61b50997890 100644 --- a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/PropPageUserControlBase.cs.xlf +++ b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/PropPageUserControlBase.cs.xlf @@ -1,4 +1,4 @@ - + diff --git a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/PropPageUserControlBase.de.xlf b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/PropPageUserControlBase.de.xlf index 094d10306c8..9f805b1c5a3 100644 --- a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/PropPageUserControlBase.de.xlf +++ b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/PropPageUserControlBase.de.xlf @@ -1,4 +1,4 @@ - + diff --git a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/PropPageUserControlBase.es.xlf b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/PropPageUserControlBase.es.xlf index e7acc7bb0d7..1a6854976e7 100644 --- a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/PropPageUserControlBase.es.xlf +++ b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/PropPageUserControlBase.es.xlf @@ -1,4 +1,4 @@ - + diff --git a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/PropPageUserControlBase.fr.xlf b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/PropPageUserControlBase.fr.xlf index 679f951b73e..a7d280bc2db 100644 --- a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/PropPageUserControlBase.fr.xlf +++ b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/PropPageUserControlBase.fr.xlf @@ -1,4 +1,4 @@ - + diff --git a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/PropPageUserControlBase.it.xlf b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/PropPageUserControlBase.it.xlf index 916621220c2..b8b7b295ea9 100644 --- a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/PropPageUserControlBase.it.xlf +++ b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/PropPageUserControlBase.it.xlf @@ -1,4 +1,4 @@ - + diff --git a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/PropPageUserControlBase.ja.xlf b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/PropPageUserControlBase.ja.xlf index c960d267e5d..36f1da5cbc3 100644 --- a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/PropPageUserControlBase.ja.xlf +++ b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/PropPageUserControlBase.ja.xlf @@ -1,4 +1,4 @@ - + diff --git a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/PropPageUserControlBase.ko.xlf b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/PropPageUserControlBase.ko.xlf index 70df964d9ce..112e882ebe4 100644 --- a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/PropPageUserControlBase.ko.xlf +++ b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/PropPageUserControlBase.ko.xlf @@ -1,4 +1,4 @@ - + diff --git a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/PropPageUserControlBase.pl.xlf b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/PropPageUserControlBase.pl.xlf index 209f6014fd6..3d877488af4 100644 --- a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/PropPageUserControlBase.pl.xlf +++ b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/PropPageUserControlBase.pl.xlf @@ -1,4 +1,4 @@ - + diff --git a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/PropPageUserControlBase.pt-BR.xlf b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/PropPageUserControlBase.pt-BR.xlf index c5a93a9e71b..980b76d5496 100644 --- a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/PropPageUserControlBase.pt-BR.xlf +++ b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/PropPageUserControlBase.pt-BR.xlf @@ -1,4 +1,4 @@ - + diff --git a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/PropPageUserControlBase.ru.xlf b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/PropPageUserControlBase.ru.xlf index 43cf83e3fcb..07322aa70c6 100644 --- a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/PropPageUserControlBase.ru.xlf +++ b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/PropPageUserControlBase.ru.xlf @@ -1,4 +1,4 @@ - + diff --git a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/PropPageUserControlBase.tr.xlf b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/PropPageUserControlBase.tr.xlf index d6e2d953f71..d8dfa57ce72 100644 --- a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/PropPageUserControlBase.tr.xlf +++ b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/PropPageUserControlBase.tr.xlf @@ -1,4 +1,4 @@ - + diff --git a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/PropPageUserControlBase.zh-Hans.xlf b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/PropPageUserControlBase.zh-Hans.xlf index b6177ce4c46..64eccb2e0a8 100644 --- a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/PropPageUserControlBase.zh-Hans.xlf +++ b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/PropPageUserControlBase.zh-Hans.xlf @@ -1,4 +1,4 @@ - + diff --git a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/PropPageUserControlBase.zh-Hant.xlf b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/PropPageUserControlBase.zh-Hant.xlf index 2984ef0687a..59ebdbcf3e1 100644 --- a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/PropPageUserControlBase.zh-Hant.xlf +++ b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/PropPageUserControlBase.zh-Hant.xlf @@ -1,4 +1,4 @@ - + diff --git a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/ReferencePathsPropPage.cs.xlf b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/ReferencePathsPropPage.cs.xlf index c3e2c3f0a18..73bc19a60f9 100644 --- a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/ReferencePathsPropPage.cs.xlf +++ b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/ReferencePathsPropPage.cs.xlf @@ -1,4 +1,4 @@ - + @@ -9,7 +9,7 @@ &Update - &Aktualizovat + Akt&ualizovat diff --git a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/ReferencePathsPropPage.de.xlf b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/ReferencePathsPropPage.de.xlf index 494cdfc5c08..d404bd4ddfe 100644 --- a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/ReferencePathsPropPage.de.xlf +++ b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/ReferencePathsPropPage.de.xlf @@ -1,4 +1,4 @@ - + @@ -39,7 +39,7 @@ Delete - Löschen + löschen diff --git a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/ReferencePathsPropPage.es.xlf b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/ReferencePathsPropPage.es.xlf index f93118c9d9e..9502fb15b84 100644 --- a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/ReferencePathsPropPage.es.xlf +++ b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/ReferencePathsPropPage.es.xlf @@ -1,4 +1,4 @@ - + diff --git a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/ReferencePathsPropPage.fr.xlf b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/ReferencePathsPropPage.fr.xlf index 96d2c49eb32..1c1154e0b2e 100644 --- a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/ReferencePathsPropPage.fr.xlf +++ b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/ReferencePathsPropPage.fr.xlf @@ -1,4 +1,4 @@ - + @@ -39,7 +39,7 @@ Delete - Supprimer + supprimer diff --git a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/ReferencePathsPropPage.it.xlf b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/ReferencePathsPropPage.it.xlf index 9ee4b7f053a..32767e6bdea 100644 --- a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/ReferencePathsPropPage.it.xlf +++ b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/ReferencePathsPropPage.it.xlf @@ -1,4 +1,4 @@ - + diff --git a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/ReferencePathsPropPage.ja.xlf b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/ReferencePathsPropPage.ja.xlf index 2ee13151176..01d07dea709 100644 --- a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/ReferencePathsPropPage.ja.xlf +++ b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/ReferencePathsPropPage.ja.xlf @@ -1,4 +1,4 @@ - + @@ -19,7 +19,7 @@ Browse - ブラウザー + 参照 diff --git a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/ReferencePathsPropPage.ko.xlf b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/ReferencePathsPropPage.ko.xlf index 02369eb5f01..7a549eb5755 100644 --- a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/ReferencePathsPropPage.ko.xlf +++ b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/ReferencePathsPropPage.ko.xlf @@ -1,4 +1,4 @@ - + diff --git a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/ReferencePathsPropPage.pl.xlf b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/ReferencePathsPropPage.pl.xlf index 708a2d14223..e095b853263 100644 --- a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/ReferencePathsPropPage.pl.xlf +++ b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/ReferencePathsPropPage.pl.xlf @@ -1,4 +1,4 @@ - + diff --git a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/ReferencePathsPropPage.pt-BR.xlf b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/ReferencePathsPropPage.pt-BR.xlf index 2fe1e1a6063..6d3ab0ec441 100644 --- a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/ReferencePathsPropPage.pt-BR.xlf +++ b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/ReferencePathsPropPage.pt-BR.xlf @@ -1,4 +1,4 @@ - + diff --git a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/ReferencePathsPropPage.ru.xlf b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/ReferencePathsPropPage.ru.xlf index 40d3ac6c348..de3199b2abc 100644 --- a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/ReferencePathsPropPage.ru.xlf +++ b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/ReferencePathsPropPage.ru.xlf @@ -1,4 +1,4 @@ - + @@ -29,17 +29,17 @@ Move up - Вверх + Переместить вверх Move down - Вниз + Переместить вниз Delete - Удаление. + Удалить diff --git a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/ReferencePathsPropPage.tr.xlf b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/ReferencePathsPropPage.tr.xlf index 05e5266da15..0f47c169698 100644 --- a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/ReferencePathsPropPage.tr.xlf +++ b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/ReferencePathsPropPage.tr.xlf @@ -1,4 +1,4 @@ - + diff --git a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/ReferencePathsPropPage.zh-Hans.xlf b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/ReferencePathsPropPage.zh-Hans.xlf index c5195f9a2a7..6bcf6828e9e 100644 --- a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/ReferencePathsPropPage.zh-Hans.xlf +++ b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/ReferencePathsPropPage.zh-Hans.xlf @@ -1,4 +1,4 @@ - + @@ -14,7 +14,7 @@ Reference &paths: - 引用路径(&P): + 引用路径(&P): diff --git a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/ReferencePathsPropPage.zh-Hant.xlf b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/ReferencePathsPropPage.zh-Hant.xlf index 910e618c7d0..725134dd28d 100644 --- a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/ReferencePathsPropPage.zh-Hant.xlf +++ b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/PropertyPages/xlf/ReferencePathsPropPage.zh-Hant.xlf @@ -1,4 +1,4 @@ - + diff --git a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/Microsoft.VisualStudio.Editors.Designer.cs.xlf b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/Microsoft.VisualStudio.Editors.Designer.cs.xlf index 0011f9be1cb..da0a132c14e 100644 --- a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/Microsoft.VisualStudio.Editors.Designer.cs.xlf +++ b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/Microsoft.VisualStudio.Editors.Designer.cs.xlf @@ -1,4 +1,4 @@ - + @@ -19,7 +19,7 @@ Version - Verze + VERSION @@ -355,7 +355,7 @@ Vyberte prosím platnou cestu ke složce. None - Žádné + žádné @@ -390,7 +390,7 @@ Vyberte prosím platnou cestu ke složce. Use of variable prior to assignment - Použití proměnné před přiřazením + Použití proměnné závisí na předchozím přiřazení @@ -819,7 +819,7 @@ Chyba: Windows Application - Aplikace pro systém Windows + Aplikace systému Windows @@ -960,7 +960,7 @@ Chyba: &Remove - Odeb&rat + O&debrat @@ -1257,7 +1257,7 @@ Chyba: The location specified is on an invalid or read-only disk, or contains a device name reserved for the system. - Zadané umístění je buď neplatné, nachází se na disku určeném jen pro čtení, nebo obsahuje název zařízení rezervovaný systémem. + Zadané umístění je buď neplatné, nachází se na disku určeném pouze pro čtení, nebo obsahuje název zařízení rezervovaný systémem. @@ -1602,7 +1602,7 @@ Chyba: (None) - (Žádný) + (žádné) Default Event @@ -1830,7 +1830,6 @@ CONSIDER: get this from CodeDom {0} x {1} {0} x {1} Format string for showing a graphic's size - # {0} = width (as an integer) # {1} = height (as an integer) #Example, for a bitmap of width=123, height = 456, the English version of this string would be "123x456" @@ -1884,7 +1883,7 @@ CONSIDER: get this from CodeDom &Remove - Odeb&rat + O&debrat Add, Delete and Views button text in the main ToolStrip @@ -2830,22 +2829,22 @@ Chcete aktualizovat hodnotu v souboru .settings? seconds - sekundy + Sekundy minutes - minuty + Minuty hours - hodiny + Hodiny days - dny + Dny diff --git a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/Microsoft.VisualStudio.Editors.Designer.de.xlf b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/Microsoft.VisualStudio.Editors.Designer.de.xlf index 0e771c59575..8e3c01a1d57 100644 --- a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/Microsoft.VisualStudio.Editors.Designer.de.xlf +++ b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/Microsoft.VisualStudio.Editors.Designer.de.xlf @@ -1,4 +1,4 @@ - + @@ -19,12 +19,12 @@ Version - Version + VERSION Signing - Signierung + Signieren @@ -133,7 +133,7 @@ Klicken Sie auf "OK", um diese Meldung zu ignorieren und den Vorgang fortzusetze N/A - Nicht zutreffend + N/V This is used in the platform and configuration comboboxes when showing pages that don't care about the current platform/configuration @@ -355,7 +355,7 @@ Wählen Sie einen gültigen Ordnerpfad aus. None - Keine + NONE @@ -557,7 +557,7 @@ Wenn diese Einstellung geändert wird, werden die Einstellungen in allen Konfigu Invalid value - Ungültiger Wert + Ungültiger Wert. @@ -875,7 +875,7 @@ Fehler: Static - Statisch + Static @@ -1627,7 +1627,7 @@ Fehler: Comment - Kommentieren + Kommentar Column names for the string table @@ -1818,7 +1818,7 @@ CONSIDER: get this from CodeDom Comment - Kommentieren + Kommentar Columns for the "Details" view of the resource editor @@ -1830,7 +1830,6 @@ CONSIDER: get this from CodeDom {0} x {1} {0} x {1} Format string for showing a graphic's size - # {0} = width (as an integer) # {1} = height (as an integer) #Example, for a bitmap of width=123, height = 456, the English version of this string would be "123x456" diff --git a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/Microsoft.VisualStudio.Editors.Designer.es.xlf b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/Microsoft.VisualStudio.Editors.Designer.es.xlf index 89398dabf58..300e65a5405 100644 --- a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/Microsoft.VisualStudio.Editors.Designer.es.xlf +++ b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/Microsoft.VisualStudio.Editors.Designer.es.xlf @@ -1,4 +1,4 @@ - + @@ -39,7 +39,7 @@ Debug - Depurar + depurar @@ -230,12 +230,12 @@ Seleccione una ruta de acceso de carpeta válida. Invalid version format, expected "[Major]", "[Major].[Minor]", "[Major].[Minor].[Build]" or "[Major].[Minor].[Build].[Revision]" - Formato de versión no válido, se esperaba "[Principal]", "[Principal].[Secundaria]", "[Principal].[Secundaria].[Compilación]" o "[Principal].[Secundaria].[Compilación].[Revisión]" + Formato de versión no válido; se esperaba "[Principal]", "[Principal].[Secundaria]", "[Principal].[Secundaria].[Compilación]" o "[Principal].[Secundaria].[Compilación].[Revisión]" A wildcard ("*") is not allowed in this field. - No se permite el carácter comodín ("*") en este campo. + No se permite el uso de caracteres comodín ("*") en este campo. @@ -355,7 +355,7 @@ Seleccione una ruta de acceso de carpeta válida. None - Ninguno + NONE @@ -365,7 +365,7 @@ Seleccione una ruta de acceso de carpeta válida. Error - Error + Fehler @@ -390,7 +390,7 @@ Seleccione una ruta de acceso de carpeta válida. Use of variable prior to assignment - Uso de variable anterior a la asignación. + Uso de variable anterior a la asignación @@ -400,7 +400,7 @@ Seleccione una ruta de acceso de carpeta válida. Unused local variable - Variable local no usada. + Variable local no usada @@ -502,7 +502,7 @@ Si cambia este valor, se restablecerán los valores de todas las configuraciones (Custom) - (Personalizada) + (Personalizado) Don't use @@ -614,7 +614,7 @@ Error: Error - Error + Fehler @@ -684,7 +684,7 @@ Error: The new passwords do not match. Enter the password again. - Las contraseñas no coinciden. Vuelva a escribir la contraseña. + Las nuevas contraseñas no coinciden. Vuelva a escribir la contraseña. @@ -1087,7 +1087,7 @@ Error: Assembly Version - Versión del ensamblado + Versión de ensamblado @@ -1830,7 +1830,6 @@ CONSIDER: get this from CodeDom {0} x {1} {0} x {1} Format string for showing a graphic's size - # {0} = width (as an integer) # {1} = height (as an integer) #Example, for a bitmap of width=123, height = 456, the English version of this string would be "123x456" @@ -2830,22 +2829,22 @@ El nuevo valor del archivo app.config es '{1}' seconds - segundos + Segundos minutes - minutos + Minutos hours - horas + Horas days - días + Días @@ -2855,7 +2854,7 @@ El nuevo valor del archivo app.config es '{1}' An error occurred while reading the Application configuration file. The file might be corrupted or contain invalid XML. - Error al leer el archivo de configuración de la aplicación. Puede que el archivo esté dañado o que contenga código XML no válido. + Error al leer el archivo de configuración de la aplicación. Puede que esté dañado o que contenga código XML no válido. diff --git a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/Microsoft.VisualStudio.Editors.Designer.fr.xlf b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/Microsoft.VisualStudio.Editors.Designer.fr.xlf index f5e2991076c..aa5728e6f96 100644 --- a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/Microsoft.VisualStudio.Editors.Designer.fr.xlf +++ b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/Microsoft.VisualStudio.Editors.Designer.fr.xlf @@ -1,4 +1,4 @@ - + @@ -39,7 +39,7 @@ Debug - Déboguer + déboguer @@ -49,7 +49,7 @@ Database - Base de données + Base de données  @@ -69,7 +69,7 @@ Reference Paths - Chemins des références + Chemins d'accès des références @@ -215,7 +215,7 @@ Sélectionnez un chemin de dossier valide. Reference Paths - Chemins des références + Chemins d'accès des références @@ -225,7 +225,7 @@ Sélectionnez un chemin de dossier valide. Assembly Information - Informations de l'assembly + Informations sur l'assembly @@ -355,7 +355,7 @@ Sélectionnez un chemin de dossier valide. None - Aucun + Aucun(e) @@ -724,7 +724,7 @@ Erreur : Expiration Date - Date d'expiration + Date d’expiration @@ -1497,7 +1497,7 @@ Erreur : Name - Nom + Nom  @@ -1507,7 +1507,7 @@ Erreur : Name - Nom + Nom  @@ -1607,12 +1607,12 @@ Erreur : Requires: - Requiert : + Nécessite : Name - Nom + Nom  Column names for the string table @@ -1798,7 +1798,7 @@ CONSIDER: get this from CodeDom Name - Nom + Nom  Columns for the "Details" view of the resource editor @@ -1830,7 +1830,6 @@ CONSIDER: get this from CodeDom {0} x {1} {0} x {1} Format string for showing a graphic's size - # {0} = width (as an integer) # {1} = height (as an integer) #Example, for a bitmap of width=123, height = 456, the English version of this string would be "123x456" @@ -2036,7 +2035,7 @@ CONSIDER: get this from CodeDom Text Files - Fichiers texte + Fichiers textes # File dialog filters # # E.g., for icons, the actual filter created would look like "Icons (*.ico)". These resources @@ -2336,7 +2335,7 @@ CONSIDER: get this from CodeDom Browse... - Parcourir... + Parcourir… Added as the last item in the list of available types to let the user browse for a new type @@ -2361,7 +2360,7 @@ CONSIDER: get this from CodeDom Name - Nom + Nom  @@ -2830,22 +2829,22 @@ Voulez-vous mettre à jour la valeur dans le fichier .settings ? seconds - secondes + Secondes minutes - minutes + Minutes hours - heures + Heures days - jours + Jours diff --git a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/Microsoft.VisualStudio.Editors.Designer.it.xlf b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/Microsoft.VisualStudio.Editors.Designer.it.xlf index ae70606d7ca..a580463b97b 100644 --- a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/Microsoft.VisualStudio.Editors.Designer.it.xlf +++ b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/Microsoft.VisualStudio.Editors.Designer.it.xlf @@ -1,4 +1,4 @@ - + @@ -173,7 +173,7 @@ Fare clic su OK per ignorare e continuare. Fare clic su ANNULLA per selezionare Select Output Path - Seleziona percorso di output + Seleziona percorso output @@ -230,7 +230,7 @@ Selezionare un percorso della cartella valido. Invalid version format, expected "[Major]", "[Major].[Minor]", "[Major].[Minor].[Build]" or "[Major].[Minor].[Build].[Revision]" - Formato di versione non valido: previsto [Principale]", "[Principale].[Secondaria]", "[Principale].[Secondaria].[Build]" o "[Principale].[Secondaria].[Build].[Revisione] + Formato di versione non valido. Previsto "[Major]", "[Major].[Minor]", "[Major].[Minor].[Build]" o "[Major].[Minor].[Build].[Revision]" @@ -240,7 +240,7 @@ Selezionare un percorso della cartella valido. Each part of the version number for '{0}' must be an integer between 0 and {1}. - Ogni parte del numero di versione per '{0}' deve essere un numero intero compreso tra 0 e {1}. + Ogni parte del numero di versione per '{0}' deve essere un intero compreso tra 0 e {1}. @@ -370,7 +370,7 @@ Selezionare un percorso della cartella valido. (custom) - (personalizzata) + (personalizzato) @@ -380,7 +380,7 @@ Selezionare un percorso della cartella valido. Late binding; call could fail at run time - Binding tardivo. La chiamata potrebbe non riuscire in fase di esecuzione + Associazione tardiva. La chiamata potrebbe non riuscire in fase di esecuzione @@ -1697,7 +1697,7 @@ Errore: The name of the resource '{0}' cannot be used as a valid identifier, because it contains one or more invalid characters: '{1}'. Please remove or replace those characters and try again. - Il nome della risorsa '{0}' non può essere usato come identificatore valido perché contiene uno o più caratteri non validi: \'{1\}'. Rimuovere o sostituire tali caratteri e riprovare. + Il nome della risorsa '{0}' non può essere usato come identificatore valido perché contiene uno o più caratteri non validi: '{1}'. Rimuovere o sostituire tali caratteri e riprovare. {0} = Resource name @@ -1830,7 +1830,6 @@ CONSIDER: get this from CodeDom {0} x {1} {0} x {1} Format string for showing a graphic's size - # {0} = width (as an integer) # {1} = height (as an integer) #Example, for a bitmap of width=123, height = 456, the English version of this string would be "123x456" @@ -2830,22 +2829,22 @@ Aggiornare il valore nel file .settings? seconds - secondi + Secondi minutes - minuti + Minuti hours - ore + Ore days - giorni + Giorni diff --git a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/Microsoft.VisualStudio.Editors.Designer.ja.xlf b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/Microsoft.VisualStudio.Editors.Designer.ja.xlf index a8fe2004e40..e465fe5fae9 100644 --- a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/Microsoft.VisualStudio.Editors.Designer.ja.xlf +++ b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/Microsoft.VisualStudio.Editors.Designer.ja.xlf @@ -14,7 +14,7 @@ References - 参照 + 参照設定 @@ -74,12 +74,12 @@ Pre-build Event Command Line - ビルド前イベントのコマンド ライン + ビルド前に実行するコマンド ライン Post-build Event Command Line - ビルド後イベントのコマンド ライン + ビルド後に実行するコマンド ライン @@ -375,7 +375,7 @@ Please select a valid folder path. Implicit conversion - 暗黙的な変換 + 暗黙的な変換です @@ -487,7 +487,7 @@ Changing this setting will reset the settings in all configurations. Canceling... - キャンセルしています... + 取り消しています... @@ -1830,7 +1830,6 @@ CONSIDER: get this from CodeDom {0} x {1} {0} x {1} Format string for showing a graphic's size - # {0} = width (as an integer) # {1} = height (as an integer) #Example, for a bitmap of width=123, height = 456, the English version of this string would be "123x456" @@ -2123,7 +2122,7 @@ CONSIDER: get this from CodeDom Managed Resources Editor - マネージ リソース エディター + マネージド リソース エディター @@ -2840,12 +2839,12 @@ app.config ファイルでの新しい値は '{1}' です hours - + 時間 days - + 日数 diff --git a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/Microsoft.VisualStudio.Editors.Designer.ko.xlf b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/Microsoft.VisualStudio.Editors.Designer.ko.xlf index b4cf73bdbf3..245fef8a3b6 100644 --- a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/Microsoft.VisualStudio.Editors.Designer.ko.xlf +++ b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/Microsoft.VisualStudio.Editors.Designer.ko.xlf @@ -1,4 +1,4 @@ - + @@ -240,7 +240,7 @@ Please select a valid folder path. Each part of the version number for '{0}' must be an integer between 0 and {1}. - '{0}' 버전 번호의 각 부분은 0에서 {1} 사이의 정수여야 합니다. + '{0}'의 각 버전 번호 부분은 0에서 {1} 사이의 정수여야 합니다. @@ -355,7 +355,7 @@ Please select a valid folder path. None - 없음 + None @@ -537,7 +537,7 @@ Changing this setting will reset the settings in all configurations. Permission - 권한 + 사용 권한 @@ -679,7 +679,7 @@ Error: Enter a new password. - 새 암호를 입력하세요. + 새 암호를 입력하십시오. @@ -1377,7 +1377,7 @@ Error: Default Value - 기본값 + Default Value @@ -1387,7 +1387,7 @@ Error: Default Value - 기본값 + Default Value @@ -1407,7 +1407,7 @@ Error: Serializable - Serialize 가능 + 직렬화 가능 @@ -1417,7 +1417,7 @@ Error: Serializable - Serialize 가능 + 직렬화 가능 @@ -1617,7 +1617,7 @@ Error: Type - 형식 + Type Column names for the string table @@ -1627,7 +1627,7 @@ Error: Comment - 설명 + 주석 Column names for the string table @@ -1808,7 +1808,7 @@ CONSIDER: get this from CodeDom Type - 형식 + Type Columns for the "Details" view of the resource editor @@ -1818,7 +1818,7 @@ CONSIDER: get this from CodeDom Comment - 설명 + 주석 Columns for the "Details" view of the resource editor @@ -1830,7 +1830,6 @@ CONSIDER: get this from CodeDom {0} x {1} {0} x {1} Format string for showing a graphic's size - # {0} = width (as an integer) # {1} = height (as an integer) #Example, for a bitmap of width=123, height = 456, the English version of this string would be "123x456" @@ -2366,7 +2365,7 @@ CONSIDER: get this from CodeDom Type - 형식 + Type @@ -2381,7 +2380,7 @@ CONSIDER: get this from CodeDom Type '{0}' is not defined. - '{0}' 형식이 정의되어 있지 않습니다. + {0}' 형식이 정의되지 않았습니다. @@ -2855,7 +2854,7 @@ app.config 파일의 새 값은 '{1}'입니다. An error occurred while reading the Application configuration file. The file might be corrupted or contain invalid XML. - 응용 프로그램 구성 파일을 읽는 동안 오류가 발생했습니다. 파일이 손상되었거나 잘못된 XML이 포함되어 있습니다. + 지정한 응용 프로그램 구성 파일을 읽는 동안 오류가 발생했습니다. 파일이 손상되었거나 잘못된 XML이 포함되어 있습니다. diff --git a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/Microsoft.VisualStudio.Editors.Designer.pl.xlf b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/Microsoft.VisualStudio.Editors.Designer.pl.xlf index 4e053ce5db5..f76be1ae69a 100644 --- a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/Microsoft.VisualStudio.Editors.Designer.pl.xlf +++ b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/Microsoft.VisualStudio.Editors.Designer.pl.xlf @@ -1,4 +1,4 @@ - + @@ -59,7 +59,7 @@ Build - Kompilacja + Kompiluj @@ -74,7 +74,7 @@ Pre-build Event Command Line - Wiersz polecenia zdarzenia sprzed kompilacji + Wiersz polecenia zdarzenia przed kompilowaniem @@ -355,7 +355,7 @@ Wybierz prawidłową ścieżkę folderu. None - Brak + brak @@ -1077,7 +1077,7 @@ Błąd: Startup Object - Obiekt uruchomieniowy + Obiekt startowy @@ -1542,7 +1542,7 @@ Błąd: Default - Domyślne + Domyślny @@ -1582,7 +1582,7 @@ Błąd: Key - Klawisz + Klucz @@ -1607,7 +1607,7 @@ Błąd: Requires: - Wymaga: + Wymagania: @@ -1830,7 +1830,6 @@ CONSIDER: get this from CodeDom {0} x {1} {0} x {1} Format string for showing a graphic's size - # {0} = width (as an integer) # {1} = height (as an integer) #Example, for a bitmap of width=123, height = 456, the English version of this string would be "123x456" @@ -2810,7 +2809,7 @@ Czy chcesz zaktualizować wartość w pliku settings? Learn more about client application services... - Dowiedz się więcej o usługach aplikacji klienta... + Dowiedz się więcej o usługach aplikacji klienckich… @@ -2830,22 +2829,22 @@ Czy chcesz zaktualizować wartość w pliku settings? seconds - sekundy + Sekundy minutes - minuty + Minuty hours - godziny + Godziny days - dni + Dni diff --git a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/Microsoft.VisualStudio.Editors.Designer.pt-BR.xlf b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/Microsoft.VisualStudio.Editors.Designer.pt-BR.xlf index c59226370a4..112d552e161 100644 --- a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/Microsoft.VisualStudio.Editors.Designer.pt-BR.xlf +++ b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/Microsoft.VisualStudio.Editors.Designer.pt-BR.xlf @@ -1,4 +1,4 @@ - + @@ -39,7 +39,7 @@ Debug - Depurar + depurar @@ -49,7 +49,7 @@ Database - Banco de Dados + Banco de dados @@ -59,12 +59,12 @@ Build - Build + Compilar Build Events - Eventos de Build + Eventos de Compilação @@ -74,12 +74,12 @@ Pre-build Event Command Line - Linha de Comando de Eventos Pré-build + Linha de comando do evento de pré-compilação Post-build Event Command Line - Linha de Comando de Eventos Pós-build + Linha de comando do evento de pós-compilação @@ -240,7 +240,7 @@ Selecione um caminho da pasta válido. Each part of the version number for '{0}' must be an integer between 0 and {1}. - Cada parte do número de versão de '{0}' deve ser um inteiro entre 0 e {1}. + Cada parte do número de versão para '{0}' deve ser um inteiro entre 0 e {1}. @@ -350,12 +350,12 @@ Selecione um caminho da pasta válido. Base address must be a hexadecimal number with less than or equal to 8 digits, for example, 0x11000000. - O endereço base deve ser um número hexadecimal com 8 ou menos dígitos, por exemplo, 0x11000000. + O endereço base deve ser um número hexadecimal com até 8 dígitos, por exemplo, 0x11000000. None - Nenhum + NENHUM @@ -385,7 +385,7 @@ Selecione um caminho da pasta válido. Implicit type; object assumed - Tipo implícito, objeto presumido + Tipo implícito; objeto assumido @@ -405,7 +405,7 @@ Selecione um caminho da pasta válido. Instance variable accesses shared member - A variável de instância acessa o membro compartilhado + Variável de instância acessa membro compartilhado @@ -724,7 +724,7 @@ Erro: Expiration Date - Data de Vencimento + Data de Validade @@ -1803,7 +1803,7 @@ CONSIDER: get this from CodeDom Filename - Nome do arquivo + Nome do Arquivo Columns for the "Details" view of the resource editor @@ -1830,7 +1830,6 @@ CONSIDER: get this from CodeDom {0} x {1} {0} x {1} Format string for showing a graphic's size - # {0} = width (as an integer) # {1} = height (as an integer) #Example, for a bitmap of width=123, height = 456, the English version of this string would be "123x456" @@ -2830,22 +2829,22 @@ Deseja atualizar o valor no arquivo .settings? seconds - segundos + Segundos minutes - minutos + Minutos hours - horas + Horas days - dias + Dias diff --git a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/Microsoft.VisualStudio.Editors.Designer.ru.xlf b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/Microsoft.VisualStudio.Editors.Designer.ru.xlf index 80383103d67..0a3d32a55f4 100644 --- a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/Microsoft.VisualStudio.Editors.Designer.ru.xlf +++ b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/Microsoft.VisualStudio.Editors.Designer.ru.xlf @@ -1,4 +1,4 @@ - + @@ -74,12 +74,12 @@ Pre-build Event Command Line - Командная строка событий перед сборкой + Командная строка события перед сборкой Post-build Event Command Line - Командная строка событий после сборки + Командная строка события после сборки @@ -173,12 +173,12 @@ Click OK to ignore and continue. Click CANCEL to choose a different output path. Select Output Path - Выбор выходного пути + Выбор пути для вывода Select Reference Path - Выбор пути для ссылок + Выберите путь для ссылки @@ -235,7 +235,7 @@ Please select a valid folder path. A wildcard ("*") is not allowed in this field. - Знак подстановки ("*") не допускается в этом поле. + Подстановочный символ ("*") недопустим в этом поле. @@ -355,7 +355,7 @@ Please select a valid folder path. None - Нет + NONE @@ -390,7 +390,7 @@ Please select a valid folder path. Use of variable prior to assignment - Использование переменной до присваивания + Использование переменной до инициализации @@ -709,12 +709,12 @@ Error: Issued To - Получатель сертификата + Выдан (кому) Issued By - Кем выдан + Выдан (кем) @@ -779,7 +779,7 @@ Error: Enter password to open file - Введите пароль, чтобы открыть файл + Введите пароль для открытия файла @@ -875,7 +875,7 @@ Error: Static - Статическая + Static @@ -960,7 +960,7 @@ Error: &Remove - Уда&лить + &Удалить @@ -1217,7 +1217,7 @@ Error: Microsoft Visual Studio - Microsoft Visual Studio + Службы Microsoft Visual Studio Error reporting @@ -1813,7 +1813,7 @@ CONSIDER: get this from CodeDom Size - Размер + Size Columns for the "Details" view of the resource editor @@ -1830,7 +1830,6 @@ CONSIDER: get this from CodeDom {0} x {1} {0} x {1} Format string for showing a graphic's size - # {0} = width (as an integer) # {1} = height (as an integer) #Example, for a bitmap of width=123, height = 456, the English version of this string would be "123x456" @@ -1879,12 +1878,12 @@ CONSIDER: get this from CodeDom &Add - Д&обавить + & Добавить Add, Delete and Views button text in the main ToolStrip &Remove - Уда&лить + &Удалить Add, Delete and Views button text in the main ToolStrip @@ -2830,22 +2829,22 @@ Do you want to update the value in the .settings file? seconds - с + Секунды minutes - мин + Минуты hours - ч + Часы days - дн. + Дни diff --git a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/Microsoft.VisualStudio.Editors.Designer.tr.xlf b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/Microsoft.VisualStudio.Editors.Designer.tr.xlf index 689a912f21e..cddf8633f5f 100644 --- a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/Microsoft.VisualStudio.Editors.Designer.tr.xlf +++ b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/Microsoft.VisualStudio.Editors.Designer.tr.xlf @@ -1,4 +1,4 @@ - + @@ -19,7 +19,7 @@ Version - Sürüm + SÜRÜM @@ -34,7 +34,7 @@ Compile - Derleme + Derle @@ -59,7 +59,7 @@ Build - Derleme + Oluştur @@ -74,12 +74,12 @@ Pre-build Event Command Line - Derleme Öncesi Olay Komut Satırı + Oluşturma öncesi olay komut satırı Post-build Event Command Line - Derleme Sonrası Olay Komut Satırı + Oluşturma sonrası olay komut satırı @@ -98,7 +98,7 @@ Yoksayıp devam etmek için Tamam'a tıklayın. Farklı bir çıkış yolu seçm (None) - (Hiçbiri) + (Yok) @@ -113,7 +113,7 @@ Yoksayıp devam etmek için Tamam'a tıklayın. Farklı bir çıkış yolu seçm (None) - (Hiçbiri) + (Yok) @@ -143,7 +143,7 @@ Yoksayıp devam etmek için Tamam'a tıklayın. Farklı bir çıkış yolu seçm (None) - (Hiçbiri) + (Yok) @@ -355,7 +355,7 @@ Lütfen geçerli bir klasör yolu seçin. None - Hiçbiri + yok @@ -649,7 +649,7 @@ Hata: (None) - (Hiçbiri) + (Yok) @@ -1092,7 +1092,7 @@ Hata: Assembly File Version - Bütünleştirilmiş Kod Dosya Sürümü + Bütünleştirilmiş Kod Dosyası Sürümü @@ -1830,7 +1830,6 @@ CONSIDER: get this from CodeDom {0} x {1} {0} x {1} Format string for showing a graphic's size - # {0} = width (as an integer) # {1} = height (as an integer) #Example, for a bitmap of width=123, height = 456, the English version of this string would be "123x456" @@ -2830,22 +2829,22 @@ app.config dosyasındaki yeni değer: '{1}' seconds - saniye + Saniye minutes - dakika + Dakika hours - saat + Saat days - gün + Gün @@ -2940,7 +2939,7 @@ app.config dosyasındaki yeni değer: '{1}' The application will fail to run in the selected zone because of this requested elevated permission. Click the help link above for more info. - İstenen bu yükseltilmiş izin nedeniyle, uygulama seçili bölgede çalışamayacak. Daha fazla bilgi için yukarıdaki yardım bağlantısına tıklayın. + İstenen bu yükseltilmiş izin nedeniyle uygulama, seçili bölgede çalıştırılamayacak. Daha fazla bilgi için yukarıdaki yardım bağlantısına tıklayın. diff --git a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/Microsoft.VisualStudio.Editors.Designer.zh-Hans.xlf b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/Microsoft.VisualStudio.Editors.Designer.zh-Hans.xlf index 953aa3b878f..28f1a20d2e4 100644 --- a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/Microsoft.VisualStudio.Editors.Designer.zh-Hans.xlf +++ b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/Microsoft.VisualStudio.Editors.Designer.zh-Hans.xlf @@ -1,4 +1,4 @@ - + @@ -355,7 +355,7 @@ Please select a valid folder path. None - + 没有 @@ -714,7 +714,7 @@ Error: Issued By - 颁发者 + 发布者 @@ -1607,7 +1607,7 @@ Error: Requires: - 要求: + 要求: @@ -1830,7 +1830,6 @@ CONSIDER: get this from CodeDom {0} x {1} {0} x {1} Format string for showing a graphic's size - # {0} = width (as an integer) # {1} = height (as an integer) #Example, for a bitmap of width=123, height = 456, the English version of this string would be "123x456" diff --git a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/Microsoft.VisualStudio.Editors.Designer.zh-Hant.xlf b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/Microsoft.VisualStudio.Editors.Designer.zh-Hant.xlf index 272f1b2e49f..9387967e2b7 100644 --- a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/Microsoft.VisualStudio.Editors.Designer.zh-Hant.xlf +++ b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/Microsoft.VisualStudio.Editors.Designer.zh-Hant.xlf @@ -1,4 +1,4 @@ - + @@ -1617,7 +1617,7 @@ Error: Type - 類型 + 型別 Column names for the string table @@ -1808,7 +1808,7 @@ CONSIDER: get this from CodeDom Type - 類型 + 型別 Columns for the "Details" view of the resource editor @@ -1830,7 +1830,6 @@ CONSIDER: get this from CodeDom {0} x {1} {0} x {1} Format string for showing a graphic's size - # {0} = width (as an integer) # {1} = height (as an integer) #Example, for a bitmap of width=123, height = 456, the English version of this string would be "123x456" @@ -2366,7 +2365,7 @@ CONSIDER: get this from CodeDom Type - 類型 + 型別 @@ -2845,7 +2844,7 @@ app.config 檔的新值是 '{1}' days - 天數 + diff --git a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/MyExtensibilityRes.cs.xlf b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/MyExtensibilityRes.cs.xlf index ec65922d473..ce1b810cf17 100644 --- a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/MyExtensibilityRes.cs.xlf +++ b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/MyExtensibilityRes.cs.xlf @@ -1,4 +1,4 @@ - + diff --git a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/MyExtensibilityRes.de.xlf b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/MyExtensibilityRes.de.xlf index 588c6249f3b..e3a8f29376a 100644 --- a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/MyExtensibilityRes.de.xlf +++ b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/MyExtensibilityRes.de.xlf @@ -1,4 +1,4 @@ - + diff --git a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/MyExtensibilityRes.es.xlf b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/MyExtensibilityRes.es.xlf index 9376a024fb4..d0978505ed5 100644 --- a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/MyExtensibilityRes.es.xlf +++ b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/MyExtensibilityRes.es.xlf @@ -1,4 +1,4 @@ - + diff --git a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/MyExtensibilityRes.fr.xlf b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/MyExtensibilityRes.fr.xlf index 0092c58edac..1e56c5d6e19 100644 --- a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/MyExtensibilityRes.fr.xlf +++ b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/MyExtensibilityRes.fr.xlf @@ -1,4 +1,4 @@ - + diff --git a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/MyExtensibilityRes.it.xlf b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/MyExtensibilityRes.it.xlf index 2dd57154f02..6280018e839 100644 --- a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/MyExtensibilityRes.it.xlf +++ b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/MyExtensibilityRes.it.xlf @@ -1,4 +1,4 @@ - + diff --git a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/MyExtensibilityRes.pl.xlf b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/MyExtensibilityRes.pl.xlf index e671ee203c8..0f4e2675694 100644 --- a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/MyExtensibilityRes.pl.xlf +++ b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/MyExtensibilityRes.pl.xlf @@ -1,4 +1,4 @@ - + diff --git a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/MyExtensibilityRes.pt-BR.xlf b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/MyExtensibilityRes.pt-BR.xlf index 71fb221cb35..88ae7f11380 100644 --- a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/MyExtensibilityRes.pt-BR.xlf +++ b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/MyExtensibilityRes.pt-BR.xlf @@ -1,4 +1,4 @@ - + diff --git a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/MyExtensibilityRes.ru.xlf b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/MyExtensibilityRes.ru.xlf index 9878db1c549..5057b9951c1 100644 --- a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/MyExtensibilityRes.ru.xlf +++ b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/MyExtensibilityRes.ru.xlf @@ -1,4 +1,4 @@ - + diff --git a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/MyExtensibilityRes.tr.xlf b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/MyExtensibilityRes.tr.xlf index e54f9c008be..bd9dc0610f9 100644 --- a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/MyExtensibilityRes.tr.xlf +++ b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/MyExtensibilityRes.tr.xlf @@ -1,4 +1,4 @@ - + diff --git a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/MyExtensibilityRes.zh-Hans.xlf b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/MyExtensibilityRes.zh-Hans.xlf index e79e6368f9e..166ebab67b2 100644 --- a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/MyExtensibilityRes.zh-Hans.xlf +++ b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/MyExtensibilityRes.zh-Hans.xlf @@ -1,4 +1,4 @@ - + diff --git a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/WCF.cs.xlf b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/WCF.cs.xlf index 3c501581e95..653bb1767e4 100644 --- a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/WCF.cs.xlf +++ b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/WCF.cs.xlf @@ -1,4 +1,4 @@ - + diff --git a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/WCF.de.xlf b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/WCF.de.xlf index 584143c8116..2b8aaa54d29 100644 --- a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/WCF.de.xlf +++ b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/WCF.de.xlf @@ -1,4 +1,4 @@ - + diff --git a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/WCF.es.xlf b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/WCF.es.xlf index f6125e7269a..ad86a70442e 100644 --- a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/WCF.es.xlf +++ b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/WCF.es.xlf @@ -1,4 +1,4 @@ - + diff --git a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/WCF.fr.xlf b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/WCF.fr.xlf index 4703e91b134..d1965a41440 100644 --- a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/WCF.fr.xlf +++ b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/WCF.fr.xlf @@ -1,4 +1,4 @@ - + diff --git a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/WCF.it.xlf b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/WCF.it.xlf index e1289648175..8967301e759 100644 --- a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/WCF.it.xlf +++ b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/WCF.it.xlf @@ -1,4 +1,4 @@ - + diff --git a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/WCF.ko.xlf b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/WCF.ko.xlf index 8ef523f70e7..4e90e7072ad 100644 --- a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/WCF.ko.xlf +++ b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/WCF.ko.xlf @@ -1,4 +1,4 @@ - + diff --git a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/WCF.pl.xlf b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/WCF.pl.xlf index 325a2575411..d8f945b7ea0 100644 --- a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/WCF.pl.xlf +++ b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/WCF.pl.xlf @@ -1,4 +1,4 @@ - + diff --git a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/WCF.pt-BR.xlf b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/WCF.pt-BR.xlf index 52699071a4d..1ed6f1401a3 100644 --- a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/WCF.pt-BR.xlf +++ b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/WCF.pt-BR.xlf @@ -1,4 +1,4 @@ - + diff --git a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/WCF.ru.xlf b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/WCF.ru.xlf index 7c3bf7b2e09..d11ed3b461c 100644 --- a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/WCF.ru.xlf +++ b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/WCF.ru.xlf @@ -1,4 +1,4 @@ - + diff --git a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/WCF.tr.xlf b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/WCF.tr.xlf index fbd3fadfd4c..d844a6fe77f 100644 --- a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/WCF.tr.xlf +++ b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/WCF.tr.xlf @@ -1,4 +1,4 @@ - + diff --git a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/WCF.zh-Hant.xlf b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/WCF.zh-Hant.xlf index 57b2b4cfaee..6c90c96523d 100644 --- a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/WCF.zh-Hant.xlf +++ b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/WCF.zh-Hant.xlf @@ -1,4 +1,4 @@ - + diff --git a/vsintegration/src/FSharp.UIResources/xlf/Strings.cs.xlf b/vsintegration/src/FSharp.UIResources/xlf/Strings.cs.xlf index 51cb1772b68..5599384663b 100644 --- a/vsintegration/src/FSharp.UIResources/xlf/Strings.cs.xlf +++ b/vsintegration/src/FSharp.UIResources/xlf/Strings.cs.xlf @@ -1,4 +1,4 @@ - + @@ -44,7 +44,7 @@ Show completion list after a character is _deleted - Zobrazovat seznam dokončení po _odstranění znaku + _Zobrazit seznam dokončení po odstranění znaku @@ -84,7 +84,7 @@ Analyze and suggest fixes for unused values - Analyzovat a navrhovat opravy pro nepoužité hodnoty + Analyzovat a navrhnout opravy pro nepoužité hodnoty diff --git a/vsintegration/src/FSharp.UIResources/xlf/Strings.de.xlf b/vsintegration/src/FSharp.UIResources/xlf/Strings.de.xlf index 36398c92032..36eb30c673b 100644 --- a/vsintegration/src/FSharp.UIResources/xlf/Strings.de.xlf +++ b/vsintegration/src/FSharp.UIResources/xlf/Strings.de.xlf @@ -1,4 +1,4 @@ - + diff --git a/vsintegration/src/FSharp.UIResources/xlf/Strings.es.xlf b/vsintegration/src/FSharp.UIResources/xlf/Strings.es.xlf index 6bec7285ca8..1eb0d63c2b7 100644 --- a/vsintegration/src/FSharp.UIResources/xlf/Strings.es.xlf +++ b/vsintegration/src/FSharp.UIResources/xlf/Strings.es.xlf @@ -1,4 +1,4 @@ - + @@ -49,7 +49,7 @@ _Show completion list after a character is typed - _Mostrar la lista de finalización después de escribir un carácter + _Mostrar lista de finalización después de escribir un carácter diff --git a/vsintegration/src/FSharp.UIResources/xlf/Strings.fr.xlf b/vsintegration/src/FSharp.UIResources/xlf/Strings.fr.xlf index 47ee2a2ddd1..9fb8b2a29e3 100644 --- a/vsintegration/src/FSharp.UIResources/xlf/Strings.fr.xlf +++ b/vsintegration/src/FSharp.UIResources/xlf/Strings.fr.xlf @@ -1,4 +1,4 @@ - + diff --git a/vsintegration/src/FSharp.UIResources/xlf/Strings.it.xlf b/vsintegration/src/FSharp.UIResources/xlf/Strings.it.xlf index 4df3cad4e61..e17dd84ba04 100644 --- a/vsintegration/src/FSharp.UIResources/xlf/Strings.it.xlf +++ b/vsintegration/src/FSharp.UIResources/xlf/Strings.it.xlf @@ -1,4 +1,4 @@ - + @@ -84,7 +84,7 @@ Analyze and suggest fixes for unused values - Analizza e suggerisci correzioni per valori inutilizzati + Analizar y sugerir correcciones para valores no utilizados diff --git a/vsintegration/src/FSharp.UIResources/xlf/Strings.ko.xlf b/vsintegration/src/FSharp.UIResources/xlf/Strings.ko.xlf index e199a658eff..af1fb564a49 100644 --- a/vsintegration/src/FSharp.UIResources/xlf/Strings.ko.xlf +++ b/vsintegration/src/FSharp.UIResources/xlf/Strings.ko.xlf @@ -1,4 +1,4 @@ - + diff --git a/vsintegration/src/FSharp.UIResources/xlf/Strings.pl.xlf b/vsintegration/src/FSharp.UIResources/xlf/Strings.pl.xlf index d1e98b2a038..0ed48eba23a 100644 --- a/vsintegration/src/FSharp.UIResources/xlf/Strings.pl.xlf +++ b/vsintegration/src/FSharp.UIResources/xlf/Strings.pl.xlf @@ -1,4 +1,4 @@ - + diff --git a/vsintegration/src/FSharp.UIResources/xlf/Strings.pt-BR.xlf b/vsintegration/src/FSharp.UIResources/xlf/Strings.pt-BR.xlf index 2cc9825f37c..4d74493a966 100644 --- a/vsintegration/src/FSharp.UIResources/xlf/Strings.pt-BR.xlf +++ b/vsintegration/src/FSharp.UIResources/xlf/Strings.pt-BR.xlf @@ -1,4 +1,4 @@ - + diff --git a/vsintegration/src/FSharp.UIResources/xlf/Strings.ru.xlf b/vsintegration/src/FSharp.UIResources/xlf/Strings.ru.xlf index 05e4c974d61..1c2950bcdf3 100644 --- a/vsintegration/src/FSharp.UIResources/xlf/Strings.ru.xlf +++ b/vsintegration/src/FSharp.UIResources/xlf/Strings.ru.xlf @@ -1,4 +1,4 @@ - + diff --git a/vsintegration/src/FSharp.UIResources/xlf/Strings.tr.xlf b/vsintegration/src/FSharp.UIResources/xlf/Strings.tr.xlf index 8988b4a51e0..19e9dd6a5eb 100644 --- a/vsintegration/src/FSharp.UIResources/xlf/Strings.tr.xlf +++ b/vsintegration/src/FSharp.UIResources/xlf/Strings.tr.xlf @@ -1,4 +1,4 @@ - + diff --git a/vsintegration/src/FSharp.UIResources/xlf/Strings.zh-Hans.xlf b/vsintegration/src/FSharp.UIResources/xlf/Strings.zh-Hans.xlf index 1a1c14ae7fb..462d836ef26 100644 --- a/vsintegration/src/FSharp.UIResources/xlf/Strings.zh-Hans.xlf +++ b/vsintegration/src/FSharp.UIResources/xlf/Strings.zh-Hans.xlf @@ -44,7 +44,7 @@ Show completion list after a character is _deleted - 删除字符后显示完成列表 + 删除字符后显示完成列表(_D) diff --git a/vsintegration/src/FSharp.UIResources/xlf/Strings.zh-Hant.xlf b/vsintegration/src/FSharp.UIResources/xlf/Strings.zh-Hant.xlf index 6fa74c80d13..830e7edfa37 100644 --- a/vsintegration/src/FSharp.UIResources/xlf/Strings.zh-Hant.xlf +++ b/vsintegration/src/FSharp.UIResources/xlf/Strings.zh-Hant.xlf @@ -1,4 +1,4 @@ - + diff --git a/vsintegration/src/FSharp.VS.FSI/xlf/Properties.cs.xlf b/vsintegration/src/FSharp.VS.FSI/xlf/Properties.cs.xlf index 88082b432ae..b84141f2e2f 100644 --- a/vsintegration/src/FSharp.VS.FSI/xlf/Properties.cs.xlf +++ b/vsintegration/src/FSharp.VS.FSI/xlf/Properties.cs.xlf @@ -1,4 +1,4 @@ - + diff --git a/vsintegration/src/FSharp.VS.FSI/xlf/Properties.de.xlf b/vsintegration/src/FSharp.VS.FSI/xlf/Properties.de.xlf index 02f16fcd192..cbdf294922d 100644 --- a/vsintegration/src/FSharp.VS.FSI/xlf/Properties.de.xlf +++ b/vsintegration/src/FSharp.VS.FSI/xlf/Properties.de.xlf @@ -1,10 +1,10 @@ - + 64-bit F# Interactive - 64-Bit-F# Interactive + 64-Bit-Version von F# Interactive @@ -24,7 +24,7 @@ Misc - Sonstiges + Verschiedenes diff --git a/vsintegration/src/FSharp.VS.FSI/xlf/Properties.es.xlf b/vsintegration/src/FSharp.VS.FSI/xlf/Properties.es.xlf index 725e86521e8..5d803f1d2c3 100644 --- a/vsintegration/src/FSharp.VS.FSI/xlf/Properties.es.xlf +++ b/vsintegration/src/FSharp.VS.FSI/xlf/Properties.es.xlf @@ -1,4 +1,4 @@ - + diff --git a/vsintegration/src/FSharp.VS.FSI/xlf/Properties.fr.xlf b/vsintegration/src/FSharp.VS.FSI/xlf/Properties.fr.xlf index 98821a22a45..8f7a8e902b2 100644 --- a/vsintegration/src/FSharp.VS.FSI/xlf/Properties.fr.xlf +++ b/vsintegration/src/FSharp.VS.FSI/xlf/Properties.fr.xlf @@ -1,4 +1,4 @@ - + @@ -34,7 +34,7 @@ Prevents referenced assemblies from being locked by the F# Interactive process. - Empêche le blocage des assemblys référencés par le processus interactif F#. + Empêche le blocage des assemblys référencés par le processus de F# Interactive. diff --git a/vsintegration/src/FSharp.VS.FSI/xlf/Properties.it.xlf b/vsintegration/src/FSharp.VS.FSI/xlf/Properties.it.xlf index 3ab00cc2b5c..aff5f3ba58d 100644 --- a/vsintegration/src/FSharp.VS.FSI/xlf/Properties.it.xlf +++ b/vsintegration/src/FSharp.VS.FSI/xlf/Properties.it.xlf @@ -1,4 +1,4 @@ - + diff --git a/vsintegration/src/FSharp.VS.FSI/xlf/Properties.ja.xlf b/vsintegration/src/FSharp.VS.FSI/xlf/Properties.ja.xlf index 86a7626559a..5d27d8c4844 100644 --- a/vsintegration/src/FSharp.VS.FSI/xlf/Properties.ja.xlf +++ b/vsintegration/src/FSharp.VS.FSI/xlf/Properties.ja.xlf @@ -1,10 +1,10 @@ - + 64-bit F# Interactive - 64 ビット F# Interactive + 64 ビット F# インタラクティブ @@ -14,7 +14,7 @@ F# Interactive options - F# Interactive オプション + F# インタラクティブ オプション @@ -44,12 +44,12 @@ Enable debugging of F# scripts (may impact script performance, requires reset of F# Interactive) - F# スクリプトのデバッグを有効にする (スクリプトのパフォーマンスに影響を与える可能性があります。F# Interactive のリセットが必要です) + F# スクリプトのデバッグを有効にする (スクリプトのパフォーマンスに影響を与える可能性があります。F# インタラクティブのリセットが必要です) Debugging - デバッグ + デバッグ中 diff --git a/vsintegration/src/FSharp.VS.FSI/xlf/Properties.ko.xlf b/vsintegration/src/FSharp.VS.FSI/xlf/Properties.ko.xlf index 09b61356b77..8899fcea757 100644 --- a/vsintegration/src/FSharp.VS.FSI/xlf/Properties.ko.xlf +++ b/vsintegration/src/FSharp.VS.FSI/xlf/Properties.ko.xlf @@ -1,30 +1,30 @@ - + 64-bit F# Interactive - 64-bit F# Interactive + 64비트 F# 대화형 If set to true, and the current machine is 64-bit, then run F# Interactive as a 64-bit process. (Otherwise, F# Interactive is a 32-bit process.) - true로 설정하는 경우 현재 컴퓨터가 64비트이면 F# Interactive를 64비트 프로세스로 실행하고, 그렇지 않으면 F# Interactive가 32비트 프로세스로 실행됩니다. + true로 설정하는 경우 현재 컴퓨터가 64비트이면 F# 대화형을 64비트 프로세스로 실행하고, 그렇지 않으면 F# 대화형이 32비트 프로세스로 실행됩니다. F# Interactive options - F# Interactive 옵션 + F# 대화형 옵션 Additional command line arguments passed to the F# Interactive executable by Visual Studio. (optimization and debug flags are ignored if script debugging is enabled) - Visual Studio에서 F# Interactive 실행 파일로 전달되는 추가 명령줄 인수입니다. 스크립트 디버깅을 사용하도록 설정한 경우 최적화 및 디버그 플래그는 무시됩니다. + Visual Studio에서 F# 대화형 실행 파일로 전달되는 추가 명령줄 인수입니다. 스크립트 디버깅을 사용하도록 설정한 경우 최적화 및 디버그 플래그는 무시됩니다. Misc - 기타 + Misc @@ -34,7 +34,7 @@ Prevents referenced assemblies from being locked by the F# Interactive process. - 참조된 어셈블리가 F# Interactive 프로세스에 의해 잠기지 않도록 합니다. + 참조된 어셈블리가 F# 대화형 프로세스에 의해 잠기지 않도록 합니다. @@ -44,7 +44,7 @@ Enable debugging of F# scripts (may impact script performance, requires reset of F# Interactive) - F# 스크립트 디버깅 사용(스크립트 성능에 영향을 주고, F# Interactive를 다시 설정해야 할 수 있음) + F# 스크립트 디버깅 사용(스크립트 성능에 영향을 주고, F# 대화형을 다시 설정해야 할 수 있음) diff --git a/vsintegration/src/FSharp.VS.FSI/xlf/Properties.pl.xlf b/vsintegration/src/FSharp.VS.FSI/xlf/Properties.pl.xlf index be021424fa1..13bb02d1077 100644 --- a/vsintegration/src/FSharp.VS.FSI/xlf/Properties.pl.xlf +++ b/vsintegration/src/FSharp.VS.FSI/xlf/Properties.pl.xlf @@ -1,4 +1,4 @@ - + @@ -19,12 +19,12 @@ Additional command line arguments passed to the F# Interactive executable by Visual Studio. (optimization and debug flags are ignored if script debugging is enabled) - Argumenty wiersza polecenia przekazywane do pliku wykonywalnego programu F# Interactive przez program Visual Studio. (Flagi optymalizacji i debugowania są ignorowane, jeśli włączone jest debugowanie skryptów). + Argumenty wiersza polecenia przekazywane do pliku wykonywalnego narzędzia F# Interactive przez program Visual Studio. (Flagi optymalizacji i debugowania są ignorowane, jeśli włączone jest debugowanie skryptów). Misc - Różne + Misc @@ -44,7 +44,7 @@ Enable debugging of F# scripts (may impact script performance, requires reset of F# Interactive) - Włącz debugowanie skryptów w języku F# (może to mieć wpływ na wydajność skryptów, wymaga zresetowania programu F# Interactive) + Włącz debugowanie skryptów w języku F# (może to mieć wpływ na wydajność skryptów, wymaga zresetowania narzędzia F# Interactive) diff --git a/vsintegration/src/FSharp.VS.FSI/xlf/Properties.pt-BR.xlf b/vsintegration/src/FSharp.VS.FSI/xlf/Properties.pt-BR.xlf index 7ff727dbdc0..ecd2fdbc048 100644 --- a/vsintegration/src/FSharp.VS.FSI/xlf/Properties.pt-BR.xlf +++ b/vsintegration/src/FSharp.VS.FSI/xlf/Properties.pt-BR.xlf @@ -1,4 +1,4 @@ - + @@ -49,7 +49,7 @@ Debugging - Depuração + Depurando diff --git a/vsintegration/src/FSharp.VS.FSI/xlf/Properties.ru.xlf b/vsintegration/src/FSharp.VS.FSI/xlf/Properties.ru.xlf index a4acb579585..5dc37680162 100644 --- a/vsintegration/src/FSharp.VS.FSI/xlf/Properties.ru.xlf +++ b/vsintegration/src/FSharp.VS.FSI/xlf/Properties.ru.xlf @@ -1,4 +1,4 @@ - + diff --git a/vsintegration/src/FSharp.VS.FSI/xlf/Properties.tr.xlf b/vsintegration/src/FSharp.VS.FSI/xlf/Properties.tr.xlf index ef22f880df4..dba13164d2d 100644 --- a/vsintegration/src/FSharp.VS.FSI/xlf/Properties.tr.xlf +++ b/vsintegration/src/FSharp.VS.FSI/xlf/Properties.tr.xlf @@ -1,4 +1,4 @@ - + @@ -9,12 +9,12 @@ If set to true, and the current machine is 64-bit, then run F# Interactive as a 64-bit process. (Otherwise, F# Interactive is a 32-bit process.) - True olarak ayarlanırsa ve geçerli makine 64 bit ise F# Interactive'i 64 bit işlem olarak çalıştırın. (Aksi takdirde F# Interactive 32 bit işlemdir.) + True olarak ayarlanırsa ve geçerli makine 64 bit ise F# Etkileşimli'yi 64 bit işlem olarak çalıştırın. (Aksi takdirde F# Etkileşimli 32 bit işlemdir.) F# Interactive options - F# Interactive seçenekleri + F# Etkileşimli seçenekleri @@ -24,7 +24,7 @@ Misc - Çeşitli + Misc diff --git a/vsintegration/src/FSharp.VS.FSI/xlf/Properties.zh-Hans.xlf b/vsintegration/src/FSharp.VS.FSI/xlf/Properties.zh-Hans.xlf index 9ee4a212ea2..060f54a8ba3 100644 --- a/vsintegration/src/FSharp.VS.FSI/xlf/Properties.zh-Hans.xlf +++ b/vsintegration/src/FSharp.VS.FSI/xlf/Properties.zh-Hans.xlf @@ -1,4 +1,4 @@ - + @@ -14,12 +14,12 @@ F# Interactive options - F# 交互选项 + F# 交互窗口选项 Additional command line arguments passed to the F# Interactive executable by Visual Studio. (optimization and debug flags are ignored if script debugging is enabled) - 其他命令行参数传递到 Visual Studio 执行的 F# 交互可执行文件。(若已启动脚本调试,则忽略优化和调试标志) + 其他命令行参数传递到 Visual Studio 执行的 F# 交互窗口可执行文件。(若已启动脚本调试,则忽略优化和调试标志) @@ -34,7 +34,7 @@ Prevents referenced assemblies from being locked by the F# Interactive process. - 防止被引用的程序集被 F# 交互式进程锁定。 + 防止被引用的程序集被 F# 交互窗口进程锁定。 diff --git a/vsintegration/src/FSharp.VS.FSI/xlf/Properties.zh-Hant.xlf b/vsintegration/src/FSharp.VS.FSI/xlf/Properties.zh-Hant.xlf index f0739077400..3b60c892d47 100644 --- a/vsintegration/src/FSharp.VS.FSI/xlf/Properties.zh-Hant.xlf +++ b/vsintegration/src/FSharp.VS.FSI/xlf/Properties.zh-Hant.xlf @@ -9,12 +9,12 @@ If set to true, and the current machine is 64-bit, then run F# Interactive as a 64-bit process. (Otherwise, F# Interactive is a 32-bit process.) - 如果設為 true,並且目前電腦為 64 位元,則 F# Interactive 會當做 64 位元處理序來執行 (反之,F# Interactive 則為 32 位元處理序)。 + 如果設為 true,並且目前電腦為 64 位元,則 F# 互動會當做 64 位元處理序來執行 (反之,F# 互動則為 32 位元處理序)。 F# Interactive options - F# Interactive 選項 + F# 互動選項 @@ -44,7 +44,7 @@ Enable debugging of F# scripts (may impact script performance, requires reset of F# Interactive) - 啟用 F# 指令碼偵錯 (可能會影響指令碼效能,必須重設 F# Interactive) + 啟用 F# 指令碼偵錯 (可能會影響指令碼效能,必須重設 F# 互動) diff --git a/vsintegration/src/FSharp.VS.FSI/xlf/VFSIstrings.txt.cs.xlf b/vsintegration/src/FSharp.VS.FSI/xlf/VFSIstrings.txt.cs.xlf index b79b747fad9..c86727adb89 100644 --- a/vsintegration/src/FSharp.VS.FSI/xlf/VFSIstrings.txt.cs.xlf +++ b/vsintegration/src/FSharp.VS.FSI/xlf/VFSIstrings.txt.cs.xlf @@ -1,4 +1,4 @@ - + diff --git a/vsintegration/src/FSharp.VS.FSI/xlf/VFSIstrings.txt.de.xlf b/vsintegration/src/FSharp.VS.FSI/xlf/VFSIstrings.txt.de.xlf index c241350805a..32c7c963308 100644 --- a/vsintegration/src/FSharp.VS.FSI/xlf/VFSIstrings.txt.de.xlf +++ b/vsintegration/src/FSharp.VS.FSI/xlf/VFSIstrings.txt.de.xlf @@ -1,10 +1,10 @@ - + Cannot create window F# Interactive ToolWindow - Das Fenster für F# Interactive ToolWindow kann nicht erstellt werden. + Das F# Interactive-Toolfenster kann nicht erstellt werden. diff --git a/vsintegration/src/FSharp.VS.FSI/xlf/VFSIstrings.txt.es.xlf b/vsintegration/src/FSharp.VS.FSI/xlf/VFSIstrings.txt.es.xlf index 8fafdfe73df..6f70641c13c 100644 --- a/vsintegration/src/FSharp.VS.FSI/xlf/VFSIstrings.txt.es.xlf +++ b/vsintegration/src/FSharp.VS.FSI/xlf/VFSIstrings.txt.es.xlf @@ -1,4 +1,4 @@ - + diff --git a/vsintegration/src/FSharp.VS.FSI/xlf/VFSIstrings.txt.fr.xlf b/vsintegration/src/FSharp.VS.FSI/xlf/VFSIstrings.txt.fr.xlf index 14025011c11..f3644c81583 100644 --- a/vsintegration/src/FSharp.VS.FSI/xlf/VFSIstrings.txt.fr.xlf +++ b/vsintegration/src/FSharp.VS.FSI/xlf/VFSIstrings.txt.fr.xlf @@ -1,4 +1,4 @@ - + diff --git a/vsintegration/src/FSharp.VS.FSI/xlf/VFSIstrings.txt.it.xlf b/vsintegration/src/FSharp.VS.FSI/xlf/VFSIstrings.txt.it.xlf index 5f2b1b679c9..aca7dcb66cc 100644 --- a/vsintegration/src/FSharp.VS.FSI/xlf/VFSIstrings.txt.it.xlf +++ b/vsintegration/src/FSharp.VS.FSI/xlf/VFSIstrings.txt.it.xlf @@ -1,4 +1,4 @@ - + diff --git a/vsintegration/src/FSharp.VS.FSI/xlf/VFSIstrings.txt.ja.xlf b/vsintegration/src/FSharp.VS.FSI/xlf/VFSIstrings.txt.ja.xlf index 6c377da9027..23f522980dc 100644 --- a/vsintegration/src/FSharp.VS.FSI/xlf/VFSIstrings.txt.ja.xlf +++ b/vsintegration/src/FSharp.VS.FSI/xlf/VFSIstrings.txt.ja.xlf @@ -34,7 +34,7 @@ Could not find fsi.exe, the F# Interactive executable.\nThis file does not exist:\n\n{0}\n - F# Interactive 実行可能ファイルである fsi.exe が見つかりませんでした。\nこのファイルは存在しません:\n\n{0}\n + F# インタラクティブ実行可能ファイルである fsi.exe が見つかりませんでした。\nこのファイルは存在しません:\n\n{0}\n @@ -44,7 +44,7 @@ The current F# Interactive session is not configured for debugging. For the best experience, enable debugging in F# Interactive settings, then reset the session.\n\nAttempt debugging with current settings? - 現在の F# Interactive セッションは、デバッグのために構成されていません。最適にご利用いただくには、F# Interactive 設定でデバッグを有効にし、セッションをリセットしてください。\n\n現在の設定でデバッグを試みますか? + 現在の F# インタラクティブ セッションは、デバッグのために構成されていません。最適にご利用いただくには、F# インタラクティブ設定でデバッグを有効にし、セッションをリセットしてください。\n\n現在の設定でデバッグを試みますか? diff --git a/vsintegration/src/FSharp.VS.FSI/xlf/VFSIstrings.txt.ko.xlf b/vsintegration/src/FSharp.VS.FSI/xlf/VFSIstrings.txt.ko.xlf index de1927894ce..ad357da1d98 100644 --- a/vsintegration/src/FSharp.VS.FSI/xlf/VFSIstrings.txt.ko.xlf +++ b/vsintegration/src/FSharp.VS.FSI/xlf/VFSIstrings.txt.ko.xlf @@ -1,10 +1,10 @@ - + Cannot create window F# Interactive ToolWindow - F# Interactive ToolWindow 창을 만들 수 없습니다. + F# 대화형 ToolWindow 창을 만들 수 없습니다. @@ -29,7 +29,7 @@ F# Interactive - F# Interactive + F# 대화형 diff --git a/vsintegration/src/FSharp.VS.FSI/xlf/VFSIstrings.txt.pl.xlf b/vsintegration/src/FSharp.VS.FSI/xlf/VFSIstrings.txt.pl.xlf index 29a46076755..a0e55d73b01 100644 --- a/vsintegration/src/FSharp.VS.FSI/xlf/VFSIstrings.txt.pl.xlf +++ b/vsintegration/src/FSharp.VS.FSI/xlf/VFSIstrings.txt.pl.xlf @@ -1,4 +1,4 @@ - + @@ -44,7 +44,7 @@ The current F# Interactive session is not configured for debugging. For the best experience, enable debugging in F# Interactive settings, then reset the session.\n\nAttempt debugging with current settings? - Bieżąca sesja programu F# Interactive nie jest skonfigurowana do debugowania. Aby uzyskać najlepszy efekt, włącz debugowanie w ustawieniach programu F# Interactive, a następnie zresetuj sesję.\n\nPodjąć próbę debugowania z bieżącymi ustawieniami? + Bieżąca sesja narzędzia F# Interactive nie jest skonfigurowana do debugowania. Aby uzyskać najlepszy efekt, włącz debugowanie w ustawieniach narzędzia F# Interactive, a następnie zresetuj sesję.\n\nPodjąć próbę debugowania z bieżącymi ustawieniami? diff --git a/vsintegration/src/FSharp.VS.FSI/xlf/VFSIstrings.txt.pt-BR.xlf b/vsintegration/src/FSharp.VS.FSI/xlf/VFSIstrings.txt.pt-BR.xlf index e09d486218a..2006daaf86a 100644 --- a/vsintegration/src/FSharp.VS.FSI/xlf/VFSIstrings.txt.pt-BR.xlf +++ b/vsintegration/src/FSharp.VS.FSI/xlf/VFSIstrings.txt.pt-BR.xlf @@ -1,10 +1,10 @@ - + Cannot create window F# Interactive ToolWindow - Não é possível criar a Janela interativa F# ToolWindow + Não é possível criar a Janela F# Interativo ToolWindow diff --git a/vsintegration/src/FSharp.VS.FSI/xlf/VFSIstrings.txt.ru.xlf b/vsintegration/src/FSharp.VS.FSI/xlf/VFSIstrings.txt.ru.xlf index c0b711f3b86..5bb16785316 100644 --- a/vsintegration/src/FSharp.VS.FSI/xlf/VFSIstrings.txt.ru.xlf +++ b/vsintegration/src/FSharp.VS.FSI/xlf/VFSIstrings.txt.ru.xlf @@ -1,4 +1,4 @@ - + diff --git a/vsintegration/src/FSharp.VS.FSI/xlf/VFSIstrings.txt.tr.xlf b/vsintegration/src/FSharp.VS.FSI/xlf/VFSIstrings.txt.tr.xlf index 41ee78b8713..785809a6d7c 100644 --- a/vsintegration/src/FSharp.VS.FSI/xlf/VFSIstrings.txt.tr.xlf +++ b/vsintegration/src/FSharp.VS.FSI/xlf/VFSIstrings.txt.tr.xlf @@ -1,4 +1,4 @@ - + @@ -29,7 +29,7 @@ F# Interactive - F# Interactive + F# Etkileşimli @@ -44,7 +44,7 @@ The current F# Interactive session is not configured for debugging. For the best experience, enable debugging in F# Interactive settings, then reset the session.\n\nAttempt debugging with current settings? - Geçerli F# Interactive oturumu hata ayıklama için yapılandırılmamış. En iyi deneyim için, F# Interactive ayarlarında hata ayıklamayı etkinleştirin ve ardından oturumu sıfırlayın.\n\nGeçerli ayarlarla hata ayıklama denensin mi? + Geçerli F# Etkileşimli oturumu hata ayıklama için yapılandırılmamış. En iyi deneyim için, F# Etkileşimli ayarlarında hata ayıklamayı etkinleştirin ve ardından oturumu sıfırlayın.\n\nGeçerli ayarlarla hata ayıklama denensin mi? diff --git a/vsintegration/src/FSharp.VS.FSI/xlf/VFSIstrings.txt.zh-Hans.xlf b/vsintegration/src/FSharp.VS.FSI/xlf/VFSIstrings.txt.zh-Hans.xlf index 2340318ee6c..9bc022caba2 100644 --- a/vsintegration/src/FSharp.VS.FSI/xlf/VFSIstrings.txt.zh-Hans.xlf +++ b/vsintegration/src/FSharp.VS.FSI/xlf/VFSIstrings.txt.zh-Hans.xlf @@ -4,7 +4,7 @@ Cannot create window F# Interactive ToolWindow - 无法创建窗口 F# 交互 ToolWindow + 无法创建“F# 交互窗口”工具窗口 @@ -34,7 +34,7 @@ Could not find fsi.exe, the F# Interactive executable.\nThis file does not exist:\n\n{0}\n - 未能找到 F# 交互可执行文件 fsi.exe。\n此文件不存在:\n\n{0}\n + 未能找到 F# 交互窗口可执行文件 fsi.exe。\n此文件不存在:\n\n{0}\n diff --git a/vsintegration/src/FSharp.VS.FSI/xlf/VFSIstrings.txt.zh-Hant.xlf b/vsintegration/src/FSharp.VS.FSI/xlf/VFSIstrings.txt.zh-Hant.xlf index 1fff22f1701..b891d6630c1 100644 --- a/vsintegration/src/FSharp.VS.FSI/xlf/VFSIstrings.txt.zh-Hant.xlf +++ b/vsintegration/src/FSharp.VS.FSI/xlf/VFSIstrings.txt.zh-Hant.xlf @@ -4,7 +4,7 @@ Cannot create window F# Interactive ToolWindow - 無法建立視窗 F# Interactive 工具視窗 + 無法建立視窗 F# 互動工具視窗 @@ -44,7 +44,7 @@ The current F# Interactive session is not configured for debugging. For the best experience, enable debugging in F# Interactive settings, then reset the session.\n\nAttempt debugging with current settings? - 目前的 F# Interactive 工作階段並未設定偵錯功能。最佳做法是啟用 F# Interactive 設定中的偵錯設定,然後重設此工作階段。\n\n要嘗試使用目前的設定進行偵錯嗎? + 目前的 F# 互動工作階段並未設定偵錯功能。最佳做法是啟用 F# 互動設定中的偵錯設定,然後重設此工作階段。\n\n要嘗試使用目前的設定進行偵錯嗎? diff --git a/vsintegration/src/FSharp.VS.FSI/xlf/VSPackage.cs.xlf b/vsintegration/src/FSharp.VS.FSI/xlf/VSPackage.cs.xlf index 94409a3ba83..05471435c84 100644 --- a/vsintegration/src/FSharp.VS.FSI/xlf/VSPackage.cs.xlf +++ b/vsintegration/src/FSharp.VS.FSI/xlf/VSPackage.cs.xlf @@ -1,4 +1,4 @@ - + diff --git a/vsintegration/src/FSharp.VS.FSI/xlf/VSPackage.de.xlf b/vsintegration/src/FSharp.VS.FSI/xlf/VSPackage.de.xlf index 6d23fd5f296..dba7119a85e 100644 --- a/vsintegration/src/FSharp.VS.FSI/xlf/VSPackage.de.xlf +++ b/vsintegration/src/FSharp.VS.FSI/xlf/VSPackage.de.xlf @@ -1,4 +1,4 @@ - + diff --git a/vsintegration/src/FSharp.VS.FSI/xlf/VSPackage.es.xlf b/vsintegration/src/FSharp.VS.FSI/xlf/VSPackage.es.xlf index 5dac8007e72..d81c9d111fe 100644 --- a/vsintegration/src/FSharp.VS.FSI/xlf/VSPackage.es.xlf +++ b/vsintegration/src/FSharp.VS.FSI/xlf/VSPackage.es.xlf @@ -1,4 +1,4 @@ - + diff --git a/vsintegration/src/FSharp.VS.FSI/xlf/VSPackage.fr.xlf b/vsintegration/src/FSharp.VS.FSI/xlf/VSPackage.fr.xlf index 13eee90d1bb..131836a088a 100644 --- a/vsintegration/src/FSharp.VS.FSI/xlf/VSPackage.fr.xlf +++ b/vsintegration/src/FSharp.VS.FSI/xlf/VSPackage.fr.xlf @@ -1,4 +1,4 @@ - + diff --git a/vsintegration/src/FSharp.VS.FSI/xlf/VSPackage.it.xlf b/vsintegration/src/FSharp.VS.FSI/xlf/VSPackage.it.xlf index 3663e52ff36..827a3f071a7 100644 --- a/vsintegration/src/FSharp.VS.FSI/xlf/VSPackage.it.xlf +++ b/vsintegration/src/FSharp.VS.FSI/xlf/VSPackage.it.xlf @@ -1,4 +1,4 @@ - + diff --git a/vsintegration/src/FSharp.VS.FSI/xlf/VSPackage.ja.xlf b/vsintegration/src/FSharp.VS.FSI/xlf/VSPackage.ja.xlf index e72e126b1fd..4fede981d4c 100644 --- a/vsintegration/src/FSharp.VS.FSI/xlf/VSPackage.ja.xlf +++ b/vsintegration/src/FSharp.VS.FSI/xlf/VSPackage.ja.xlf @@ -1,4 +1,4 @@ - + diff --git a/vsintegration/src/FSharp.VS.FSI/xlf/VSPackage.ko.xlf b/vsintegration/src/FSharp.VS.FSI/xlf/VSPackage.ko.xlf index 2cf2374c950..18358f87a30 100644 --- a/vsintegration/src/FSharp.VS.FSI/xlf/VSPackage.ko.xlf +++ b/vsintegration/src/FSharp.VS.FSI/xlf/VSPackage.ko.xlf @@ -1,4 +1,4 @@ - + diff --git a/vsintegration/src/FSharp.VS.FSI/xlf/VSPackage.pl.xlf b/vsintegration/src/FSharp.VS.FSI/xlf/VSPackage.pl.xlf index 5c93445d21f..c7fa3150e06 100644 --- a/vsintegration/src/FSharp.VS.FSI/xlf/VSPackage.pl.xlf +++ b/vsintegration/src/FSharp.VS.FSI/xlf/VSPackage.pl.xlf @@ -1,4 +1,4 @@ - + diff --git a/vsintegration/src/FSharp.VS.FSI/xlf/VSPackage.pt-BR.xlf b/vsintegration/src/FSharp.VS.FSI/xlf/VSPackage.pt-BR.xlf index 6eafbec312d..d3efcae6cbd 100644 --- a/vsintegration/src/FSharp.VS.FSI/xlf/VSPackage.pt-BR.xlf +++ b/vsintegration/src/FSharp.VS.FSI/xlf/VSPackage.pt-BR.xlf @@ -1,4 +1,4 @@ - + diff --git a/vsintegration/src/FSharp.VS.FSI/xlf/VSPackage.ru.xlf b/vsintegration/src/FSharp.VS.FSI/xlf/VSPackage.ru.xlf index 82128f9ce6f..7dff862c42b 100644 --- a/vsintegration/src/FSharp.VS.FSI/xlf/VSPackage.ru.xlf +++ b/vsintegration/src/FSharp.VS.FSI/xlf/VSPackage.ru.xlf @@ -1,4 +1,4 @@ - + diff --git a/vsintegration/src/FSharp.VS.FSI/xlf/VSPackage.tr.xlf b/vsintegration/src/FSharp.VS.FSI/xlf/VSPackage.tr.xlf index 0a0e2372fc3..1b88583f604 100644 --- a/vsintegration/src/FSharp.VS.FSI/xlf/VSPackage.tr.xlf +++ b/vsintegration/src/FSharp.VS.FSI/xlf/VSPackage.tr.xlf @@ -1,4 +1,4 @@ - + diff --git a/vsintegration/src/FSharp.VS.FSI/xlf/VSPackage.zh-Hans.xlf b/vsintegration/src/FSharp.VS.FSI/xlf/VSPackage.zh-Hans.xlf index 6a485bd6d2c..1db4c02f255 100644 --- a/vsintegration/src/FSharp.VS.FSI/xlf/VSPackage.zh-Hans.xlf +++ b/vsintegration/src/FSharp.VS.FSI/xlf/VSPackage.zh-Hans.xlf @@ -1,4 +1,4 @@ - + diff --git a/vsintegration/src/FSharp.VS.FSI/xlf/VSPackage.zh-Hant.xlf b/vsintegration/src/FSharp.VS.FSI/xlf/VSPackage.zh-Hant.xlf index 68641900a27..792559d932c 100644 --- a/vsintegration/src/FSharp.VS.FSI/xlf/VSPackage.zh-Hant.xlf +++ b/vsintegration/src/FSharp.VS.FSI/xlf/VSPackage.zh-Hant.xlf @@ -1,4 +1,4 @@ - + From 1e76cb971f4c8df8dd1278cc1d2f40f2269399d6 Mon Sep 17 00:00:00 2001 From: Jakub Majocha Date: Tue, 6 Nov 2018 05:08:57 +0100 Subject: [PATCH 103/160] fix options regression (#5863) --- .../FSharp.Editor/Options/SettingsPersistence.fs | 4 ++-- .../src/FSharp.Editor/Options/UIHelpers.fs | 16 +++------------- 2 files changed, 5 insertions(+), 15 deletions(-) diff --git a/vsintegration/src/FSharp.Editor/Options/SettingsPersistence.fs b/vsintegration/src/FSharp.Editor/Options/SettingsPersistence.fs index cec979e1656..cc985a00585 100644 --- a/vsintegration/src/FSharp.Editor/Options/SettingsPersistence.fs +++ b/vsintegration/src/FSharp.Editor/Options/SettingsPersistence.fs @@ -48,12 +48,12 @@ type SettingsStore(serviceProvider: IServiceProvider) = settingsManager.SetValueAsync(settings.GetType() |> storageKey, JsonConvert.SerializeObject settings, false) |> Async.AwaitTask |> Async.StartImmediate - member __.Register defaultSettings = + member __.Register (defaultSettings : 'options) = defaultSettings |> updateFromStore |> write let subset = defaultSettings.GetType() |> storageKey |> settingsManager.GetSubset PropertyChangedAsyncEventHandler ( fun _ _ -> - read() |> updateFromStore |> write + (read() :'options) |> updateFromStore |> write System.Threading.Tasks.Task.CompletedTask ) |> subset.add_SettingChangedAsync \ No newline at end of file diff --git a/vsintegration/src/FSharp.Editor/Options/UIHelpers.fs b/vsintegration/src/FSharp.Editor/Options/UIHelpers.fs index 8ed209c80e1..1a7c8584133 100644 --- a/vsintegration/src/FSharp.Editor/Options/UIHelpers.fs +++ b/vsintegration/src/FSharp.Editor/Options/UIHelpers.fs @@ -10,7 +10,7 @@ open Microsoft.VisualStudio.ComponentModelHost module internal OptionsUIHelpers = [] - type AbstractOptionPage<'t>() as this = + type AbstractOptionPage<'options>() as this = inherit UIElementDialogPage() let view = lazy this.CreateView() @@ -26,20 +26,10 @@ module internal OptionsUIHelpers = override this.Child = upcast view.Value override this.SaveSettingsToStorage() = - this.GetResult() |> optionService.Value.Write + downcast view.Value.DataContext |> optionService.Value.Write<'options> override this.LoadSettingsFromStorage() = - optionService.Value.Read() |> this.SetViewModel - - //Override this method when using immutable settings type - member __.SetViewModel(settings: 't) = - // in case settings are a CLIMutable record - view.Value.DataContext <- null - view.Value.DataContext <- settings - - //Override this method when using immutable settings type - member __.GetResult() : 't = - downcast view.Value.DataContext + view.Value.DataContext <- optionService.Value.Read<'options>() //data binding helpers let radioButtonCoverter = From 14169daaa9b935a9cbce24086f46a17078e89939 Mon Sep 17 00:00:00 2001 From: "Kevin Ransom (msft)" Date: Mon, 5 Nov 2018 20:39:10 -0800 Subject: [PATCH 104/160] Use Framework valuetuple rather than netstandard1.0 one (#5867) --- .../ConsoleProject/Template/ConsoleApplication.fsproj | 2 +- .../ProjectTemplates/LibraryProject/Template/Library.fsproj | 2 +- .../ProjectTemplates/TutorialProject/Template/Tutorial.fsproj | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/vsintegration/ProjectTemplates/ConsoleProject/Template/ConsoleApplication.fsproj b/vsintegration/ProjectTemplates/ConsoleProject/Template/ConsoleApplication.fsproj index 2a102babc81..362d1964a66 100644 --- a/vsintegration/ProjectTemplates/ConsoleProject/Template/ConsoleApplication.fsproj +++ b/vsintegration/ProjectTemplates/ConsoleProject/Template/ConsoleApplication.fsproj @@ -47,7 +47,7 @@ True - ..\packages\System.ValueTuple.4.4.0\lib\netstandard1.0\System.ValueTuple.dll + ..\packages\System.ValueTuple.4.4.0\lib\net461\System.ValueTuple.dll True diff --git a/vsintegration/ProjectTemplates/LibraryProject/Template/Library.fsproj b/vsintegration/ProjectTemplates/LibraryProject/Template/Library.fsproj index e8601a827d6..a9a75d23d78 100644 --- a/vsintegration/ProjectTemplates/LibraryProject/Template/Library.fsproj +++ b/vsintegration/ProjectTemplates/LibraryProject/Template/Library.fsproj @@ -43,7 +43,7 @@ True - ..\packages\System.ValueTuple.4.4.0\lib\netstandard1.0\System.ValueTuple.dll + ..\packages\System.ValueTuple.4.4.0\lib\net461\System.ValueTuple.dll True diff --git a/vsintegration/ProjectTemplates/TutorialProject/Template/Tutorial.fsproj b/vsintegration/ProjectTemplates/TutorialProject/Template/Tutorial.fsproj index 02498d6e1d1..0d0abe089cd 100644 --- a/vsintegration/ProjectTemplates/TutorialProject/Template/Tutorial.fsproj +++ b/vsintegration/ProjectTemplates/TutorialProject/Template/Tutorial.fsproj @@ -50,7 +50,7 @@ True - ..\packages\System.ValueTuple.4.4.0\lib\netstandard1.0\System.ValueTuple.dll + ..\packages\System.ValueTuple.4.4.0\lib\net461\System.ValueTuple.dll True From 017fb40b752836eb19cfe9a17d2f789b9b95bc16 Mon Sep 17 00:00:00 2001 From: Kevin Ransom Date: Mon, 5 Nov 2018 23:41:25 -0800 Subject: [PATCH 105/160] merge --- .../Microsoft.VisualStudio.Editors.Designer.resx | 6 ------ .../Microsoft.VisualStudio.Editors.Designer.cs.xlf | 13 ++----------- .../Microsoft.VisualStudio.Editors.Designer.de.xlf | 13 ++----------- .../Microsoft.VisualStudio.Editors.Designer.en.xlf | 10 ---------- .../Microsoft.VisualStudio.Editors.Designer.es.xlf | 13 ++----------- .../Microsoft.VisualStudio.Editors.Designer.fr.xlf | 13 ++----------- .../Microsoft.VisualStudio.Editors.Designer.it.xlf | 13 ++----------- .../Microsoft.VisualStudio.Editors.Designer.ja.xlf | 13 ++----------- .../Microsoft.VisualStudio.Editors.Designer.ko.xlf | 13 ++----------- .../Microsoft.VisualStudio.Editors.Designer.pl.xlf | 13 ++----------- ...icrosoft.VisualStudio.Editors.Designer.pt-BR.xlf | 13 ++----------- .../Microsoft.VisualStudio.Editors.Designer.ru.xlf | 13 ++----------- .../Microsoft.VisualStudio.Editors.Designer.tr.xlf | 13 ++----------- ...rosoft.VisualStudio.Editors.Designer.zh-Hans.xlf | 13 ++----------- ...rosoft.VisualStudio.Editors.Designer.zh-Hant.xlf | 13 ++----------- 15 files changed, 26 insertions(+), 159 deletions(-) diff --git a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/Microsoft.VisualStudio.Editors.Designer.resx b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/Microsoft.VisualStudio.Editors.Designer.resx index b6c6a8091ed..697e650fcbb 100644 --- a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/Microsoft.VisualStudio.Editors.Designer.resx +++ b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/Microsoft.VisualStudio.Editors.Designer.resx @@ -1696,15 +1696,9 @@ CONSIDER: get this from CodeDom Application - - Application (Web) - User - - User (Web) - Name diff --git a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/Microsoft.VisualStudio.Editors.Designer.cs.xlf b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/Microsoft.VisualStudio.Editors.Designer.cs.xlf index da0a132c14e..ab9abd57bf9 100644 --- a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/Microsoft.VisualStudio.Editors.Designer.cs.xlf +++ b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/Microsoft.VisualStudio.Editors.Designer.cs.xlf @@ -1828,8 +1828,9 @@ CONSIDER: get this from CodeDom {0} x {1} - {0} x {1} + {0} x {1} Format string for showing a graphic's size + # {0} = width (as an integer) # {1} = height (as an integer) #Example, for a bitmap of width=123, height = 456, the English version of this string would be "123x456" @@ -2343,21 +2344,11 @@ CONSIDER: get this from CodeDom Aplikace - - Application (Web) - Aplikace (web) - - User Uživatel - - User (Web) - Uživatel (web) - - Name Název diff --git a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/Microsoft.VisualStudio.Editors.Designer.de.xlf b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/Microsoft.VisualStudio.Editors.Designer.de.xlf index 8e3c01a1d57..c042c5dd65a 100644 --- a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/Microsoft.VisualStudio.Editors.Designer.de.xlf +++ b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/Microsoft.VisualStudio.Editors.Designer.de.xlf @@ -1828,8 +1828,9 @@ CONSIDER: get this from CodeDom {0} x {1} - {0} x {1} + {0} x {1} Format string for showing a graphic's size + # {0} = width (as an integer) # {1} = height (as an integer) #Example, for a bitmap of width=123, height = 456, the English version of this string would be "123x456" @@ -2343,21 +2344,11 @@ CONSIDER: get this from CodeDom Anwendung - - Application (Web) - Anwendung (Web) - - User Benutzer - - User (Web) - Benutzer (Web) - - Name Name diff --git a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/Microsoft.VisualStudio.Editors.Designer.en.xlf b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/Microsoft.VisualStudio.Editors.Designer.en.xlf index 2b820cacf7e..8f158b4e155 100644 --- a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/Microsoft.VisualStudio.Editors.Designer.en.xlf +++ b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/Microsoft.VisualStudio.Editors.Designer.en.xlf @@ -2344,21 +2344,11 @@ CONSIDER: get this from CodeDom Application - - Application (Web) - Application (Web) - - User User - - User (Web) - User (Web) - - Name Name diff --git a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/Microsoft.VisualStudio.Editors.Designer.es.xlf b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/Microsoft.VisualStudio.Editors.Designer.es.xlf index 300e65a5405..3a0ae3c38e5 100644 --- a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/Microsoft.VisualStudio.Editors.Designer.es.xlf +++ b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/Microsoft.VisualStudio.Editors.Designer.es.xlf @@ -1828,8 +1828,9 @@ CONSIDER: get this from CodeDom {0} x {1} - {0} x {1} + {0} x {1} Format string for showing a graphic's size + # {0} = width (as an integer) # {1} = height (as an integer) #Example, for a bitmap of width=123, height = 456, the English version of this string would be "123x456" @@ -2343,21 +2344,11 @@ CONSIDER: get this from CodeDom Aplicación - - Application (Web) - Aplicación (web) - - User Usuario - - User (Web) - Usuario (web) - - Name Nombre diff --git a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/Microsoft.VisualStudio.Editors.Designer.fr.xlf b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/Microsoft.VisualStudio.Editors.Designer.fr.xlf index aa5728e6f96..588f1f2e23c 100644 --- a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/Microsoft.VisualStudio.Editors.Designer.fr.xlf +++ b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/Microsoft.VisualStudio.Editors.Designer.fr.xlf @@ -1828,8 +1828,9 @@ CONSIDER: get this from CodeDom {0} x {1} - {0} x {1} + {0} x {1} Format string for showing a graphic's size + # {0} = width (as an integer) # {1} = height (as an integer) #Example, for a bitmap of width=123, height = 456, the English version of this string would be "123x456" @@ -2343,21 +2344,11 @@ CONSIDER: get this from CodeDom Application - - Application (Web) - Application (web) - - User Utilisateur - - User (Web) - Utilisateur (web) - - Name Nom  diff --git a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/Microsoft.VisualStudio.Editors.Designer.it.xlf b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/Microsoft.VisualStudio.Editors.Designer.it.xlf index a580463b97b..ea9be117a47 100644 --- a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/Microsoft.VisualStudio.Editors.Designer.it.xlf +++ b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/Microsoft.VisualStudio.Editors.Designer.it.xlf @@ -1828,8 +1828,9 @@ CONSIDER: get this from CodeDom {0} x {1} - {0} x {1} + {0} x {1} Format string for showing a graphic's size + # {0} = width (as an integer) # {1} = height (as an integer) #Example, for a bitmap of width=123, height = 456, the English version of this string would be "123x456" @@ -2343,21 +2344,11 @@ CONSIDER: get this from CodeDom Applicazione - - Application (Web) - Applicazione (Web) - - User Utente - - User (Web) - Utente (Web) - - Name Nome diff --git a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/Microsoft.VisualStudio.Editors.Designer.ja.xlf b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/Microsoft.VisualStudio.Editors.Designer.ja.xlf index e465fe5fae9..3c99c346714 100644 --- a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/Microsoft.VisualStudio.Editors.Designer.ja.xlf +++ b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/Microsoft.VisualStudio.Editors.Designer.ja.xlf @@ -1828,8 +1828,9 @@ CONSIDER: get this from CodeDom {0} x {1} - {0} x {1} + {0} x {1} Format string for showing a graphic's size + # {0} = width (as an integer) # {1} = height (as an integer) #Example, for a bitmap of width=123, height = 456, the English version of this string would be "123x456" @@ -2343,21 +2344,11 @@ CONSIDER: get this from CodeDom アプリケーション - - Application (Web) - アプリケーション (Web) - - User ユーザー - - User (Web) - ユーザー (Web) - - Name 名前 diff --git a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/Microsoft.VisualStudio.Editors.Designer.ko.xlf b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/Microsoft.VisualStudio.Editors.Designer.ko.xlf index 245fef8a3b6..dd8dbaa95b5 100644 --- a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/Microsoft.VisualStudio.Editors.Designer.ko.xlf +++ b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/Microsoft.VisualStudio.Editors.Designer.ko.xlf @@ -1828,8 +1828,9 @@ CONSIDER: get this from CodeDom {0} x {1} - {0} x {1} + {0} x {1} Format string for showing a graphic's size + # {0} = width (as an integer) # {1} = height (as an integer) #Example, for a bitmap of width=123, height = 456, the English version of this string would be "123x456" @@ -2343,21 +2344,11 @@ CONSIDER: get this from CodeDom 응용 프로그램 - - Application (Web) - 응용 프로그램(웹) - - User 사용자 - - User (Web) - 사용자(웹) - - Name 이름 diff --git a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/Microsoft.VisualStudio.Editors.Designer.pl.xlf b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/Microsoft.VisualStudio.Editors.Designer.pl.xlf index f76be1ae69a..b317e8a727a 100644 --- a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/Microsoft.VisualStudio.Editors.Designer.pl.xlf +++ b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/Microsoft.VisualStudio.Editors.Designer.pl.xlf @@ -1828,8 +1828,9 @@ CONSIDER: get this from CodeDom {0} x {1} - {0} x {1} + {0} x {1} Format string for showing a graphic's size + # {0} = width (as an integer) # {1} = height (as an integer) #Example, for a bitmap of width=123, height = 456, the English version of this string would be "123x456" @@ -2343,21 +2344,11 @@ CONSIDER: get this from CodeDom Aplikacja - - Application (Web) - Aplikacja (sieć Web) - - User Użytkownik - - User (Web) - Użytkownik (sieć Web) - - Name Nazwa diff --git a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/Microsoft.VisualStudio.Editors.Designer.pt-BR.xlf b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/Microsoft.VisualStudio.Editors.Designer.pt-BR.xlf index 112d552e161..8a9809a7edf 100644 --- a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/Microsoft.VisualStudio.Editors.Designer.pt-BR.xlf +++ b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/Microsoft.VisualStudio.Editors.Designer.pt-BR.xlf @@ -1828,8 +1828,9 @@ CONSIDER: get this from CodeDom {0} x {1} - {0} x {1} + {0} x {1} Format string for showing a graphic's size + # {0} = width (as an integer) # {1} = height (as an integer) #Example, for a bitmap of width=123, height = 456, the English version of this string would be "123x456" @@ -2343,21 +2344,11 @@ CONSIDER: get this from CodeDom Aplicativo - - Application (Web) - Aplicativo (Web) - - User Usuário - - User (Web) - Usuário (Web) - - Name Nome diff --git a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/Microsoft.VisualStudio.Editors.Designer.ru.xlf b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/Microsoft.VisualStudio.Editors.Designer.ru.xlf index 0a3d32a55f4..3a81b127f71 100644 --- a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/Microsoft.VisualStudio.Editors.Designer.ru.xlf +++ b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/Microsoft.VisualStudio.Editors.Designer.ru.xlf @@ -1828,8 +1828,9 @@ CONSIDER: get this from CodeDom {0} x {1} - {0} x {1} + {0} x {1} Format string for showing a graphic's size + # {0} = width (as an integer) # {1} = height (as an integer) #Example, for a bitmap of width=123, height = 456, the English version of this string would be "123x456" @@ -2343,21 +2344,11 @@ CONSIDER: get this from CodeDom Приложение - - Application (Web) - Приложение (веб) - - User Пользователь - - User (Web) - Пользователь (веб) - - Name Имя diff --git a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/Microsoft.VisualStudio.Editors.Designer.tr.xlf b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/Microsoft.VisualStudio.Editors.Designer.tr.xlf index cddf8633f5f..2c5fd4566c7 100644 --- a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/Microsoft.VisualStudio.Editors.Designer.tr.xlf +++ b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/Microsoft.VisualStudio.Editors.Designer.tr.xlf @@ -1828,8 +1828,9 @@ CONSIDER: get this from CodeDom {0} x {1} - {0} x {1} + {0} x {1} Format string for showing a graphic's size + # {0} = width (as an integer) # {1} = height (as an integer) #Example, for a bitmap of width=123, height = 456, the English version of this string would be "123x456" @@ -2343,21 +2344,11 @@ CONSIDER: get this from CodeDom Uygulama - - Application (Web) - Uygulama (Web) - - User Kullanıcı - - User (Web) - Kullanıcı (Web) - - Name Ad diff --git a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/Microsoft.VisualStudio.Editors.Designer.zh-Hans.xlf b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/Microsoft.VisualStudio.Editors.Designer.zh-Hans.xlf index 28f1a20d2e4..d6947890646 100644 --- a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/Microsoft.VisualStudio.Editors.Designer.zh-Hans.xlf +++ b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/Microsoft.VisualStudio.Editors.Designer.zh-Hans.xlf @@ -1828,8 +1828,9 @@ CONSIDER: get this from CodeDom {0} x {1} - {0} x {1} + {0} x {1} Format string for showing a graphic's size + # {0} = width (as an integer) # {1} = height (as an integer) #Example, for a bitmap of width=123, height = 456, the English version of this string would be "123x456" @@ -2343,21 +2344,11 @@ CONSIDER: get this from CodeDom 应用程序 - - Application (Web) - 应用程序 (Web) - - User 用户 - - User (Web) - 用户 (Web) - - Name 名称 diff --git a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/Microsoft.VisualStudio.Editors.Designer.zh-Hant.xlf b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/Microsoft.VisualStudio.Editors.Designer.zh-Hant.xlf index 9387967e2b7..95da5d0ce0d 100644 --- a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/Microsoft.VisualStudio.Editors.Designer.zh-Hant.xlf +++ b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/Resources/xlf/Microsoft.VisualStudio.Editors.Designer.zh-Hant.xlf @@ -1828,8 +1828,9 @@ CONSIDER: get this from CodeDom {0} x {1} - {0} x {1} + {0} x {1} Format string for showing a graphic's size + # {0} = width (as an integer) # {1} = height (as an integer) #Example, for a bitmap of width=123, height = 456, the English version of this string would be "123x456" @@ -2343,21 +2344,11 @@ CONSIDER: get this from CodeDom 應用程式 - - Application (Web) - 應用程式 (Web) - - User 使用者 - - User (Web) - 使用者 (Web) - - Name 名稱 From f2de3ba6135173bf45259dd993a030536afb4c1d Mon Sep 17 00:00:00 2001 From: Will Smith Date: Wed, 7 Nov 2018 15:25:28 -0800 Subject: [PATCH 106/160] Optimizing string concatenations to use String.Concat overloads (#5570) * Optimize String.Concat calls * Small refactor * Added test * Another test * Fixing tests * using /noca * Fixing test * Fixing tests again * Minor adjustments from feedback * Quick fix * More tests * Updated baselines + more tests * Added better way to test IL directly in unit tests * Moved StringConcat.fs tests * Removed bad file * Using FSharpChecker directly * Added more tests * Comparing lines for tests * Better IL check output * Small cleanup * Fixed test --- src/fsharp/Optimizer.fs | 98 +- src/fsharp/TastOps.fs | 27 + src/fsharp/TastOps.fsi | 5 + .../FSharp.Compiler.UnitTests.fsproj | 4 +- tests/FSharp.Compiler.UnitTests/ILHelpers.fs | 117 +++ .../Language/StringConcat.fs | 845 ++++++++++++++++++ tests/fsharp/tests.fs | 2 +- 7 files changed, 1077 insertions(+), 21 deletions(-) create mode 100644 tests/FSharp.Compiler.UnitTests/ILHelpers.fs create mode 100644 tests/FSharp.Compiler.UnitTests/Language/StringConcat.fs diff --git a/src/fsharp/Optimizer.fs b/src/fsharp/Optimizer.fs index 599392383d7..116911167eb 100644 --- a/src/fsharp/Optimizer.fs +++ b/src/fsharp/Optimizer.fs @@ -1764,7 +1764,15 @@ let TryDetectQueryQuoteAndRun cenv (expr:Expr) = //printfn "Not eliminating because no Run found" None - +let IsSystemStringConcatOverload (methRef: ILMethodRef) = + methRef.Name = "Concat" && methRef.DeclaringTypeRef.FullName = "System.String" && + methRef.ReturnType.BasicQualifiedName = "System.String" && + methRef.ArgTypes |> List.forall(fun ilty -> ilty.BasicQualifiedName = "System.String") + +let IsSystemStringConcatArray (methRef: ILMethodRef) = + methRef.Name = "Concat" && methRef.DeclaringTypeRef.FullName = "System.String" && + methRef.ReturnType.BasicQualifiedName = "System.String" && + methRef.ArgTypes.Length = 1 && methRef.ArgTypes.Head.BasicQualifiedName = "System.String[]" //------------------------------------------------------------------------- // The traversal @@ -1824,7 +1832,6 @@ let rec OptimizeExpr cenv (env:IncrementalOptimizationEnv) expr = assert ("unexpected reclink" = "") failwith "Unexpected reclink" - //------------------------------------------------------------------------- // Optimize/analyze an object expression //------------------------------------------------------------------------- @@ -1874,9 +1881,54 @@ and OptimizeInterfaceImpl cenv env baseValOpt (ty, overrides) = Info=UnknownValue} //------------------------------------------------------------------------- -// Optimize/analyze an application of an intrinsic operator to arguments +// Make and optimize String.Concat calls //------------------------------------------------------------------------- +and MakeOptimizedSystemStringConcatCall cenv env m args = + let rec optimizeArg e accArgs = + match e, accArgs with + | Expr.Op(TOp.ILCall(_, _, _, _, _, _, _, methRef, _, _, _), _, [ Expr.Op(TOp.Array, _, args, _) ], _), _ when IsSystemStringConcatArray methRef -> + optimizeArgs args accArgs + + | Expr.Op(TOp.ILCall(_, _, _, _, _, _, _, methRef, _, _, _), _, args, _), _ when IsSystemStringConcatOverload methRef -> + optimizeArgs args accArgs + + // Optimize string constants, e.g. "1" + "2" will turn into "12" + | Expr.Const(Const.String str1, _, _), Expr.Const(Const.String str2, _, _) :: accArgs -> + mkString cenv.g m (str1 + str2) :: accArgs + + | arg, _ -> arg :: accArgs + + and optimizeArgs args accArgs = + (args, accArgs) + ||> List.foldBack (fun arg accArgs -> optimizeArg arg accArgs) + + let args = optimizeArgs args [] + + let e = + match args with + | [ arg ] -> + arg + | [ arg1; arg2 ] -> + mkStaticCall_String_Concat2 cenv.g m arg1 arg2 + | [ arg1; arg2; arg3 ] -> + mkStaticCall_String_Concat3 cenv.g m arg1 arg2 arg3 + | [ arg1; arg2; arg3; arg4 ] -> + mkStaticCall_String_Concat4 cenv.g m arg1 arg2 arg3 arg4 + | args -> + let arg = mkArray (cenv.g.string_ty, args, m) + mkStaticCall_String_Concat_Array cenv.g m arg + + match e with + | Expr.Op(TOp.ILCall(_, _, _, _, _, _, _, methRef, _, _, _) as op, tyargs, args, m) when IsSystemStringConcatOverload methRef || IsSystemStringConcatArray methRef -> + OptimizeExprOpReductions cenv env (op, tyargs, args, m) + | _ -> + OptimizeExpr cenv env e + +//------------------------------------------------------------------------- +// Optimize/analyze an application of an intrinsic operator to arguments +//------------------------------------------------------------------------- + and OptimizeExprOp cenv env (op, tyargs, args, m) = // Special cases @@ -1940,22 +1992,30 @@ and OptimizeExprOp cenv env (op, tyargs, args, m) = // if the types match up. | TOp.ILAsm([], [ty]), _, [a] when typeEquiv cenv.g (tyOfExpr cenv.g a) ty -> OptimizeExpr cenv env a - | _ -> - // Reductions - let args', arginfos = OptimizeExprsThenConsiderSplits cenv env args - let knownValue = - match op, arginfos with - | TOp.ValFieldGet (rf), [e1info] -> TryOptimizeRecordFieldGet cenv env (e1info, rf, tyargs, m) - | TOp.TupleFieldGet (tupInfo, n), [e1info] -> TryOptimizeTupleFieldGet cenv env (tupInfo, e1info, tyargs, n, m) - | TOp.UnionCaseFieldGet (cspec, n), [e1info] -> TryOptimizeUnionCaseGet cenv env (e1info, cspec, tyargs, n, m) - | _ -> None - match knownValue with - | Some valu -> - match TryOptimizeVal cenv env (false, valu, m) with - | Some res -> OptimizeExpr cenv env res (* discard e1 since guard ensures it has no effects *) - | None -> OptimizeExprOpFallback cenv env (op, tyargs, args', m) arginfos valu - | None -> OptimizeExprOpFallback cenv env (op, tyargs, args', m) arginfos UnknownValue + // Optimize calls when concatenating strings, e.g. "1" + "2" + "3" + "4" .. etc. + | TOp.ILCall(_, _, _, _, _, _, _, methRef, _, _, _), _, [ Expr.Op(TOp.Array, _, args, _) ] when IsSystemStringConcatArray methRef -> + MakeOptimizedSystemStringConcatCall cenv env m args + | TOp.ILCall(_, _, _, _, _, _, _, methRef, _, _, _), _, args when IsSystemStringConcatOverload methRef -> + MakeOptimizedSystemStringConcatCall cenv env m args + | _ -> + // Reductions + OptimizeExprOpReductions cenv env (op, tyargs, args, m) + +and OptimizeExprOpReductions cenv env (op, tyargs, args, m) = + let args', arginfos = OptimizeExprsThenConsiderSplits cenv env args + let knownValue = + match op, arginfos with + | TOp.ValFieldGet (rf), [e1info] -> TryOptimizeRecordFieldGet cenv env (e1info, rf, tyargs, m) + | TOp.TupleFieldGet (tupInfo, n), [e1info] -> TryOptimizeTupleFieldGet cenv env (tupInfo, e1info, tyargs, n, m) + | TOp.UnionCaseFieldGet (cspec, n), [e1info] -> TryOptimizeUnionCaseGet cenv env (e1info, cspec, tyargs, n, m) + | _ -> None + match knownValue with + | Some valu -> + match TryOptimizeVal cenv env (false, valu, m) with + | Some res -> OptimizeExpr cenv env res (* discard e1 since guard ensures it has no effects *) + | None -> OptimizeExprOpFallback cenv env (op, tyargs, args', m) arginfos valu + | None -> OptimizeExprOpFallback cenv env (op, tyargs, args', m) arginfos UnknownValue and OptimizeExprOpFallback cenv env (op, tyargs, args', m) arginfos valu = // The generic case - we may collect information, but the construction/projection doesn't disappear @@ -2682,7 +2742,7 @@ and TryInlineApplication cenv env finfo (tyargs: TType list, args: Expr list, m) // Inlining: beta reducing let expr' = MakeApplicationAndBetaReduce cenv.g (f2', f2ty, [tyargs], args', m) // Inlining: reoptimizing - Some (OptimizeExpr cenv {env with dontInline= Zset.add lambdaId env.dontInline} expr') + Some(OptimizeExpr cenv {env with dontInline= Zset.add lambdaId env.dontInline} expr') | _ -> None diff --git a/src/fsharp/TastOps.fs b/src/fsharp/TastOps.fs index dfebdb9bae0..c50593dd7a7 100644 --- a/src/fsharp/TastOps.fs +++ b/src/fsharp/TastOps.fs @@ -6366,6 +6366,18 @@ let mkIsInst ty e m = mkAsmExpr ([ isinst ], [ty], [e], [ ty ], m) let mspec_Type_GetTypeFromHandle (g: TcGlobals) = IL.mkILNonGenericStaticMethSpecInTy(g.ilg.typ_Type, "GetTypeFromHandle", [g.iltyp_RuntimeTypeHandle], g.ilg.typ_Type) let mspec_String_Length (g: TcGlobals) = mkILNonGenericInstanceMethSpecInTy (g.ilg.typ_String, "get_Length", [], g.ilg.typ_Int32) +let mspec_String_Concat2 (g: TcGlobals) = + mkILNonGenericStaticMethSpecInTy (g.ilg.typ_String, "Concat", [ g.ilg.typ_String; g.ilg.typ_String ], g.ilg.typ_String) + +let mspec_String_Concat3 (g: TcGlobals) = + mkILNonGenericStaticMethSpecInTy (g.ilg.typ_String, "Concat", [ g.ilg.typ_String; g.ilg.typ_String; g.ilg.typ_String ], g.ilg.typ_String) + +let mspec_String_Concat4 (g: TcGlobals) = + mkILNonGenericStaticMethSpecInTy (g.ilg.typ_String, "Concat", [ g.ilg.typ_String; g.ilg.typ_String; g.ilg.typ_String; g.ilg.typ_String ], g.ilg.typ_String) + +let mspec_String_Concat_Array (g: TcGlobals) = + mkILNonGenericStaticMethSpecInTy (g.ilg.typ_String, "Concat", [ mkILArr1DTy g.ilg.typ_String ], g.ilg.typ_String) + let fspec_Missing_Value (g: TcGlobals) = IL.mkILFieldSpecInTy(g.iltyp_Missing, "Value", g.iltyp_Missing) let mkInitializeArrayMethSpec (g: TcGlobals) = @@ -6587,6 +6599,21 @@ let mkGetStringLength g m e = /// ILCall(useCallvirt, isProtected, valu, newobj, valUseFlags, isProp, noTailCall, mref, actualTypeInst, actualMethInst, retTy) Expr.Op(TOp.ILCall(false, false, false, false, ValUseFlag.NormalValUse, true, false, mspec.MethodRef, [], [], [g.int32_ty]), [], [e], m) +let mkStaticCall_String_Concat2 g m arg1 arg2 = + let mspec = mspec_String_Concat2 g + Expr.Op(TOp.ILCall(false, false, false, false, ValUseFlag.NormalValUse, false, false, mspec.MethodRef, [], [], [g.string_ty]), [], [arg1; arg2], m) + +let mkStaticCall_String_Concat3 g m arg1 arg2 arg3 = + let mspec = mspec_String_Concat3 g + Expr.Op(TOp.ILCall(false, false, false, false, ValUseFlag.NormalValUse, false, false, mspec.MethodRef, [], [], [g.string_ty]), [], [arg1; arg2; arg3], m) + +let mkStaticCall_String_Concat4 g m arg1 arg2 arg3 arg4 = + let mspec = mspec_String_Concat4 g + Expr.Op(TOp.ILCall(false, false, false, false, ValUseFlag.NormalValUse, false, false, mspec.MethodRef, [], [], [g.string_ty]), [], [arg1; arg2; arg3; arg4], m) + +let mkStaticCall_String_Concat_Array g m arg = + let mspec = mspec_String_Concat_Array g + Expr.Op(TOp.ILCall(false, false, false, false, ValUseFlag.NormalValUse, false, false, mspec.MethodRef, [], [], [g.string_ty]), [], [arg], m) // Quotations can't contain any IL. // As a result, we aim to get rid of all IL generation in the typechecker and pattern match diff --git a/src/fsharp/TastOps.fsi b/src/fsharp/TastOps.fsi index 8856119d7be..0731970c195 100755 --- a/src/fsharp/TastOps.fsi +++ b/src/fsharp/TastOps.fsi @@ -1386,6 +1386,11 @@ val mkCallNewQuerySource : TcGlobals -> range -> TType -> TType -> Expr -> Expr val mkArray : TType * Exprs * range -> Expr +val mkStaticCall_String_Concat2 : TcGlobals -> range -> Expr -> Expr -> Expr +val mkStaticCall_String_Concat3 : TcGlobals -> range -> Expr -> Expr -> Expr -> Expr +val mkStaticCall_String_Concat4 : TcGlobals -> range -> Expr -> Expr -> Expr -> Expr -> Expr +val mkStaticCall_String_Concat_Array : TcGlobals -> range -> Expr -> Expr + //------------------------------------------------------------------------- // operations primarily associated with the optimization to fix // up loops to generate .NET code that does not include array bound checks diff --git a/tests/FSharp.Compiler.UnitTests/FSharp.Compiler.UnitTests.fsproj b/tests/FSharp.Compiler.UnitTests/FSharp.Compiler.UnitTests.fsproj index 06b8a4b422a..da3db8e565f 100644 --- a/tests/FSharp.Compiler.UnitTests/FSharp.Compiler.UnitTests.fsproj +++ b/tests/FSharp.Compiler.UnitTests/FSharp.Compiler.UnitTests.fsproj @@ -44,7 +44,7 @@ - ..\..\..\packages\System.ValueTuple.$(SystemValueTuplePackageVersion)\lib\netstandard1.0\System.ValueTuple.dll + ..\..\..\packages\System.ValueTuple.$(SystemValueTuplePackageVersion)\lib\netstandard1.0\System.ValueTuple.dll @@ -54,6 +54,8 @@ + + diff --git a/tests/FSharp.Compiler.UnitTests/ILHelpers.fs b/tests/FSharp.Compiler.UnitTests/ILHelpers.fs new file mode 100644 index 00000000000..32c4e209d8b --- /dev/null +++ b/tests/FSharp.Compiler.UnitTests/ILHelpers.fs @@ -0,0 +1,117 @@ +// Copyright (c) Microsoft Corporation. All Rights Reserved. See License.txt in the project root for license information. + +namespace FSharp.Compiler.UnitTests + +open System +open System.IO +open System.Diagnostics + +open NUnit.Framework + +open Microsoft.FSharp.Compiler.SourceCodeServices + +module ILChecker = + + let checker = FSharpChecker.Create() + + let private (++) a b = Path.Combine(a,b) + + let private getfullpath workDir path = + let rooted = + if Path.IsPathRooted(path) then path + else Path.Combine(workDir, path) + rooted |> Path.GetFullPath + + let private fileExists workDir path = + if path |> getfullpath workDir |> File.Exists then Some path else None + + let private requireFile nm = + if fileExists __SOURCE_DIRECTORY__ nm |> Option.isSome then nm else failwith (sprintf "couldn't find %s. Running 'build test' once might solve this issue" nm) + + let private exec exe args = + let startInfo = ProcessStartInfo(exe, String.concat " " args) + startInfo.RedirectStandardError <- true + startInfo.UseShellExecute <- false + use p = Process.Start(startInfo) + p.WaitForExit() + p.StandardError.ReadToEnd(), p.ExitCode + + /// Compile the source and check to see if the expected IL exists. + /// The first line of each expected IL string is found first. + let check source expectedIL = + let SCRIPT_ROOT = __SOURCE_DIRECTORY__ + let packagesDir = SCRIPT_ROOT ++ ".." ++ ".." ++ "packages" + let Is64BitOperatingSystem = sizeof = 8 + let architectureMoniker = if Is64BitOperatingSystem then "x64" else "x86" + let ildasmExe = requireFile (packagesDir ++ ("runtime.win-" + architectureMoniker + ".Microsoft.NETCore.ILDAsm.2.0.3") ++ "runtimes" ++ ("win-" + architectureMoniker) ++ "native" ++ "ildasm.exe") + let coreclrDll = requireFile (packagesDir ++ ("runtime.win-" + architectureMoniker + ".Microsoft.NETCore.Runtime.CoreCLR.2.0.3") ++ "runtimes" ++ ("win-" + architectureMoniker) ++ "native" ++ "coreclr.dll") + + let tmp = Path.GetTempFileName() + let tmpFs = Path.ChangeExtension(tmp, ".fs") + let tmpDll = Path.ChangeExtension(tmp, ".dll") + let tmpIL = Path.ChangeExtension(tmp, ".il") + + let mutable errorMsgOpt = None + try + // ildasm requires coreclr.dll to run which has already been restored to the packages directory + File.Copy(coreclrDll, Path.GetDirectoryName(ildasmExe) ++ "coreclr.dll", overwrite=true) + + File.WriteAllText(tmpFs, source) + + let errors, exitCode = checker.Compile([| "fsc.exe"; "--optimize+"; "-o"; tmpDll; "-a"; tmpFs |]) |> Async.RunSynchronously + let errors = + String.concat "\n" (errors |> Array.map (fun x -> x.Message)) + + if exitCode = 0 then + exec ildasmExe [ sprintf "%s /out=%s" tmpDll tmpIL ] |> ignore + + let text = File.ReadAllText(tmpIL) + let blockComments = @"/\*(.*?)\*/" + let lineComments = @"//(.*?)\r?\n" + let strings = @"""((\\[^\n]|[^""\n])*)""" + let verbatimStrings = @"@(""[^""]*"")+" + let textNoComments = + System.Text.RegularExpressions.Regex.Replace(text, + blockComments + "|" + lineComments + "|" + strings + "|" + verbatimStrings, + (fun me -> + if (me.Value.StartsWith("/*") || me.Value.StartsWith("//")) then + if me.Value.StartsWith("//") then Environment.NewLine else String.Empty + else + me.Value), System.Text.RegularExpressions.RegexOptions.Singleline) + + expectedIL + |> List.iter (fun (ilCode: string) -> + let expectedLines = ilCode.Split('\n') + let startIndex = textNoComments.IndexOf(expectedLines.[0]) + if startIndex = -1 || textNoComments.Length < startIndex + ilCode.Length then + errorMsgOpt <- Some("==EXPECTED CONTAINS==\n" + ilCode + "\n") + else + let errors = ResizeArray() + let actualLines = textNoComments.Substring(startIndex, textNoComments.Length - startIndex).Split('\n') + for i = 0 to expectedLines.Length - 1 do + let expected = expectedLines.[i].Trim() + let actual = actualLines.[i].Trim() + if expected <> actual then + errors.Add(sprintf "\n==\nName: %s\n\nExpected:\t %s\nActual:\t\t %s\n==" actualLines.[0] expected actual) + + if errors.Count > 0 then + let msg = String.concat "\n" errors + "\n\n\n==EXPECTED==\n" + ilCode + "\n" + errorMsgOpt <- Some(msg + "\n\n\n==ACTUAL==\n" + String.Join("\n", actualLines, 0, expectedLines.Length)) + ) + + match errorMsgOpt with + | Some(msg) -> errorMsgOpt <- Some(msg + "\n\n\n==ENTIRE ACTUAL==\n" + textNoComments) + | _ -> () + else + errorMsgOpt <- Some(errors) + finally + try File.Delete(tmp) with | _ -> () + try File.Delete(tmpFs) with | _ -> () + try File.Delete(tmpDll) with | _ -> () + try File.Delete(tmpIL) with | _ -> () + + match errorMsgOpt with + | Some(errorMsg) -> + Assert.Fail(errorMsg) + | _ -> () + diff --git a/tests/FSharp.Compiler.UnitTests/Language/StringConcat.fs b/tests/FSharp.Compiler.UnitTests/Language/StringConcat.fs new file mode 100644 index 00000000000..fa18e7bb427 --- /dev/null +++ b/tests/FSharp.Compiler.UnitTests/Language/StringConcat.fs @@ -0,0 +1,845 @@ +// Copyright (c) Microsoft Corporation. All Rights Reserved. See License.txt in the project root for license information. + +namespace FSharp.Compiler.UnitTests + +open System +open NUnit.Framework + +[] +module StringConcat = + + [] + let Optimizations () = + let baseSource = """ +module Test + +open System + +let arr = ResizeArray() + +let inline ss (x: int) = + arr.Add(x) + "_" + x.ToString() + "_" +""" + + let test1Source = """ +let test1 () = + ss 1 + ss 2 + ss 3 +""" + let test1IL = """.method public static string test1() cil managed + { + + .maxstack 7 + .locals init (int32 V_0) + IL_0000: ldc.i4.1 + IL_0001: stloc.0 + IL_0002: call class [mscorlib]System.Collections.Generic.List`1 Test::get_arr() + IL_0007: ldc.i4.1 + IL_0008: callvirt instance void class [mscorlib]System.Collections.Generic.List`1::Add(!0) + IL_000d: ldstr "_" + IL_0012: ldloca.s V_0 + IL_0014: constrained. [mscorlib]System.Int32 + IL_001a: callvirt instance string [mscorlib]System.Object::ToString() + IL_001f: ldstr "_" + IL_0024: call string [mscorlib]System.String::Concat(string, + string, + string) + IL_0029: ldc.i4.2 + IL_002a: stloc.0 + IL_002b: call class [mscorlib]System.Collections.Generic.List`1 Test::get_arr() + IL_0030: ldc.i4.2 + IL_0031: callvirt instance void class [mscorlib]System.Collections.Generic.List`1::Add(!0) + IL_0036: ldstr "_" + IL_003b: ldloca.s V_0 + IL_003d: constrained. [mscorlib]System.Int32 + IL_0043: callvirt instance string [mscorlib]System.Object::ToString() + IL_0048: ldstr "_" + IL_004d: call string [mscorlib]System.String::Concat(string, + string, + string) + IL_0052: ldc.i4.3 + IL_0053: stloc.0 + IL_0054: call class [mscorlib]System.Collections.Generic.List`1 Test::get_arr() + IL_0059: ldc.i4.3 + IL_005a: callvirt instance void class [mscorlib]System.Collections.Generic.List`1::Add(!0) + IL_005f: ldstr "_" + IL_0064: ldloca.s V_0 + IL_0066: constrained. [mscorlib]System.Int32 + IL_006c: callvirt instance string [mscorlib]System.Object::ToString() + IL_0071: ldstr "_" + IL_0076: call string [mscorlib]System.String::Concat(string, + string, + string) + IL_007b: call string [mscorlib]System.String::Concat(string, + string, + string) + IL_0080: ret + }""" + + let test2Source = """ +let test2 () = + ss 1 + ss 2 + ss 3 + ss 4 +""" + let test2IL = """.method public static string test2() cil managed + { + + .maxstack 8 + .locals init (int32 V_0) + IL_0000: ldc.i4.1 + IL_0001: stloc.0 + IL_0002: call class [mscorlib]System.Collections.Generic.List`1 Test::get_arr() + IL_0007: ldc.i4.1 + IL_0008: callvirt instance void class [mscorlib]System.Collections.Generic.List`1::Add(!0) + IL_000d: ldstr "_" + IL_0012: ldloca.s V_0 + IL_0014: constrained. [mscorlib]System.Int32 + IL_001a: callvirt instance string [mscorlib]System.Object::ToString() + IL_001f: ldstr "_" + IL_0024: call string [mscorlib]System.String::Concat(string, + string, + string) + IL_0029: ldc.i4.2 + IL_002a: stloc.0 + IL_002b: call class [mscorlib]System.Collections.Generic.List`1 Test::get_arr() + IL_0030: ldc.i4.2 + IL_0031: callvirt instance void class [mscorlib]System.Collections.Generic.List`1::Add(!0) + IL_0036: ldstr "_" + IL_003b: ldloca.s V_0 + IL_003d: constrained. [mscorlib]System.Int32 + IL_0043: callvirt instance string [mscorlib]System.Object::ToString() + IL_0048: ldstr "_" + IL_004d: call string [mscorlib]System.String::Concat(string, + string, + string) + IL_0052: ldc.i4.3 + IL_0053: stloc.0 + IL_0054: call class [mscorlib]System.Collections.Generic.List`1 Test::get_arr() + IL_0059: ldc.i4.3 + IL_005a: callvirt instance void class [mscorlib]System.Collections.Generic.List`1::Add(!0) + IL_005f: ldstr "_" + IL_0064: ldloca.s V_0 + IL_0066: constrained. [mscorlib]System.Int32 + IL_006c: callvirt instance string [mscorlib]System.Object::ToString() + IL_0071: ldstr "_" + IL_0076: call string [mscorlib]System.String::Concat(string, + string, + string) + IL_007b: ldc.i4.4 + IL_007c: stloc.0 + IL_007d: call class [mscorlib]System.Collections.Generic.List`1 Test::get_arr() + IL_0082: ldc.i4.4 + IL_0083: callvirt instance void class [mscorlib]System.Collections.Generic.List`1::Add(!0) + IL_0088: ldstr "_" + IL_008d: ldloca.s V_0 + IL_008f: constrained. [mscorlib]System.Int32 + IL_0095: callvirt instance string [mscorlib]System.Object::ToString() + IL_009a: ldstr "_" + IL_009f: call string [mscorlib]System.String::Concat(string, + string, + string) + IL_00a4: call string [mscorlib]System.String::Concat(string, + string, + string, + string) + IL_00a9: ret + }""" + + let test3Source = """ +let test3 () = + ss 1 + ss 2 + ss 3 + ss 4 + ss 5 +""" + let test3IL = """.method public static string test3() cil managed + { + + .maxstack 8 + .locals init (int32 V_0) + IL_0000: ldc.i4.5 + IL_0001: newarr [mscorlib]System.String + IL_0006: dup + IL_0007: ldc.i4.0 + IL_0008: ldc.i4.1 + IL_0009: stloc.0 + IL_000a: call class [mscorlib]System.Collections.Generic.List`1 Test::get_arr() + IL_000f: ldc.i4.1 + IL_0010: callvirt instance void class [mscorlib]System.Collections.Generic.List`1::Add(!0) + IL_0015: ldstr "_" + IL_001a: ldloca.s V_0 + IL_001c: constrained. [mscorlib]System.Int32 + IL_0022: callvirt instance string [mscorlib]System.Object::ToString() + IL_0027: ldstr "_" + IL_002c: call string [mscorlib]System.String::Concat(string, + string, + string) + IL_0031: stelem [mscorlib]System.String + IL_0036: dup + IL_0037: ldc.i4.1 + IL_0038: ldc.i4.2 + IL_0039: stloc.0 + IL_003a: call class [mscorlib]System.Collections.Generic.List`1 Test::get_arr() + IL_003f: ldc.i4.2 + IL_0040: callvirt instance void class [mscorlib]System.Collections.Generic.List`1::Add(!0) + IL_0045: ldstr "_" + IL_004a: ldloca.s V_0 + IL_004c: constrained. [mscorlib]System.Int32 + IL_0052: callvirt instance string [mscorlib]System.Object::ToString() + IL_0057: ldstr "_" + IL_005c: call string [mscorlib]System.String::Concat(string, + string, + string) + IL_0061: stelem [mscorlib]System.String + IL_0066: dup + IL_0067: ldc.i4.2 + IL_0068: ldc.i4.3 + IL_0069: stloc.0 + IL_006a: call class [mscorlib]System.Collections.Generic.List`1 Test::get_arr() + IL_006f: ldc.i4.3 + IL_0070: callvirt instance void class [mscorlib]System.Collections.Generic.List`1::Add(!0) + IL_0075: ldstr "_" + IL_007a: ldloca.s V_0 + IL_007c: constrained. [mscorlib]System.Int32 + IL_0082: callvirt instance string [mscorlib]System.Object::ToString() + IL_0087: ldstr "_" + IL_008c: call string [mscorlib]System.String::Concat(string, + string, + string) + IL_0091: stelem [mscorlib]System.String + IL_0096: dup + IL_0097: ldc.i4.3 + IL_0098: ldc.i4.4 + IL_0099: stloc.0 + IL_009a: call class [mscorlib]System.Collections.Generic.List`1 Test::get_arr() + IL_009f: ldc.i4.4 + IL_00a0: callvirt instance void class [mscorlib]System.Collections.Generic.List`1::Add(!0) + IL_00a5: ldstr "_" + IL_00aa: ldloca.s V_0 + IL_00ac: constrained. [mscorlib]System.Int32 + IL_00b2: callvirt instance string [mscorlib]System.Object::ToString() + IL_00b7: ldstr "_" + IL_00bc: call string [mscorlib]System.String::Concat(string, + string, + string) + IL_00c1: stelem [mscorlib]System.String + IL_00c6: dup + IL_00c7: ldc.i4.4 + IL_00c8: ldc.i4.5 + IL_00c9: stloc.0 + IL_00ca: call class [mscorlib]System.Collections.Generic.List`1 Test::get_arr() + IL_00cf: ldc.i4.5 + IL_00d0: callvirt instance void class [mscorlib]System.Collections.Generic.List`1::Add(!0) + IL_00d5: ldstr "_" + IL_00da: ldloca.s V_0 + IL_00dc: constrained. [mscorlib]System.Int32 + IL_00e2: callvirt instance string [mscorlib]System.Object::ToString() + IL_00e7: ldstr "_" + IL_00ec: call string [mscorlib]System.String::Concat(string, + string, + string) + IL_00f1: stelem [mscorlib]System.String + IL_00f6: call string [mscorlib]System.String::Concat(string[]) + IL_00fb: ret + }""" + + let test4Source = """ +let test4 () = + ss 5 + ss 6 + ss 7 + String.Concat(ss 8, ss 9) + ss 10 + "_50_" + "_60_" + String.Concat(ss 100, String.Concat(ss 101, ss 102), ss 103) + String.Concat([|"_104_";"_105_"|]) + ss 106 +""" + let test4IL = """.method public static string test4() cil managed + { + + .maxstack 8 + .locals init (int32 V_0) + IL_0000: ldc.i4.s 13 + IL_0002: newarr [mscorlib]System.String + IL_0007: dup + IL_0008: ldc.i4.0 + IL_0009: ldc.i4.5 + IL_000a: stloc.0 + IL_000b: call class [mscorlib]System.Collections.Generic.List`1 Test::get_arr() + IL_0010: ldc.i4.5 + IL_0011: callvirt instance void class [mscorlib]System.Collections.Generic.List`1::Add(!0) + IL_0016: ldstr "_" + IL_001b: ldloca.s V_0 + IL_001d: constrained. [mscorlib]System.Int32 + IL_0023: callvirt instance string [mscorlib]System.Object::ToString() + IL_0028: ldstr "_" + IL_002d: call string [mscorlib]System.String::Concat(string, + string, + string) + IL_0032: stelem [mscorlib]System.String + IL_0037: dup + IL_0038: ldc.i4.1 + IL_0039: ldc.i4.6 + IL_003a: stloc.0 + IL_003b: call class [mscorlib]System.Collections.Generic.List`1 Test::get_arr() + IL_0040: ldc.i4.6 + IL_0041: callvirt instance void class [mscorlib]System.Collections.Generic.List`1::Add(!0) + IL_0046: ldstr "_" + IL_004b: ldloca.s V_0 + IL_004d: constrained. [mscorlib]System.Int32 + IL_0053: callvirt instance string [mscorlib]System.Object::ToString() + IL_0058: ldstr "_" + IL_005d: call string [mscorlib]System.String::Concat(string, + string, + string) + IL_0062: stelem [mscorlib]System.String + IL_0067: dup + IL_0068: ldc.i4.2 + IL_0069: ldc.i4.7 + IL_006a: stloc.0 + IL_006b: call class [mscorlib]System.Collections.Generic.List`1 Test::get_arr() + IL_0070: ldc.i4.7 + IL_0071: callvirt instance void class [mscorlib]System.Collections.Generic.List`1::Add(!0) + IL_0076: ldstr "_" + IL_007b: ldloca.s V_0 + IL_007d: constrained. [mscorlib]System.Int32 + IL_0083: callvirt instance string [mscorlib]System.Object::ToString() + IL_0088: ldstr "_" + IL_008d: call string [mscorlib]System.String::Concat(string, + string, + string) + IL_0092: stelem [mscorlib]System.String + IL_0097: dup + IL_0098: ldc.i4.3 + IL_0099: ldc.i4.8 + IL_009a: stloc.0 + IL_009b: call class [mscorlib]System.Collections.Generic.List`1 Test::get_arr() + IL_00a0: ldc.i4.8 + IL_00a1: callvirt instance void class [mscorlib]System.Collections.Generic.List`1::Add(!0) + IL_00a6: ldstr "_" + IL_00ab: ldloca.s V_0 + IL_00ad: constrained. [mscorlib]System.Int32 + IL_00b3: callvirt instance string [mscorlib]System.Object::ToString() + IL_00b8: ldstr "_" + IL_00bd: call string [mscorlib]System.String::Concat(string, + string, + string) + IL_00c2: stelem [mscorlib]System.String + IL_00c7: dup + IL_00c8: ldc.i4.4 + IL_00c9: ldc.i4.s 9 + IL_00cb: stloc.0 + IL_00cc: call class [mscorlib]System.Collections.Generic.List`1 Test::get_arr() + IL_00d1: ldc.i4.s 9 + IL_00d3: callvirt instance void class [mscorlib]System.Collections.Generic.List`1::Add(!0) + IL_00d8: ldstr "_" + IL_00dd: ldloca.s V_0 + IL_00df: constrained. [mscorlib]System.Int32 + IL_00e5: callvirt instance string [mscorlib]System.Object::ToString() + IL_00ea: ldstr "_" + IL_00ef: call string [mscorlib]System.String::Concat(string, + string, + string) + IL_00f4: stelem [mscorlib]System.String + IL_00f9: dup + IL_00fa: ldc.i4.5 + IL_00fb: ldc.i4.s 10 + IL_00fd: stloc.0 + IL_00fe: call class [mscorlib]System.Collections.Generic.List`1 Test::get_arr() + IL_0103: ldc.i4.s 10 + IL_0105: callvirt instance void class [mscorlib]System.Collections.Generic.List`1::Add(!0) + IL_010a: ldstr "_" + IL_010f: ldloca.s V_0 + IL_0111: constrained. [mscorlib]System.Int32 + IL_0117: callvirt instance string [mscorlib]System.Object::ToString() + IL_011c: ldstr "_" + IL_0121: call string [mscorlib]System.String::Concat(string, + string, + string) + IL_0126: stelem [mscorlib]System.String + IL_012b: dup + IL_012c: ldc.i4.6 + IL_012d: ldstr "_50__60_" + IL_0132: stelem [mscorlib]System.String + IL_0137: dup + IL_0138: ldc.i4.7 + IL_0139: ldc.i4.s 100 + IL_013b: stloc.0 + IL_013c: call class [mscorlib]System.Collections.Generic.List`1 Test::get_arr() + IL_0141: ldc.i4.s 100 + IL_0143: callvirt instance void class [mscorlib]System.Collections.Generic.List`1::Add(!0) + IL_0148: ldstr "_" + IL_014d: ldloca.s V_0 + IL_014f: constrained. [mscorlib]System.Int32 + IL_0155: callvirt instance string [mscorlib]System.Object::ToString() + IL_015a: ldstr "_" + IL_015f: call string [mscorlib]System.String::Concat(string, + string, + string) + IL_0164: stelem [mscorlib]System.String + IL_0169: dup + IL_016a: ldc.i4.8 + IL_016b: ldc.i4.s 101 + IL_016d: stloc.0 + IL_016e: call class [mscorlib]System.Collections.Generic.List`1 Test::get_arr() + IL_0173: ldc.i4.s 101 + IL_0175: callvirt instance void class [mscorlib]System.Collections.Generic.List`1::Add(!0) + IL_017a: ldstr "_" + IL_017f: ldloca.s V_0 + IL_0181: constrained. [mscorlib]System.Int32 + IL_0187: callvirt instance string [mscorlib]System.Object::ToString() + IL_018c: ldstr "_" + IL_0191: call string [mscorlib]System.String::Concat(string, + string, + string) + IL_0196: stelem [mscorlib]System.String + IL_019b: dup + IL_019c: ldc.i4.s 9 + IL_019e: ldc.i4.s 102 + IL_01a0: stloc.0 + IL_01a1: call class [mscorlib]System.Collections.Generic.List`1 Test::get_arr() + IL_01a6: ldc.i4.s 102 + IL_01a8: callvirt instance void class [mscorlib]System.Collections.Generic.List`1::Add(!0) + IL_01ad: ldstr "_" + IL_01b2: ldloca.s V_0 + IL_01b4: constrained. [mscorlib]System.Int32 + IL_01ba: callvirt instance string [mscorlib]System.Object::ToString() + IL_01bf: ldstr "_" + IL_01c4: call string [mscorlib]System.String::Concat(string, + string, + string) + IL_01c9: stelem [mscorlib]System.String + IL_01ce: dup + IL_01cf: ldc.i4.s 10 + IL_01d1: ldc.i4.s 103 + IL_01d3: stloc.0 + IL_01d4: call class [mscorlib]System.Collections.Generic.List`1 Test::get_arr() + IL_01d9: ldc.i4.s 103 + IL_01db: callvirt instance void class [mscorlib]System.Collections.Generic.List`1::Add(!0) + IL_01e0: ldstr "_" + IL_01e5: ldloca.s V_0 + IL_01e7: constrained. [mscorlib]System.Int32 + IL_01ed: callvirt instance string [mscorlib]System.Object::ToString() + IL_01f2: ldstr "_" + IL_01f7: call string [mscorlib]System.String::Concat(string, + string, + string) + IL_01fc: stelem [mscorlib]System.String + IL_0201: dup + IL_0202: ldc.i4.s 11 + IL_0204: ldstr "_104__105_" + IL_0209: stelem [mscorlib]System.String + IL_020e: dup + IL_020f: ldc.i4.s 12 + IL_0211: ldc.i4.s 106 + IL_0213: stloc.0 + IL_0214: call class [mscorlib]System.Collections.Generic.List`1 Test::get_arr() + IL_0219: ldc.i4.s 106 + IL_021b: callvirt instance void class [mscorlib]System.Collections.Generic.List`1::Add(!0) + IL_0220: ldstr "_" + IL_0225: ldloca.s V_0 + IL_0227: constrained. [mscorlib]System.Int32 + IL_022d: callvirt instance string [mscorlib]System.Object::ToString() + IL_0232: ldstr "_" + IL_0237: call string [mscorlib]System.String::Concat(string, + string, + string) + IL_023c: stelem [mscorlib]System.String + IL_0241: call string [mscorlib]System.String::Concat(string[]) + IL_0246: ret + }""" + + let test5Source = """ +let test5 () = + ss 5 + ss 6 + ss 7 + String.Concat(ss 8, ss 9) + ss 10 + "_50_" + "_60_" + String.Concat(ss 100, (let x = String.Concat(ss 101, ss 102) in Console.WriteLine(x);x), ss 103) + String.Concat([|"_104_";"_105_"|]) + ss 106 +""" + let test5IL = """.method public static string test5() cil managed + { + + .maxstack 9 + .locals init (int32 V_0, + string V_1) + IL_0000: ldc.i4.s 12 + IL_0002: newarr [mscorlib]System.String + IL_0007: dup + IL_0008: ldc.i4.0 + IL_0009: ldc.i4.5 + IL_000a: stloc.0 + IL_000b: call class [mscorlib]System.Collections.Generic.List`1 Test::get_arr() + IL_0010: ldc.i4.5 + IL_0011: callvirt instance void class [mscorlib]System.Collections.Generic.List`1::Add(!0) + IL_0016: ldstr "_" + IL_001b: ldloca.s V_0 + IL_001d: constrained. [mscorlib]System.Int32 + IL_0023: callvirt instance string [mscorlib]System.Object::ToString() + IL_0028: ldstr "_" + IL_002d: call string [mscorlib]System.String::Concat(string, + string, + string) + IL_0032: stelem [mscorlib]System.String + IL_0037: dup + IL_0038: ldc.i4.1 + IL_0039: ldc.i4.6 + IL_003a: stloc.0 + IL_003b: call class [mscorlib]System.Collections.Generic.List`1 Test::get_arr() + IL_0040: ldc.i4.6 + IL_0041: callvirt instance void class [mscorlib]System.Collections.Generic.List`1::Add(!0) + IL_0046: ldstr "_" + IL_004b: ldloca.s V_0 + IL_004d: constrained. [mscorlib]System.Int32 + IL_0053: callvirt instance string [mscorlib]System.Object::ToString() + IL_0058: ldstr "_" + IL_005d: call string [mscorlib]System.String::Concat(string, + string, + string) + IL_0062: stelem [mscorlib]System.String + IL_0067: dup + IL_0068: ldc.i4.2 + IL_0069: ldc.i4.7 + IL_006a: stloc.0 + IL_006b: call class [mscorlib]System.Collections.Generic.List`1 Test::get_arr() + IL_0070: ldc.i4.7 + IL_0071: callvirt instance void class [mscorlib]System.Collections.Generic.List`1::Add(!0) + IL_0076: ldstr "_" + IL_007b: ldloca.s V_0 + IL_007d: constrained. [mscorlib]System.Int32 + IL_0083: callvirt instance string [mscorlib]System.Object::ToString() + IL_0088: ldstr "_" + IL_008d: call string [mscorlib]System.String::Concat(string, + string, + string) + IL_0092: stelem [mscorlib]System.String + IL_0097: dup + IL_0098: ldc.i4.3 + IL_0099: ldc.i4.8 + IL_009a: stloc.0 + IL_009b: call class [mscorlib]System.Collections.Generic.List`1 Test::get_arr() + IL_00a0: ldc.i4.8 + IL_00a1: callvirt instance void class [mscorlib]System.Collections.Generic.List`1::Add(!0) + IL_00a6: ldstr "_" + IL_00ab: ldloca.s V_0 + IL_00ad: constrained. [mscorlib]System.Int32 + IL_00b3: callvirt instance string [mscorlib]System.Object::ToString() + IL_00b8: ldstr "_" + IL_00bd: call string [mscorlib]System.String::Concat(string, + string, + string) + IL_00c2: stelem [mscorlib]System.String + IL_00c7: dup + IL_00c8: ldc.i4.4 + IL_00c9: ldc.i4.s 9 + IL_00cb: stloc.0 + IL_00cc: call class [mscorlib]System.Collections.Generic.List`1 Test::get_arr() + IL_00d1: ldc.i4.s 9 + IL_00d3: callvirt instance void class [mscorlib]System.Collections.Generic.List`1::Add(!0) + IL_00d8: ldstr "_" + IL_00dd: ldloca.s V_0 + IL_00df: constrained. [mscorlib]System.Int32 + IL_00e5: callvirt instance string [mscorlib]System.Object::ToString() + IL_00ea: ldstr "_" + IL_00ef: call string [mscorlib]System.String::Concat(string, + string, + string) + IL_00f4: stelem [mscorlib]System.String + IL_00f9: dup + IL_00fa: ldc.i4.5 + IL_00fb: ldc.i4.s 10 + IL_00fd: stloc.0 + IL_00fe: call class [mscorlib]System.Collections.Generic.List`1 Test::get_arr() + IL_0103: ldc.i4.s 10 + IL_0105: callvirt instance void class [mscorlib]System.Collections.Generic.List`1::Add(!0) + IL_010a: ldstr "_" + IL_010f: ldloca.s V_0 + IL_0111: constrained. [mscorlib]System.Int32 + IL_0117: callvirt instance string [mscorlib]System.Object::ToString() + IL_011c: ldstr "_" + IL_0121: call string [mscorlib]System.String::Concat(string, + string, + string) + IL_0126: stelem [mscorlib]System.String + IL_012b: dup + IL_012c: ldc.i4.6 + IL_012d: ldstr "_50__60_" + IL_0132: stelem [mscorlib]System.String + IL_0137: dup + IL_0138: ldc.i4.7 + IL_0139: ldc.i4.s 100 + IL_013b: stloc.0 + IL_013c: call class [mscorlib]System.Collections.Generic.List`1 Test::get_arr() + IL_0141: ldc.i4.s 100 + IL_0143: callvirt instance void class [mscorlib]System.Collections.Generic.List`1::Add(!0) + IL_0148: ldstr "_" + IL_014d: ldloca.s V_0 + IL_014f: constrained. [mscorlib]System.Int32 + IL_0155: callvirt instance string [mscorlib]System.Object::ToString() + IL_015a: ldstr "_" + IL_015f: call string [mscorlib]System.String::Concat(string, + string, + string) + IL_0164: stelem [mscorlib]System.String + IL_0169: dup + IL_016a: ldc.i4.8 + IL_016b: ldc.i4.s 101 + IL_016d: stloc.0 + IL_016e: call class [mscorlib]System.Collections.Generic.List`1 Test::get_arr() + IL_0173: ldc.i4.s 101 + IL_0175: callvirt instance void class [mscorlib]System.Collections.Generic.List`1::Add(!0) + IL_017a: ldstr "_" + IL_017f: ldloca.s V_0 + IL_0181: constrained. [mscorlib]System.Int32 + IL_0187: callvirt instance string [mscorlib]System.Object::ToString() + IL_018c: ldstr "_" + IL_0191: call string [mscorlib]System.String::Concat(string, + string, + string) + IL_0196: ldc.i4.s 102 + IL_0198: stloc.0 + IL_0199: call class [mscorlib]System.Collections.Generic.List`1 Test::get_arr() + IL_019e: ldc.i4.s 102 + IL_01a0: callvirt instance void class [mscorlib]System.Collections.Generic.List`1::Add(!0) + IL_01a5: ldstr "_" + IL_01aa: ldloca.s V_0 + IL_01ac: constrained. [mscorlib]System.Int32 + IL_01b2: callvirt instance string [mscorlib]System.Object::ToString() + IL_01b7: ldstr "_" + IL_01bc: call string [mscorlib]System.String::Concat(string, + string, + string) + IL_01c1: call string [mscorlib]System.String::Concat(string, + string) + IL_01c6: stloc.1 + IL_01c7: ldloc.1 + IL_01c8: call void [mscorlib]System.Console::WriteLine(string) + IL_01cd: ldloc.1 + IL_01ce: stelem [mscorlib]System.String + IL_01d3: dup + IL_01d4: ldc.i4.s 9 + IL_01d6: ldc.i4.s 103 + IL_01d8: stloc.0 + IL_01d9: call class [mscorlib]System.Collections.Generic.List`1 Test::get_arr() + IL_01de: ldc.i4.s 103 + IL_01e0: callvirt instance void class [mscorlib]System.Collections.Generic.List`1::Add(!0) + IL_01e5: ldstr "_" + IL_01ea: ldloca.s V_0 + IL_01ec: constrained. [mscorlib]System.Int32 + IL_01f2: callvirt instance string [mscorlib]System.Object::ToString() + IL_01f7: ldstr "_" + IL_01fc: call string [mscorlib]System.String::Concat(string, + string, + string) + IL_0201: stelem [mscorlib]System.String + IL_0206: dup + IL_0207: ldc.i4.s 10 + IL_0209: ldstr "_104__105_" + IL_020e: stelem [mscorlib]System.String + IL_0213: dup + IL_0214: ldc.i4.s 11 + IL_0216: ldc.i4.s 106 + IL_0218: stloc.0 + IL_0219: call class [mscorlib]System.Collections.Generic.List`1 Test::get_arr() + IL_021e: ldc.i4.s 106 + IL_0220: callvirt instance void class [mscorlib]System.Collections.Generic.List`1::Add(!0) + IL_0225: ldstr "_" + IL_022a: ldloca.s V_0 + IL_022c: constrained. [mscorlib]System.Int32 + IL_0232: callvirt instance string [mscorlib]System.Object::ToString() + IL_0237: ldstr "_" + IL_023c: call string [mscorlib]System.String::Concat(string, + string, + string) + IL_0241: stelem [mscorlib]System.String + IL_0246: call string [mscorlib]System.String::Concat(string[]) + IL_024b: ret + }""" + + let test6Source = """ +let inline inlineStringConcat str1 str2 = str1 + str2 + +let test6 () = + inlineStringConcat (inlineStringConcat (ss 1) (ss 2)) (ss 3) + ss 4 +""" + let test6IL = """.method public static string test6() cil managed + { + + .maxstack 8 + .locals init (int32 V_0) + IL_0000: ldc.i4.1 + IL_0001: stloc.0 + IL_0002: call class [mscorlib]System.Collections.Generic.List`1 Test::get_arr() + IL_0007: ldc.i4.1 + IL_0008: callvirt instance void class [mscorlib]System.Collections.Generic.List`1::Add(!0) + IL_000d: ldstr "_" + IL_0012: ldloca.s V_0 + IL_0014: constrained. [mscorlib]System.Int32 + IL_001a: callvirt instance string [mscorlib]System.Object::ToString() + IL_001f: ldstr "_" + IL_0024: call string [mscorlib]System.String::Concat(string, + string, + string) + IL_0029: ldc.i4.2 + IL_002a: stloc.0 + IL_002b: call class [mscorlib]System.Collections.Generic.List`1 Test::get_arr() + IL_0030: ldc.i4.2 + IL_0031: callvirt instance void class [mscorlib]System.Collections.Generic.List`1::Add(!0) + IL_0036: ldstr "_" + IL_003b: ldloca.s V_0 + IL_003d: constrained. [mscorlib]System.Int32 + IL_0043: callvirt instance string [mscorlib]System.Object::ToString() + IL_0048: ldstr "_" + IL_004d: call string [mscorlib]System.String::Concat(string, + string, + string) + IL_0052: ldc.i4.3 + IL_0053: stloc.0 + IL_0054: call class [mscorlib]System.Collections.Generic.List`1 Test::get_arr() + IL_0059: ldc.i4.3 + IL_005a: callvirt instance void class [mscorlib]System.Collections.Generic.List`1::Add(!0) + IL_005f: ldstr "_" + IL_0064: ldloca.s V_0 + IL_0066: constrained. [mscorlib]System.Int32 + IL_006c: callvirt instance string [mscorlib]System.Object::ToString() + IL_0071: ldstr "_" + IL_0076: call string [mscorlib]System.String::Concat(string, + string, + string) + IL_007b: ldc.i4.4 + IL_007c: stloc.0 + IL_007d: call class [mscorlib]System.Collections.Generic.List`1 Test::get_arr() + IL_0082: ldc.i4.4 + IL_0083: callvirt instance void class [mscorlib]System.Collections.Generic.List`1::Add(!0) + IL_0088: ldstr "_" + IL_008d: ldloca.s V_0 + IL_008f: constrained. [mscorlib]System.Int32 + IL_0095: callvirt instance string [mscorlib]System.Object::ToString() + IL_009a: ldstr "_" + IL_009f: call string [mscorlib]System.String::Concat(string, + string, + string) + IL_00a4: call string [mscorlib]System.String::Concat(string, + string, + string, + string) + IL_00a9: ret + }""" + + let test7Source = """ +let test7 () = + let x = 1 + x.ToString() + x.ToString() + x.ToString() +""" + let test7IL = """.method public static string test7() cil managed + { + + .maxstack 5 + .locals init (int32 V_0) + IL_0000: ldc.i4.1 + IL_0001: stloc.0 + IL_0002: ldloca.s V_0 + IL_0004: constrained. [mscorlib]System.Int32 + IL_000a: callvirt instance string [mscorlib]System.Object::ToString() + IL_000f: ldloca.s V_0 + IL_0011: constrained. [mscorlib]System.Int32 + IL_0017: callvirt instance string [mscorlib]System.Object::ToString() + IL_001c: ldloca.s V_0 + IL_001e: constrained. [mscorlib]System.Int32 + IL_0024: callvirt instance string [mscorlib]System.Object::ToString() + IL_0029: call string [mscorlib]System.String::Concat(string, + string, + string) + IL_002e: ret + }""" + + let test8Source = """ +let test8 () = + let x = 1 + x.ToString() + x.ToString() + x.ToString() + x.ToString() +""" + let test8IL = """.method public static string test8() cil managed + { + + .maxstack 6 + .locals init (int32 V_0) + IL_0000: ldc.i4.1 + IL_0001: stloc.0 + IL_0002: ldloca.s V_0 + IL_0004: constrained. [mscorlib]System.Int32 + IL_000a: callvirt instance string [mscorlib]System.Object::ToString() + IL_000f: ldloca.s V_0 + IL_0011: constrained. [mscorlib]System.Int32 + IL_0017: callvirt instance string [mscorlib]System.Object::ToString() + IL_001c: ldloca.s V_0 + IL_001e: constrained. [mscorlib]System.Int32 + IL_0024: callvirt instance string [mscorlib]System.Object::ToString() + IL_0029: ldloca.s V_0 + IL_002b: constrained. [mscorlib]System.Int32 + IL_0031: callvirt instance string [mscorlib]System.Object::ToString() + IL_0036: call string [mscorlib]System.String::Concat(string, + string, + string, + string) + IL_003b: ret + }""" + + let test9Source = """ +let test9 () = + let x = 1 + x.ToString() + x.ToString() + x.ToString() + x.ToString() + x.ToString() +""" + let test9IL = """.method public static string test9() cil managed + { + + .maxstack 6 + .locals init (int32 V_0) + IL_0000: ldc.i4.1 + IL_0001: stloc.0 + IL_0002: ldc.i4.5 + IL_0003: newarr [mscorlib]System.String + IL_0008: dup + IL_0009: ldc.i4.0 + IL_000a: ldloca.s V_0 + IL_000c: constrained. [mscorlib]System.Int32 + IL_0012: callvirt instance string [mscorlib]System.Object::ToString() + IL_0017: stelem [mscorlib]System.String + IL_001c: dup + IL_001d: ldc.i4.1 + IL_001e: ldloca.s V_0 + IL_0020: constrained. [mscorlib]System.Int32 + IL_0026: callvirt instance string [mscorlib]System.Object::ToString() + IL_002b: stelem [mscorlib]System.String + IL_0030: dup + IL_0031: ldc.i4.2 + IL_0032: ldloca.s V_0 + IL_0034: constrained. [mscorlib]System.Int32 + IL_003a: callvirt instance string [mscorlib]System.Object::ToString() + IL_003f: stelem [mscorlib]System.String + IL_0044: dup + IL_0045: ldc.i4.3 + IL_0046: ldloca.s V_0 + IL_0048: constrained. [mscorlib]System.Int32 + IL_004e: callvirt instance string [mscorlib]System.Object::ToString() + IL_0053: stelem [mscorlib]System.String + IL_0058: dup + IL_0059: ldc.i4.4 + IL_005a: ldloca.s V_0 + IL_005c: constrained. [mscorlib]System.Int32 + IL_0062: callvirt instance string [mscorlib]System.Object::ToString() + IL_0067: stelem [mscorlib]System.String + IL_006c: call string [mscorlib]System.String::Concat(string[]) + IL_0071: ret + }""" + + let sources = + [ + baseSource + test1Source + test2Source + test3Source + test4Source + test5Source + test6Source + test7Source + test8Source + test9Source + ] + let source = String.Join("", sources) + ILChecker.check source + [ + test1IL + test2IL + test3IL + test4IL + test5IL + test6IL + test7IL + test8IL + test9IL + ] diff --git a/tests/fsharp/tests.fs b/tests/fsharp/tests.fs index 4dbb5242b59..c79abb4f791 100644 --- a/tests/fsharp/tests.fs +++ b/tests/fsharp/tests.fs @@ -1878,7 +1878,7 @@ module OptimizationTests = |> Seq.filter (fun line -> line.Contains(".locals init")) |> Seq.length - log "Ran ok - optimizations removed %d textual occurrences of optimizable identifiers from target IL" numElim + log "Ran ok - optimizations removed %d textual occurrences of optimizable identifiers from target IL" numElim [] let stats () = From 5ae8597a4fe49f9ee496533c53e2dd44778e7c01 Mon Sep 17 00:00:00 2001 From: "Kevin Ransom (msft)" Date: Mon, 12 Nov 2018 14:12:09 -0800 Subject: [PATCH 107/160] Remove dependence on runfsc.cmd and runfsc.sh (#5882) * Remove dependence on runfsc.cmd and runfsc.sh * White space --- .../FSharp.Build/Microsoft.FSharp.NetSdk.props | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/src/fsharp/FSharp.Build/Microsoft.FSharp.NetSdk.props b/src/fsharp/FSharp.Build/Microsoft.FSharp.NetSdk.props index 97302e0bc96..f9c48d77e7c 100644 --- a/src/fsharp/FSharp.Build/Microsoft.FSharp.NetSdk.props +++ b/src/fsharp/FSharp.Build/Microsoft.FSharp.NetSdk.props @@ -55,14 +55,10 @@ WARNING: DO NOT MODIFY this file unless you are knowledgeable about MSBuild and true - - $(MSBuildThisFileDirectory) - RunFsc.cmd - - - - $(MSBuildThisFileDirectory) - RunFsc.sh + + $([System.IO.Path]::GetDirectoryName($(DOTNET_HOST_PATH))) + $([System.IO.Path]::GetFileName($(DOTNET_HOST_PATH))) + "$(MSBuildThisFileDirectory)fsc.exe" ] + let tryExactlyOne (array:'T[]) = + checkNonNull "array" array + if array.Length = 1 then Some array.[0] + else None + let transposeArrays (array:'T[][]) = let len = array.Length if len = 0 then Microsoft.FSharp.Primitives.Basics.Array.zeroCreateUnchecked 0 else diff --git a/src/fsharp/FSharp.Core/array.fsi b/src/fsharp/FSharp.Core/array.fsi index ad9e82f27fb..5ede87a3c6d 100644 --- a/src/fsharp/FSharp.Core/array.fsi +++ b/src/fsharp/FSharp.Core/array.fsi @@ -243,6 +243,16 @@ namespace Microsoft.FSharp.Collections [] val exactlyOne: array:'T[] -> 'T + /// Returns the only element of the array or None if array is empty or contains more than one element. + /// + /// The input array. + /// + /// The only element of the array or None. + /// + /// Thrown when the input array is null. + [] + val tryExactlyOne: array:'T[] -> 'T option + /// Returns a new list with the distinct elements of the input array which do not appear in the itemsToExclude sequence, /// using generic hash and equality comparisons to compare values. /// diff --git a/src/fsharp/FSharp.Core/list.fs b/src/fsharp/FSharp.Core/list.fs index f02ceffcff6..6092567f1f4 100644 --- a/src/fsharp/FSharp.Core/list.fs +++ b/src/fsharp/FSharp.Core/list.fs @@ -671,6 +671,12 @@ namespace Microsoft.FSharp.Collections | [] -> invalidArg "source" LanguagePrimitives.ErrorStrings.InputSequenceEmptyString | _ -> invalidArg "source" (SR.GetString(SR.inputSequenceTooLong)) + [] + let tryExactlyOne (list : list<_>) = + match list with + | [x] -> Some x + | _ -> None + [] let transpose (lists : seq<'T list>) = checkNonNull "lists" lists diff --git a/src/fsharp/FSharp.Core/list.fsi b/src/fsharp/FSharp.Core/list.fsi index d42186e73d9..aba9b3505b7 100644 --- a/src/fsharp/FSharp.Core/list.fsi +++ b/src/fsharp/FSharp.Core/list.fsi @@ -172,6 +172,14 @@ namespace Microsoft.FSharp.Collections [] val exactlyOne: list:'T list -> 'T + /// Returns the only element of the list or None if it is empty or contains more than one element. + /// + /// The input list. + /// + /// The only element of the list or None. + [] + val tryExactlyOne: list:'T list -> 'T option + /// Tests if any element of the list satisfies the given predicate. /// /// The predicate is applied to the elements of the input list. If any application diff --git a/src/fsharp/FSharp.Core/seq.fs b/src/fsharp/FSharp.Core/seq.fs index 3162a0fe594..eab2599b1aa 100644 --- a/src/fsharp/FSharp.Core/seq.fs +++ b/src/fsharp/FSharp.Core/seq.fs @@ -1421,6 +1421,19 @@ namespace Microsoft.FSharp.Collections else invalidArg "source" LanguagePrimitives.ErrorStrings.InputSequenceEmptyString + [] + let tryExactlyOne (source : seq<_>) = + checkNonNull "source" source + use e = source.GetEnumerator() + if e.MoveNext() then + let v = e.Current + if e.MoveNext() then + None + else + Some v + else + None + [] let rev source = checkNonNull "source" source diff --git a/src/fsharp/FSharp.Core/seq.fsi b/src/fsharp/FSharp.Core/seq.fsi index 045a22b84ab..9ed5bed0965 100644 --- a/src/fsharp/FSharp.Core/seq.fsi +++ b/src/fsharp/FSharp.Core/seq.fsi @@ -558,6 +558,16 @@ namespace Microsoft.FSharp.Collections [] val exactlyOne: source:seq<'T> -> 'T + /// Returns the only element of the sequence or None if sequence is empty or contains more than one element. + /// + /// The input sequence. + /// + /// The only element of the sequence or None. + /// + /// Thrown when the input sequence is null. + [] + val tryExactlyOne: source:seq<'T> -> 'T option + /// Returns true if the sequence contains no elements, false otherwise. /// /// The input sequence. diff --git a/tests/FSharp.Core.UnitTests/FSharp.Core/Microsoft.FSharp.Collections/ArrayModule.fs b/tests/FSharp.Core.UnitTests/FSharp.Core/Microsoft.FSharp.Collections/ArrayModule.fs index 725775bf751..2718948cab1 100644 --- a/tests/FSharp.Core.UnitTests/FSharp.Core/Microsoft.FSharp.Collections/ArrayModule.fs +++ b/tests/FSharp.Core.UnitTests/FSharp.Core/Microsoft.FSharp.Collections/ArrayModule.fs @@ -1186,6 +1186,24 @@ type ArrayModule() = member this.``exactlyOne should fail on arrays with more than one element``() = CheckThrowsArgumentException(fun () -> Array.exactlyOne [|"1"; "2"|] |> ignore) + [] + member this.``tryExactlyOne should return the element from singleton arrays``() = + Assert.AreEqual(Some 1, Array.tryExactlyOne [|1|]) + Assert.AreEqual(Some "2", Array.tryExactlyOne [|"2"|]) + () + + [] + member this.``tryExactlyOne should return None on empty array``() = + Assert.AreEqual(None, Array.tryExactlyOne [||]) + + [] + member this.``tryExactlyOne should return None for arrays with more than one element``() = + Assert.AreEqual(None, Array.tryExactlyOne [|"1"; "2"|]) + + [] + member this.``tryExactlyOne should fail on null array``() = + CheckThrowsArgumentNullException(fun () -> Array.tryExactlyOne null |> ignore) + [] member this.GroupBy() = let funcInt x = x%5 diff --git a/tests/FSharp.Core.UnitTests/FSharp.Core/Microsoft.FSharp.Collections/CollectionModulesConsistency.fs b/tests/FSharp.Core.UnitTests/FSharp.Core/Microsoft.FSharp.Collections/CollectionModulesConsistency.fs index c85ff999f67..53897216c2b 100644 --- a/tests/FSharp.Core.UnitTests/FSharp.Core/Microsoft.FSharp.Collections/CollectionModulesConsistency.fs +++ b/tests/FSharp.Core.UnitTests/FSharp.Core/Microsoft.FSharp.Collections/CollectionModulesConsistency.fs @@ -200,6 +200,18 @@ let ``exactlyOne is consistent`` () = smallerSizeCheck exactlyOne smallerSizeCheck exactlyOne +let tryExactlyOne<'a when 'a : comparison> (xs : 'a []) = + let s = runAndCheckErrorType (fun () -> xs |> Seq.tryExactlyOne) + let l = runAndCheckErrorType (fun () -> xs |> List.ofArray |> List.tryExactlyOne) + let a = runAndCheckErrorType (fun () -> xs |> Array.tryExactlyOne) + consistency "tryExactlyOne" s l a + +[] +let ``tryExactlyOne is consistent`` () = + smallerSizeCheck tryExactlyOne + smallerSizeCheck tryExactlyOne + smallerSizeCheck tryExactlyOne + let except<'a when 'a : equality> (xs : 'a []) (itemsToExclude: 'a []) = let s = xs |> Seq.except itemsToExclude |> Seq.toArray let l = xs |> List.ofArray |> List.except itemsToExclude |> List.toArray diff --git a/tests/FSharp.Core.UnitTests/FSharp.Core/Microsoft.FSharp.Collections/ListModule.fs b/tests/FSharp.Core.UnitTests/FSharp.Core/Microsoft.FSharp.Collections/ListModule.fs index e9784237119..538e5a0d155 100644 --- a/tests/FSharp.Core.UnitTests/FSharp.Core/Microsoft.FSharp.Collections/ListModule.fs +++ b/tests/FSharp.Core.UnitTests/FSharp.Core/Microsoft.FSharp.Collections/ListModule.fs @@ -808,6 +808,20 @@ type ListModule() = member this.``exactlyOne should fail on lists with more than one element``() = CheckThrowsArgumentException(fun () -> List.exactlyOne ["1"; "2"] |> ignore) + [] + member this.``tryExactlyOne should return the element from singleton lists``() = + Assert.AreEqual(Some 1, List.tryExactlyOne [1]) + Assert.AreEqual(Some "2", List.tryExactlyOne ["2"]) + () + + [] + member this.``tryExactlyOne should return None for empty list``() = + Assert.AreEqual(None, List.tryExactlyOne []) + + [] + member this.``tryExactlyOne should return None for lists with more than one element``() = + Assert.AreEqual(None, List.tryExactlyOne ["1"; "2"]) + [] member this.TryHead() = // integer List diff --git a/tests/FSharp.Core.UnitTests/FSharp.Core/Microsoft.FSharp.Collections/SeqModule2.fs b/tests/FSharp.Core.UnitTests/FSharp.Core/Microsoft.FSharp.Collections/SeqModule2.fs index 87483598568..700e4582934 100644 --- a/tests/FSharp.Core.UnitTests/FSharp.Core/Microsoft.FSharp.Collections/SeqModule2.fs +++ b/tests/FSharp.Core.UnitTests/FSharp.Core/Microsoft.FSharp.Collections/SeqModule2.fs @@ -139,17 +139,41 @@ type SeqModule2() = // Empty Seq let emptySeq = Seq.empty CheckThrowsArgumentException ( fun() -> Seq.exactlyOne emptySeq) - + // non-singleton Seq + let nonSingletonSeq = [ 0 .. 1 ] + CheckThrowsArgumentException ( fun() -> Seq.exactlyOne nonSingletonSeq |> ignore ) + + // null Seq + let nullSeq:seq<'a> = null + CheckThrowsArgumentNullException (fun () -> Seq.exactlyOne nullSeq) + () + + [] + member this.TryExactlyOne() = + let IntSeq = + seq { for i in 7 .. 7 do + yield i } + + Assert.AreEqual(Some 7, Seq.tryExactlyOne IntSeq) + + // string Seq + let strSeq = seq ["second"] + Assert.AreEqual(Some "second", Seq.tryExactlyOne strSeq) + + // Empty Seq let emptySeq = Seq.empty - CheckThrowsArgumentException ( fun() -> Seq.exactlyOne [ 0 .. 1 ] |> ignore ) - + Assert.AreEqual(None, Seq.tryExactlyOne emptySeq) + + // non-singleton Seq + let nonSingletonSeq = [ 0 .. 1 ] + Assert.AreEqual(None, Seq.tryExactlyOne nonSingletonSeq) + // null Seq let nullSeq:seq<'a> = null - CheckThrowsArgumentNullException (fun () ->Seq.exactlyOne nullSeq) - () - - + CheckThrowsArgumentNullException (fun () -> Seq.tryExactlyOne nullSeq |> ignore) + () + [] member this.Init() = diff --git a/tests/FSharp.Core.UnitTests/SurfaceArea.coreclr.fs b/tests/FSharp.Core.UnitTests/SurfaceArea.coreclr.fs index 841b5092f23..fc3dbbbed59 100644 --- a/tests/FSharp.Core.UnitTests/SurfaceArea.coreclr.fs +++ b/tests/FSharp.Core.UnitTests/SurfaceArea.coreclr.fs @@ -115,6 +115,7 @@ Microsoft.FSharp.Collections.ArrayModule: System.Tuple`3[T1[],T2[],T3[]] Unzip3[ Microsoft.FSharp.Collections.ArrayModule: System.Type GetType() Microsoft.FSharp.Collections.ArrayModule: T Average[T](T[]) Microsoft.FSharp.Collections.ArrayModule: T ExactlyOne[T](T[]) +Microsoft.FSharp.Collections.ArrayModule: Microsoft.FSharp.Core.FSharpOption`1[T] TryExactlyOne[T](T[]) Microsoft.FSharp.Collections.ArrayModule: T FindBack[T](Microsoft.FSharp.Core.FSharpFunc`2[T,System.Boolean], T[]) Microsoft.FSharp.Collections.ArrayModule: T Find[T](Microsoft.FSharp.Core.FSharpFunc`2[T,System.Boolean], T[]) Microsoft.FSharp.Collections.ArrayModule: T Get[T](T[], Int32) @@ -373,6 +374,7 @@ Microsoft.FSharp.Collections.ListModule: System.Tuple`3[Microsoft.FSharp.Collect Microsoft.FSharp.Collections.ListModule: System.Type GetType() Microsoft.FSharp.Collections.ListModule: T Average[T](Microsoft.FSharp.Collections.FSharpList`1[T]) Microsoft.FSharp.Collections.ListModule: T ExactlyOne[T](Microsoft.FSharp.Collections.FSharpList`1[T]) +Microsoft.FSharp.Collections.ListModule: Microsoft.FSharp.Core.FSharpOption`1[T] TryExactlyOne[T](Microsoft.FSharp.Collections.FSharpList`1[T]) Microsoft.FSharp.Collections.ListModule: T FindBack[T](Microsoft.FSharp.Core.FSharpFunc`2[T,System.Boolean], Microsoft.FSharp.Collections.FSharpList`1[T]) Microsoft.FSharp.Collections.ListModule: T Find[T](Microsoft.FSharp.Core.FSharpFunc`2[T,System.Boolean], Microsoft.FSharp.Collections.FSharpList`1[T]) Microsoft.FSharp.Collections.ListModule: T Get[T](Microsoft.FSharp.Collections.FSharpList`1[T], Int32) @@ -507,6 +509,7 @@ Microsoft.FSharp.Collections.SeqModule: System.Tuple`2[System.Collections.Generi Microsoft.FSharp.Collections.SeqModule: System.Type GetType() Microsoft.FSharp.Collections.SeqModule: T Average[T](System.Collections.Generic.IEnumerable`1[T]) Microsoft.FSharp.Collections.SeqModule: T ExactlyOne[T](System.Collections.Generic.IEnumerable`1[T]) +Microsoft.FSharp.Collections.SeqModule: Microsoft.FSharp.Core.FSharpOption`1[T] TryExactlyOne[T](System.Collections.Generic.IEnumerable`1[T]) Microsoft.FSharp.Collections.SeqModule: T FindBack[T](Microsoft.FSharp.Core.FSharpFunc`2[T,System.Boolean], System.Collections.Generic.IEnumerable`1[T]) Microsoft.FSharp.Collections.SeqModule: T Find[T](Microsoft.FSharp.Core.FSharpFunc`2[T,System.Boolean], System.Collections.Generic.IEnumerable`1[T]) Microsoft.FSharp.Collections.SeqModule: T Get[T](Int32, System.Collections.Generic.IEnumerable`1[T]) diff --git a/tests/FSharp.Core.UnitTests/SurfaceArea.net40.fs b/tests/FSharp.Core.UnitTests/SurfaceArea.net40.fs index fb3d061f045..daebd2d65fe 100644 --- a/tests/FSharp.Core.UnitTests/SurfaceArea.net40.fs +++ b/tests/FSharp.Core.UnitTests/SurfaceArea.net40.fs @@ -114,6 +114,7 @@ Microsoft.FSharp.Collections.ArrayModule: System.Tuple`3[T1[],T2[],T3[]] Unzip3[ Microsoft.FSharp.Collections.ArrayModule: System.Type GetType() Microsoft.FSharp.Collections.ArrayModule: T Average[T](T[]) Microsoft.FSharp.Collections.ArrayModule: T ExactlyOne[T](T[]) +Microsoft.FSharp.Collections.ArrayModule: Microsoft.FSharp.Core.FSharpOption`1[T] TryExactlyOne[T](T[]) Microsoft.FSharp.Collections.ArrayModule: T FindBack[T](Microsoft.FSharp.Core.FSharpFunc`2[T,System.Boolean], T[]) Microsoft.FSharp.Collections.ArrayModule: T Find[T](Microsoft.FSharp.Core.FSharpFunc`2[T,System.Boolean], T[]) Microsoft.FSharp.Collections.ArrayModule: T Get[T](T[], Int32) @@ -360,6 +361,7 @@ Microsoft.FSharp.Collections.ListModule: System.Tuple`3[Microsoft.FSharp.Collect Microsoft.FSharp.Collections.ListModule: System.Type GetType() Microsoft.FSharp.Collections.ListModule: T Average[T](Microsoft.FSharp.Collections.FSharpList`1[T]) Microsoft.FSharp.Collections.ListModule: T ExactlyOne[T](Microsoft.FSharp.Collections.FSharpList`1[T]) +Microsoft.FSharp.Collections.ListModule: Microsoft.FSharp.Core.FSharpOption`1[T] TryExactlyOne[T](Microsoft.FSharp.Collections.FSharpList`1[T]) Microsoft.FSharp.Collections.ListModule: T FindBack[T](Microsoft.FSharp.Core.FSharpFunc`2[T,System.Boolean], Microsoft.FSharp.Collections.FSharpList`1[T]) Microsoft.FSharp.Collections.ListModule: T Find[T](Microsoft.FSharp.Core.FSharpFunc`2[T,System.Boolean], Microsoft.FSharp.Collections.FSharpList`1[T]) Microsoft.FSharp.Collections.ListModule: T Get[T](Microsoft.FSharp.Collections.FSharpList`1[T], Int32) @@ -494,6 +496,7 @@ Microsoft.FSharp.Collections.SeqModule: System.Tuple`2[System.Collections.Generi Microsoft.FSharp.Collections.SeqModule: System.Type GetType() Microsoft.FSharp.Collections.SeqModule: T Average[T](System.Collections.Generic.IEnumerable`1[T]) Microsoft.FSharp.Collections.SeqModule: T ExactlyOne[T](System.Collections.Generic.IEnumerable`1[T]) +Microsoft.FSharp.Collections.SeqModule: Microsoft.FSharp.Core.FSharpOption`1[T] TryExactlyOne[T](System.Collections.Generic.IEnumerable`1[T]) Microsoft.FSharp.Collections.SeqModule: T FindBack[T](Microsoft.FSharp.Core.FSharpFunc`2[T,System.Boolean], System.Collections.Generic.IEnumerable`1[T]) Microsoft.FSharp.Collections.SeqModule: T Find[T](Microsoft.FSharp.Core.FSharpFunc`2[T,System.Boolean], System.Collections.Generic.IEnumerable`1[T]) Microsoft.FSharp.Collections.SeqModule: T Get[T](Int32, System.Collections.Generic.IEnumerable`1[T]) From 44c7e10ca432d8f245a6d8f8e0ec19ca8c72edaf Mon Sep 17 00:00:00 2001 From: Phillip Carter Date: Mon, 12 Nov 2018 16:16:42 -0800 Subject: [PATCH 109/160] FS-1065 Value Option Parity (#5772) * Initial FS-1065 implementation * Undo removal of compilationrepresentation suffix and update surface area * Whoopise, add the suffix to the impl file * Update coreclr surface area * Revert the FSComp changes that somehow got picked up * newline * Consume internal VOption module functions * More internal voption module functions --- src/absil/illib.fs | 6 +- .../FSharp.Compiler.Private/FSComp.fs | 4 +- src/fsharp/FSharp.Core/option.fs | 208 +++++-- src/fsharp/FSharp.Core/option.fsi | 580 ++++++++++++------ src/fsharp/FSharp.Core/prim-types.fs | 17 + src/fsharp/FSharp.Core/prim-types.fsi | 14 + src/fsharp/NameResolution.fs | 2 +- src/fsharp/Optimizer.fs | 2 +- src/fsharp/QuotationTranslator.fs | 2 +- src/fsharp/symbols/Symbols.fs | 21 +- src/fsharp/tast.fs | 8 +- .../Microsoft.FSharp.Core/OptionModule.fs | 240 +++++++- .../SurfaceArea.coreclr.fs | 37 ++ .../SurfaceArea.net40.fs | 37 ++ 14 files changed, 878 insertions(+), 300 deletions(-) diff --git a/src/absil/illib.fs b/src/absil/illib.fs index ab92a747b5e..69b0030f910 100644 --- a/src/absil/illib.fs +++ b/src/absil/illib.fs @@ -432,8 +432,10 @@ module List = let existsSquared f xss = xss |> List.exists (fun xs -> xs |> List.exists (fun x -> f x)) let mapiFoldSquared f z xss = mapFoldSquared f z (xss |> mapiSquared (fun i j x -> (i,j,x))) -[] -module ValueOption = +/// Because FSharp.Compiler.Service is a library that will target FSharp.Core 4.5.2 for the forseeable future, +/// we need to stick these functions in this module rather than using the module functions for ValueOption +/// that come after FSharp.Core 4.5.2. +module ValueOptionInternal = let inline ofOption x = match x with Some x -> ValueSome x | None -> ValueNone let inline bind f x = match x with ValueSome x -> f x | ValueNone -> ValueNone let inline isSome x = match x with ValueSome _ -> true | ValueNone -> false diff --git a/src/buildfromsource/FSharp.Compiler.Private/FSComp.fs b/src/buildfromsource/FSharp.Compiler.Private/FSComp.fs index 1be5487161c..10faa567545 100644 --- a/src/buildfromsource/FSharp.Compiler.Private/FSComp.fs +++ b/src/buildfromsource/FSharp.Compiler.Private/FSComp.fs @@ -3197,10 +3197,10 @@ type internal SR private() = /// (Originally from ..\FSComp.txt:1044) static member tastInvalidAddressOfMutableAcrossAssemblyBoundary() = (1188, GetStringFunc("tastInvalidAddressOfMutableAcrossAssemblyBoundary",",,,") ) /// Remove spaces between the type name and type parameter, e.g. \"type C<'T>\", not type \"C <'T>\". Type parameters must be placed directly adjacent to the type name. - /// (Originally from ..\FSComp.txt:1045) + /// (Originally from ..\FSComp.txt:1043) static member parsNonAdjacentTypars() = (1189, GetStringFunc("parsNonAdjacentTypars",",,,") ) /// Remove spaces between the type name and type parameter, e.g. \"C<'T>\", not \"C <'T>\". Type parameters must be placed directly adjacent to the type name. - /// (Originally from ..\FSComp.txt:1046) + /// (Originally from ..\FSComp.txt:1044) static member parsNonAdjacentTyargs() = (1190, GetStringFunc("parsNonAdjacentTyargs",",,,") ) /// The use of the type syntax 'int C' and 'C ' is not permitted here. Consider adjusting this type to be written in the form 'C' /// (Originally from ..\FSComp.txt:1047) diff --git a/src/fsharp/FSharp.Core/option.fs b/src/fsharp/FSharp.Core/option.fs index f963c01fc79..552d1c9231f 100644 --- a/src/fsharp/FSharp.Core/option.fs +++ b/src/fsharp/FSharp.Core/option.fs @@ -2,91 +2,177 @@ namespace Microsoft.FSharp.Core - open Microsoft.FSharp.Core.Operators +open Microsoft.FSharp.Core.Operators - [] - module Option = +[] +module Option = - [] - let get option = match option with None -> invalidArg "option" (SR.GetString(SR.optionValueWasNone)) | Some x -> x + [] + let get option = match option with None -> invalidArg "option" (SR.GetString(SR.optionValueWasNone)) | Some x -> x - [] - let inline isSome option = match option with None -> false | Some _ -> true + [] + let inline isSome option = match option with None -> false | Some _ -> true - [] - let inline isNone option = match option with None -> true | Some _ -> false + [] + let inline isNone option = match option with None -> true | Some _ -> false - [] - let defaultValue value option = match option with None -> value | Some v -> v + [] + let defaultValue value option = match option with None -> value | Some v -> v - [] - let defaultWith defThunk option = match option with None -> defThunk () | Some v -> v + [] + let defaultWith defThunk option = match option with None -> defThunk () | Some v -> v - [] - let orElse ifNone option = match option with None -> ifNone | Some _ -> option + [] + let orElse ifNone option = match option with None -> ifNone | Some _ -> option - [] - let orElseWith ifNoneThunk option = match option with None -> ifNoneThunk () | Some _ -> option + [] + let orElseWith ifNoneThunk option = match option with None -> ifNoneThunk () | Some _ -> option - [] - let count option = match option with None -> 0 | Some _ -> 1 + [] + let count option = match option with None -> 0 | Some _ -> 1 - [] - let fold<'T,'State> folder (state:'State) (option: option<'T>) = match option with None -> state | Some x -> folder state x + [] + let fold<'T,'State> folder (state:'State) (option: option<'T>) = match option with None -> state | Some x -> folder state x - [] - let foldBack<'T,'State> folder (option: option<'T>) (state:'State) = match option with None -> state | Some x -> folder x state + [] + let foldBack<'T,'State> folder (option: option<'T>) (state:'State) = match option with None -> state | Some x -> folder x state - [] - let exists predicate option = match option with None -> false | Some x -> predicate x + [] + let exists predicate option = match option with None -> false | Some x -> predicate x - [] - let forall predicate option = match option with None -> true | Some x -> predicate x + [] + let forall predicate option = match option with None -> true | Some x -> predicate x - [] - let inline contains value option = match option with None -> false | Some v -> v = value + [] + let inline contains value option = match option with None -> false | Some v -> v = value - [] - let iter action option = match option with None -> () | Some x -> action x + [] + let iter action option = match option with None -> () | Some x -> action x - [] - let map mapping option = match option with None -> None | Some x -> Some (mapping x) + [] + let map mapping option = match option with None -> None | Some x -> Some (mapping x) - [] - let map2 mapping option1 option2 = - match option1, option2 with - | Some x, Some y -> Some (mapping x y) - | _ -> None + [] + let map2 mapping option1 option2 = + match option1, option2 with + | Some x, Some y -> Some (mapping x y) + | _ -> None - [] - let map3 mapping option1 option2 option3 = - match option1, option2, option3 with - | Some x, Some y, Some z -> Some (mapping x y z) - | _ -> None + [] + let map3 mapping option1 option2 option3 = + match option1, option2, option3 with + | Some x, Some y, Some z -> Some (mapping x y z) + | _ -> None - [] - let bind binder option = match option with None -> None | Some x -> binder x + [] + let bind binder option = match option with None -> None | Some x -> binder x - [] - let flatten option = match option with None -> None | Some x -> x + [] + let flatten option = match option with None -> None | Some x -> x - [] - let filter predicate option = match option with None -> None | Some x -> if predicate x then Some x else None + [] + let filter predicate option = match option with None -> None | Some x -> if predicate x then Some x else None - [] - let toArray option = match option with None -> [| |] | Some x -> [| x |] + [] + let toArray option = match option with None -> [| |] | Some x -> [| x |] - [] - let toList option = match option with None -> [ ] | Some x -> [ x ] + [] + let toList option = match option with None -> [ ] | Some x -> [ x ] - [] - let toNullable option = match option with None -> System.Nullable() | Some v -> System.Nullable(v) + [] + let toNullable option = match option with None -> System.Nullable() | Some v -> System.Nullable(v) - [] - let ofNullable (value:System.Nullable<'T>) = if value.HasValue then Some value.Value else None + [] + let ofNullable (value:System.Nullable<'T>) = if value.HasValue then Some value.Value else None - [] - let ofObj value = match value with null -> None | _ -> Some value + [] + let ofObj value = match value with null -> None | _ -> Some value - [] - let toObj value = match value with None -> null | Some x -> x + [] + let toObj value = match value with None -> null | Some x -> x + +module ValueOption = + + [] + let get voption = match voption with ValueNone -> invalidArg "option" (SR.GetString(SR.optionValueWasNone)) | ValueSome x -> x + + [] + let inline isSome voption = match voption with ValueNone -> false | ValueSome _ -> true + + [] + let inline isNone voption = match voption with ValueNone -> true | ValueSome _ -> false + + [] + let defaultValue value voption = match voption with ValueNone -> value | ValueSome v -> v + + [] + let defaultWith defThunk voption = match voption with ValueNone -> defThunk () | ValueSome v -> v + + [] + let orElse ifNone voption = match voption with ValueNone -> ifNone | ValueSome _ -> voption + + [] + let orElseWith ifNoneThunk voption = match voption with ValueNone -> ifNoneThunk () | ValueSome _ -> voption + + [] + let count voption = match voption with ValueNone -> 0 | ValueSome _ -> 1 + + [] + let fold<'T,'State> folder (state:'State) (voption: voption<'T>) = match voption with ValueNone -> state | ValueSome x -> folder state x + + [] + let foldBack<'T,'State> folder (voption: voption<'T>) (state:'State) = match voption with ValueNone -> state | ValueSome x -> folder x state + + [] + let exists predicate voption = match voption with ValueNone -> false | ValueSome x -> predicate x + + [] + let forall predicate voption = match voption with ValueNone -> true | ValueSome x -> predicate x + + [] + let inline contains value voption = match voption with ValueNone -> false | ValueSome v -> v = value + + [] + let iter action voption = match voption with ValueNone -> () | ValueSome x -> action x + + [] + let map mapping voption = match voption with ValueNone -> ValueNone | ValueSome x -> ValueSome (mapping x) + + [] + let map2 mapping voption1 voption2 = + match voption1, voption2 with + | ValueSome x, ValueSome y -> ValueSome (mapping x y) + | _ -> ValueNone + + [] + let map3 mapping voption1 voption2 voption3 = + match voption1, voption2, voption3 with + | ValueSome x, ValueSome y, ValueSome z -> ValueSome (mapping x y z) + | _ -> ValueNone + + [] + let bind binder voption = match voption with ValueNone -> ValueNone | ValueSome x -> binder x + + [] + let flatten voption = match voption with ValueNone -> ValueNone | ValueSome x -> x + + [] + let filter predicate voption = match voption with ValueNone -> ValueNone | ValueSome x -> if predicate x then ValueSome x else ValueNone + + [] + let toArray voption = match voption with ValueNone -> [| |] | ValueSome x -> [| x |] + + [] + let toList voption = match voption with ValueNone -> [ ] | ValueSome x -> [ x ] + + [] + let toNullable voption = match voption with ValueNone -> System.Nullable() | ValueSome v -> System.Nullable(v) + + [] + let ofNullable (value:System.Nullable<'T>) = if value.HasValue then ValueSome value.Value else ValueNone + + [] + let ofObj value = match value with null -> ValueNone | _ -> ValueSome value + + [] + let toObj value = match value with ValueNone -> null | ValueSome x -> x diff --git a/src/fsharp/FSharp.Core/option.fsi b/src/fsharp/FSharp.Core/option.fsi index a8f7af2ffce..739484ae8cf 100644 --- a/src/fsharp/FSharp.Core/option.fsi +++ b/src/fsharp/FSharp.Core/option.fsi @@ -2,199 +2,387 @@ namespace Microsoft.FSharp.Core - open System - open Microsoft.FSharp.Core - open Microsoft.FSharp.Collections - open Microsoft.FSharp.Core.Operators - open Microsoft.FSharp.Collections - - [] - /// Basic operations on options. - module Option = - /// Returns true if the option is not None. - /// The input option. - /// True if the option is not None. - [] - val inline isSome: option:'T option -> bool - - /// Returns true if the option is None. - /// The input option. - /// True if the option is None. - [] - val inline isNone: option:'T option -> bool - - /// Gets the value of the option if the option is Some, otherwise returns the specified default value. - /// The specified default value. - /// The input option. - /// The option if the option is Some, else the default value. - /// Identical to the built-in operator, except with the arguments swapped. - [] - val defaultValue: value:'T -> option:'T option -> 'T - - /// Gets the value of the option if the option is Some, otherwise evaluates and returns the result. - /// A thunk that provides a default value when evaluated. - /// The input option. - /// The option if the option is Some, else the result of evaluating . - /// is not evaluated unless is None. - [] - val defaultWith: defThunk:(unit -> 'T) -> option:'T option -> 'T - - /// Returns if it is Some, otherwise returns . - /// The value to use if is None. - /// The input option. - /// The option if the option is Some, else the alternate option. - [] - val orElse: ifNone:'T option -> option:'T option -> 'T option - - /// Returns if it is Some, otherwise evaluates and returns the result. - /// A thunk that provides an alternate option when evaluated. - /// The input option. - /// The option if the option is Some, else the result of evaluating . - /// is not evaluated unless is None. - [] - val orElseWith: ifNoneThunk:(unit -> 'T option) -> option:'T option -> 'T option - - /// Gets the value associated with the option. - /// The input option. - /// The value within the option. - /// Thrown when the option is None. - [] - val get: option:'T option -> 'T - - /// count inp evaluates to match inp with None -> 0 | Some _ -> 1. - /// The input option. - /// A zero if the option is None, a one otherwise. - [] - val count: option:'T option -> int - - /// fold f s inp evaluates to match inp with None -> s | Some x -> f s x. - /// A function to update the state data when given a value from an option. - /// The initial state. - /// The input option. - /// The original state if the option is None, otherwise it returns the updated state with the folder - /// and the option value. - [] - val fold<'T,'State> : folder:('State -> 'T -> 'State) -> state:'State -> option:'T option -> 'State - - /// fold f inp s evaluates to match inp with None -> s | Some x -> f x s. - /// A function to update the state data when given a value from an option. - /// The input option. - /// The initial state. - /// The original state if the option is None, otherwise it returns the updated state with the folder - /// and the option value. - [] - val foldBack<'T,'State> : folder:('T -> 'State -> 'State) -> option:'T option -> state:'State -> 'State - - /// exists p inp evaluates to match inp with None -> false | Some x -> p x. - /// A function that evaluates to a boolean when given a value from the option type. - /// The input option. - /// False if the option is None, otherwise it returns the result of applying the predicate - /// to the option value. - [] - val exists: predicate:('T -> bool) -> option:'T option -> bool - - /// forall p inp evaluates to match inp with None -> true | Some x -> p x. - /// A function that evaluates to a boolean when given a value from the option type. - /// The input option. - /// True if the option is None, otherwise it returns the result of applying the predicate - /// to the option value. - [] - val forall: predicate:('T -> bool) -> option:'T option -> bool - - /// Evaluates to true if is Some and its value is equal to . - /// The value to test for equality. - /// The input option. - /// True if the option is Some and contains a value equal to , otherwise false. - [] - val inline contains: value:'T -> option:'T option -> bool when 'T : equality - - /// iter f inp executes match inp with None -> () | Some x -> f x. - /// A function to apply to the option value. - /// The input option. - /// Unit if the option is None, otherwise it returns the result of applying the predicate - /// to the option value. - [] - val iter: action:('T -> unit) -> option:'T option -> unit - - /// map f inp evaluates to match inp with None -> None | Some x -> Some (f x). - /// A function to apply to the option value. - /// The input option. - /// An option of the input value after applying the mapping function, or None if the input is None. - [] - val map: mapping:('T -> 'U) -> option:'T option -> 'U option - - /// map f option1 option2 evaluates to match option1, option2 with Some x, Some y -> Some (f x y) | _ -> None. - /// A function to apply to the option values. - /// The first option. - /// The second option. - /// An option of the input values after applying the mapping function, or None if either input is None. - [] - val map2: mapping:('T1 -> 'T2 -> 'U) -> 'T1 option -> 'T2 option -> 'U option - - /// map f option1 option2 option3 evaluates to match option1, option2, option3 with Some x, Some y, Some z -> Some (f x y z) | _ -> None. - /// A function to apply to the option values. - /// The first option. - /// The second option. - /// The third option. - /// An option of the input values after applying the mapping function, or None if any input is None. - [] - val map3: mapping:('T1 -> 'T2 -> 'T3 -> 'U) -> 'T1 option -> 'T2 option -> 'T3 option -> 'U option - - /// bind f inp evaluates to match inp with None -> None | Some x -> f x - /// A function that takes the value of type T from an option and transforms it into - /// an option containing a value of type U. - /// The input option. - /// An option of the output type of the binder. - [] - val bind: binder:('T -> 'U option) -> option:'T option -> 'U option - - /// flatten inp evaluates to match inp with None -> None | Some x -> x - /// The input option. - /// An option of the output type of the binder. - /// flatten is equivalent to bind id. - [] - val flatten: option:'T option option -> 'T option - - /// filter f inp evaluates to match inp with None -> None | Some x -> if f x then Some x else None. - /// A function that evaluates whether the value contained in the option should remain, or be filtered out. - /// The input option. - /// The input if the predicate evaluates to true; otherwise, None. - [] - val filter: predicate:('T -> bool) -> option:'T option -> 'T option - - /// Convert the option to an array of length 0 or 1. - /// The input option. - /// The result array. - [] - val toArray: option:'T option -> 'T[] - - /// Convert the option to a list of length 0 or 1. - /// The input option. - /// The result list. - [] - val toList: option:'T option -> 'T list - - - /// Convert the option to a Nullable value. - /// The input option. - /// The result value. - [] - val toNullable: option:'T option -> Nullable<'T> - - /// Convert a Nullable value to an option. - /// The input nullable value. - /// The result option. - [] - val ofNullable: value:Nullable<'T> -> 'T option - - /// Convert a potentially null value to an option. - /// The input value. - /// The result option. - [] - val ofObj: value: 'T -> 'T option when 'T : null - - /// Convert an option to a potentially null value. - /// The input value. - /// The result value, which is null if the input was None. - [] - val toObj: value: 'T option -> 'T when 'T : null +open System +open Microsoft.FSharp.Core +open Microsoft.FSharp.Collections + + +[] +/// Basic operations on options. +module Option = + /// Returns true if the option is not None. + /// The input option. + /// True if the option is not None. + [] + val inline isSome: option:'T option -> bool + + /// Returns true if the option is None. + /// The input option. + /// True if the option is None. + [] + val inline isNone: option:'T option -> bool + + /// Gets the value of the option if the option is Some, otherwise returns the specified default value. + /// The specified default value. + /// The input option. + /// The option if the option is Some, else the default value. + /// Identical to the built-in operator, except with the arguments swapped. + [] + val defaultValue: value:'T -> option:'T option -> 'T + + /// Gets the value of the option if the option is Some, otherwise evaluates and returns the result. + /// A thunk that provides a default value when evaluated. + /// The input option. + /// The option if the option is Some, else the result of evaluating . + /// is not evaluated unless is None. + [] + val defaultWith: defThunk:(unit -> 'T) -> option:'T option -> 'T + + /// Returns if it is Some, otherwise returns . + /// The value to use if is None. + /// The input option. + /// The option if the option is Some, else the alternate option. + [] + val orElse: ifNone:'T option -> option:'T option -> 'T option + + /// Returns if it is Some, otherwise evaluates and returns the result. + /// A thunk that provides an alternate option when evaluated. + /// The input option. + /// The option if the option is Some, else the result of evaluating . + /// is not evaluated unless is None. + [] + val orElseWith: ifNoneThunk:(unit -> 'T option) -> option:'T option -> 'T option + + /// Gets the value associated with the option. + /// The input option. + /// The value within the option. + /// Thrown when the option is None. + [] + val get: option:'T option -> 'T + + /// count inp evaluates to match inp with None -> 0 | Some _ -> 1. + /// The input option. + /// A zero if the option is None, a one otherwise. + [] + val count: option:'T option -> int + + /// fold f s inp evaluates to match inp with None -> s | Some x -> f s x. + /// A function to update the state data when given a value from an option. + /// The initial state. + /// The input option. + /// The original state if the option is None, otherwise it returns the updated state with the folder + /// and the option value. + [] + val fold<'T,'State> : folder:('State -> 'T -> 'State) -> state:'State -> option:'T option -> 'State + + /// fold f inp s evaluates to match inp with None -> s | Some x -> f x s. + /// A function to update the state data when given a value from an option. + /// The input option. + /// The initial state. + /// The original state if the option is None, otherwise it returns the updated state with the folder + /// and the option value. + [] + val foldBack<'T,'State> : folder:('T -> 'State -> 'State) -> option:'T option -> state:'State -> 'State + + /// exists p inp evaluates to match inp with None -> false | Some x -> p x. + /// A function that evaluates to a boolean when given a value from the option type. + /// The input option. + /// False if the option is None, otherwise it returns the result of applying the predicate + /// to the option value. + [] + val exists: predicate:('T -> bool) -> option:'T option -> bool + + /// forall p inp evaluates to match inp with None -> true | Some x -> p x. + /// A function that evaluates to a boolean when given a value from the option type. + /// The input option. + /// True if the option is None, otherwise it returns the result of applying the predicate + /// to the option value. + [] + val forall: predicate:('T -> bool) -> option:'T option -> bool + + /// Evaluates to true if is Some and its value is equal to . + /// The value to test for equality. + /// The input option. + /// True if the option is Some and contains a value equal to , otherwise false. + [] + val inline contains: value:'T -> option:'T option -> bool when 'T : equality + + /// iter f inp executes match inp with None -> () | Some x -> f x. + /// A function to apply to the option value. + /// The input option. + /// Unit if the option is None, otherwise it returns the result of applying the predicate + /// to the option value. + [] + val iter: action:('T -> unit) -> option:'T option -> unit + + /// map f inp evaluates to match inp with None -> None | Some x -> Some (f x). + /// A function to apply to the option value. + /// The input option. + /// An option of the input value after applying the mapping function, or None if the input is None. + [] + val map: mapping:('T -> 'U) -> option:'T option -> 'U option + + /// map f option1 option2 evaluates to match option1, option2 with Some x, Some y -> Some (f x y) | _ -> None. + /// A function to apply to the option values. + /// The first option. + /// The second option. + /// An option of the input values after applying the mapping function, or None if either input is None. + [] + val map2: mapping:('T1 -> 'T2 -> 'U) -> 'T1 option -> 'T2 option -> 'U option + + /// map f option1 option2 option3 evaluates to match option1, option2, option3 with Some x, Some y, Some z -> Some (f x y z) | _ -> None. + /// A function to apply to the option values. + /// The first option. + /// The second option. + /// The third option. + /// An option of the input values after applying the mapping function, or None if any input is None. + [] + val map3: mapping:('T1 -> 'T2 -> 'T3 -> 'U) -> 'T1 option -> 'T2 option -> 'T3 option -> 'U option + + /// bind f inp evaluates to match inp with None -> None | Some x -> f x + /// A function that takes the value of type T from an option and transforms it into + /// an option containing a value of type U. + /// The input option. + /// An option of the output type of the binder. + [] + val bind: binder:('T -> 'U option) -> option:'T option -> 'U option + + /// flatten inp evaluates to match inp with None -> None | Some x -> x + /// The input option. + /// An option of the output type of the binder. + /// flatten is equivalent to bind id. + [] + val flatten: option:'T option option -> 'T option + + /// filter f inp evaluates to match inp with None -> None | Some x -> if f x then Some x else None. + /// A function that evaluates whether the value contained in the option should remain, or be filtered out. + /// The input option. + /// The input if the predicate evaluates to true; otherwise, None. + [] + val filter: predicate:('T -> bool) -> option:'T option -> 'T option + + /// Convert the option to an array of length 0 or 1. + /// The input option. + /// The result array. + [] + val toArray: option:'T option -> 'T[] + + /// Convert the option to a list of length 0 or 1. + /// The input option. + /// The result list. + [] + val toList: option:'T option -> 'T list + + + /// Convert the option to a Nullable value. + /// The input option. + /// The result value. + [] + val toNullable: option:'T option -> Nullable<'T> + + /// Convert a Nullable value to an option. + /// The input nullable value. + /// The result option. + [] + val ofNullable: value:Nullable<'T> -> 'T option + + /// Convert a potentially null value to an option. + /// The input value. + /// The result option. + [] + val ofObj: value: 'T -> 'T option when 'T : null + + /// Convert an option to a potentially null value. + /// The input value. + /// The result value, which is null if the input was None. + [] + val toObj: value: 'T option -> 'T when 'T : null + +/// Basic operations on value options. +module ValueOption = + /// Returns true if the value option is not ValueNone. + /// The input value option. + /// True if the value option is not ValueNone. + [] + val inline isSome: voption:'T voption -> bool + + /// Returns true if the value option is ValueNone. + /// The input value option. + /// True if the voption is ValueNone. + [] + val inline isNone: voption:'T voption -> bool + + /// Gets the value of the value option if the option is ValueSome, otherwise returns the specified default value. + /// The specified default value. + /// The input voption. + /// The voption if the voption is ValueSome, else the default value. + /// Identical to the built-in operator, except with the arguments swapped. + [] + val defaultValue: value:'T -> voption:'T voption -> 'T + + /// Gets the value of the voption if the voption is ValueSome, otherwise evaluates and returns the result. + /// A thunk that provides a default value when evaluated. + /// The input voption. + /// The voption if the voption is ValueSome, else the result of evaluating . + /// is not evaluated unless is ValueNone. + [] + val defaultWith: defThunk:(unit -> 'T) -> voption:'T voption -> 'T + + /// Returns if it is Some, otherwise returns . + /// The value to use if is None. + /// The input option. + /// The option if the option is Some, else the alternate option. + [] + val orElse: ifNone:'T voption -> voption:'T voption -> 'T voption + + /// Returns if it is Some, otherwise evaluates and returns the result. + /// A thunk that provides an alternate value option when evaluated. + /// The input value option. + /// The voption if the voption is ValueSome, else the result of evaluating . + /// is not evaluated unless is ValueNone. + [] + val orElseWith: ifNoneThunk:(unit -> 'T voption) -> voption:'T voption -> 'T voption + + /// Gets the value associated with the option. + /// The input value option. + /// The value within the option. + /// Thrown when the option is ValueNone. + [] + val get: voption:'T voption -> 'T + + /// count inp evaluates to match inp with ValueNone -> 0 | ValueSome _ -> 1. + /// The input value option. + /// A zero if the option is ValueNone, a one otherwise. + [] + val count: voption:'T voption -> int + + /// fold f s inp evaluates to match inp with ValueNone -> s | ValueSome x -> f s x. + /// A function to update the state data when given a value from a value option. + /// The initial state. + /// The input value option. + /// The original state if the option is ValueNone, otherwise it returns the updated state with the folder + /// and the voption value. + [] + val fold<'T,'State> : folder:('State -> 'T -> 'State) -> state:'State -> voption:'T voption -> 'State + + /// fold f inp s evaluates to match inp with ValueNone -> s | ValueSome x -> f x s. + /// A function to update the state data when given a value from a value option. + /// The input value option. + /// The initial state. + /// The original state if the option is ValueNone, otherwise it returns the updated state with the folder + /// and the voption value. + [] + val foldBack<'T,'State> : folder:('T -> 'State -> 'State) -> voption:'T voption -> state:'State -> 'State + + /// exists p inp evaluates to match inp with ValueNone -> false | ValueSome x -> p x. + /// A function that evaluates to a boolean when given a value from the option type. + /// The input value option. + /// False if the option is ValueNone, otherwise it returns the result of applying the predicate + /// to the option value. + [] + val exists: predicate:('T -> bool) -> voption:'T voption -> bool + + /// forall p inp evaluates to match inp with ValueNone -> true | ValueSome x -> p x. + /// A function that evaluates to a boolean when given a value from the value option type. + /// The input value option. + /// True if the option is None, otherwise it returns the result of applying the predicate + /// to the option value. + [] + val forall: predicate:('T -> bool) -> voption:'T voption -> bool + + /// Evaluates to true if is ValueSome and its value is equal to . + /// The value to test for equality. + /// The input value option. + /// True if the option is ValueSome and contains a value equal to , otherwise false. + [] + val inline contains: value:'T -> voption:'T voption -> bool when 'T : equality + + /// iter f inp executes match inp with ValueNone -> () | ValueSome x -> f x. + /// A function to apply to the voption value. + /// The input value option. + /// Unit if the option is ValueNone, otherwise it returns the result of applying the predicate + /// to the voption value. + [] + val iter: action:('T -> unit) -> voption:'T voption -> unit + + /// map f inp evaluates to match inp with ValueNone -> ValueNone | ValueSome x -> ValueSome (f x). + /// A function to apply to the voption value. + /// The input value option. + /// A value option of the input value after applying the mapping function, or ValueNone if the input is ValueNone. + [] + val map: mapping:('T -> 'U) -> voption:'T voption -> 'U voption + + /// map f voption1 voption2 evaluates to match voption1, voption2 with ValueSome x, ValueSome y -> ValueSome (f x y) | _ -> ValueNone. + /// A function to apply to the voption values. + /// The first value option. + /// The second value option. + /// A value option of the input values after applying the mapping function, or ValueNone if either input is ValueNone. + [] + val map2: mapping:('T1 -> 'T2 -> 'U) -> voption1: 'T1 voption -> voption2: 'T2 voption -> 'U voption + + /// map f voption1 voption2 voption3 evaluates to match voption1, voption2, voption3 with ValueSome x, ValueSome y, ValueSome z -> ValueSome (f x y z) | _ -> ValueNone. + /// A function to apply to the value option values. + /// The first value option. + /// The second value option. + /// The third value option. + /// A value option of the input values after applying the mapping function, or ValueNone if any input is ValueNone. + [] + val map3: mapping:('T1 -> 'T2 -> 'T3 -> 'U) -> 'T1 voption -> 'T2 voption -> 'T3 voption -> 'U voption + + /// bind f inp evaluates to match inp with ValueNone -> ValueNone | ValueSome x -> f x + /// A function that takes the value of type T from a value option and transforms it into + /// a value option containing a value of type U. + /// The input value option. + /// An option of the output type of the binder. + [] + val bind: binder:('T -> 'U voption) -> voption:'T voption -> 'U voption + + /// flatten inp evaluates to match inp with ValueNone -> ValueNone | ValueSome x -> x + /// The input value option. + /// A value option of the output type of the binder. + /// flatten is equivalent to bind id. + [] + val flatten: voption:'T voption voption -> 'T voption + + /// filter f inp evaluates to match inp with ValueNone -> ValueNone | ValueSome x -> if f x then ValueSome x else ValueNone. + /// A function that evaluates whether the value contained in the value option should remain, or be filtered out. + /// The input value option. + /// The input if the predicate evaluates to true; otherwise, ValueNone. + [] + val filter: predicate:('T -> bool) -> voption:'T voption -> 'T voption + + /// Convert the value option to an array of length 0 or 1. + /// The input value option. + /// The result array. + [] + val toArray: voption:'T voption -> 'T[] + + /// Convert the value option to a list of length 0 or 1. + /// The input value option. + /// The result list. + [] + val toList: voption:'T voption -> 'T list + + /// Convert the value option to a Nullable value. + /// The input value option. + /// The result value. + [] + val toNullable: voption:'T voption -> Nullable<'T> + + /// Convert a Nullable value to a value option. + /// The input nullable value. + /// The result value option. + [] + val ofNullable: value:Nullable<'T> -> 'T voption + + /// Convert a potentially null value to a value option. + /// The input value. + /// The result value option. + [] + val ofObj: value: 'T -> 'T voption when 'T : null + + /// Convert an option to a potentially null value. + /// The input value. + /// The result value, which is null if the input was ValueNone. + [] + val toObj: value: 'T voption -> 'T when 'T : null diff --git a/src/fsharp/FSharp.Core/prim-types.fs b/src/fsharp/FSharp.Core/prim-types.fs index 753a75204dc..7929ef77581 100644 --- a/src/fsharp/FSharp.Core/prim-types.fs +++ b/src/fsharp/FSharp.Core/prim-types.fs @@ -3054,12 +3054,29 @@ namespace Microsoft.FSharp.Core [] [] [] + [] type ValueOption<'T> = | ValueNone : 'T voption | ValueSome : 'T -> 'T voption member x.Value = match x with ValueSome x -> x | ValueNone -> raise (new System.InvalidOperationException("ValueOption.Value")) + [] + static member None : 'T voption = ValueNone + + static member Some (value) : 'T voption = ValueSome(value) + + [] + member x.IsNone = match x with ValueNone -> true | _ -> false + + [] + member x.IsSome = match x with ValueSome _ -> true | _ -> false + + static member op_Implicit (value) : 'T option = Some(value) + + override x.ToString() = + // x is non-null, hence ValueSome + "ValueSome("^anyToStringShowingNull x.Value^")" and 'T voption = ValueOption<'T> diff --git a/src/fsharp/FSharp.Core/prim-types.fsi b/src/fsharp/FSharp.Core/prim-types.fsi index 61786826a20..a62b9d18783 100644 --- a/src/fsharp/FSharp.Core/prim-types.fsi +++ b/src/fsharp/FSharp.Core/prim-types.fsi @@ -1866,6 +1866,20 @@ namespace Microsoft.FSharp.Core /// Get the value of a 'ValueSome' option. An InvalidOperationException is raised if the option is 'ValueNone'. member Value : 'T + /// Create a value option value that is a 'ValueNone' value. + static member None : 'T voption + + /// Create a value option value that is a 'Some' value. + /// The input value + /// A value option representing the value. + static member Some : value:'T -> 'T voption + + /// Return 'true' if the value option is a 'ValueSome' value. + member IsSome : bool + + /// Return 'true' if the value option is a 'ValueNone' value. + member IsNone : bool + /// The type of optional values, represented as structs. /// /// Use the constructors ValueSome and ValueNone to create values of this type. diff --git a/src/fsharp/NameResolution.fs b/src/fsharp/NameResolution.fs index 0b95e6f72f3..e07e3a682fd 100644 --- a/src/fsharp/NameResolution.fs +++ b/src/fsharp/NameResolution.fs @@ -1100,7 +1100,7 @@ let AddEntityForProvidedType (amap: Import.ImportMap, modref: ModuleOrNamespaceR let tycon = Construct.NewProvidedTycon(resolutionEnvironment, st, importProvidedType, isSuppressRelocate, m) modref.ModuleOrNamespaceType.AddProvidedTypeEntity(tycon) let tcref = modref.NestedTyconRef tycon - System.Diagnostics.Debug.Assert(ValueOption.isSome modref.TryDeref) + System.Diagnostics.Debug.Assert(ValueOptionInternal.isSome modref.TryDeref) tcref diff --git a/src/fsharp/Optimizer.fs b/src/fsharp/Optimizer.fs index 116911167eb..b97e6b7da7a 100644 --- a/src/fsharp/Optimizer.fs +++ b/src/fsharp/Optimizer.fs @@ -3162,7 +3162,7 @@ and OptimizeBinding cenv isRec env (TBind(vref, expr, spBind)) = | None -> false | Some mbrTyconRef -> // Check we can deref system_MarshalByRefObject_tcref. When compiling against the Silverlight mscorlib we can't - if ValueOption.isSome mbrTyconRef.TryDeref then + if ValueOptionInternal.isSome mbrTyconRef.TryDeref then // Check if this is a subtype of MarshalByRefObject assert (cenv.g.system_MarshalByRefObject_ty.IsSome) ExistsSameHeadTypeInHierarchy cenv.g cenv.amap vref.Range (generalizedTyconRef tcref) cenv.g.system_MarshalByRefObject_ty.Value diff --git a/src/fsharp/QuotationTranslator.fs b/src/fsharp/QuotationTranslator.fs index 99fdf6c751a..24e86da1bad 100644 --- a/src/fsharp/QuotationTranslator.fs +++ b/src/fsharp/QuotationTranslator.fs @@ -66,7 +66,7 @@ type QuotationGenerationScope = static member ComputeQuotationFormat g = let deserializeExValRef = ValRefForIntrinsic g.deserialize_quoted_FSharp_40_plus_info - if ValueOption.isSome deserializeExValRef.TryDeref then + if ValueOptionInternal.isSome deserializeExValRef.TryDeref then QuotationSerializationFormat.FSharp_40_Plus else QuotationSerializationFormat.FSharp_20_Plus diff --git a/src/fsharp/symbols/Symbols.fs b/src/fsharp/symbols/Symbols.fs index ab4cc75a977..fa3fcccfc82 100644 --- a/src/fsharp/symbols/Symbols.fs +++ b/src/fsharp/symbols/Symbols.fs @@ -86,7 +86,7 @@ module Impl = let entityIsUnresolved(entity:EntityRef) = match entity with | ERefNonLocal(NonLocalEntityRef(ccu, _)) -> - ccu.IsUnresolvedReference && ValueOption.isNone entity.TryDeref + ccu.IsUnresolvedReference && ValueOptionInternal.isNone entity.TryDeref | _ -> false let checkEntityIsResolved(entity:EntityRef) = @@ -755,11 +755,12 @@ and FSharpUnionCase(cenv, v: UnionCaseRef) = ) - let isUnresolved() = - entityIsUnresolved v.TyconRef || ValueOption.isNone v.TryUnionCase + let isUnresolved() = + entityIsUnresolved v.TyconRef || ValueOptionInternal.isNone v.TryUnionCase + let checkIsResolved() = checkEntityIsResolved v.TyconRef - if ValueOption.isNone v.TryUnionCase then + if ValueOptionInternal.isNone v.TryUnionCase then invalidOp (sprintf "The union case '%s' could not be found in the target type" v.CaseName) member __.IsUnresolved = @@ -872,10 +873,10 @@ and FSharpField(cenv: SymbolEnv, d: FSharpFieldData) = let isUnresolved() = d.TryDeclaringTyconRef |> Option.exists entityIsUnresolved || - match d with + match d with | AnonField _ -> false - | RecdOrClass v -> ValueOption.isNone v.TryRecdField - | Union (v, _) -> ValueOption.isNone v.TryUnionCase + | RecdOrClass v -> ValueOptionInternal.isNone v.TryRecdField + | Union (v, _) -> ValueOptionInternal.isNone v.TryUnionCase | ILField _ -> false let checkIsResolved() = @@ -883,10 +884,10 @@ and FSharpField(cenv: SymbolEnv, d: FSharpFieldData) = match d with | AnonField _ -> () | RecdOrClass v -> - if ValueOption.isNone v.TryRecdField then + if ValueOptionInternal.isNone v.TryRecdField then invalidOp (sprintf "The record field '%s' could not be found in the target type" v.FieldName) | Union (v, _) -> - if ValueOption.isNone v.TryUnionCase then + if ValueOptionInternal.isNone v.TryUnionCase then invalidOp (sprintf "The union case '%s' could not be found in the target type" v.CaseName) | ILField _ -> () @@ -1378,7 +1379,7 @@ and FSharpMemberOrFunctionOrValue(cenv, d:FSharpMemberOrValData, item) = let isUnresolved() = match fsharpInfo() with | None -> false - | Some v -> ValueOption.isNone v.TryDeref + | Some v -> ValueOptionInternal.isNone v.TryDeref let checkIsResolved() = if isUnresolved() then diff --git a/src/fsharp/tast.fs b/src/fsharp/tast.fs index fc8354e3432..63e7412d902 100644 --- a/src/fsharp/tast.fs +++ b/src/fsharp/tast.fs @@ -1901,7 +1901,7 @@ and [] |> List.tryFind (fun v -> match key.TypeForLinkage with | None -> true | Some keyTy -> ccu.MemberSignatureEquality(keyTy,v.Type)) - |> ValueOption.ofOption + |> ValueOptionInternal.ofOption /// Get a table of values indexed by logical name member mtyp.AllValsByLogicalName = @@ -3263,7 +3263,7 @@ and ValueSome tcr.binding /// Is the destination assembly available? - member tcr.CanDeref = ValueOption.isSome tcr.TryDeref + member tcr.CanDeref = ValueOptionInternal.isSome tcr.TryDeref /// Gets the data indicating the compiled representation of a type or module in terms of Abstract IL data structures. member x.CompiledRepresentation = x.Deref.CompiledRepresentation @@ -3814,7 +3814,7 @@ and | None -> error(InternalError(sprintf "union case %s not found in type %s" x.CaseName x.TyconRef.LogicalName, x.TyconRef.Range)) /// Try to dereference the reference - member x.TryUnionCase = x.TyconRef.TryDeref |> ValueOption.bind (fun tcref -> tcref.GetUnionCaseByName x.CaseName |> ValueOption.ofOption) + member x.TryUnionCase = x.TyconRef.TryDeref |> ValueOptionInternal.bind (fun tcref -> tcref.GetUnionCaseByName x.CaseName |> ValueOptionInternal.ofOption) /// Get the attributes associated with the union case member x.Attribs = x.UnionCase.Attribs @@ -3873,7 +3873,7 @@ and | None -> error(InternalError(sprintf "field %s not found in type %s" id tcref.LogicalName, tcref.Range)) /// Try to dereference the reference - member x.TryRecdField = x.TyconRef.TryDeref |> ValueOption.bind (fun tcref -> tcref.GetFieldByName x.FieldName |> ValueOption.ofOption) + member x.TryRecdField = x.TyconRef.TryDeref |> ValueOptionInternal.bind (fun tcref -> tcref.GetFieldByName x.FieldName |> ValueOptionInternal.ofOption) /// Get the attributes associated with the compiled property of the record field member x.PropertyAttribs = x.RecdField.PropertyAttribs diff --git a/tests/FSharp.Core.UnitTests/FSharp.Core/Microsoft.FSharp.Core/OptionModule.fs b/tests/FSharp.Core.UnitTests/FSharp.Core/Microsoft.FSharp.Core/OptionModule.fs index 5726775deff..3fb4395cd69 100644 --- a/tests/FSharp.Core.UnitTests/FSharp.Core/Microsoft.FSharp.Core/OptionModule.fs +++ b/tests/FSharp.Core.UnitTests/FSharp.Core/Microsoft.FSharp.Core/OptionModule.fs @@ -224,28 +224,224 @@ type ValueOptionTests() = [] member this.ValueOptionBasics () = - Assert.AreEqual( (ValueNone: int voption), (ValueNone: int voption)) - Assert.True( (ValueNone: int voption) <= (ValueNone: int voption)) - Assert.True( (ValueNone: int voption) >= (ValueNone: int voption)) - Assert.True( (ValueNone: int voption) < (ValueSome 1: int voption)) - Assert.True( (ValueSome 0: int voption) < (ValueSome 1: int voption)) - Assert.True( (ValueSome 1: int voption) > (ValueSome 0: int voption)) - Assert.False( (ValueSome 1: int voption) < (ValueNone : int voption)) - Assert.True( (ValueSome 1: int voption) <= (ValueSome 1: int voption)) - Assert.AreEqual( compare (ValueSome 1) (ValueSome 1), 0) - Assert.True( compare (ValueSome 0) (ValueSome 1) < 0) - Assert.True( compare (ValueNone: int voption) (ValueSome 1) < 0) - Assert.True( compare (ValueSome 1) (ValueNone : int voption) > 0) - Assert.AreEqual( ValueSome 1, ValueSome 1) - Assert.AreNotEqual( ValueSome 2, ValueSome 1) - Assert.AreEqual( ValueSome 2, ValueSome 2) - Assert.AreEqual( ValueSome (ValueSome 2), ValueSome (ValueSome 2)) - Assert.AreNotEqual( ValueSome (ValueSome 2), ValueSome (ValueSome 1)) - Assert.AreNotEqual( ValueSome (ValueSome 0), ValueSome ValueNone) - Assert.AreEqual( ValueSome (ValueNone: int voption), ValueSome (ValueNone: int voption)) - Assert.AreEqual( (ValueSome (ValueNone: int voption)).Value, (ValueNone: int voption)) - Assert.AreEqual( (ValueSome 1).Value, 1) - Assert.AreEqual( (ValueSome (1,2)).Value, (1,2)) + Assert.AreEqual((ValueNone: int voption), (ValueNone: int voption)) + Assert.True((ValueNone: int voption) <= (ValueNone: int voption)) + Assert.True((ValueNone: int voption) >= (ValueNone: int voption)) + Assert.True((ValueNone: int voption) < (ValueSome 1: int voption)) + Assert.True((ValueSome 0: int voption) < (ValueSome 1: int voption)) + Assert.True((ValueSome 1: int voption) > (ValueSome 0: int voption)) + Assert.False((ValueSome 1: int voption) < (ValueNone : int voption)) + Assert.True((ValueSome 1: int voption) <= (ValueSome 1: int voption)) + Assert.AreEqual(compare (ValueSome 1) (ValueSome 1), 0) + Assert.True(compare (ValueSome 0) (ValueSome 1) < 0) + Assert.True(compare (ValueNone: int voption) (ValueSome 1) < 0) + Assert.True(compare (ValueSome 1) (ValueNone : int voption) > 0) + Assert.AreEqual(ValueSome 1, ValueSome 1) + Assert.AreNotEqual(ValueSome 2, ValueSome 1) + Assert.AreEqual(ValueSome 2, ValueSome 2) + Assert.AreEqual(ValueSome (ValueSome 2), ValueSome (ValueSome 2)) + Assert.AreNotEqual(ValueSome (ValueSome 2), ValueSome (ValueSome 1)) + Assert.AreNotEqual(ValueSome (ValueSome 0), ValueSome ValueNone) + Assert.AreEqual(ValueSome (ValueNone: int voption), ValueSome (ValueNone: int voption)) + Assert.AreEqual((ValueSome (ValueNone: int voption)).Value, (ValueNone: int voption)) + Assert.AreEqual((ValueSome 1).Value, 1) + Assert.AreEqual((ValueSome (1,2)).Value, (1,2)) Assert.AreEqual(defaultValueArg ValueNone 1, 1) Assert.AreEqual(defaultValueArg (ValueSome 3) 1, 3) + + [] + member this.Flatten () = + Assert.AreEqual(ValueOption.flatten ValueNone, ValueNone) + Assert.AreEqual(ValueOption.flatten (ValueSome ValueNone), ValueNone) + Assert.AreEqual(ValueOption.flatten (ValueSome <| ValueSome 1), ValueSome 1) + Assert.AreEqual(ValueOption.flatten (ValueSome <| ValueSome ""), ValueSome "") + + [] + member this.FilterValueSomeIntegerWhenPredicateReturnsTrue () = + let test x = + let actual = x |> ValueSome |> ValueOption.filter (fun _ -> true) + + actual = ValueSome x + |> Assert.True + [0;1;-1;42] |> List.iter test + + [] + member this.FilterValueSomeStringWhenPredicateReturnsTrue () = + let test x = + let actual = x |> ValueSome |> ValueOption.filter (fun _ -> true) + + actual = ValueSome x + |> Assert.True + [""; " "; "Foo"; "Bar"] |> List.iter test + + [] + member this.FilterValueSomeIntegerWhenPredicateReturnsFalse () = + let test x = + let actual = x |> ValueSome |> ValueOption.filter (fun _ -> false) + + actual = ValueNone + |> Assert.True + [0; 1; -1; 1337] |> List.iter test + + [] + member this.FilterValueSomeStringWhenPredicateReturnsFalse () = + let test x = + let actual = x |> ValueSome |> ValueOption.filter (fun _ -> false) + + actual= ValueNone + |> Assert.True + [""; " "; "Ploeh"; "Fnaah"] |> List.iter test + [] + member this.FilterValueNoneReturnsCorrectResult () = + let test x = + let actual = ValueNone |> ValueOption.filter (fun _ -> x) + + actual = ValueNone + |> Assert.True + [false; true] |> List.iter test + + [] + member this.FilterValueSomeIntegerWhenPredicateEqualsInput () = + let test x = + let actual = x |> ValueSome |> ValueOption.filter ((=) x) + + actual = ValueSome x + |> Assert.True + [0; 1; -1; -2001] |> List.iter test + + [] + member this.FilterValueSomeStringWhenPredicateEqualsInput () = + let test x = + let actual = x |> ValueSome |> ValueOption.filter ((=) x) + + actual = ValueSome x + |> Assert.True + [""; " "; "Xyzz"; "Sgryt"] |> List.iter test + + [] + member this.FilterValueSomeIntegerWhenPredicateDoesNotEqualsInput () = + let test x = + let actual = x |> ValueSome |> ValueOption.filter ((<>) x) + + actual = ValueNone + |> Assert.True + [0; 1; -1; 927] |> List.iter test + + [] + member this.FilterValueSomeStringWhenPredicateDoesNotEqualsInput () = + let test x = + let actual = x |> ValueSome |> ValueOption.filter ((<>) x) + + actual = ValueNone + |> Assert.True + [""; " "; "Baz Quux"; "Corge grault"] |> List.iter test + + [] + member this.Contains() = + Assert.IsFalse(ValueOption.contains 1 ValueNone) + Assert.IsTrue(ValueOption.contains 1 (ValueSome 1)) + + Assert.IsFalse(ValueOption.contains "" ValueNone) + Assert.IsTrue(ValueOption.contains "" (ValueSome "")) + + Assert.IsFalse(ValueOption.contains ValueNone ValueNone) + Assert.IsTrue(ValueOption.contains ValueNone (ValueSome ValueNone)) + [] + member this.OfToNullable() = + Assert.IsTrue(ValueOption.ofNullable (System.Nullable()) = ValueNone) + Assert.IsTrue(ValueOption.ofNullable (System.Nullable(3)) = ValueSome 3) + + Assert.IsTrue(ValueOption.toNullable (ValueNone : int voption) = System.Nullable()) + Assert.IsTrue(ValueOption.toNullable (ValueNone : System.DateTime voption) = System.Nullable()) + Assert.IsTrue(ValueOption.toNullable (ValueSome 3) = System.Nullable(3)) + + [] + member this.OfToObj() = + Assert.IsTrue(ValueOption.toObj (ValueSome "3") = "3") + Assert.IsTrue(ValueOption.toObj (ValueSome "") = "") + Assert.IsTrue(ValueOption.toObj (ValueSome null) = null) + Assert.IsTrue(ValueOption.toObj ValueNone = null) + + Assert.IsTrue(ValueOption.ofObj "3" = ValueSome "3") + Assert.IsTrue(ValueOption.ofObj "" = ValueSome "") + Assert.IsTrue(ValueOption.ofObj [| "" |] = ValueSome [| "" |]) + Assert.IsTrue(ValueOption.ofObj (null : string array) = ValueNone) + Assert.IsTrue(ValueOption.ofObj null = ValueNone) + Assert.IsTrue(ValueOption.ofObj null = ValueNone) + Assert.IsTrue(ValueOption.ofObj null = ValueNone) + + [] + member this.DefaultValue() = + Assert.AreEqual(ValueOption.defaultValue 3 ValueNone, 3) + Assert.AreEqual(ValueOption.defaultValue 3 (ValueSome 42), 42) + Assert.AreEqual(ValueOption.defaultValue "" ValueNone, "") + Assert.AreEqual(ValueOption.defaultValue "" (ValueSome "x"), "x") + + [] + member this.DefaultWith() = + Assert.AreEqual(ValueOption.defaultWith (fun () -> 3) ValueNone, 3) + Assert.AreEqual(ValueOption.defaultWith (fun () -> "") ValueNone, "") + + Assert.AreEqual(ValueOption.defaultWith assertWasNotCalledThunk (ValueSome 42), 42) + Assert.AreEqual(ValueOption.defaultWith assertWasNotCalledThunk (ValueSome ""), "") + + [] + member this.OrElse() = + Assert.AreEqual(ValueOption.orElse ValueNone ValueNone, ValueNone) + Assert.AreEqual(ValueOption.orElse (ValueSome 3) ValueNone, ValueSome 3) + Assert.AreEqual(ValueOption.orElse ValueNone (ValueSome 42), ValueSome 42) + Assert.AreEqual(ValueOption.orElse (ValueSome 3) (ValueSome 42), ValueSome 42) + + Assert.AreEqual(ValueOption.orElse (ValueSome "") ValueNone, ValueSome "") + Assert.AreEqual(ValueOption.orElse ValueNone (ValueSome "x"), ValueSome "x") + Assert.AreEqual(ValueOption.orElse (ValueSome "") (ValueSome "x"), ValueSome "x") + + [] + member this.OrElseWith() = + Assert.AreEqual(ValueOption.orElseWith (fun () -> ValueNone) ValueNone, ValueNone) + Assert.AreEqual(ValueOption.orElseWith (fun () -> ValueSome 3) ValueNone, ValueSome 3) + Assert.AreEqual(ValueOption.orElseWith (fun () -> ValueSome "") ValueNone, ValueSome "") + + Assert.AreEqual(ValueOption.orElseWith assertWasNotCalledThunk (ValueSome 42), ValueSome 42) + Assert.AreEqual(ValueOption.orElseWith assertWasNotCalledThunk (ValueSome ""), ValueSome "") + + [] + member this.Map2() = + Assert.True(ValueOption.map2 (-) ValueNone ValueNone = ValueNone) + Assert.True(ValueOption.map2 (-) (ValueSome 1) ValueNone = ValueNone) + Assert.True(ValueOption.map2 (-) ValueNone (ValueSome 2) = ValueNone) + Assert.True(ValueOption.map2 (-) (ValueSome 1) (ValueSome 2) = ValueSome -1) + + Assert.True(ValueOption.map2 (+) ValueNone ValueNone = ValueNone) + Assert.True(ValueOption.map2 (+) (ValueSome "x") ValueNone = ValueNone) + Assert.True(ValueOption.map2 (+) (ValueSome "x") (ValueSome "y") = ValueSome "xy") + Assert.True(ValueOption.map2 (+) ValueNone (ValueSome "y") = ValueNone) + + [] + member this.Map3() = + let add3 x y z = string x + string y + string z + Assert.True(ValueOption.map3 add3 ValueNone ValueNone ValueNone = ValueNone) + Assert.True(ValueOption.map3 add3 (ValueSome 1) ValueNone ValueNone = ValueNone) + Assert.True(ValueOption.map3 add3 ValueNone (ValueSome 2) ValueNone = ValueNone) + Assert.True(ValueOption.map3 add3 (ValueSome 1) (ValueSome 2) ValueNone = ValueNone) + Assert.True(ValueOption.map3 add3 ValueNone ValueNone (ValueSome 3) = ValueNone) + Assert.True(ValueOption.map3 add3 (ValueSome 1) ValueNone (ValueSome 3) = ValueNone) + Assert.True(ValueOption.map3 add3 ValueNone (ValueSome 2) (ValueSome 3) = ValueNone) + Assert.True(ValueOption.map3 add3 (ValueSome 1) (ValueSome 2) (ValueSome 3) = ValueSome "123") + + let concat3 x y z = x + y + z + Assert.True(ValueOption.map3 concat3 ValueNone ValueNone ValueNone = ValueNone) + Assert.True(ValueOption.map3 concat3 (ValueSome "x") ValueNone ValueNone = ValueNone) + Assert.True(ValueOption.map3 concat3 ValueNone (ValueSome "y") ValueNone = ValueNone) + Assert.True(ValueOption.map3 concat3 (ValueSome "x") (ValueSome "y") ValueNone = ValueNone) + Assert.True(ValueOption.map3 concat3 ValueNone ValueNone (ValueSome "z") = ValueNone) + Assert.True(ValueOption.map3 concat3 (ValueSome "x") ValueNone (ValueSome "z") = ValueNone) + Assert.True(ValueOption.map3 concat3 ValueNone (ValueSome "y") (ValueSome "z") = ValueNone) + Assert.True(ValueOption.map3 concat3 (ValueSome "x") (ValueSome "y") (ValueSome "z") = ValueSome "xyz") + + [] + member this.MapBindEquivalenceProperties () = + let fn x = x + 3 + Assert.AreEqual(ValueOption.map fn ValueNone, ValueOption.bind (fn >> ValueSome) ValueNone) + Assert.AreEqual(ValueOption.map fn (ValueSome 5), ValueOption.bind (fn >> ValueSome) (ValueSome 5)) \ No newline at end of file diff --git a/tests/FSharp.Core.UnitTests/SurfaceArea.coreclr.fs b/tests/FSharp.Core.UnitTests/SurfaceArea.coreclr.fs index fc3dbbbed59..e3873c76b9c 100644 --- a/tests/FSharp.Core.UnitTests/SurfaceArea.coreclr.fs +++ b/tests/FSharp.Core.UnitTests/SurfaceArea.coreclr.fs @@ -2192,6 +2192,13 @@ Microsoft.FSharp.Core.FSharpValueOption`1[T]: T Item Microsoft.FSharp.Core.FSharpValueOption`1[T]: T Value Microsoft.FSharp.Core.FSharpValueOption`1[T]: T get_Item() Microsoft.FSharp.Core.FSharpValueOption`1[T]: T get_Value() +Microsoft.FSharp.Core.FSharpValueOption`1[T]: Boolean IsNone +Microsoft.FSharp.Core.FSharpValueOption`1[T]: Boolean IsSome +Microsoft.FSharp.Core.FSharpValueOption`1[T]: Boolean get_IsNone() +Microsoft.FSharp.Core.FSharpValueOption`1[T]: Boolean get_IsSome() +Microsoft.FSharp.Core.FSharpValueOption`1[T]: Microsoft.FSharp.Core.FSharpValueOption`1[T] None +Microsoft.FSharp.Core.FSharpValueOption`1[T]: Microsoft.FSharp.Core.FSharpValueOption`1[T] Some(T) +Microsoft.FSharp.Core.FSharpValueOption`1[T]: Microsoft.FSharp.Core.FSharpValueOption`1[T] get_None() Microsoft.FSharp.Core.FSharpTypeFunc: Boolean Equals(System.Object) Microsoft.FSharp.Core.FSharpTypeFunc: Int32 GetHashCode() Microsoft.FSharp.Core.FSharpTypeFunc: System.Object Specialize[T]() @@ -2762,6 +2769,36 @@ Microsoft.FSharp.Core.OptionModule: TState FoldBack[T,TState](Microsoft.FSharp.C Microsoft.FSharp.Core.OptionModule: TState Fold[T,TState](Microsoft.FSharp.Core.FSharpFunc`2[TState,Microsoft.FSharp.Core.FSharpFunc`2[T,TState]], TState, Microsoft.FSharp.Core.FSharpOption`1[T]) Microsoft.FSharp.Core.OptionModule: T[] ToArray[T](Microsoft.FSharp.Core.FSharpOption`1[T]) Microsoft.FSharp.Core.OptionModule: Void Iterate[T](Microsoft.FSharp.Core.FSharpFunc`2[T,Microsoft.FSharp.Core.Unit], Microsoft.FSharp.Core.FSharpOption`1[T]) +Microsoft.FSharp.Core.ValueOption: Boolean Contains[T](T, Microsoft.FSharp.Core.FSharpValueOption`1[T]) +Microsoft.FSharp.Core.ValueOption: Boolean Equals(System.Object) +Microsoft.FSharp.Core.ValueOption: Boolean Exists[T](Microsoft.FSharp.Core.FSharpFunc`2[T,System.Boolean], Microsoft.FSharp.Core.FSharpValueOption`1[T]) +Microsoft.FSharp.Core.ValueOption: Boolean ForAll[T](Microsoft.FSharp.Core.FSharpFunc`2[T,System.Boolean], Microsoft.FSharp.Core.FSharpValueOption`1[T]) +Microsoft.FSharp.Core.ValueOption: Boolean IsNone[T](Microsoft.FSharp.Core.FSharpValueOption`1[T]) +Microsoft.FSharp.Core.ValueOption: Boolean IsSome[T](Microsoft.FSharp.Core.FSharpValueOption`1[T]) +Microsoft.FSharp.Core.ValueOption: Int32 Count[T](Microsoft.FSharp.Core.FSharpValueOption`1[T]) +Microsoft.FSharp.Core.ValueOption: Int32 GetHashCode() +Microsoft.FSharp.Core.ValueOption: Microsoft.FSharp.Collections.FSharpList`1[T] ToList[T](Microsoft.FSharp.Core.FSharpValueOption`1[T]) +Microsoft.FSharp.Core.ValueOption: Microsoft.FSharp.Core.FSharpValueOption`1[TResult] Bind[T,TResult](Microsoft.FSharp.Core.FSharpFunc`2[T,Microsoft.FSharp.Core.FSharpValueOption`1[TResult]], Microsoft.FSharp.Core.FSharpValueOption`1[T]) +Microsoft.FSharp.Core.ValueOption: Microsoft.FSharp.Core.FSharpValueOption`1[TResult] Map2[T1,T2,TResult](Microsoft.FSharp.Core.FSharpFunc`2[T1,Microsoft.FSharp.Core.FSharpFunc`2[T2,TResult]], Microsoft.FSharp.Core.FSharpValueOption`1[T1], Microsoft.FSharp.Core.FSharpValueOption`1[T2]) +Microsoft.FSharp.Core.ValueOption: Microsoft.FSharp.Core.FSharpValueOption`1[TResult] Map3[T1,T2,T3,TResult](Microsoft.FSharp.Core.FSharpFunc`2[T1,Microsoft.FSharp.Core.FSharpFunc`2[T2,Microsoft.FSharp.Core.FSharpFunc`2[T3,TResult]]], Microsoft.FSharp.Core.FSharpValueOption`1[T1], Microsoft.FSharp.Core.FSharpValueOption`1[T2], Microsoft.FSharp.Core.FSharpValueOption`1[T3]) +Microsoft.FSharp.Core.ValueOption: Microsoft.FSharp.Core.FSharpValueOption`1[TResult] Map[T,TResult](Microsoft.FSharp.Core.FSharpFunc`2[T,TResult], Microsoft.FSharp.Core.FSharpValueOption`1[T]) +Microsoft.FSharp.Core.ValueOption: Microsoft.FSharp.Core.FSharpValueOption`1[T] Filter[T](Microsoft.FSharp.Core.FSharpFunc`2[T,System.Boolean], Microsoft.FSharp.Core.FSharpValueOption`1[T]) +Microsoft.FSharp.Core.ValueOption: Microsoft.FSharp.Core.FSharpValueOption`1[T] Flatten[T](Microsoft.FSharp.Core.FSharpValueOption`1[Microsoft.FSharp.Core.FSharpValueOption`1[T]]) +Microsoft.FSharp.Core.ValueOption: Microsoft.FSharp.Core.FSharpValueOption`1[T] OfNullable[T](System.Nullable`1[T]) +Microsoft.FSharp.Core.ValueOption: Microsoft.FSharp.Core.FSharpValueOption`1[T] OfObj[T](T) +Microsoft.FSharp.Core.ValueOption: Microsoft.FSharp.Core.FSharpValueOption`1[T] OrElseWith[T](Microsoft.FSharp.Core.FSharpFunc`2[Microsoft.FSharp.Core.Unit,Microsoft.FSharp.Core.FSharpValueOption`1[T]], Microsoft.FSharp.Core.FSharpValueOption`1[T]) +Microsoft.FSharp.Core.ValueOption: Microsoft.FSharp.Core.FSharpValueOption`1[T] OrElse[T](Microsoft.FSharp.Core.FSharpValueOption`1[T], Microsoft.FSharp.Core.FSharpValueOption`1[T]) +Microsoft.FSharp.Core.ValueOption: System.Nullable`1[T] ToNullable[T](Microsoft.FSharp.Core.FSharpValueOption`1[T]) +Microsoft.FSharp.Core.ValueOption: System.String ToString() +Microsoft.FSharp.Core.ValueOption: System.Type GetType() +Microsoft.FSharp.Core.ValueOption: T DefaultValue[T](T, Microsoft.FSharp.Core.FSharpValueOption`1[T]) +Microsoft.FSharp.Core.ValueOption: T DefaultWith[T](Microsoft.FSharp.Core.FSharpFunc`2[Microsoft.FSharp.Core.Unit,T], Microsoft.FSharp.Core.FSharpValueOption`1[T]) +Microsoft.FSharp.Core.ValueOption: T GetValue[T](Microsoft.FSharp.Core.FSharpValueOption`1[T]) +Microsoft.FSharp.Core.ValueOption: T ToObj[T](Microsoft.FSharp.Core.FSharpValueOption`1[T]) +Microsoft.FSharp.Core.ValueOption: TState FoldBack[T,TState](Microsoft.FSharp.Core.FSharpFunc`2[T,Microsoft.FSharp.Core.FSharpFunc`2[TState,TState]], Microsoft.FSharp.Core.FSharpValueOption`1[T], TState) +Microsoft.FSharp.Core.ValueOption: TState Fold[T,TState](Microsoft.FSharp.Core.FSharpFunc`2[TState,Microsoft.FSharp.Core.FSharpFunc`2[T,TState]], TState, Microsoft.FSharp.Core.FSharpValueOption`1[T]) +Microsoft.FSharp.Core.ValueOption: T[] ToArray[T](Microsoft.FSharp.Core.FSharpValueOption`1[T]) +Microsoft.FSharp.Core.ValueOption: Void Iterate[T](Microsoft.FSharp.Core.FSharpFunc`2[T,Microsoft.FSharp.Core.Unit], Microsoft.FSharp.Core.FSharpValueOption`1[T]) Microsoft.FSharp.Core.OptionalArgumentAttribute: Boolean Equals(System.Object) Microsoft.FSharp.Core.OptionalArgumentAttribute: Boolean Match(System.Object) Microsoft.FSharp.Core.OptionalArgumentAttribute: Int32 GetHashCode() diff --git a/tests/FSharp.Core.UnitTests/SurfaceArea.net40.fs b/tests/FSharp.Core.UnitTests/SurfaceArea.net40.fs index daebd2d65fe..16035e67c02 100644 --- a/tests/FSharp.Core.UnitTests/SurfaceArea.net40.fs +++ b/tests/FSharp.Core.UnitTests/SurfaceArea.net40.fs @@ -2272,6 +2272,13 @@ Microsoft.FSharp.Core.FSharpValueOption`1[T]: T Item Microsoft.FSharp.Core.FSharpValueOption`1[T]: T Value Microsoft.FSharp.Core.FSharpValueOption`1[T]: T get_Item() Microsoft.FSharp.Core.FSharpValueOption`1[T]: T get_Value() +Microsoft.FSharp.Core.FSharpValueOption`1[T]: Boolean IsNone +Microsoft.FSharp.Core.FSharpValueOption`1[T]: Boolean IsSome +Microsoft.FSharp.Core.FSharpValueOption`1[T]: Boolean get_IsNone() +Microsoft.FSharp.Core.FSharpValueOption`1[T]: Boolean get_IsSome() +Microsoft.FSharp.Core.FSharpValueOption`1[T]: Microsoft.FSharp.Core.FSharpValueOption`1[T] None +Microsoft.FSharp.Core.FSharpValueOption`1[T]: Microsoft.FSharp.Core.FSharpValueOption`1[T] Some(T) +Microsoft.FSharp.Core.FSharpValueOption`1[T]: Microsoft.FSharp.Core.FSharpValueOption`1[T] get_None() Microsoft.FSharp.Core.FSharpTypeFunc: Boolean Equals(System.Object) Microsoft.FSharp.Core.FSharpTypeFunc: Int32 GetHashCode() Microsoft.FSharp.Core.FSharpTypeFunc: System.Object Specialize[T]() @@ -2870,6 +2877,36 @@ Microsoft.FSharp.Core.OptionModule: TState FoldBack[T,TState](Microsoft.FSharp.C Microsoft.FSharp.Core.OptionModule: TState Fold[T,TState](Microsoft.FSharp.Core.FSharpFunc`2[TState,Microsoft.FSharp.Core.FSharpFunc`2[T,TState]], TState, Microsoft.FSharp.Core.FSharpOption`1[T]) Microsoft.FSharp.Core.OptionModule: T[] ToArray[T](Microsoft.FSharp.Core.FSharpOption`1[T]) Microsoft.FSharp.Core.OptionModule: Void Iterate[T](Microsoft.FSharp.Core.FSharpFunc`2[T,Microsoft.FSharp.Core.Unit], Microsoft.FSharp.Core.FSharpOption`1[T]) +Microsoft.FSharp.Core.ValueOption: Boolean Contains[T](T, Microsoft.FSharp.Core.FSharpValueOption`1[T]) +Microsoft.FSharp.Core.ValueOption: Boolean Equals(System.Object) +Microsoft.FSharp.Core.ValueOption: Boolean Exists[T](Microsoft.FSharp.Core.FSharpFunc`2[T,System.Boolean], Microsoft.FSharp.Core.FSharpValueOption`1[T]) +Microsoft.FSharp.Core.ValueOption: Boolean ForAll[T](Microsoft.FSharp.Core.FSharpFunc`2[T,System.Boolean], Microsoft.FSharp.Core.FSharpValueOption`1[T]) +Microsoft.FSharp.Core.ValueOption: Boolean IsNone[T](Microsoft.FSharp.Core.FSharpValueOption`1[T]) +Microsoft.FSharp.Core.ValueOption: Boolean IsSome[T](Microsoft.FSharp.Core.FSharpValueOption`1[T]) +Microsoft.FSharp.Core.ValueOption: Int32 Count[T](Microsoft.FSharp.Core.FSharpValueOption`1[T]) +Microsoft.FSharp.Core.ValueOption: Int32 GetHashCode() +Microsoft.FSharp.Core.ValueOption: Microsoft.FSharp.Collections.FSharpList`1[T] ToList[T](Microsoft.FSharp.Core.FSharpValueOption`1[T]) +Microsoft.FSharp.Core.ValueOption: Microsoft.FSharp.Core.FSharpValueOption`1[TResult] Bind[T,TResult](Microsoft.FSharp.Core.FSharpFunc`2[T,Microsoft.FSharp.Core.FSharpValueOption`1[TResult]], Microsoft.FSharp.Core.FSharpValueOption`1[T]) +Microsoft.FSharp.Core.ValueOption: Microsoft.FSharp.Core.FSharpValueOption`1[TResult] Map2[T1,T2,TResult](Microsoft.FSharp.Core.FSharpFunc`2[T1,Microsoft.FSharp.Core.FSharpFunc`2[T2,TResult]], Microsoft.FSharp.Core.FSharpValueOption`1[T1], Microsoft.FSharp.Core.FSharpValueOption`1[T2]) +Microsoft.FSharp.Core.ValueOption: Microsoft.FSharp.Core.FSharpValueOption`1[TResult] Map3[T1,T2,T3,TResult](Microsoft.FSharp.Core.FSharpFunc`2[T1,Microsoft.FSharp.Core.FSharpFunc`2[T2,Microsoft.FSharp.Core.FSharpFunc`2[T3,TResult]]], Microsoft.FSharp.Core.FSharpValueOption`1[T1], Microsoft.FSharp.Core.FSharpValueOption`1[T2], Microsoft.FSharp.Core.FSharpValueOption`1[T3]) +Microsoft.FSharp.Core.ValueOption: Microsoft.FSharp.Core.FSharpValueOption`1[TResult] Map[T,TResult](Microsoft.FSharp.Core.FSharpFunc`2[T,TResult], Microsoft.FSharp.Core.FSharpValueOption`1[T]) +Microsoft.FSharp.Core.ValueOption: Microsoft.FSharp.Core.FSharpValueOption`1[T] Filter[T](Microsoft.FSharp.Core.FSharpFunc`2[T,System.Boolean], Microsoft.FSharp.Core.FSharpValueOption`1[T]) +Microsoft.FSharp.Core.ValueOption: Microsoft.FSharp.Core.FSharpValueOption`1[T] Flatten[T](Microsoft.FSharp.Core.FSharpValueOption`1[Microsoft.FSharp.Core.FSharpValueOption`1[T]]) +Microsoft.FSharp.Core.ValueOption: Microsoft.FSharp.Core.FSharpValueOption`1[T] OfNullable[T](System.Nullable`1[T]) +Microsoft.FSharp.Core.ValueOption: Microsoft.FSharp.Core.FSharpValueOption`1[T] OfObj[T](T) +Microsoft.FSharp.Core.ValueOption: Microsoft.FSharp.Core.FSharpValueOption`1[T] OrElseWith[T](Microsoft.FSharp.Core.FSharpFunc`2[Microsoft.FSharp.Core.Unit,Microsoft.FSharp.Core.FSharpValueOption`1[T]], Microsoft.FSharp.Core.FSharpValueOption`1[T]) +Microsoft.FSharp.Core.ValueOption: Microsoft.FSharp.Core.FSharpValueOption`1[T] OrElse[T](Microsoft.FSharp.Core.FSharpValueOption`1[T], Microsoft.FSharp.Core.FSharpValueOption`1[T]) +Microsoft.FSharp.Core.ValueOption: System.Nullable`1[T] ToNullable[T](Microsoft.FSharp.Core.FSharpValueOption`1[T]) +Microsoft.FSharp.Core.ValueOption: System.String ToString() +Microsoft.FSharp.Core.ValueOption: System.Type GetType() +Microsoft.FSharp.Core.ValueOption: T DefaultValue[T](T, Microsoft.FSharp.Core.FSharpValueOption`1[T]) +Microsoft.FSharp.Core.ValueOption: T DefaultWith[T](Microsoft.FSharp.Core.FSharpFunc`2[Microsoft.FSharp.Core.Unit,T], Microsoft.FSharp.Core.FSharpValueOption`1[T]) +Microsoft.FSharp.Core.ValueOption: T GetValue[T](Microsoft.FSharp.Core.FSharpValueOption`1[T]) +Microsoft.FSharp.Core.ValueOption: T ToObj[T](Microsoft.FSharp.Core.FSharpValueOption`1[T]) +Microsoft.FSharp.Core.ValueOption: TState FoldBack[T,TState](Microsoft.FSharp.Core.FSharpFunc`2[T,Microsoft.FSharp.Core.FSharpFunc`2[TState,TState]], Microsoft.FSharp.Core.FSharpValueOption`1[T], TState) +Microsoft.FSharp.Core.ValueOption: TState Fold[T,TState](Microsoft.FSharp.Core.FSharpFunc`2[TState,Microsoft.FSharp.Core.FSharpFunc`2[T,TState]], TState, Microsoft.FSharp.Core.FSharpValueOption`1[T]) +Microsoft.FSharp.Core.ValueOption: T[] ToArray[T](Microsoft.FSharp.Core.FSharpValueOption`1[T]) +Microsoft.FSharp.Core.ValueOption: Void Iterate[T](Microsoft.FSharp.Core.FSharpFunc`2[T,Microsoft.FSharp.Core.Unit], Microsoft.FSharp.Core.FSharpValueOption`1[T]) Microsoft.FSharp.Core.OptionalArgumentAttribute: Boolean Equals(System.Object) Microsoft.FSharp.Core.OptionalArgumentAttribute: Boolean IsDefaultAttribute() Microsoft.FSharp.Core.OptionalArgumentAttribute: Boolean Match(System.Object) From b28ba27c7d0cc9259ea3b206ae0f56ebbe6cc76e Mon Sep 17 00:00:00 2001 From: Phillip Carter Date: Tue, 13 Nov 2018 12:26:23 -0800 Subject: [PATCH 110/160] 15.9 relnotes (#5893) * Add VS 15.9 release notes * add milestone * Add jason attribution --- release-notes.md | 31 ++++++++++++++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) diff --git a/release-notes.md b/release-notes.md index 2c29485b580..790efce1005 100644 --- a/release-notes.md +++ b/release-notes.md @@ -3,7 +3,36 @@ ## About the release notes -We deliver F# and F# components in Visual Studio and .NET Core releases. These can include bug fixes, new tooling features, new compiler features, performance improvements, infrastructure improvements, and new langauge versions. The most recent release of F# or any F# component will be at the top of this document. +We deliver F# and F# tools for Visual Studio and .NET Core releases. These can include bug fixes, new tooling features, new compiler features, performance improvements, infrastructure improvements, and new language versions. The most recent release of F# or any F# component will be at the top of this document. + +## Visual Studio 15.9 + +You can find all tracked VS 15.9 items in the [15.9 milestone](https://github.com/Microsoft/visualfsharp/milestone/24). + +### F# Compiler + +* Fix (#4637) - Can't debug FCS when compiled with portable pdb debug symbols, by [Jason Imison](https://github.com/nosami). +* Fix (#5355) - We fixed a bug where extension methods that take `byref` values could mutate an immutable value. +* Fix (#5446) - We improved the compile error information for overloads on `byref`/`inref`/`outref`, rather than displaying the previously obscure error. +* Fix (#5354) - Optional Type Extensions on `byref`s are now disallowed entirely. They could be declared previously, but were unusable, resulting in a confusing user experience. +* Fix (#5294) - We fixed a bug where `CompareTo` on a struct tuple and causing a type equivalence with an aliased struct tuple would result in a runtime exception. +* Fix (#5621) - We fixed a bug where use of `System.Void` in the context of authoring a Type Provider for .NET Standard could fail to find the `System.Void` type at design-time. +* Fix (#5468) - We fixed a bug where an internal error could occur when a partially applied Discriminated Union constructor is mismatched with an annotated or inferred type for the Discriminated Union. +* Fix (#5540) - We modified the compiler error message when attempting to take an address of an expression (such as accessing a property) to make it more clear that it violates scoping rules for `byref` types. +* Fix (#5536) - We fixed a bug where your program could crash at runtime when partially applying a `byref` type to a method or function. An error message will now display. +* Fix (#5459) - We fixed an issue where an invalid combination of a `byref` and a reference type (such as `byref option`) would fail at runtime and not emit an error message. We now emit an error message. + +### F# Tools for Visual Studio + +* Fix (#5657) - We resolved an issue where metadata for F# assemblies built with the .NET Core SDK was not shown in file properties on Windows. You can now see this metadata by right-clicking an assembly on Windows and selecting **Properties**. +* Fix (#5615) - We fixed a bug where use of `module global` in F# source could cause Visual Studio to become unresponsive. +* Fix (#5515) - We fixed a bug where extension methods using `inref<'T>` would not show in completion lists. +* Fix (#5514) - We fixed a bug where the TargetFramework dropdown in Project Properties for .NET Framework F# projects was empty. +* Fix (#5507) - We fixed a bug where File | New Project on a .NET Framework 4.0 project would fail. + +### F# OSS Build + +* Feature (#5027) - Set VisualFSharpFull as the default startup project, by [Robert Jeppesen](https://github.com/rojepp). ## Visual Studio 15.8.5 From fb7531cd9ce17b715b54c674fbf981c427659638 Mon Sep 17 00:00:00 2001 From: "Kevin Ransom (msft)" Date: Fri, 16 Nov 2018 11:07:26 -0800 Subject: [PATCH 111/160] Update dotnetsdk props (#5911) --- src/fsharp/FSharp.Build/Microsoft.FSharp.NetSdk.props | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/fsharp/FSharp.Build/Microsoft.FSharp.NetSdk.props b/src/fsharp/FSharp.Build/Microsoft.FSharp.NetSdk.props index f9c48d77e7c..a992617ca4d 100644 --- a/src/fsharp/FSharp.Build/Microsoft.FSharp.NetSdk.props +++ b/src/fsharp/FSharp.Build/Microsoft.FSharp.NetSdk.props @@ -58,7 +58,7 @@ WARNING: DO NOT MODIFY this file unless you are knowledgeable about MSBuild and $([System.IO.Path]::GetDirectoryName($(DOTNET_HOST_PATH))) $([System.IO.Path]::GetFileName($(DOTNET_HOST_PATH))) - "$(MSBuildThisFileDirectory)fsc.exe" + "$(MSBuildThisFileDirectory)fsc.exe" Date: Fri, 16 Nov 2018 11:08:02 -0800 Subject: [PATCH 113/160] Improve coreclr init for build (#5912) --- init-tools.cmd | 3 +-- scripts/dotnet-install.ps1 | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/init-tools.cmd b/init-tools.cmd index e8aaa61b92f..ede43a60c06 100644 --- a/init-tools.cmd +++ b/init-tools.cmd @@ -38,8 +38,6 @@ if exist "%BUILD_TOOLS_SEMAPHORE%" ( goto :DONE ) -if exist "%TOOLRUNTIME_DIR%" rmdir /S /Q "%TOOLRUNTIME_DIR%" - :: Download Nuget.exe if NOT exist "%PACKAGES_DIR%NuGet.exe" ( if NOT exist "%PACKAGES_DIR%" mkdir "%PACKAGES_DIR%" @@ -63,6 +61,7 @@ if errorlevel 1 ( set TOOLS_INIT_RETURN_CODE=1 goto :DONE ) +echo "%DOTNET_TOOLS_VERSION% >> "%DOTNET_TOOLS_PATH%\sdk\%DOTNET_TOOLS_VERSION%" :afterdotnettoolsrestore set /p DOTNET_VERSION=< "%~dp0DotnetCLIVersion.txt" diff --git a/scripts/dotnet-install.ps1 b/scripts/dotnet-install.ps1 index 93d964540f5..9da0947d958 100644 --- a/scripts/dotnet-install.ps1 +++ b/scripts/dotnet-install.ps1 @@ -188,7 +188,7 @@ function GetHTTPResponse([Uri] $Uri) } # Default timeout for HttpClient is 100s. For a 50 MB download this assumes 500 KB/s average, any less will time out # 10 minutes allows it to work over much slower connections. - $HttpClient.Timeout = New-TimeSpan -Minutes 10 + $HttpClient.Timeout = New-TimeSpan -Minutes 20 $Response = $HttpClient.GetAsync($Uri).Result if (($Response -eq $null) -or (-not ($Response.IsSuccessStatusCode))) { From f1558b7f24c7e6bbf284c428dbf9ec41bda877e1 Mon Sep 17 00:00:00 2001 From: "Kevin Ransom (msft)" Date: Sun, 18 Nov 2018 19:36:07 -0800 Subject: [PATCH 114/160] Add new implementation of IEnumerable<_> for dict (#5918) --- src/FSharp.Profiles.props | 1 + src/FSharpSource.Profiles.targets | 1 + .../FSharp.Core/fslib-extra-pervasives.fs | 30 ++++++++++++++++++- 3 files changed, 31 insertions(+), 1 deletion(-) diff --git a/src/FSharp.Profiles.props b/src/FSharp.Profiles.props index 915781c9534..3abfcb49be4 100644 --- a/src/FSharp.Profiles.props +++ b/src/FSharp.Profiles.props @@ -10,6 +10,7 @@ + $(DefineConstants);NETSTANDARD $(DefineConstants);NETSTANDARD1_6 $(DefineConstants);FX_NO_APP_DOMAINS $(DefineConstants);FX_NO_ARRAY_LONG_LENGTH diff --git a/src/FSharpSource.Profiles.targets b/src/FSharpSource.Profiles.targets index 9069ebdb955..3dc3cdd5fb3 100644 --- a/src/FSharpSource.Profiles.targets +++ b/src/FSharpSource.Profiles.targets @@ -13,6 +13,7 @@ + $(DefineConstants);NETSTANDARD $(DefineConstants);NETSTANDARD1_6 $(DefineConstants);FX_NO_APP_DOMAINS $(DefineConstants);FX_NO_ARRAY_LONG_LENGTH diff --git a/src/fsharp/FSharp.Core/fslib-extra-pervasives.fs b/src/fsharp/FSharp.Core/fslib-extra-pervasives.fs index 63cb2d80718..b4271f4a267 100644 --- a/src/fsharp/FSharp.Core/fslib-extra-pervasives.fs +++ b/src/fsharp/FSharp.Core/fslib-extra-pervasives.fs @@ -43,7 +43,9 @@ module ExtraTopLevelOperators = [] [>)>] type DictImpl<'SafeKey,'Key,'T>(t : Dictionary<'SafeKey,'T>, makeSafeKey : 'Key->'SafeKey, getKey : 'SafeKey->'Key) = - +#if NETSTANDARD + static let emptyEnumerator = (Array.empty> :> seq<_>).GetEnumerator() +#endif member x.Count = t.Count // Give a read-only view of the dictionary @@ -110,8 +112,34 @@ module ExtraTopLevelOperators = member s.GetEnumerator() = // We use an array comprehension here instead of seq {} as otherwise we get incorrect // IEnumerator.Reset() and IEnumerator.Current semantics. + // Coreclr has a bug with SZGenericEnumerators --- implement a correct enumerator. On desktop use the desktop implementation because it's ngened. +#if !NETSTANDARD let kvps = [| for (KeyValue (k,v)) in t -> KeyValuePair (getKey k, v) |] :> seq<_> kvps.GetEnumerator() +#else + let endIndex = t.Count + if endIndex = 0 then emptyEnumerator + else + let kvps = [| for (KeyValue (k,v)) in t -> KeyValuePair (getKey k, v) |] + let mutable index = -1 + let current () = + if index < 0 then raise <| InvalidOperationException(SR.GetString(SR.enumerationNotStarted)) + if index >= endIndex then raise <| InvalidOperationException(SR.GetString(SR.enumerationAlreadyFinished)) + kvps.[index] + + {new IEnumerator<_> with + member __.Current = current () + interface System.Collections.IEnumerator with + member __.Current = box(current()) + member __.MoveNext() = + if index < endIndex then + index <- index + 1 + index < endIndex + else false + member __.Reset() = index <- -1 + interface System.IDisposable with + member self.Dispose() = () } +#endif interface System.Collections.IEnumerable with member s.GetEnumerator() = From b630ce17e4cb345ddf6b65efcaf07d54d60b62b2 Mon Sep 17 00:00:00 2001 From: "Kevin Ransom (msft)" Date: Mon, 19 Nov 2018 07:12:55 -0800 Subject: [PATCH 115/160] CP: UImprove template specification for .NET Framework templates. (#5879) * CP: Use Framework valuetuple rather than netstandard1.0 one (#5872) * Use Framework valuetuple rather than netstandard1.0 one (#5867) * remove references from template * update templates --- build.cmd | 4 ++-- .../ConsoleProject/Template/ConsoleApplication.fsproj | 8 -------- .../ConsoleProject/Template/ConsoleApplication.vstemplate | 4 ++-- .../LibraryProject/Template/Library.fsproj | 8 -------- .../LibraryProject/Template/Library.vstemplate | 4 ++-- .../TutorialProject/Template/Tutorial.fsproj | 8 -------- .../TutorialProject/Template/Tutorial.vstemplate | 4 ++-- .../VisualFSharpTemplates/VisualFSharpTemplates.csproj | 2 +- 8 files changed, 9 insertions(+), 33 deletions(-) diff --git a/build.cmd b/build.cmd index dae4a3cafbf..9ae59374a90 100644 --- a/build.cmd +++ b/build.cmd @@ -611,8 +611,8 @@ if exist "%ProgramFiles%\Microsoft Visual Studio 12.0\common7\ide\devenv.exe" se :vsversionset if "%VisualStudioVersion%" == "" echo Error: Could not find an installation of Visual Studio && goto :failure -if exist "%VS160COMNTOOLS%\..\..\MSBuild\15.0\Bin\MSBuild.exe" ( - set _msbuildexe="%VS160COMNTOOLS%\..\..\MSBuild\15.0\Bin\MSBuild.exe" +if exist "%VS160COMNTOOLS%\..\..\MSBuild\Current\Bin\MSBuild.exe" ( + set _msbuildexe="%VS160COMNTOOLS%\..\..\MSBuild\Current\Bin\MSBuild.exe" goto :havemsbuild ) if exist "%VS150COMNTOOLS%\..\..\MSBuild\15.0\Bin\MSBuild.exe" ( diff --git a/vsintegration/ProjectTemplates/ConsoleProject/Template/ConsoleApplication.fsproj b/vsintegration/ProjectTemplates/ConsoleProject/Template/ConsoleApplication.fsproj index 362d1964a66..19c297de5e2 100644 --- a/vsintegration/ProjectTemplates/ConsoleProject/Template/ConsoleApplication.fsproj +++ b/vsintegration/ProjectTemplates/ConsoleProject/Template/ConsoleApplication.fsproj @@ -42,14 +42,6 @@ - - ..\packages\FSharp.Core.4.5.2\lib\net45\FSharp.Core.dll - True - - - ..\packages\System.ValueTuple.4.4.0\lib\net461\System.ValueTuple.dll - True - diff --git a/vsintegration/ProjectTemplates/ConsoleProject/Template/ConsoleApplication.vstemplate b/vsintegration/ProjectTemplates/ConsoleProject/Template/ConsoleApplication.vstemplate index 5717c132c33..31989064070 100644 --- a/vsintegration/ProjectTemplates/ConsoleProject/Template/ConsoleApplication.vstemplate +++ b/vsintegration/ProjectTemplates/ConsoleProject/Template/ConsoleApplication.vstemplate @@ -26,8 +26,8 @@ - - + + diff --git a/vsintegration/ProjectTemplates/LibraryProject/Template/Library.fsproj b/vsintegration/ProjectTemplates/LibraryProject/Template/Library.fsproj index a9a75d23d78..5878583967c 100644 --- a/vsintegration/ProjectTemplates/LibraryProject/Template/Library.fsproj +++ b/vsintegration/ProjectTemplates/LibraryProject/Template/Library.fsproj @@ -38,14 +38,6 @@ - - ..\packages\FSharp.Core.4.5.2\lib\net45\FSharp.Core.dll - True - - - ..\packages\System.ValueTuple.4.4.0\lib\net461\System.ValueTuple.dll - True - diff --git a/vsintegration/ProjectTemplates/LibraryProject/Template/Library.vstemplate b/vsintegration/ProjectTemplates/LibraryProject/Template/Library.vstemplate index c74a2d18227..bd1ef57057b 100644 --- a/vsintegration/ProjectTemplates/LibraryProject/Template/Library.vstemplate +++ b/vsintegration/ProjectTemplates/LibraryProject/Template/Library.vstemplate @@ -26,8 +26,8 @@ - - + + diff --git a/vsintegration/ProjectTemplates/TutorialProject/Template/Tutorial.fsproj b/vsintegration/ProjectTemplates/TutorialProject/Template/Tutorial.fsproj index 0d0abe089cd..dd2eed1525f 100644 --- a/vsintegration/ProjectTemplates/TutorialProject/Template/Tutorial.fsproj +++ b/vsintegration/ProjectTemplates/TutorialProject/Template/Tutorial.fsproj @@ -45,14 +45,6 @@ - - ..\packages\FSharp.Core.4.5.2\lib\net45\FSharp.Core.dll - True - - - ..\packages\System.ValueTuple.4.4.0\lib\net461\System.ValueTuple.dll - True - diff --git a/vsintegration/ProjectTemplates/TutorialProject/Template/Tutorial.vstemplate b/vsintegration/ProjectTemplates/TutorialProject/Template/Tutorial.vstemplate index 76fd069d5f8..a7c9f403d3a 100644 --- a/vsintegration/ProjectTemplates/TutorialProject/Template/Tutorial.vstemplate +++ b/vsintegration/ProjectTemplates/TutorialProject/Template/Tutorial.vstemplate @@ -24,8 +24,8 @@ - - + + diff --git a/vsintegration/Vsix/VisualFSharpTemplates/VisualFSharpTemplates.csproj b/vsintegration/Vsix/VisualFSharpTemplates/VisualFSharpTemplates.csproj index 53ff7dae39c..461fb062bfc 100644 --- a/vsintegration/Vsix/VisualFSharpTemplates/VisualFSharpTemplates.csproj +++ b/vsintegration/Vsix/VisualFSharpTemplates/VisualFSharpTemplates.csproj @@ -6,7 +6,7 @@ VisualFSharpTemplate Library Microsoft\FSharpTemplates - false + true From 87ea864488b2b7223ce0da1bfe3150df375b7b14 Mon Sep 17 00:00:00 2001 From: Avi Avni Date: Tue, 20 Nov 2018 21:14:13 +0200 Subject: [PATCH 116/160] Remove massive string allocations (#5940) * remove massive string allocations * change NormalizedSource Source and Seq to Array computation expression * fix line end according to the source positions * remove pos use i * fix some tests --- src/fsharp/CheckFormatStrings.fs | 18 +++++++++--------- src/fsharp/NameResolution.fs | 22 +++++++++++++--------- src/fsharp/NameResolution.fsi | 10 +++++----- tests/service/EditorTests.fs | 3 +-- 4 files changed, 28 insertions(+), 25 deletions(-) diff --git a/src/fsharp/CheckFormatStrings.fs b/src/fsharp/CheckFormatStrings.fs index 4d532904a16..9d7fd72d7a0 100644 --- a/src/fsharp/CheckFormatStrings.fs +++ b/src/fsharp/CheckFormatStrings.fs @@ -54,15 +54,15 @@ let parseFormatStringInternal (m:range) (g: TcGlobals) (context: FormatStringChe let (offset, fmt) = match context with | Some context -> - let length = context.NormalizedSource.Length - if m.EndLine < context.LineEndPositions.Length then - let startIndex = context.LineEndPositions.[m.StartLine-1] + m.StartColumn - let endIndex = context.LineEndPositions.[m.EndLine-1] + m.EndColumn - 1 - if startIndex < length-3 && context.NormalizedSource.[startIndex..startIndex+2] = "\"\"\"" then - (3, context.NormalizedSource.[startIndex+3..endIndex-3]) - elif startIndex < length-2 && context.NormalizedSource.[startIndex..startIndex+1] = "@\"" then - (2, context.NormalizedSource.[startIndex+2..endIndex-1]) - else (1, context.NormalizedSource.[startIndex+1..endIndex-1]) + let length = context.Source.Length + if m.EndLine < context.LineStartPositions.Length then + let startIndex = context.LineStartPositions.[m.StartLine-1] + m.StartColumn + let endIndex = context.LineStartPositions.[m.EndLine-1] + m.EndColumn - 1 + if startIndex < length-3 && context.Source.[startIndex..startIndex+2] = "\"\"\"" then + (3, context.Source.[startIndex+3..endIndex-3]) + elif startIndex < length-2 && context.Source.[startIndex..startIndex+1] = "@\"" then + (2, context.Source.[startIndex+2..endIndex-1]) + else (1, context.Source.[startIndex+1..endIndex-1]) else (1, fmt) | None -> (1, fmt) diff --git a/src/fsharp/NameResolution.fs b/src/fsharp/NameResolution.fs index e07e3a682fd..5fcc4623345 100644 --- a/src/fsharp/NameResolution.fs +++ b/src/fsharp/NameResolution.fs @@ -1251,8 +1251,8 @@ type OpenDeclaration = IsOwnNamespace = isOwnNamespace } type FormatStringCheckContext = - { NormalizedSource: string - LineEndPositions: int[] } + { Source: string + LineStartPositions: int[] } /// An abstract type for reporting the results of name resolution and type checking. type ITypecheckResultsSink = @@ -1538,14 +1538,18 @@ type TcResultsSinkImpl(g, ?source: string) = let formatStringCheckContext = lazy source |> Option.map (fun source -> - let source = source.Replace("\r\n", "\n").Replace("\r", "\n") let positions = - source.Split('\n') - |> Seq.map (fun s -> String.length s + 1) - |> Seq.scan (+) 0 - |> Seq.toArray - { NormalizedSource = source - LineEndPositions = positions }) + [| + yield 0 + for i in 0..source.Length-1 do + let c = source.[i] + if c = '\r' && i + 1 < source.Length && source.[i+1] = '\n' then () + elif c = '\r' then yield i + 1 + if c = '\n' then yield i + 1 + yield source.Length + |] + { Source = source + LineStartPositions = positions }) member this.GetResolutions() = TcResolutions(capturedEnvs, capturedExprTypings, capturedNameResolutions, capturedMethodGroupResolutions) diff --git a/src/fsharp/NameResolution.fsi b/src/fsharp/NameResolution.fsi index 178d6a8e3cc..10fe03ff0b1 100755 --- a/src/fsharp/NameResolution.fsi +++ b/src/fsharp/NameResolution.fsi @@ -344,12 +344,12 @@ type internal OpenDeclaration = /// Create a new instance of OpenDeclaration. static member Create : longId: Ident list * modules: ModuleOrNamespaceRef list * appliedScope: range * isOwnNamespace: bool -> OpenDeclaration -/// Line-end normalized source text and an array of line end positions, used for format string parsing +/// Source text and an array of line end positions, used for format string parsing type FormatStringCheckContext = - { /// Line-end normalized source text - NormalizedSource: string - /// Array of line end positions - LineEndPositions: int[] } + { /// Source text + Source: string + /// Array of line start positions + LineStartPositions: int[] } /// An abstract type for reporting the results of name resolution and type checking type ITypecheckResultsSink = diff --git a/tests/service/EditorTests.fs b/tests/service/EditorTests.fs index d097c710651..5edcd2da94c 100644 --- a/tests/service/EditorTests.fs +++ b/tests/service/EditorTests.fs @@ -433,8 +433,7 @@ let _ = printf " %*a" 3 (fun _ _ -> ()) 2 typeCheckResults.GetFormatSpecifierLocationsAndArity() |> Array.map (fun (range,numArgs) -> range.StartLine, range.StartColumn, range.EndLine, range.EndColumn, numArgs) |> shouldEqual - [|(2, 45, 2, 47, 1); (3, 23, 3, 25, 1); (4, 38, 4, 40, 1); (5, 27, 5, 29 -, 1); + [|(2, 45, 2, 47, 1); (3, 23, 3, 25, 1); (4, 38, 4, 40, 1); (5, 27, 5, 29, 1); (6, 17, 6, 20, 2); (7, 17, 7, 22, 1); (8, 17, 8, 23, 1); (9, 18, 9, 22, 1); (10, 18, 10, 21, 1); (12, 12, 12, 15, 1); (15, 12, 15, 15, 1); (16, 28, 16, 30, 1); (18, 30, 18, 32, 1); (19, 30, 19, 32, 1); From 17ad03fcd8901e5f46b8203a686f201b243e5ef5 Mon Sep 17 00:00:00 2001 From: Patrick Stevens Date: Mon, 26 Nov 2018 21:20:19 +0000 Subject: [PATCH 117/160] Stop eagerly evaluating seqs (revert parts of #5348, #5370) (#5947) * Fix and tests, unbuilt and untested * Correct one of the tests Got the order wrong for the output of `countBy`. * Repair the groupBy test groupBy test was bad: it assumed (ridiculously) that groupBy wouldn't iterate the original sequence even though it somehow knew the groups in the sequence. --- src/fsharp/FSharp.Core/seq.fs | 5 -- .../FSharp.Core.UnitTests.fsproj | 5 +- .../SeqMultipleIteration.fs | 47 +++++++++++++++++++ 3 files changed, 50 insertions(+), 7 deletions(-) create mode 100644 tests/FSharp.Core.UnitTests/FSharp.Core/Microsoft.FSharp.Collections/SeqMultipleIteration.fs diff --git a/src/fsharp/FSharp.Core/seq.fs b/src/fsharp/FSharp.Core/seq.fs index eab2599b1aa..a5b6fd34387 100644 --- a/src/fsharp/FSharp.Core/seq.fs +++ b/src/fsharp/FSharp.Core/seq.fs @@ -1032,8 +1032,6 @@ namespace Microsoft.FSharp.Collections let inline groupByImpl (comparer:IEqualityComparer<'SafeKey>) (keyf:'T->'SafeKey) (getKey:'SafeKey->'Key) (seq:seq<'T>) = checkNonNull "seq" seq - if isEmpty seq then empty else - let dict = Dictionary<_,ResizeArray<_>> comparer // Previously this was 1, but I think this is rather stingy, considering that we are already paying @@ -1087,7 +1085,6 @@ namespace Microsoft.FSharp.Collections [] let distinct source = checkNonNull "source" source - if isEmpty source then empty else seq { let hashSet = HashSet<'T>(HashIdentity.Structural<'T>) for v in source do if hashSet.Add(v) then @@ -1096,7 +1093,6 @@ namespace Microsoft.FSharp.Collections [] let distinctBy projection source = checkNonNull "source" source - if isEmpty source then empty else seq { let hashSet = HashSet<_>(HashIdentity.Structural<_>) for v in source do if hashSet.Add(projection v) then @@ -1140,7 +1136,6 @@ namespace Microsoft.FSharp.Collections let inline countByImpl (comparer:IEqualityComparer<'SafeKey>) (keyf:'T->'SafeKey) (getKey:'SafeKey->'Key) (source:seq<'T>) = checkNonNull "source" source - if isEmpty source then empty else let dict = Dictionary comparer diff --git a/tests/FSharp.Core.UnitTests/FSharp.Core.UnitTests.fsproj b/tests/FSharp.Core.UnitTests/FSharp.Core.UnitTests.fsproj index 689f832ee5b..9a20813ee13 100644 --- a/tests/FSharp.Core.UnitTests/FSharp.Core.UnitTests.fsproj +++ b/tests/FSharp.Core.UnitTests/FSharp.Core.UnitTests.fsproj @@ -52,8 +52,8 @@ $(FsCheckLibDir)\net452\FsCheck.dll - ..\..\packages\System.ValueTuple.$(SystemValueTuplePackageVersion)\lib\portable-net40+sl4+win8+wp8\System.ValueTuple.dll - True + ..\..\packages\System.ValueTuple.$(SystemValueTuplePackageVersion)\lib\portable-net40+sl4+win8+wp8\System.ValueTuple.dll + True @@ -94,6 +94,7 @@ + diff --git a/tests/FSharp.Core.UnitTests/FSharp.Core/Microsoft.FSharp.Collections/SeqMultipleIteration.fs b/tests/FSharp.Core.UnitTests/FSharp.Core/Microsoft.FSharp.Collections/SeqMultipleIteration.fs new file mode 100644 index 00000000000..cc53b254676 --- /dev/null +++ b/tests/FSharp.Core.UnitTests/FSharp.Core/Microsoft.FSharp.Collections/SeqMultipleIteration.fs @@ -0,0 +1,47 @@ +namespace FSharp.Core.UnitTests.FSharp_Core.Microsoft_FSharp_Collections + +open NUnit.Framework + +[] +module SeqMultipleIteration = + let makeNewSeq () = + let haveCalled = false |> ref + seq { + if !haveCalled then failwith "Should not have iterated this sequence before" + haveCalled := true + yield 3 + }, haveCalled + + [] + let ``Seq.distinct only evaluates the seq once`` () = + let s, haveCalled = makeNewSeq () + let distincts = Seq.distinct s + Assert.IsFalse !haveCalled + CollectionAssert.AreEqual (distincts |> Seq.toList, [3]) + Assert.IsTrue !haveCalled + + [] + let ``Seq.distinctBy only evaluates the seq once`` () = + let s, haveCalled = makeNewSeq () + let distincts = Seq.distinctBy id s + Assert.IsFalse !haveCalled + CollectionAssert.AreEqual (distincts |> Seq.toList, [3]) + Assert.IsTrue !haveCalled + + [] + let ``Seq.groupBy only evaluates the seq once`` () = + let s, haveCalled = makeNewSeq () + let groups : seq> = Seq.groupBy id s + Assert.IsFalse !haveCalled + let groups : list> = Seq.toList groups + // Seq.groupBy iterates the entire sequence as soon as it begins iteration. + Assert.IsTrue !haveCalled + + [] + let ``Seq.countBy only evaluates the seq once`` () = + let s, haveCalled = makeNewSeq () + let counts : seq = Seq.countBy id s + Assert.IsFalse !haveCalled + let counts : list = Seq.toList counts + Assert.IsTrue !haveCalled + CollectionAssert.AreEqual (counts |> Seq.toList, [(3, 1)]) From 8dc74f7c3183ce383e4304a2395eac3b6489c4a6 Mon Sep 17 00:00:00 2001 From: Avi Avni Date: Fri, 30 Nov 2018 03:58:33 +0200 Subject: [PATCH 118/160] Reduce memory allocations (#5965) * reduce memory allocations * remove memory allocations --- src/absil/il.fs | 2 +- src/absil/ilprint.fs | 25 ++++++++++----- src/absil/ilread.fs | 2 +- src/absil/ilreflect.fs | 11 +++---- src/absil/ilwrite.fs | 4 +-- src/fsharp/AttributeChecking.fs | 4 +-- src/fsharp/FindUnsolved.fs | 4 +-- src/fsharp/IlxGen.fs | 8 ++--- src/fsharp/PostInferenceChecks.fs | 4 +-- src/fsharp/TastPickle.fs | 53 ++++++++++++++++++++++++------- src/fsharp/TastPickle.fsi | 2 +- src/fsharp/TypeChecker.fs | 2 +- src/fsharp/fsc.fs | 8 ++--- 13 files changed, 83 insertions(+), 46 deletions(-) diff --git a/src/absil/il.fs b/src/absil/il.fs index 4e7f2c66b78..a7949a8e84e 100644 --- a/src/absil/il.fs +++ b/src/absil/il.fs @@ -3975,7 +3975,7 @@ and refs_of_token s x = and refs_of_custom_attr s (cattr: ILAttribute) = refs_of_mspec s cattr.Method -and refs_of_custom_attrs s (cas : ILAttributes) = List.iter (refs_of_custom_attr s) cas.AsList +and refs_of_custom_attrs s (cas : ILAttributes) = Array.iter (refs_of_custom_attr s) cas.AsArray and refs_of_varargs s tyso = Option.iter (refs_of_tys s) tyso and refs_of_instr s x = match x with diff --git a/src/absil/ilprint.fs b/src/absil/ilprint.fs index 0ae779c6f60..391b49ba349 100644 --- a/src/absil/ilprint.fs +++ b/src/absil/ilprint.fs @@ -98,6 +98,13 @@ let output_seq sep f os (a:seq<_>) = output_string os sep; f os e.Current +let output_array sep f os (a:_ []) = + if not (Array.isEmpty a) then + for i in 0..a.Length-2 do + f os a.[i] + output_string os sep + f os (a.[a.Length - 1]) + let output_parens f os a = output_string os "("; f os a; output_string os ")" let output_angled f os a = output_string os "<"; f os a; output_string os ">" let output_bracks f os a = output_string os "["; f os a; output_string os "]" @@ -437,12 +444,12 @@ let output_option f os = function None -> () | Some x -> f os x let goutput_alternative_ref env os (alt: IlxUnionAlternative) = output_id os alt.Name; - alt.FieldDefs |> Array.toList |> output_parens (output_seq "," (fun os fdef -> goutput_typ env os fdef.Type)) os + alt.FieldDefs |> output_parens (output_array "," (fun os fdef -> goutput_typ env os fdef.Type)) os let goutput_curef env os (IlxUnionRef(_,tref,alts,_,_)) = output_string os " .classunion import "; goutput_tref env os tref; - output_parens (output_seq "," (goutput_alternative_ref env)) os (Array.toList alts) + output_parens (output_array "," (goutput_alternative_ref env)) os alts let goutput_cuspec env os (IlxUnionSpec(IlxUnionRef(_,tref,_,_,_),i)) = output_string os "class /* classunion */ "; @@ -477,7 +484,7 @@ let goutput_custom_attr env os (attr: ILAttribute) = output_custom_attr_data os data let goutput_custom_attrs env os (attrs : ILAttributes) = - List.iter (fun attr -> goutput_custom_attr env os attr; output_string os "\n" ) attrs.AsList + Array.iter (fun attr -> goutput_custom_attr env os attr; output_string os "\n" ) attrs.AsArray let goutput_fdef _tref env os (fd: ILFieldDef) = output_string os " .field " @@ -704,7 +711,7 @@ let rec goutput_instr env os inst = goutput_dlocref env os (mkILArrTy(typ,shape)); output_string os ".ctor"; let rank = shape.Rank - output_parens (output_seq "," (goutput_typ env)) os (Array.toList (Array.create ( rank) EcmaMscorlibILGlobals.typ_Int32)) + output_parens (output_array "," (goutput_typ env)) os (Array.create ( rank) EcmaMscorlibILGlobals.typ_Int32) | I_stelem_any (shape,dt) -> if shape = ILArrayShape.SingleDimensional then output_string os "stelem.any "; goutput_typ env os dt @@ -713,7 +720,9 @@ let rec goutput_instr env os inst = goutput_dlocref env os (mkILArrTy(dt,shape)); output_string os "Set"; let rank = shape.Rank - output_parens (output_seq "," (goutput_typ env)) os (Array.toList (Array.create ( rank) EcmaMscorlibILGlobals.typ_Int32) @ [dt]) + let arr = Array.create (rank + 1) EcmaMscorlibILGlobals.typ_Int32 + arr.[rank] <- dt + output_parens (output_array "," (goutput_typ env)) os arr | I_ldelem_any (shape,tok) -> if shape = ILArrayShape.SingleDimensional then output_string os "ldelem.any "; goutput_typ env os tok @@ -724,7 +733,7 @@ let rec goutput_instr env os inst = goutput_dlocref env os (mkILArrTy(tok,shape)); output_string os "Get"; let rank = shape.Rank - output_parens (output_seq "," (goutput_typ env)) os (Array.toList (Array.create ( rank) EcmaMscorlibILGlobals.typ_Int32)) + output_parens (output_array "," (goutput_typ env)) os (Array.create ( rank) EcmaMscorlibILGlobals.typ_Int32) | I_ldelema (ro,_,shape,tok) -> if ro = ReadonlyAddress then output_string os "readonly. "; if shape = ILArrayShape.SingleDimensional then @@ -736,7 +745,7 @@ let rec goutput_instr env os inst = goutput_dlocref env os (mkILArrTy(tok,shape)); output_string os "Address"; let rank = shape.Rank - output_parens (output_seq "," (goutput_typ env)) os (Array.toList (Array.create ( rank) EcmaMscorlibILGlobals.typ_Int32)) + output_parens (output_array "," (goutput_typ env)) os (Array.create ( rank) EcmaMscorlibILGlobals.typ_Int32) | I_box tok -> output_string os "box "; goutput_typ env os tok | I_unbox tok -> output_string os "unbox "; goutput_typ env os tok @@ -890,7 +899,7 @@ let splitTypeLayout = function let goutput_fdefs tref env os (fdefs: ILFieldDefs) = List.iter (fun f -> (goutput_fdef tref env) os f; output_string os "\n" ) fdefs.AsList let goutput_mdefs env os (mdefs: ILMethodDefs) = - List.iter (fun f -> (goutput_mdef env) os f; output_string os "\n" ) mdefs.AsList + Array.iter (fun f -> (goutput_mdef env) os f; output_string os "\n" ) mdefs.AsArray let goutput_pdefs env os (pdefs: ILPropertyDefs) = List.iter (fun f -> (goutput_pdef env) os f; output_string os "\n" ) pdefs.AsList diff --git a/src/absil/ilread.fs b/src/absil/ilread.fs index b08da89249f..c2c10e9479b 100644 --- a/src/absil/ilread.fs +++ b/src/absil/ilread.fs @@ -2101,7 +2101,7 @@ and sigptrGetTy (ctxt: ILMetadataReader) numtypars bytes sigptr = let dim i = (if i < numLoBounded then Some (List.item i lobounds) else None), (if i < numSized then Some (List.item i sizes) else None) - ILArrayShape (Array.toList (Array.init rank dim)) + ILArrayShape (List.init rank dim) mkILArrTy (ty, shape), sigptr elif b0 = et_VOID then ILType.Void, sigptr diff --git a/src/absil/ilreflect.fs b/src/absil/ilreflect.fs index 6cb379d5d4d..5e15cbbd37b 100644 --- a/src/absil/ilreflect.fs +++ b/src/absil/ilreflect.fs @@ -289,6 +289,7 @@ module Zmap = let equalTypes (s:Type) (t:Type) = s.Equals(t) let equalTypeLists ss tt = List.lengthsEqAndForall2 equalTypes ss tt +let equalTypeArrays ss tt = Array.lengthsEqAndForall2 equalTypes ss tt let getGenericArgumentsOfType (typT : Type) = if typT.IsGenericType then typT.GetGenericArguments() else [| |] @@ -1423,7 +1424,7 @@ let convCustomAttr cenv emEnv (cattr: ILAttribute) = (methInfo, data) let emitCustomAttr cenv emEnv add cattr = add (convCustomAttr cenv emEnv cattr) -let emitCustomAttrs cenv emEnv add (cattrs : ILAttributes) = List.iter (emitCustomAttr cenv emEnv add) cattrs.AsList +let emitCustomAttrs cenv emEnv add (cattrs : ILAttributes) = Array.iter (emitCustomAttr cenv emEnv add) cattrs.AsArray //---------------------------------------------------------------------------- // buildGenParams @@ -1597,9 +1598,7 @@ let rec buildMethodPass3 cenv tref modB (typB:TypeBuilder) emEnv (mdef : ILMetho (getGenericArgumentsOfType (typB.AsType())) (getGenericArgumentsOfMethod methB)) - match mdef.Return.CustomAttrs.AsList with - | [] -> () - | _ -> + if not (Array.isEmpty mdef.Return.CustomAttrs.AsArray) then let retB = methB.DefineParameterAndLog(0, System.Reflection.ParameterAttributes.Retval, null) emitCustomAttrs cenv emEnv (wrapCustomAttr retB.SetCustomAttribute) mdef.Return.CustomAttrs @@ -1825,7 +1824,7 @@ let rec buildTypeDefPass2 cenv nesting emEnv (tdef : ILTypeDef) = // add interface impls tdef.Implements |> convTypes cenv emEnv |> List.iter (fun implT -> typB.AddInterfaceImplementationAndLog(implT)); // add methods, properties - let emEnv = List.fold (buildMethodPass2 cenv tref typB) emEnv tdef.Methods.AsList + let emEnv = Array.fold (buildMethodPass2 cenv tref typB) emEnv tdef.Methods.AsArray let emEnv = List.fold (buildFieldPass2 cenv tref typB) emEnv tdef.Fields.AsList let emEnv = List.fold (buildPropertyPass2 cenv tref typB) emEnv tdef.Properties.AsList let emEnv = envPopTyvars emEnv @@ -1942,7 +1941,7 @@ let createTypeRef (visited : Dictionary<_, _>, created : Dictionary<_, _>) emEnv traverseType CollectTypes.All cx if verbose2 then dprintf "buildTypeDefPass4: Doing method constraints of %s\n" tdef.Name - for md in tdef.Methods.AsList do + for md in tdef.Methods.AsArray do for gp in md.GenericParams do for cx in gp.Constraints do traverseType CollectTypes.All cx diff --git a/src/absil/ilwrite.fs b/src/absil/ilwrite.fs index cd9e1ac41f3..12541d5089e 100644 --- a/src/absil/ilwrite.fs +++ b/src/absil/ilwrite.fs @@ -1401,7 +1401,7 @@ and GenCustomAttrPass3Or4 cenv hca attr = AddUnsharedRow cenv TableNames.CustomAttribute (GetCustomAttrRow cenv hca attr) |> ignore and GenCustomAttrsPass3Or4 cenv hca (attrs: ILAttributes) = - attrs.AsList |> List.iter (GenCustomAttrPass3Or4 cenv hca) + attrs.AsArray |> Array.iter (GenCustomAttrPass3Or4 cenv hca) // -------------------------------------------------------------------- // ILSecurityDecl --> DeclSecurity rows @@ -2463,7 +2463,7 @@ let GenReturnAsParamRow (returnv : ILReturn) = StringE 0 |] let GenReturnPass3 cenv (returnv: ILReturn) = - if Option.isSome returnv.Marshal || not (isNil returnv.CustomAttrs.AsList) then + if Option.isSome returnv.Marshal || not (Array.isEmpty returnv.CustomAttrs.AsArray) then let pidx = AddUnsharedRow cenv TableNames.Param (GenReturnAsParamRow returnv) GenCustomAttrsPass3Or4 cenv (hca_ParamDef, pidx) returnv.CustomAttrs match returnv.Marshal with diff --git a/src/fsharp/AttributeChecking.fs b/src/fsharp/AttributeChecking.fs index 3be4a3a0705..a28598d9708 100644 --- a/src/fsharp/AttributeChecking.fs +++ b/src/fsharp/AttributeChecking.fs @@ -449,8 +449,8 @@ let MethInfoIsUnseen g m ty minfo = // We are only interested in filtering out the method on System.Object, so it is sufficient // just to look at the attributes on IL methods. if tcref.IsILTycon then - tcref.ILTyconRawMetadata.CustomAttrs.AsList - |> List.exists (fun attr -> attr.Method.DeclaringType.TypeSpec.Name = typeof.FullName) + tcref.ILTyconRawMetadata.CustomAttrs.AsArray + |> Array.exists (fun attr -> attr.Method.DeclaringType.TypeSpec.Name = typeof.FullName) else false #else diff --git a/src/fsharp/FindUnsolved.fs b/src/fsharp/FindUnsolved.fs index 89dea15eed4..9c38f26a2a7 100644 --- a/src/fsharp/FindUnsolved.fs +++ b/src/fsharp/FindUnsolved.fs @@ -199,9 +199,9 @@ let accTycon cenv env (tycon:Tycon) = abstractSlotValsOfTycons [tycon] |> List.iter (accVal cenv env) tycon.AllFieldsArray |> Array.iter (accTyconRecdField cenv env tycon) if tycon.IsUnionTycon then (* This covers finite unions. *) - tycon.UnionCasesAsList |> List.iter (fun uc -> + tycon.UnionCasesArray |> Array.iter (fun uc -> accAttribs cenv env uc.Attribs - uc.RecdFields |> List.iter (accTyconRecdField cenv env tycon)) + uc.RecdFieldsArray |> Array.iter (accTyconRecdField cenv env tycon)) let accTycons cenv env tycons = List.iter (accTycon cenv env) tycons diff --git a/src/fsharp/IlxGen.fs b/src/fsharp/IlxGen.fs index 4afd8e651c0..9bd796db143 100644 --- a/src/fsharp/IlxGen.fs +++ b/src/fsharp/IlxGen.fs @@ -1163,7 +1163,7 @@ and TypeDefsBuilder() = || not tdef.Fields.AsList.IsEmpty || not tdef.Events.AsList.IsEmpty || not tdef.Properties.AsList.IsEmpty - || not tdef.Methods.AsList.IsEmpty then + || not (Array.isEmpty tdef.Methods.AsArray) then yield tdef ] member b.FindTypeDefBuilder(nm) = @@ -6527,7 +6527,7 @@ and GenTypeDef cenv mgbuf lazyInitInfo eenv m (tycon:Tycon) = (match ilTypeDefKind with ILTypeDefKind.ValueType -> true | _ -> false) && // All structs are sequential by default // Structs with no instance fields get size 1, pack 0 - tycon.AllFieldsAsList |> List.forall (fun f -> f.IsStatic) + tycon.AllFieldsArray |> Array.forall (fun f -> f.IsStatic) isEmptyStruct && cenv.opts.workAroundReflectionEmitBugs && not tycon.TyparsNoRange.IsEmpty @@ -6535,7 +6535,7 @@ and GenTypeDef cenv mgbuf lazyInitInfo eenv m (tycon:Tycon) = let isCLIMutable = (TryFindFSharpBoolAttribute cenv.g cenv.g.attrib_CLIMutableAttribute tycon.Attribs = Some true) let fieldSummaries = - [ for fspec in tycon.AllFieldsAsList do + [ for fspec in tycon.AllFieldsArray do let useGenuineField = useGenuineField tycon fspec @@ -6852,7 +6852,7 @@ and GenTypeDef cenv mgbuf lazyInitInfo eenv m (tycon:Tycon) = // All structs are sequential by default // Structs with no instance fields get size 1, pack 0 - if tycon.AllFieldsAsList |> List.exists (fun f -> not f.IsStatic) || + if tycon.AllFieldsArray |> Array.exists (fun f -> not f.IsStatic) || // Reflection emit doesn't let us emit 'pack' and 'size' for generic structs. // In that case we generate a dummy field instead (cenv.opts.workAroundReflectionEmitBugs && not tycon.TyparsNoRange.IsEmpty) diff --git a/src/fsharp/PostInferenceChecks.fs b/src/fsharp/PostInferenceChecks.fs index 61ca1ee3b56..acc3c0c03a2 100644 --- a/src/fsharp/PostInferenceChecks.fs +++ b/src/fsharp/PostInferenceChecks.fs @@ -2140,9 +2140,9 @@ let CheckEntityDefn cenv env (tycon:Entity) = superOfTycon g tycon |> CheckTypeNoByrefs cenv env m if tycon.IsUnionTycon then - tycon.UnionCasesAsList |> List.iter (fun uc -> + tycon.UnionCasesArray |> Array.iter (fun uc -> CheckAttribs cenv env uc.Attribs - uc.RecdFields |> List.iter (CheckRecdField true cenv env tycon)) + uc.RecdFieldsArray |> Array.iter (CheckRecdField true cenv env tycon)) // Access checks let access = AdjustAccess (IsHiddenTycon env.sigToImplRemapInfo tycon) (fun () -> tycon.CompilationPath) tycon.Accessibility diff --git a/src/fsharp/TastPickle.fs b/src/fsharp/TastPickle.fs index d86546b3699..14998cc882d 100755 --- a/src/fsharp/TastPickle.fs +++ b/src/fsharp/TastPickle.fs @@ -36,16 +36,16 @@ type PickledDataWithReferences<'rawData> = { /// The data that uses a collection of CcuThunks internally RawData: 'rawData /// The assumptions that need to be fixed up - FixupThunks: list } + FixupThunks: CcuThunk [] } member x.Fixup loader = - x.FixupThunks |> List.iter (fun reqd -> reqd.Fixup(loader reqd.AssemblyName)) + x.FixupThunks |> Array.iter (fun reqd -> reqd.Fixup(loader reqd.AssemblyName)) x.RawData /// Like Fixup but loader may return None, in which case there is no fixup. member x.OptionalFixup loader = x.FixupThunks - |> List.iter(fun reqd-> + |> Array.iter(fun reqd-> match loader reqd.AssemblyName with | Some(loaded) -> reqd.Fixup(loaded) | None -> reqd.FixupOrphaned() ) @@ -461,9 +461,21 @@ let p_array_ext extraf f (x: 'T[]) st = | Some f -> f st p_array_core f x st - -let p_list f x st = p_array f (Array.ofList x) st -let p_list_ext extraf f x st = p_array_ext extraf f (Array.ofList x) st +let p_list_core f (xs: 'T list) st = + for x in xs do + f x st + +let p_list f x st = + p_int (List.length x) st + p_list_core f x st +let p_list_ext extraf f x st = + let n = List.length x + let n = if Option.isSome extraf then n ||| 0x80000000 else n + p_int n st + match extraf with + | None -> () + | Some f -> f st + p_list_core f x st let p_List f (x: 'T list) st = p_list f x st @@ -548,8 +560,22 @@ let u_array_ext extraf f st = let arr = u_array_core f (n &&& 0x7FFFFFFF) st extraItem, arr -let u_list f st = Array.toList (u_array f st) -let u_list_ext extra f st = let v, res = u_array_ext extra f st in v, Array.toList res +let u_list_core f n st = + [ for _ in 1..n do + yield f st ] + +let u_list f st = + let n = u_int st + u_list_core f n st +let u_list_ext extra f st = + let n = u_int st + let extraItem = + if n &&& 0x80000000 = 0x80000000 then + Some (extra st) + else + None + let list = u_list_core f (n &&& 0x7FFFFFFF) st + extraItem, list #if FLAT_LIST_AS_LIST #else @@ -572,7 +598,10 @@ let u_array_revi f st = res // Mark up default constraints with a priority in reverse order: last gets 0 etc. See comment on TyparConstraint.DefaultsTo -let u_list_revi f st = Array.toList (u_array_revi f st) +let u_list_revi f st = + let n = u_int st + [ for i = 0 to n-1 do + yield f st (n-1-i) ] let u_wrap (f: 'U -> 'T) (u : 'U unpickler) : 'T unpickler = (fun st -> f (u st)) @@ -835,7 +864,7 @@ let unpickleObjWithDanglingCcus file ilscope (iILModule:ILModuleDef option) u (p #endif res - {RawData=data; FixupThunks=Array.toList ccuTab.itbl_rows } + {RawData=data; FixupThunks=ccuTab.itbl_rows } //========================================================================= @@ -1733,7 +1762,7 @@ and p_tycon_repr x st = // The leading "p_byte 1" and "p_byte 0" come from the F# 2.0 format, which used an option value at this point. match x with | TRecdRepr fs -> p_byte 1 st; p_byte 0 st; p_rfield_table fs st; false - | TUnionRepr x -> p_byte 1 st; p_byte 1 st; p_list p_unioncase_spec (Array.toList x.CasesTable.CasesByIndex) st; false + | TUnionRepr x -> p_byte 1 st; p_byte 1 st; p_array p_unioncase_spec (x.CasesTable.CasesByIndex) st; false | TAsmRepr ilty -> p_byte 1 st; p_byte 2 st; p_ILType ilty st; false | TFSharpObjectRepr r -> p_byte 1 st; p_byte 3 st; p_tycon_objmodel_data r st; false | TMeasureableRepr ty -> p_byte 1 st; p_byte 4 st; p_ty ty st; false @@ -1793,7 +1822,7 @@ and p_recdfield_spec x st = p_access x.rfield_access st and p_rfield_table x st = - p_list p_recdfield_spec (Array.toList x.FieldsByIndex) st + p_array p_recdfield_spec (x.FieldsByIndex) st and p_entity_spec_data (x:Entity) st = p_tyar_specs (x.entity_typars.Force(x.entity_range)) st diff --git a/src/fsharp/TastPickle.fsi b/src/fsharp/TastPickle.fsi index 4bf6aca3ef1..97eab4b30b9 100644 --- a/src/fsharp/TastPickle.fsi +++ b/src/fsharp/TastPickle.fsi @@ -18,7 +18,7 @@ type PickledDataWithReferences<'RawData> = { /// The data that uses a collection of CcuThunks internally RawData: 'RawData /// The assumptions that need to be fixed up - FixupThunks: list } + FixupThunks: CcuThunk [] } member Fixup : (CcuReference -> CcuThunk) -> 'RawData /// Like Fixup but loader may return None, in which case there is no fixup. diff --git a/src/fsharp/TypeChecker.fs b/src/fsharp/TypeChecker.fs index 8f6a41f03e7..495e0d4c470 100755 --- a/src/fsharp/TypeChecker.fs +++ b/src/fsharp/TypeChecker.fs @@ -15916,7 +15916,7 @@ module EstablishTypeDefinitionCores = let fspecs = if structTycon.IsUnionTycon then [ for uc in structTycon.UnionCasesArray do - for c in uc.FieldTable.AllFieldsAsList do + for c in uc.FieldTable.FieldsByIndex do yield c] else structTycon.AllFieldsAsList diff --git a/src/fsharp/fsc.fs b/src/fsharp/fsc.fs index abcde1f3c5a..4cb4fbe4866 100644 --- a/src/fsharp/fsc.fs +++ b/src/fsharp/fsc.fs @@ -329,9 +329,9 @@ module XmlDocWriter = if (hasDoc tc.XmlDoc) then tc.XmlDocSig <- XmlDocSigOfTycon [ptext; tc.CompiledName] for vref in tc.MembersOfFSharpTyconSorted do doValSig ptext vref.Deref - for uc in tc.UnionCasesAsList do + for uc in tc.UnionCasesArray do if (hasDoc uc.XmlDoc) then uc.XmlDocSig <- XmlDocSigOfUnionCase [ptext; tc.CompiledName; uc.Id.idText] - for rf in tc.AllFieldsAsList do + for rf in tc.AllFieldsArray do if (hasDoc rf.XmlDoc) then rf.XmlDocSig <- if tc.IsRecordTycon && (not rf.IsStatic) then @@ -380,9 +380,9 @@ module XmlDocWriter = addMember tc.XmlDocSig tc.XmlDoc for vref in tc.MembersOfFSharpTyconSorted do doVal vref.Deref - for uc in tc.UnionCasesAsList do + for uc in tc.UnionCasesArray do doUnionCase uc - for rf in tc.AllFieldsAsList do + for rf in tc.AllFieldsArray do doField rf let modulMember (m:ModuleOrNamespace) = addMember m.XmlDocSig m.XmlDoc From a7acf9f4198550f697945ba36c8321e96541eeab Mon Sep 17 00:00:00 2001 From: Avi Avni Date: Fri, 30 Nov 2018 04:02:27 +0200 Subject: [PATCH 119/160] Smal fixes for https://github.com/Microsoft/visualfsharp/pull/5940 (#5943) * small fixes * fix test --- src/fsharp/NameResolution.fs | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/fsharp/NameResolution.fs b/src/fsharp/NameResolution.fs index 5fcc4623345..43c15418490 100644 --- a/src/fsharp/NameResolution.fs +++ b/src/fsharp/NameResolution.fs @@ -1541,11 +1541,11 @@ type TcResultsSinkImpl(g, ?source: string) = let positions = [| yield 0 - for i in 0..source.Length-1 do - let c = source.[i] - if c = '\r' && i + 1 < source.Length && source.[i+1] = '\n' then () - elif c = '\r' then yield i + 1 - if c = '\n' then yield i + 1 + for i in 1..source.Length do + let c = source.[i-1] + if c = '\r' && i < source.Length && source.[i] = '\n' then () + elif c = '\r' then yield i + elif c = '\n' then yield i yield source.Length |] { Source = source From 61465f6f3294e0b1a294c92871a8a76adb4f4582 Mon Sep 17 00:00:00 2001 From: "Brett V. Forsgren" Date: Tue, 27 Nov 2018 10:10:43 -0800 Subject: [PATCH 120/160] convert to SDK projects --- .gitignore | 5 + .vsts-pr.yaml | 6 +- DEVGUIDE.md | 1 - DotnetCLIToolsVersion.txt | 2 +- DotnetCLIVersion.txt | 1 - ...rp.Profiles.props => FSharp.Profiles.props | 13 +- FSharpBuild.Directory.Build.props | 37 +- FSharpBuild.Directory.Build.targets | 56 +- Makefile | 151 ++--- NuGet.Config | 16 - RoslynPackageVersion.txt | 2 +- build-everything.proj | 165 ------ build-nuget-packages.proj | 16 +- build.cmd | 446 ++++----------- build/config/packages.config | 5 - build/projects/Directory.Build.props | 3 + build/projects/Directory.Build.targets | 3 + build/projects/PrepareDependencyUptake.proj | 33 -- build/projects/Signing.proj | 27 + build/scripts/run-signtool.cmd | 69 --- build/targets/AssemblyVersions.props | 10 +- build/targets/ConvertPortablePdbs.targets | 13 +- .../GenerateAssemblyAttributes.targets | 18 +- .../GenerateInternalsVisibleTo.targets | 38 +- build/targets/PackageVersions.props | 59 +- fcs/Directory.Build.props | 23 + fcs/Directory.Build.targets | 3 + ...FSharp.Compiler.Service.MSBuild.v12.fsproj | 10 - ...Compiler.Service.ProjectCrackerTool.fsproj | 4 - .../CSharp_Analysis/CSharp_Analysis.csproj | 1 + .../FSharp.Compiler.Service.fsproj | 15 +- fcs/build.cmd | 3 + fcs/build.fsx | 16 +- fsharp.proj | 134 +++++ init-tools.cmd | 148 ++--- mono/cibuild.sh | 2 +- packages.config | 89 --- proto.proj | 30 + scripts/dotnet-install.sh | 532 ++++++++++++------ setup/Directory.Build.props | 12 + setup/Directory.Build.targets | 4 + setup/FSharp.Setup.props | 12 +- setup/Swix/Directory.Build.props | 14 + setup/Swix/Directory.Build.targets | 3 + ...crosoft.FSharp.Compiler.Resources.swixproj | 21 +- .../Swix/Microsoft.FSharp.Compiler/Files.swr | 2 +- .../Microsoft.FSharp.Compiler.swixproj | 26 +- .../Microsoft.FSharp.Dependencies/Files.swr | 10 +- .../Microsoft.FSharp.Dependencies.swixproj | 25 +- setup/Swix/Microsoft.FSharp.IDE/Files.swr | 10 +- .../Microsoft.FSharp.IDE.swixproj | 25 +- setup/Swix/Microsoft.FSharp.SDK/Files.swr | 144 ++--- .../Microsoft.FSharp.SDK.swixproj | 24 +- .../Microsoft.FSharp.Vsix.Resources.swixproj | 26 +- setup/Swix/Microsoft.FSharp.vsmanproj | 66 ++- setup/build-insertion.proj | 84 +-- setup/fsharp-setup-build.csproj | 70 +++ setup/fsharp-setup-build.proj | 59 -- setup/packages.config | 15 - src/Directory.Build.props | 3 + src/Directory.Build.targets | 3 + src/FSharpSource.Profiles.targets | 57 -- src/FSharpSource.Settings.targets | 174 ------ src/FSharpSource.targets | 383 ------------- src/Microbuild.Settings.targets | 13 - src/buildfromsource/BuildFromSource.targets | 1 - src/buildfromsource/Directory.Build.targets | 5 + .../FSharp.Compiler.nuget.fsproj | 2 +- .../Microsoft.FSharp.Compiler.nuspec} | 92 +-- .../FSharp.Core/FSharp.Core.fsproj | 2 +- .../FSharp.Core/SR.fs | 0 src/buildfromsource/Fsc/Fsc.fsproj | 1 - .../targets/PackageVersions.props | 9 +- src/buildtools/Directory.Build.props | 3 + src/buildtools/Directory.Build.targets | 3 + src/buildtools/buildtools.proj | 32 ++ src/buildtools/buildtools.targets | 121 ++-- src/buildtools/fslex/fslex.fs | 7 +- src/buildtools/fslex/fslex.fsproj | 14 +- src/buildtools/fslex/fslex.fsx | 3 - src/buildtools/fssrgen/fssrgen.fsproj | 12 - src/buildtools/fssrgen/fssrgen.fsx | 476 ---------------- src/buildtools/fssrgen/fssrgen.targets | 57 -- src/buildtools/fsyacc/fsyacc.fs | 12 +- src/buildtools/fsyacc/fsyacc.fsproj | 14 +- src/buildtools/fsyacc/fsyacc.fsx | 3 - src/fsharp-proto-build.proj | 15 - src/fsharp/Directory.Build.props | 11 + src/fsharp/Directory.Build.targets | 4 + src/fsharp/Directory.Nuget.props | 26 + src/fsharp/Directory.Nuget.targets | 21 + .../FSharp.Build-proto.fsproj | 111 ---- src/fsharp/FSharp.Build/FSharp.Build.fsproj | 80 +-- .../Microsoft.FSharp.NetSdk.props | 2 +- src/fsharp/FSharp.Build/project.json | 28 - ...Sharp.Compiler.Interactive.Settings.fsproj | 35 +- .../project.json | 18 - .../FSharp.Compiler.Private.fsproj | 105 ++-- .../FSharp.Compiler.Private/project.json | 34 -- .../FSharp.Compiler.Server.Shared.fsproj | 36 +- .../Directory.Build.props | 13 + .../Directory.Build.targets | 13 + .../FSharp.Compiler.Template.nuget.props | 21 - .../FSharp.Compiler.Template.nuget.targets | 47 -- .../Microsoft.FSharp.Compiler.csproj | 7 + .../Microsoft.FSharp.Compiler.nuget.proj | 11 - .../Microsoft.FSharp.Compiler.nuspec | 97 ++-- src/fsharp/FSharp.Compiler.nuget/Program.fs | 6 - .../Testing.FSharp.Compiler.csproj | 7 + .../Testing.FSharp.Compiler.nuget.proj | 11 - .../FSharp.Core.nuget/FSharp.Core.nuget.proj | 76 --- .../Microsoft.Portable.FSharp.Core.nuspec | 27 - src/fsharp/FSharp.Core/Directory.Build.props | 14 + .../FSharp.Core/Directory.Build.targets | 6 + src/fsharp/FSharp.Core/FSharp.Core.fsproj | 81 +-- .../FSharp.Core.nuspec | 29 +- src/fsharp/FSharp.Core/project.json | 31 - src/fsharp/Fsc-proto/Fsc-proto.fsproj | 499 ---------------- src/fsharp/Fsc-proto/app.config | 11 - src/fsharp/Fsc/Fsc.fsproj | 55 +- src/fsharp/Fsc/project.json | 26 - src/fsharp/fsi/Fsi.fsproj | 94 ++-- src/fsharp/fsi/project.json | 30 - src/fsharp/fsiAnyCpu/FsiAnyCPU.fsproj | 67 +-- src/fsharp/service/ServiceDeclarationLists.fs | 2 +- src/scripts/scriptlib.fsx | 14 +- src/scripts/subst.fsx | 25 - .../Directory.Build.props | 3 + .../Directory.Build.targets | 3 + .../FSharp.Build.UnitTests.fsproj | 111 +--- tests/FSharp.Build.UnitTests/NuGet.Config | 2 +- tests/FSharp.Build.UnitTests/Program.fs | 14 - tests/FSharp.Build.UnitTests/project.json | 34 -- .../Directory.Build.props | 3 + .../Directory.Build.targets | 3 + .../FSharp.Compiler.UnitTests.fsproj | 65 +-- tests/FSharp.Compiler.UnitTests/ILHelpers.fs | 7 +- .../ProductVersion.fs | 12 +- tests/FSharp.Core.UnitTests/.gitignore | 1 + .../Directory.Build.props | 3 + .../Directory.Build.targets | 3 + .../FSharp.Core.UnitTests.dll.config | 6 +- .../FSharp.Core.UnitTests.fsproj | 90 +-- .../ArrayModule.fs | 49 +- .../ListModule.fs | 36 +- .../Microsoft.FSharp.Control/AsyncModule.fs | 2 +- .../Microsoft.FSharp.Control/AsyncType.fs | 34 +- .../MailboxProcessorType.fs | 6 +- tests/FSharp.Core.UnitTests/LibraryTestFx.fs | 3 +- tests/FSharp.Core.UnitTests/Program.fs | 12 - .../SurfaceArea.coreclr.fs | 220 ++++++-- tests/FSharp.Core.UnitTests/TypeForwarding.fs | 8 +- tests/FSharp.Core.UnitTests/project.json | 33 -- tests/FSharp.Directory.Build.props | 9 + tests/FSharp.Directory.Build.targets | 11 + tests/fsharp/Directory.Build.props | 3 + tests/fsharp/Directory.Build.targets | 3 + .../DeployCompiler/fsc/NuGet.Config | 12 - .../DeployCompiler/fsc/project.json | 30 - .../DeployCompiler/fsi/NuGet.Config | 12 - .../DeployCompiler/fsi/project.json | 30 - ...rp.Tests.FSharpSuite.DrivingCoreCLR.fsproj | 59 -- ...Sharp.Tests.FSharpSuite.DrivingCoreCLR.sln | 25 - .../Program.cs | 1 - .../Program.fs | 12 - .../project.json | 35 -- tests/fsharp/FSharp.Tests.FSharpSuite.fsproj | 72 +-- tests/fsharp/SDKTests/AllSdkTargetsTests.proj | 1 + tests/fsharp/SDKTests/Directory.Build.props | 3 + tests/fsharp/SDKTests/Directory.Build.targets | 3 + tests/fsharp/SDKTests/tests/Test.targets | 1 - tests/fsharp/Test.Directory.Build.props | 8 + tests/fsharp/TypeProviderTests.fs | 3 +- tests/fsharp/core/array/test.fsx | 4 +- tests/fsharp/core/attributes/test.fsx | 28 +- tests/fsharp/core/attributes/testlib.fsi | 2 +- tests/fsharp/core/byrefs/.gitignore | 1 + tests/fsharp/core/comprehensions-hw/test.fsx | 4 +- tests/fsharp/core/comprehensions/test.fsx | 2 +- tests/fsharp/core/control/test.fsx | 56 +- tests/fsharp/core/controlChamenos/test.fsx | 2 +- tests/fsharp/core/controlMailbox/test.fsx | 24 +- .../fsharp/core/controlStackOverflow/test.fsx | 6 +- tests/fsharp/core/forexpression/test.fsx | 2 +- tests/fsharp/core/lazy/test.fsx | 2 +- tests/fsharp/core/letrec/test.fsx | 5 +- tests/fsharp/core/libtest/test.fsx | 17 +- tests/fsharp/core/longnames/test.fsx | 2 +- tests/fsharp/core/math/numbers/test.fsx | 2 +- tests/fsharp/core/math/numbersVS2008/test.fsx | 2 +- tests/fsharp/core/measures/test.fsx | 10 +- tests/fsharp/core/members/basics-hw/test.fsx | 12 +- .../core/members/incremental-hw/test.fsx | 4 +- .../fsharp/core/members/incremental/test.fsx | 4 +- tests/fsharp/core/patterns/test.fsx | 4 +- tests/fsharp/core/printing/testLoadFile2.fsx | 2 +- .../queriesLeafExpressionConvert/test.fsx | 8 +- tests/fsharp/core/quotes/test.fsx | 12 +- tests/fsharp/core/reflect/test2.fs | 2 +- tests/fsharp/core/span/.gitignore | 1 + tests/fsharp/core/span/common-pre.fsx | 4 + tests/fsharp/core/span/test-pre.fsx | 1 + tests/fsharp/core/span/test.bsl | 16 +- tests/fsharp/core/span/test.fsx | 3 +- tests/fsharp/core/span/test2-pre.fsx | 1 + tests/fsharp/core/span/test2.bsl | 88 +-- tests/fsharp/core/span/test2.fsx | 3 +- tests/fsharp/core/span/test3-pre.fsx | 1 + tests/fsharp/core/span/test3.bsl | 10 +- tests/fsharp/core/span/test3.fsx | 3 +- tests/fsharp/core/subtype/test.fsx | 14 +- tests/fsharp/core/syntax/test.fsx | 4 +- tests/fsharp/core/unicode/test.fsx | 2 +- tests/fsharp/packages.config | 11 - tests/fsharp/single-test.fs | 327 +++++++---- tests/fsharp/test-framework.fs | 60 +- tests/fsharp/tests.fs | 102 ++-- tests/fsharp/tools/eval/test.fsx | 2 +- tests/fsharp/typecheck/sigs/.gitignore | 1 + tests/fsharp/typecheck/sigs/neg107-pre.fsx | 4 + tests/fsharp/typecheck/sigs/neg107.bsl | 108 ++-- tests/fsharp/typecheck/sigs/neg107.fsx | 3 +- tests/fsharp/typecheck/sigs/neg107.vsbsl | 108 ++-- .../CompilerOptions/fsc/determinism/env.lst | 2 +- .../RecordTypes/env.lst | 3 +- .../src/AssemblyVersionCheck/.gitignore | 2 + .../AssemblyVersionCheck.fsx | 4 +- .../testenv/src/Directory.Build.props | 3 + .../testenv/src/Directory.Build.targets | 3 + .../HostedCompilerServer.fsproj | 64 +-- .../testenv/src/ILComparer/ILComparer.fsproj | 51 +- .../testenv/src/PEVerify/PEVerify.csproj | 1 + .../src/nunit/nunit-console-x86.exe.config | 24 - .../src/nunit/nunit-console.exe.config | 24 - tests/projects/Directory.Build.props | 3 + tests/projects/Directory.Build.targets | 3 + .../Directory.Build.props | 3 + .../Directory.Build.targets | 3 + tests/projects/misc/Directory.Build.props | 3 + tests/projects/misc/Directory.Build.targets | 3 + .../ProjectWithBuildErrors.fsproj | 80 +-- .../ProjectWithBuildErrors/packages.config | 4 - .../Library2/Library2.fsproj | 76 +-- .../Library2/packages.config | 4 - .../SameFileBelongsToMultipleProjects.fsproj | 87 +-- ...brary1AlwaysInMatchingConfiguration.fsproj | 75 +-- .../Library2AlwaysInDebugConfiguration.fsproj | 76 +-- .../packages.config | 4 - .../TestProjectChanges.fsproj | 92 +-- tests/service/EditorTests.fs | 2 +- .../CSharp_Analysis/CSharp_Analysis.csproj | 63 +-- .../Properties/AssemblyInfo.cs | 28 - tests/service/data/Directory.Build.props | 3 + tests/service/data/Directory.Build.targets | 3 + tests/service/data/TestTP/TestTP.fsproj | 75 +-- vsintegration/Directory.Build.targets | 19 +- .../LanguageServiceProfiling.fsproj | 1 + vsintegration/Vsix/Directory.Build.props | 1 - .../VisualFSharpFull/VisualFSharpFull.csproj | 10 +- .../VisualFSharpTemplates.csproj | 4 +- ...rp-vsintegration-item-templates-build.proj | 14 +- ...vsintegration-project-templates-build.proj | 6 +- .../fsharp-vsintegration-src-build.proj | 18 +- .../fsharp-vsintegration-unittests-build.proj | 45 +- .../fsharp-vsintegration-vsix-build.proj | 7 +- .../src/FSharp.Editor/FSharp.Editor.fsproj | 2 +- .../FSharp.LanguageService.Base.csproj | 4 +- .../FSharp.LanguageService.fsproj | 2 +- .../FSharp.PatternMatcher.csproj | 1 - .../Project/ProjectSystem.Base.csproj | 3 +- .../ProjectSystem.fsproj | 3 +- .../FSharp.PropertiesPages.vbproj | 2 +- .../FSharp.UIResources.csproj | 1 - .../src/FSharp.VS.FSI/FSharp.VS.FSI.fsproj | 3 +- .../DefinitionLocationAttribute.csproj | 40 +- ...onLocationAttributeFileDoesnotExist.csproj | 40 +- ...onLocationAttributeLineDoesnotExist.csproj | 38 +- ...LocationAttributeWithSpaceInTheType.csproj | 39 +- .../MockTypeProviders/Directory.Build.props | 14 +- .../MockTypeProviders/Directory.Build.targets | 3 +- ...myProviderForLanguageServiceTesting.fsproj | 36 +- .../EditorHideMethodsAttribute.csproj | 38 +- .../EmptyAssembly/EmptyAssembly.fsproj | 38 +- .../XmlDocAttributeWithAdequateComment.csproj | 38 +- .../XmlDocAttributeWithEmptyComment.csproj | 38 +- ...XmlDocAttributeWithLocalizedComment.csproj | 38 +- .../XmlDocAttributeWithLongComment.csproj | 38 +- .../XmlDocAttributeWithNullComment.csproj | 38 +- vsintegration/tests/Salsa/salsa.fs | 8 +- vsintegration/tests/UnitTests/.gitignore | 1 + vsintegration/tests/UnitTests/App.config | 8 +- .../UnitTests/HelpContextServiceTests.fs | 4 +- .../Tests.LanguageService.Completion.fs | 277 +++++---- .../Tests.LanguageService.ErrorList.fs | 21 +- .../Tests.LanguageService.GotoDefinition.fs | 28 +- .../Tests.LanguageService.ParameterInfo.fs | 83 +-- .../Tests.LanguageService.QuickInfo.fs | 72 ++- .../Tests.LanguageService.Script.fs | 6 +- .../UnitTests/SignatureHelpProviderTests.fs | 2 +- .../UnitTests/TestLib.LanguageService.fs | 7 +- .../tests/UnitTests/Tests.XmlDocComments.fs | 9 +- 301 files changed, 3456 insertions(+), 6960 deletions(-) delete mode 100644 DotnetCLIVersion.txt rename src/FSharp.Profiles.props => FSharp.Profiles.props (83%) delete mode 100644 build-everything.proj delete mode 100644 build/config/packages.config create mode 100644 build/projects/Directory.Build.props create mode 100644 build/projects/Directory.Build.targets delete mode 100644 build/projects/PrepareDependencyUptake.proj create mode 100644 build/projects/Signing.proj delete mode 100644 build/scripts/run-signtool.cmd create mode 100644 fcs/Directory.Build.props create mode 100644 fcs/Directory.Build.targets create mode 100644 fsharp.proj delete mode 100644 packages.config create mode 100644 proto.proj create mode 100644 setup/Directory.Build.props create mode 100644 setup/Directory.Build.targets create mode 100644 setup/Swix/Directory.Build.props create mode 100644 setup/Swix/Directory.Build.targets create mode 100644 setup/fsharp-setup-build.csproj delete mode 100644 setup/fsharp-setup-build.proj delete mode 100644 setup/packages.config create mode 100644 src/Directory.Build.props create mode 100644 src/Directory.Build.targets delete mode 100644 src/FSharpSource.Profiles.targets delete mode 100644 src/FSharpSource.Settings.targets delete mode 100644 src/FSharpSource.targets delete mode 100644 src/Microbuild.Settings.targets create mode 100644 src/buildfromsource/Directory.Build.targets rename src/{fsharp/FSharp.Compiler.nuget/Testing.FSharp.Compiler.nuspec => buildfromsource/FSharp.Compiler.nuget/Microsoft.FSharp.Compiler.nuspec} (52%) rename src/{fsharp => buildfromsource}/FSharp.Core/SR.fs (100%) create mode 100644 src/buildtools/Directory.Build.props create mode 100644 src/buildtools/Directory.Build.targets create mode 100644 src/buildtools/buildtools.proj delete mode 100644 src/buildtools/fslex/fslex.fsx delete mode 100644 src/buildtools/fssrgen/fssrgen.fsproj delete mode 100644 src/buildtools/fssrgen/fssrgen.fsx delete mode 100644 src/buildtools/fssrgen/fssrgen.targets delete mode 100644 src/buildtools/fsyacc/fsyacc.fsx delete mode 100644 src/fsharp-proto-build.proj create mode 100644 src/fsharp/Directory.Build.props create mode 100644 src/fsharp/Directory.Build.targets create mode 100644 src/fsharp/Directory.Nuget.props create mode 100644 src/fsharp/Directory.Nuget.targets delete mode 100644 src/fsharp/FSharp.Build-proto/FSharp.Build-proto.fsproj delete mode 100644 src/fsharp/FSharp.Build/project.json delete mode 100644 src/fsharp/FSharp.Compiler.Interactive.Settings/project.json delete mode 100644 src/fsharp/FSharp.Compiler.Private/project.json create mode 100644 src/fsharp/FSharp.Compiler.nuget/Directory.Build.props create mode 100644 src/fsharp/FSharp.Compiler.nuget/Directory.Build.targets delete mode 100644 src/fsharp/FSharp.Compiler.nuget/FSharp.Compiler.Template.nuget.props delete mode 100644 src/fsharp/FSharp.Compiler.nuget/FSharp.Compiler.Template.nuget.targets create mode 100644 src/fsharp/FSharp.Compiler.nuget/Microsoft.FSharp.Compiler.csproj delete mode 100644 src/fsharp/FSharp.Compiler.nuget/Microsoft.FSharp.Compiler.nuget.proj delete mode 100644 src/fsharp/FSharp.Compiler.nuget/Program.fs create mode 100644 src/fsharp/FSharp.Compiler.nuget/Testing.FSharp.Compiler.csproj delete mode 100644 src/fsharp/FSharp.Compiler.nuget/Testing.FSharp.Compiler.nuget.proj delete mode 100644 src/fsharp/FSharp.Core.nuget/FSharp.Core.nuget.proj delete mode 100644 src/fsharp/FSharp.Core.nuget/Microsoft.Portable.FSharp.Core.nuspec create mode 100644 src/fsharp/FSharp.Core/Directory.Build.props create mode 100644 src/fsharp/FSharp.Core/Directory.Build.targets rename src/fsharp/{FSharp.Core.nuget => FSharp.Core}/FSharp.Core.nuspec (69%) delete mode 100644 src/fsharp/FSharp.Core/project.json delete mode 100644 src/fsharp/Fsc-proto/Fsc-proto.fsproj delete mode 100644 src/fsharp/Fsc-proto/app.config delete mode 100644 src/fsharp/Fsc/project.json delete mode 100644 src/fsharp/fsi/project.json delete mode 100644 src/scripts/subst.fsx create mode 100644 tests/FSharp.Build.UnitTests/Directory.Build.props create mode 100644 tests/FSharp.Build.UnitTests/Directory.Build.targets delete mode 100644 tests/FSharp.Build.UnitTests/Program.fs delete mode 100644 tests/FSharp.Build.UnitTests/project.json create mode 100644 tests/FSharp.Compiler.UnitTests/Directory.Build.props create mode 100644 tests/FSharp.Compiler.UnitTests/Directory.Build.targets create mode 100644 tests/FSharp.Core.UnitTests/.gitignore create mode 100644 tests/FSharp.Core.UnitTests/Directory.Build.props create mode 100644 tests/FSharp.Core.UnitTests/Directory.Build.targets delete mode 100644 tests/FSharp.Core.UnitTests/Program.fs delete mode 100644 tests/FSharp.Core.UnitTests/project.json create mode 100644 tests/FSharp.Directory.Build.props create mode 100644 tests/FSharp.Directory.Build.targets create mode 100644 tests/fsharp/Directory.Build.props create mode 100644 tests/fsharp/Directory.Build.targets delete mode 100644 tests/fsharp/FSharp.Tests.FSharpSuite.DrivingCoreCLR/DeployCompiler/fsc/NuGet.Config delete mode 100644 tests/fsharp/FSharp.Tests.FSharpSuite.DrivingCoreCLR/DeployCompiler/fsc/project.json delete mode 100644 tests/fsharp/FSharp.Tests.FSharpSuite.DrivingCoreCLR/DeployCompiler/fsi/NuGet.Config delete mode 100644 tests/fsharp/FSharp.Tests.FSharpSuite.DrivingCoreCLR/DeployCompiler/fsi/project.json delete mode 100644 tests/fsharp/FSharp.Tests.FSharpSuite.DrivingCoreCLR/FSharp.Tests.FSharpSuite.DrivingCoreCLR.fsproj delete mode 100644 tests/fsharp/FSharp.Tests.FSharpSuite.DrivingCoreCLR/FSharp.Tests.FSharpSuite.DrivingCoreCLR.sln delete mode 100644 tests/fsharp/FSharp.Tests.FSharpSuite.DrivingCoreCLR/Program.cs delete mode 100644 tests/fsharp/FSharp.Tests.FSharpSuite.DrivingCoreCLR/Program.fs delete mode 100644 tests/fsharp/FSharp.Tests.FSharpSuite.DrivingCoreCLR/project.json create mode 100644 tests/fsharp/SDKTests/Directory.Build.props create mode 100644 tests/fsharp/SDKTests/Directory.Build.targets create mode 100644 tests/fsharp/Test.Directory.Build.props create mode 100644 tests/fsharp/core/byrefs/.gitignore create mode 100644 tests/fsharp/core/span/.gitignore create mode 100644 tests/fsharp/core/span/common-pre.fsx create mode 100644 tests/fsharp/core/span/test-pre.fsx create mode 100644 tests/fsharp/core/span/test2-pre.fsx create mode 100644 tests/fsharp/core/span/test3-pre.fsx delete mode 100644 tests/fsharp/packages.config create mode 100644 tests/fsharp/typecheck/sigs/.gitignore create mode 100644 tests/fsharp/typecheck/sigs/neg107-pre.fsx create mode 100644 tests/fsharpqa/testenv/src/AssemblyVersionCheck/.gitignore create mode 100644 tests/fsharpqa/testenv/src/Directory.Build.props create mode 100644 tests/fsharpqa/testenv/src/Directory.Build.targets delete mode 100644 tests/fsharpqa/testenv/src/nunit/nunit-console-x86.exe.config delete mode 100644 tests/fsharpqa/testenv/src/nunit/nunit-console.exe.config create mode 100644 tests/projects/Directory.Build.props create mode 100644 tests/projects/Directory.Build.targets create mode 100644 tests/projects/Sample_NETCoreSDK_FSharp_Library_netstandard2_0/Directory.Build.props create mode 100644 tests/projects/Sample_NETCoreSDK_FSharp_Library_netstandard2_0/Directory.Build.targets create mode 100644 tests/projects/misc/Directory.Build.props create mode 100644 tests/projects/misc/Directory.Build.targets delete mode 100644 tests/projects/misc/ProjectWithBuildErrors/ProjectWithBuildErrors/packages.config delete mode 100644 tests/projects/misc/SameFileBelongsToMultipleProjects/Library2/packages.config delete mode 100644 tests/projects/misc/TestProjectChanges/Library2AlwaysInDebugConfiguration/packages.config create mode 100644 tests/service/data/Directory.Build.props create mode 100644 tests/service/data/Directory.Build.targets create mode 100644 vsintegration/tests/UnitTests/.gitignore diff --git a/.gitignore b/.gitignore index e599502bb48..9ab09dfa936 100644 --- a/.gitignore +++ b/.gitignore @@ -8,6 +8,9 @@ /debug /Proto +# auto-generated during the build +global.json + # Patches that may have been generated by scripts. # (These aren't generally useful to commit directly; if anything, they should be applied.) scripts/*.patch @@ -82,6 +85,8 @@ lib/bootstrap/4.1/*.xml lib/bootstrap/4.1/fsharpc lib/bootstrap/4.1/fsharpi lib/bootstrap/4.1/policy* +obj/ +bin/ aclocal.m4 Debug Release diff --git a/.vsts-pr.yaml b/.vsts-pr.yaml index 1f9976034fd..c722dd1662d 100644 --- a/.vsts-pr.yaml +++ b/.vsts-pr.yaml @@ -6,9 +6,9 @@ jobs: strategy: maxParallel: 2 matrix: - release_default: - _command: ./mono/cibuild.sh - _args: release + dotnet_sdk: + _command: make + _args: Configuration=release # disabled until it can be properly fixed #release_fcs: # _command: ./fcs/build.sh diff --git a/DEVGUIDE.md b/DEVGUIDE.md index 551c0b684bb..b1b0d00cbf5 100644 --- a/DEVGUIDE.md +++ b/DEVGUIDE.md @@ -259,7 +259,6 @@ If you are behind a proxy server, NuGet client tool must be configured to use it Where you should set proper proxy address, user name and password. - #### Resources The primary technical guide to the core compiler code is [The F# Compiler Technical Guide](http://fsharp.github.io/2015/09/29/fsharp-compiler-guide.html). Please read and contribute to that guide. diff --git a/DotnetCLIToolsVersion.txt b/DotnetCLIToolsVersion.txt index c36e5cc7c24..8c63a20474c 100644 --- a/DotnetCLIToolsVersion.txt +++ b/DotnetCLIToolsVersion.txt @@ -1 +1 @@ -2.1.403 +2.1.500 diff --git a/DotnetCLIVersion.txt b/DotnetCLIVersion.txt deleted file mode 100644 index 6d7fdc186f6..00000000000 --- a/DotnetCLIVersion.txt +++ /dev/null @@ -1 +0,0 @@ -1.0.0-preview3-003886 \ No newline at end of file diff --git a/src/FSharp.Profiles.props b/FSharp.Profiles.props similarity index 83% rename from src/FSharp.Profiles.props rename to FSharp.Profiles.props index 3abfcb49be4..2e2edb73702 100644 --- a/src/FSharp.Profiles.props +++ b/FSharp.Profiles.props @@ -2,14 +2,14 @@ - + $(DefineConstants);CROSS_PLATFORM_COMPILER $(DefineConstants);ENABLE_MONO_SUPPORT $(DefineConstants);BE_SECURITY_TRANSPARENT $(DefineConstants);FX_LCIDFROMCODEPAGE - + $(DefineConstants);NETSTANDARD $(DefineConstants);NETSTANDARD1_6 $(DefineConstants);FX_NO_APP_DOMAINS @@ -19,13 +19,11 @@ $(DefineConstants);FX_NO_CONVERTER $(DefineConstants);FX_NO_DEFAULT_DEPENDENCY_TYPE $(DefineConstants);FX_NO_CORHOST_SIGNER - $(DefineConstants);FX_NO_CRYPTO $(DefineConstants);FX_NO_EVENTWAITHANDLE_IDISPOSABLE $(DefineConstants);FX_NO_EXIT_CONTEXT_FLAGS $(DefineConstants);FX_NO_HEAPTERMINATION $(DefineConstants);FX_NO_LINKEDRESOURCES $(DefineConstants);FX_NO_LOADER_OPTIMIZATION - $(DefineConstants);FX_NO_SIMPLIFIED_LOADER $(DefineConstants);FX_NO_PARAMETERIZED_THREAD_START $(DefineConstants);FX_NO_PDB_READER $(DefineConstants);FX_NO_PDB_WRITER @@ -42,16 +40,13 @@ $(DefineConstants);FX_NO_WEB_CLIENT $(DefineConstants);FX_NO_WIN_REGISTRY $(DefineConstants);FX_NO_WINFORMS + $(DefineConstants);FX_NO_INDENTED_TEXT_WRITER $(DefineConstants);FX_REDUCED_EXCEPTIONS $(DefineConstants);FX_REDUCED_CONSOLE $(DefineConstants);FX_RESHAPED_REFEMIT - $(DefineConstants);FX_RESHAPED_CONSOLE $(DefineConstants);FX_RESHAPED_GLOBALIZATION $(DefineConstants);FX_RESHAPED_REFLECTION - $(DefineConstants);FX_JITTRACKING_ISSUE - $(DefineConstants);FX_NO_INDENTED_TEXT_WRITER - $(DefineConstants);FX_RESHAPED_REFLECTION_CORECLR - $(DefineConstants);FSI_TODO_NETCORE + $(DefineConstants);FX_RESHAPED_MSBUILD $(OtherFlags) --simpleresolution diff --git a/FSharpBuild.Directory.Build.props b/FSharpBuild.Directory.Build.props index 560885e394b..81701799796 100644 --- a/FSharpBuild.Directory.Build.props +++ b/FSharpBuild.Directory.Build.props @@ -1,6 +1,8 @@ + + @@ -9,8 +11,8 @@ $(MSBuildThisFileDirectory) $(RepoRoot)src $(RepoRoot)Tools - false - $(RepoRoot)Proto\net40\bin + $(RepoRoot)Proto\net40\bin + $(RepoRoot)Proto\coreclr\bin 4.4.0 @@ -18,10 +20,20 @@ $(NUGET_PACKAGES) - $(MSBuildThisFileDirectory)packages + $(UserProfile)\.nuget\packages\ + $(HOME)/.nuget/packages/ $(NuGetPackageRoot)\ $(NuGetPackageRoot)/ + + true + + + + + true + /usr/lib/mono/4.5-api + /usr/lib/mono/4.6-api @@ -32,15 +44,15 @@ true true - - - - true + + $(FSharpSourcesRoot)\fsharp\test.snk + false + STRONG_NAME_FSHARP_COMPILER_WITH_TEST_KEY;$(DefineConstants) - false + false true @@ -53,10 +65,11 @@ - - $(ProtoOutputPath)\Microsoft.FSharp.NetSdk.props - $(ProtoOutputPath)\Microsoft.FSharp.NetSdk.targets - $(ProtoOutputPath)\Microsoft.FSharp.Overrides.NetSdk.targets + + $(ProtoOutputPath)\Microsoft.FSharp.Targets + $(ProtoOutputPath)\Microsoft.FSharp.NetSdk.props + $(ProtoOutputPath)\Microsoft.FSharp.NetSdk.targets + $(ProtoOutputPath)\Microsoft.FSharp.Overrides.NetSdk.targets diff --git a/FSharpBuild.Directory.Build.targets b/FSharpBuild.Directory.Build.targets index a447c35111a..375416e5cf3 100644 --- a/FSharpBuild.Directory.Build.targets +++ b/FSharpBuild.Directory.Build.targets @@ -1,18 +1,40 @@ + + en;$(XlfLanguages) - coreclr - net40 - $(MSBuildProjectDirectory)\$(OutputPath) - $(OutputPath) - $(RepoRoot)$(Configuration)\$(TargetDotnetProfile)\bin - $(RepoRoot)$(Configuration)\$(TargetDotnetProfile)\obj - + + + $(AssetTargetFallback);net462 + + + + $(CompileDependsOn);CopyAndSubstituteTextFiles + + + + + <_ReplacementText>$([System.IO.File]::ReadAllText('%(CopyAndSubstituteText.FullPath)')) + <_ReplacementText Condition="'%(CopyAndSubstituteText.Pattern1)' != ''">$(_ReplacementText.Replace('%(CopyAndSubstituteText.Pattern1)', '%(CopyAndSubstituteText.Replacement1)')) + <_ReplacementText Condition="'%(CopyAndSubstituteText.Pattern2)' != ''">$(_ReplacementText.Replace('%(CopyAndSubstituteText.Pattern2)', '%(CopyAndSubstituteText.Replacement2)')) + + + + + + + + + + + coreclr + net40 + $(MSBuildProjectDirectory)\$(OutputPath) + $(OutputPath) + $(RepoRoot)$(Configuration)\$(TargetDotnetProfile)\bin + $(RepoRoot)$(Configuration)\$(TargetDotnetProfile)\obj + + + + + @@ -33,7 +70,6 @@ - diff --git a/Makefile b/Makefile index 14f7aef4870..d596299cb57 100644 --- a/Makefile +++ b/Makefile @@ -1,101 +1,50 @@ -include $(topsrcdir)mono/config.make - -.PHONY: restore build build-proto - -restore: - MONO_ENV_OPTIONS=$(monoopts) mono .nuget/NuGet.exe restore packages.config -PackagesDirectory packages -ConfigFile ./NuGet.Config - chmod u+x packages/FSharp.Compiler.Tools.4.1.27/tools/fsi.exe - chmod u+x packages/FsLexYacc.7.0.6/build/fslex.exe - chmod u+x packages/FsLexYacc.7.0.6/build/fsyacc.exe - -# Make the proto using the bootstrap, then make the final compiler using the proto -# We call MAKE sequentially because we don't want build-final to explicitly depend on build-proto, -# as that causes a complete recompilation of both proto and final everytime you touch the -# compiler sources. -all: - @echo ----------- - @echo prefix=$(prefix) - @echo topdir=$(topdir) - @echo monodir=$(monodir) - @echo monolibdir=$(monolibdir) - @echo monobindir=$(monobindir) - @echo ----------- - $(MAKE) restore - $(MAKE) build-proto - $(MAKE) build - -build-proto: - MONO_ENV_OPTIONS=$(monoopts) $(MSBUILD) /p:Configuration=Proto /p:TargetDotnetProfile=$(TargetDotnetProfile) src/fsharp/FSharp.Build-proto/FSharp.Build-proto.fsproj - MONO_ENV_OPTIONS=$(monoopts) $(MSBUILD) /p:Configuration=Proto /p:TargetDotnetProfile=$(TargetDotnetProfile) src/fsharp/Fsc-proto/Fsc-proto.fsproj - -# The main targets -build: - MONO_ENV_OPTIONS=$(monoopts) $(MSBUILD) /p:Configuration=$(Configuration) /p:TargetDotnetProfile=net40 src/fsharp/FSharp.Core/FSharp.Core.fsproj - MONO_ENV_OPTIONS=$(monoopts) $(MSBUILD) /p:Configuration=$(Configuration) /p:TargetDotnetProfile=net40 src/fsharp/FSharp.Build/FSharp.Build.fsproj - MONO_ENV_OPTIONS=$(monoopts) $(MSBUILD) /p:Configuration=$(Configuration) /p:TargetDotnetProfile=net40 src/fsharp/FSharp.Compiler.Private/FSharp.Compiler.Private.fsproj - MONO_ENV_OPTIONS=$(monoopts) $(MSBUILD) /p:Configuration=$(Configuration) /p:TargetDotnetProfile=net40 src/fsharp/Fsc/Fsc.fsproj - MONO_ENV_OPTIONS=$(monoopts) $(MSBUILD) /p:Configuration=$(Configuration) /p:TargetDotnetProfile=net40 src/fsharp/FSharp.Compiler.Interactive.Settings/FSharp.Compiler.Interactive.Settings.fsproj - MONO_ENV_OPTIONS=$(monoopts) $(MSBUILD) /p:Configuration=$(Configuration) /p:TargetDotnetProfile=net40 src/fsharp/FSharp.Compiler.Server.Shared/FSharp.Compiler.Server.Shared.fsproj - MONO_ENV_OPTIONS=$(monoopts) $(MSBUILD) /p:Configuration=$(Configuration) /p:TargetDotnetProfile=net40 src/fsharp/fsi/Fsi.fsproj - MONO_ENV_OPTIONS=$(monoopts) $(MSBUILD) /p:Configuration=$(Configuration) /p:TargetDotnetProfile=net40 src/fsharp/fsiAnyCpu/FsiAnyCPU.fsproj - MONO_ENV_OPTIONS=$(monoopts) $(MSBUILD) /p:Configuration=$(Configuration) /p:TargetDotnetProfile=net40 tests/FSharp.Core.UnitTests/FSharp.Core.UnitTests.fsproj - mkdir -p $(Configuration)/fsharp30/net40/bin - mkdir -p $(Configuration)/fsharp31/net40/bin - mkdir -p $(Configuration)/fsharp40/net40/bin - cp -p packages/FSharp.Core.3.0.2/lib/net40/* $(Configuration)/fsharp30/net40/bin - cp -p packages/FSharp.Core.3.1.2.5/lib/net40/* $(Configuration)/fsharp31/net40/bin - cp -p packages/FSharp.Core.4.0.0.1/lib/net40/* $(Configuration)/fsharp40/net40/bin - mkdir -p $(Configuration)/portable7/bin - cp -p packages/FSharp.Core.4.1.17/lib/portable-net45+netcore45/* $(Configuration)/portable7/bin - mkdir -p $(Configuration)/portable47/bin - cp -p packages/FSharp.Core.4.1.17/lib/portable-net45+sl5+netcore45/* $(Configuration)/portable47/bin - mkdir -p $(Configuration)/portable78/bin - cp -p packages/FSharp.Core.4.1.17/lib/portable-net45+netcore45+wp8/* $(Configuration)/portable78/bin - mkdir -p $(Configuration)/portable259/bin - cp -p packages/FSharp.Core.4.1.17/lib/portable-net45+netcore45+wpa81+wp8/* $(Configuration)/portable259/bin - mkdir -p $(Configuration)/monoandroid10+monotouch10+xamarinios10/bin - cp -p packages/FSharp.Core.4.1.17/lib/portable-net45+monoandroid10+monotouch10+xamarinios10/* $(Configuration)/monoandroid10+monotouch10+xamarinios10/bin - mkdir -p $(Configuration)/xamarinmacmobile/bin - cp -p packages/FSharp.Core.4.1.17/lib/xamarinmac20/* $(Configuration)/xamarinmacmobile/bin - - - -install: - -rm -fr $(DESTDIR)$(monodir)/fsharp - -rm -fr $(DESTDIR)$(monodir)/Microsoft\ F# - -rm -fr $(DESTDIR)$(monodir)/Microsoft\ SDKs/F# - -rm -fr $(DESTDIR)$(monodir)/msbuild/Microsoft/VisualStudio/v/FSharp - -rm -fr $(DESTDIR)$(monodir)/msbuild/Microsoft/VisualStudio/v11.0/FSharp - -rm -fr $(DESTDIR)$(monodir)/msbuild/Microsoft/VisualStudio/v12.0/FSharp - -rm -fr $(DESTDIR)$(monodir)/msbuild/Microsoft/VisualStudio/v14.0/FSharp - -rm -fr $(DESTDIR)$(monodir)/msbuild/Microsoft/VisualStudio/v15.0/FSharp - $(MAKE) -C mono/FSharp.Core TargetDotnetProfile=net40 install - $(MAKE) -C mono/FSharp.Build install - $(MAKE) -C mono/FSharp.Compiler.Private install - $(MAKE) -C mono/Fsc install - $(MAKE) -C mono/FSharp.Compiler.Interactive.Settings install - $(MAKE) -C mono/FSharp.Compiler.Server.Shared install - $(MAKE) -C mono/fsi install - $(MAKE) -C mono/fsiAnyCpu install - $(MAKE) -C mono/FSharp.Core TargetDotnetProfile=net40 FSharpCoreBackVersion=3.0 install - $(MAKE) -C mono/FSharp.Core TargetDotnetProfile=net40 FSharpCoreBackVersion=3.1 install - $(MAKE) -C mono/FSharp.Core TargetDotnetProfile=net40 FSharpCoreBackVersion=4.0 install - $(MAKE) -C mono/FSharp.Core TargetDotnetProfile=portable47 install - $(MAKE) -C mono/FSharp.Core TargetDotnetProfile=portable7 install - $(MAKE) -C mono/FSharp.Core TargetDotnetProfile=portable78 install - $(MAKE) -C mono/FSharp.Core TargetDotnetProfile=portable259 install - $(MAKE) -C mono/FSharp.Core TargetDotnetProfile=monoandroid10+monotouch10+xamarinios10 install - $(MAKE) -C mono/FSharp.Core TargetDotnetProfile=xamarinmacmobile install - echo "------------------------------ INSTALLED FILES --------------" - ls -xlR $(DESTDIR)$(monodir)/fsharp $(DESTDIR)$(monodir)/msbuild $(DESTDIR)$(monodir)/xbuild $(DESTDIR)$(monodir)/Reference\ Assemblies $(DESTDIR)$(monodir)/gac/FSharp* $(DESTDIR)$(monodir)/Microsoft* || true - -dist: - -rm -r fsharp-$(DISTVERSION) fsharp-$(DISTVERSION).tar.bz2 - mkdir -p fsharp-$(DISTVERSION) - (cd $(topdir) && git archive HEAD |(cd $(builddir)fsharp-$(DISTVERSION) && tar xf -)) - list='$(EXTRA_DIST)'; for s in $$list; do \ - (cp $(topdir)$$s fsharp-$(DISTVERSION)/$$s) \ - done; - tar cvjf fsharp-$(DISTVERSION).tar.bz2 $(patsubst %,--exclude=%, $(NO_DIST)) fsharp-$(DISTVERSION) - du -b fsharp-$(DISTVERSION).tar.bz2 - +Configuration ?= release +DotNetVersion = `cat DotnetCLIToolsVersion.txt` +DotNetExe = "$(CURDIR)/Tools/dotnet20/dotnet" + +all: proto restore build test + +tools: + $(CURDIR)/scripts/dotnet-install.sh --version $(DotNetVersion) --install-dir $(CURDIR)/Tools/dotnet20 + +global.json: tools + echo { \"sdk\": { \"version\": \"$(DotNetVersion)\" } }>global.json + +proto: global.json + $(DotNetExe) build-server shutdown + $(DotNetExe) restore src/buildtools/buildtools.proj + $(DotNetExe) restore src/fsharp/FSharp.Build/FSharp.Build.fsproj + $(DotNetExe) restore src/fsharp/Fsc/Fsc.fsproj + $(DotNetExe) build src/buildtools/buildtools.proj -c Proto + $(DotNetExe) build src/fsharp/FSharp.Build/FSharp.Build.fsproj -f netstandard2.0 -c Proto + $(DotNetExe) build src/fsharp/Fsc/Fsc.fsproj -f netcoreapp2.1 -c Proto + +restore: global.json + $(DotNetExe) restore src/fsharp/FSharp.Core/FSharp.Core.fsproj + $(DotNetExe) restore src/fsharp/FSharp.Build/FSharp.Build.fsproj + $(DotNetExe) restore src/fsharp/FSharp.Compiler.Private/FSharp.Compiler.Private.fsproj + $(DotNetExe) restore src/fsharp/Fsc/Fsc.fsproj + $(DotNetExe) restore src/fsharp/FSharp.Compiler.Interactive.Settings/FSharp.Compiler.Interactive.Settings.fsproj + $(DotNetExe) restore src/fsharp/fsi/Fsi.fsproj + $(DotNetExe) restore tests/FSharp.Core.UnitTests/FSharp.Core.UnitTests.fsproj + $(DotNetExe) restore tests/FSharp.Build.UnitTests/FSharp.Build.UnitTests.fsproj + +build: proto restore + $(DotNetExe) build-server shutdown + $(DotNetExe) build -c $(Configuration) -f netstandard1.6 src/fsharp/FSharp.Core/FSharp.Core.fsproj + $(DotNetExe) build -c $(Configuration) -f netstandard2.0 src/fsharp/FSharp.Build/FSharp.Build.fsproj + $(DotNetExe) build -c $(Configuration) -f netstandard1.6 src/fsharp/FSharp.Compiler.Private/FSharp.Compiler.Private.fsproj + $(DotNetExe) build -c $(Configuration) -f netcoreapp2.1 src/fsharp/Fsc/Fsc.fsproj + $(DotNetExe) build -c $(Configuration) -f netstandard1.6 src/fsharp/FSharp.Compiler.Interactive.Settings/FSharp.Compiler.Interactive.Settings.fsproj + $(DotNetExe) build -c $(Configuration) -f netcoreapp2.0 src/fsharp/fsi/Fsi.fsproj + $(DotNetExe) build -c $(Configuration) -f netcoreapp2.0 tests/FSharp.Core.UnitTests/FSharp.Core.UnitTests.fsproj + $(DotNetExe) build -c $(Configuration) -f netcoreapp2.0 tests/FSharp.Build.UnitTests/FSharp.Build.UnitTests.fsproj + +test: build + $(DotNetExe) test -f netcoreapp2.0 -c $(Configuration) --no-restore --no-build tests/FSharp.Core.UnitTests/FSharp.Core.UnitTests.fsproj -l "trx;LogFileName=$(CURDIR)/tests/TestResults/FSharp.Core.UnitTests.coreclr.trx" + $(DotNetExe) test -f netcoreapp2.0 -c $(Configuration) --no-restore --no-build tests/FSharp.Build.UnitTests/FSharp.Build.UnitTests.fsproj -l "trx;LogFileName=$(CURDIR)/tests/TestResults/FSharp.Build.UnitTests.coreclr.trx" + +clean: + rm -rf $(CURDIR)/Proto + rm -rf $(CURDIR)/debug + rm -rf $(CURDIR)/release diff --git a/NuGet.Config b/NuGet.Config index c89208eb6da..6efc7f7b978 100644 --- a/NuGet.Config +++ b/NuGet.Config @@ -1,22 +1,6 @@  - - - - - - - - - - - - - - - - diff --git a/RoslynPackageVersion.txt b/RoslynPackageVersion.txt index d0a9234a2fb..593eafec198 100644 --- a/RoslynPackageVersion.txt +++ b/RoslynPackageVersion.txt @@ -1 +1 @@ -2.9.0-beta8-63208-01 \ No newline at end of file +2.9.0-beta8-63208-01 diff --git a/build-everything.proj b/build-everything.proj deleted file mode 100644 index caba4fd173e..00000000000 --- a/build-everything.proj +++ /dev/null @@ -1,165 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - true - true - true - true - true - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - true - - - - - - - - - true - - - - - - - - - - - - - - - - - - - - - true - - - - - - - - - - - - - - AssemblySearchPaths={HintPathFromItem};{TargetFrameworkDirectory};{RawFileName} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/build-nuget-packages.proj b/build-nuget-packages.proj index 2aab5455e93..37a64ed6535 100644 --- a/build-nuget-packages.proj +++ b/build-nuget-packages.proj @@ -2,20 +2,12 @@ - - + + - - - - - - - - - - + + diff --git a/build.cmd b/build.cmd index 9ae59374a90..504616ccab2 100644 --- a/build.cmd +++ b/build.cmd @@ -76,7 +76,6 @@ set TEST_CORECLR_FSHARP_SUITE=0 set TEST_VS_IDEUNIT_SUITE=0 set TEST_FCS=0 set TEST_END_2_END=0 -set INCLUDE_TEST_SPEC_NUNIT= set INCLUDE_TEST_TAGS= set COPY_FSCOMP_RESOURCE_FOR_BUILD_FROM_SOURCES=0 @@ -345,7 +344,6 @@ if /i "%ARG%" == "no-test" ( if /i "%ARG%" == "include" ( set /a counter=!counter!+1 - if "!INCLUDE_TEST_SPEC_NUNIT!" == "" ( set INCLUDE_TEST_SPEC_NUNIT=cat == %ARG2% ) else (set INCLUDE_TEST_SPEC_NUNIT=cat == %ARG2% or !INCLUDE_TEST_SPEC_NUNIT! ) if "!INCLUDE_TEST_TAGS!" == "" ( set INCLUDE_TEST_TAGS=%ARG2% ) else (set INCLUDE_TEST_TAGS=%ARG2%;!INCLUDE_TEST_TAGS! ) ) @@ -465,22 +463,6 @@ if /i "%TEST_NET40_FSHARP_SUITE" == "1" ( ) ) -if /i "%BUILD_PROTO_WITH_CORECLR_LKG%" == "1" ( - set NEEDS_DOTNET_CLI_TOOLS=1 -) - -if /i "%BUILD_CORECLR%" == "1" ( - set NEEDS_DOTNET_CLI_TOOLS=1 -) - -if /i "%BUILD_FROMSOURCE%" == "1" ( - set NEEDS_DOTNET_CLI_TOOLS=1 -) - -if /i "%BUILD_FCS%" == "1" ( - set NEEDS_DOTNET_CLI_TOOLS=1 -) - rem Decide if Proto need building if NOT EXIST Proto\net40\bin\fsc.exe ( set BUILD_PROTO=1 @@ -525,7 +507,6 @@ echo TEST_NET40_FSHARPQA_SUITE=%TEST_NET40_FSHARPQA_SUITE% echo TEST_CORECLR_COREUNIT_SUITE=%TEST_CORECLR_COREUNIT_SUITE% echo TEST_CORECLR_FSHARP_SUITE=%TEST_CORECLR_FSHARP_SUITE% echo TEST_VS_IDEUNIT_SUITE=%TEST_VS_IDEUNIT_SUITE% -echo INCLUDE_TEST_SPEC_NUNIT=%INCLUDE_TEST_SPEC_NUNIT% echo INCLUDE_TEST_TAGS=%INCLUDE_TEST_TAGS% echo TEMP=%TEMP% @@ -562,24 +543,12 @@ set TargetFrameworkSDKToolsDirectory=%WindowsSDK_ExecutablePath_x64% if not "%TargetFrameworkSDKToolsDirectory%" == "" ( goto have_TargetFrameworkSDKToolsDirectory ) set TargetFrameworkSDKToolsDirectory=%WindowsSDK_ExecutablePath_x86% -:have_TargetFrameworkSDKToolsDirectory - -set BuildToolsPackage=Microsoft.VSSDK.BuildTools.15.6.170 -if "%VSSDKInstall%"=="" ( - set VSSDKInstall=%~dp0packages\%BuildToolsPackage%\tools\vssdk -) -if "%VSSDKToolsPath%"=="" ( - set VSSDKToolsPath=%~dp0packages\%BuildToolsPackage%\tools\vssdk\bin -) -if "%VSSDKIncludes%"=="" ( - set VSSDKIncludes=%~dp0packages\%BuildToolsPackage%\tools\vssdk\inc -) +:have_TargetFrameworkSDKToolsDirectory if "%RestorePackages%"=="" ( set RestorePackages=true ) -@echo VSSDKInstall: %VSSDKInstall% @echo VSSDKToolsPath: %VSSDKToolsPath% @echo VSSDKIncludes: %VSSDKIncludes% @echo TargetFrameworkSDKToolsDirectory: %TargetFrameworkSDKToolsDirectory% @@ -639,86 +608,18 @@ if not exist %_ngenexe% echo Error: Could not find ngen.exe. && goto :failure echo ---------------- Done with prepare, starting package restore ---------------- -set _nugetexe="%~dp0.nuget\NuGet.exe" -set _nugetconfig="%~dp0NuGet.Config" +:: create a global.json +set /p DOTNET_TOOLS_VERSION=<"%~dp0DotnetCLIToolsVersion.txt" +echo { "sdk": { "version": "%DOTNET_TOOLS_VERSION%" } }>global.json -if "%RestorePackages%" == "true" ( - if "%BUILD_FCS%" == "1" ( - cd fcs - .paket\paket.exe restore - cd.. - @if ERRORLEVEL 1 echo Error: Paket restore failed && goto :failure - ) - - %_ngenexe% install %_nugetexe% /nologo - set _nugetoptions=-PackagesDirectory packages -ConfigFile %_nugetconfig% - if not "%PB_RESTORESOURCE%" == "" ( - set _nugetoptions=!_nugetoptions! -FallbackSource %PB_RESTORESOURCE% - ) - - echo _nugetoptions=!_nugetoptions! - - %_nugetexe% restore packages.config !_nugetoptions! - @if ERRORLEVEL 1 echo Error: Nuget restore failed && goto :failure - - if "%BUILD_SETUP%" == "1" ( - %_nugetexe% restore setup\packages.config !_nugetoptions! - @if ERRORLEVEL 1 echo Error: Nuget restore failed && goto :failure - ) - - if not "%SIGN_TYPE%" == "" ( - set signtoolnugetoptions=-PackagesDirectory "%USERPROFILE%\.nuget\packages" -ConfigFile %_nugetconfig% - if not "%PB_RESTORESOURCE%" == "" set signtoolnugetoptions=!signtoolnugetoptions! -FallbackSource %PB_RESTORESOURCE% - %_nugetexe% restore build\config\packages.config !signtoolnugetoptions! - @if ERRORLEVEL 1 echo Error: Nuget restore failed && goto :failure - ) - - set restore_fsharp_suite=0 - if "%TEST_NET40_FSHARP_SUITE%" == "1" set restore_fsharp_suite=1 - if "%TEST_CORECLR_FSHARP_SUITE%" == "1" set restore_fsharp_suite=1 - - if "!restore_fsharp_suite!" == "1" ( - %_nugetexe% restore tests\fsharp\packages.config !_nugetoptions! - @if ERRORLEVEL 1 echo Error: Nuget restore failed && goto :failure - ) -) - -if "%NEEDS_DOTNET_CLI_TOOLS%" == "1" ( - :: Restore the Tools directory - call "%~dp0init-tools.cmd" -) -set _dotnetcliexe=%~dp0Tools\dotnetcli\dotnet.exe -set _dotnet20exe=%~dp0Tools\dotnet20\dotnet.exe -set NUGET_PACKAGES=%~dp0packages +:: Restore the Tools directory +call "%~dp0init-tools.cmd" +set _dotnetexe=%~dp0Tools\dotnet20\dotnet.exe set path=%~dp0Tools\dotnet20\;%path% -echo ----------- Done with package restore, starting dependency uptake check ------------- - if not "%PB_PackageVersionPropsUrl%" == "" ( - set dependencyUptakeDir=%~dp0Tools\dependencyUptake - if not exist "!dependencyUptakeDir!" mkdir "!dependencyUptakeDir!" - - :: download package version overrides - echo powershell -noprofile -executionPolicy RemoteSigned -command "Invoke-WebRequest -Uri '%PB_PackageVersionPropsUrl%' -OutFile '!dependencyUptakeDir!\PackageVersions.props'" - powershell -noprofile -executionPolicy RemoteSigned -command "Invoke-WebRequest -Uri '%PB_PackageVersionPropsUrl%' -OutFile '!dependencyUptakeDir!\PackageVersions.props'" - if ERRORLEVEL 1 echo Error downloading package version properties && goto :failure - - :: prepare dependency uptake files - echo %_msbuildexe% %msbuildflags% %~dp0build\projects\PrepareDependencyUptake.proj /t:Build - %_msbuildexe% %msbuildflags% %~dp0build\projects\PrepareDependencyUptake.proj /t:Build - if ERRORLEVEL 1 echo Error building dependency uptake files && goto :failure + echo ----------- do dependency uptake check ----------- - :: restore dependencies - %_nugetexe% restore !dependencyUptakeDir!\packages.config -PackagesDirectory packages -ConfigFile !dependencyUptakeDir!\NuGet.config - if ERRORLEVEL 1 echo Error restoring dependency uptake packages && goto :failure - - :: set DotNetPackageVersionPropsPath - set DotNetPackageVersionPropsPath=!dependencyUptakeDir!\PackageVersions.props -) - -echo ----------- Done with package restore, starting dependency uptake check ------------- - -if not "%PB_PackageVersionPropsUrl%" == "" ( set dependencyUptakeDir=%~dp0Tools\dependencyUptake if not exist "!dependencyUptakeDir!" mkdir "!dependencyUptakeDir!" @@ -726,28 +627,16 @@ if not "%PB_PackageVersionPropsUrl%" == "" ( echo powershell -noprofile -executionPolicy RemoteSigned -command "Invoke-WebRequest -Uri '%PB_PackageVersionPropsUrl%' -OutFile '!dependencyUptakeDir!\PackageVersions.props'" powershell -noprofile -executionPolicy RemoteSigned -command "Invoke-WebRequest -Uri '%PB_PackageVersionPropsUrl%' -OutFile '!dependencyUptakeDir!\PackageVersions.props'" if ERRORLEVEL 1 echo Error downloading package version properties && goto :failure - - :: prepare dependency uptake files - echo %_msbuildexe% %msbuildflags% %~dp0build\projects\PrepareDependencyUptake.proj /t:Build - %_msbuildexe% %msbuildflags% %~dp0build\projects\PrepareDependencyUptake.proj /t:Build - if ERRORLEVEL 1 echo Error building dependency uptake files && goto :failure - - :: restore dependencies - %_nugetexe% restore !dependencyUptakeDir!\packages.config -PackagesDirectory packages -ConfigFile !dependencyUptakeDir!\NuGet.config - if ERRORLEVEL 1 echo Error restoring dependency uptake packages && goto :failure ) -set _dotnetcliexe=%~dp0Tools\dotnetcli\dotnet.exe -set _dotnet20exe=%~dp0Tools\dotnet20\dotnet.exe -set NUGET_PACKAGES=%~dp0Packages -set path=%~dp0Tools\dotnet20\;%path% - -set _fsiexe="packages\FSharp.Compiler.Tools.4.1.27\tools\fsi.exe" -if not exist %_fsiexe% echo Error: Could not find %_fsiexe% && goto :failure -%_ngenexe% install %_fsiexe% /nologo - -if not exist %_nugetexe% echo Error: Could not find %_nugetexe% && goto :failure -%_ngenexe% install %_nugetexe% /nologo +if "%RestorePackages%" == "true" ( + if "%BUILD_FCS%" == "1" ( + cd fcs + .paket\paket.exe restore + cd.. + @if ERRORLEVEL 1 echo Error: Paket restore failed && goto :failure + ) +) echo ---------------- Done with package restore, verify buildfrom source --------------- if "%BUILD_PROTO_WITH_CORECLR_LKG%" == "1" ( @@ -763,46 +652,26 @@ if not exist "!logdir!" mkdir "!logdir!" rem Build Proto if "%BUILD_PROTO%" == "1" ( - rmdir /s /q Proto + rmdir /s /q Proto - if "%BUILD_PROTO_WITH_CORECLR_LKG%" == "1" ( + echo %_msbuildexe% proto.proj /t:Restore /bl:%~dp0Proto\proto.proj.restore.binlog + %_msbuildexe% proto.proj /t:Restore /bl:%~dp0Proto\proto.proj.restore.binlog + @if ERRORLEVEL 1 echo Error restoring proto failed && goto :failure - echo %_msbuildexe% %msbuildflags% src\fsharp-proto-build.proj /p:BUILD_PROTO_WITH_CORECLR_LKG=%BUILD_PROTO_WITH_CORECLR_LKG% /p:Configuration=Proto /p:DisableLocalization=true /bl:%~dp0%BUILD_CONFIG%\logs\protobuild-coreclr.build.binlog - %_msbuildexe% %msbuildflags% src\fsharp-proto-build.proj /p:BUILD_PROTO_WITH_CORECLR_LKG=%BUILD_PROTO_WITH_CORECLR_LKG% /p:Configuration=Proto /p:DisableLocalization=true /bl:%~dp0%BUILD_CONFIG%\logs\protobuild-coreclr.build.binlog - @if ERRORLEVEL 1 echo Error: compiler proto build failed && goto :failure - ) - - if "%BUILD_PROTO_WITH_CORECLR_LKG%" == "0" ( - - echo %_ngenexe% install packages\FSharp.Compiler.Tools.4.1.27\tools\fsc.exe /nologo - %_ngenexe% install packages\FSharp.Compiler.Tools.4.1.27\tools\fsc.exe /nologo - - echo %_msbuildexe% %msbuildflags% src\fsharp-proto-build.proj /p:BUILD_PROTO_WITH_CORECLR_LKG=%BUILD_PROTO_WITH_CORECLR_LKG% /p:Configuration=Proto /p:DisableLocalization=true /bl:%~dp0%BUILD_CONFIG%\logs\protobuild-net40.build.binlog - %_msbuildexe% %msbuildflags% src\fsharp-proto-build.proj /p:BUILD_PROTO_WITH_CORECLR_LKG=%BUILD_PROTO_WITH_CORECLR_LKG% /p:Configuration=Proto /p:DisableLocalization=true /bl:%~dp0%BUILD_CONFIG%\logs\protobuild-net40.build.binlog - @if ERRORLEVEL 1 echo Error: compiler proto build failed && goto :failure - ) - - echo %_ngenexe% install Proto\net40\bin\fsc.exe /nologo - %_ngenexe% install Proto\net40\bin\fsc.exe /nologo - @if ERRORLEVEL 1 echo Error: NGen of proto failed && goto :failure -) - -if "%NEEDS_DOTNET_CLI_TOOLS%" == "1" ( - echo ---------------- Done with proto, starting SDK restore ------------------------ - :: Restore projects using dotnet CLI tool - echo %_dotnet20exe% restore -v:d build-everything.proj %msbuildflags% %BUILD_DIAG% - %_dotnet20exe% restore -v:d build-everything.proj %msbuildflags% %BUILD_DIAG% + echo %_msbuildexe% proto.proj /t:Build /bl:%~dp0Proto\proto.proj.build.binlog + %_msbuildexe% proto.proj /t:Build /bl:%~dp0Proto\proto.proj.build.binlog + @if ERRORLEVEL 1 echo Error building proto failed && goto :failure ) echo ---------------- Done with SDK restore, starting build ------------------------ if "%BUILD_PHASE%" == "1" ( - echo %_msbuildexe% %msbuildflags% build-everything.proj /t:Restore %BUILD_DIAG% /bl:%~dp0%BUILD_CONFIG%\net40\binmsbuild.build-everything.restore.%BUILD_CONFIG%.binlog - %_msbuildexe% %msbuildflags% build-everything.proj /t:Restore %BUILD_DIAG% /bl:%~dp0%BUILD_CONFIG%\net40\binmsbuild.build-everything.restore.%BUILD_CONFIG%.binlog + echo %_msbuildexe% fsharp.proj /t:Restore /p:Configuration=%BUILD_CONFIG% /bl:%~dp0%BUILD_CONFIG%\fsharp.proj.restore.binlog + %_msbuildexe% fsharp.proj /t:Restore /p:Configuration=%BUILD_CONFIG% /bl:%~dp0%BUILD_CONFIG%\fsharp.proj.restore.binlog - echo %_msbuildexe% %msbuildflags% build-everything.proj /p:Configuration=%BUILD_CONFIG% %BUILD_DIAG% /p:BUILD_PUBLICSIGN=%BUILD_PUBLICSIGN% /bl:%~dp0%BUILD_CONFIG%\logs\msbuild.build-everything.build.%BUILD_CONFIG%.binlog - %_msbuildexe% %msbuildflags% build-everything.proj /p:Configuration=%BUILD_CONFIG% %BUILD_DIAG% /p:BUILD_PUBLICSIGN=%BUILD_PUBLICSIGN% /bl:%~dp0%BUILD_CONFIG%\logs\msbuild.build-everything.build.%BUILD_CONFIG%.binlog + echo %_msbuildexe% fsharp.proj /t:Build /p:Configuration=%BUILD_CONFIG% /p:BUILD_PUBLICSIGN=%BUILD_PUBLICSIGN% /bl:%~dp0%BUILD_CONFIG%\fsharp.proj.build.binlog + %_msbuildexe% fsharp.proj /t:Build /p:Configuration=%BUILD_CONFIG% /p:BUILD_PUBLICSIGN=%BUILD_PUBLICSIGN% /bl:%~dp0%BUILD_CONFIG%\fsharp.proj.build.binlog @if ERRORLEVEL 1 echo Error build failed && goto :failure ) @@ -811,6 +680,7 @@ echo ---------------- Done with build, starting assembly version checks -------- set asmvercheckpath=%~dp0tests\fsharpqa\testenv\src\AssemblyVersionCheck if "%BUILD_NET40%" == "1" ( + echo #r @"%USERPROFILE%\.nuget\packages\Newtonsoft.Json\9.0.1\lib\net45\Newtonsoft.Json.dll">%asmvercheckpath%\assemblies.fsx echo "%~dp0%BUILD_CONFIG%\net40\bin\fsi.exe" "%asmvercheckpath%\AssemblyVersionCheck.fsx" -- "%~dp0build\config\AssemblySignToolData.json" "%~dp0%BUILD_CONFIG%" "%~dp0%BUILD_CONFIG%\net40\bin\fsi.exe" "%asmvercheckpath%\AssemblyVersionCheck.fsx" -- "%~dp0build\config\AssemblySignToolData.json" "%~dp0%BUILD_CONFIG%" if ERRORLEVEL 1 echo Error verifying assembly versions and commit hashes. && goto :failure @@ -819,20 +689,24 @@ if "%BUILD_NET40%" == "1" ( echo ---------------- Done with assembly version checks, starting assembly signing --------------- if not "%SIGN_TYPE%" == "" ( - echo build\scripts\run-signtool.cmd -MSBuild %_msbuildexe% -SignType %SIGN_TYPE% -Configuration %BUILD_CONFIG% -ConfigFile build\config\AssemblySignToolData.json - call build\scripts\run-signtool.cmd -MSBuild %_msbuildexe% -SignType %SIGN_TYPE% -Configuration %BUILD_CONFIG% -ConfigFile build\config\AssemblySignToolData.json + echo %_msbuildexe% build\projects\Signing.proj /t:Restore + %_msbuildexe% build\projects\Signing.proj /t:Restore + + echo %_msbuildexe% build\projects\Signing.proj /t:DoSigning /p:SignType=%SIGN_TYPE% /p:Configuration=%BUILD_CONFIG% /p:ConfigFile=%~dp0build\config\AssemblySignToolData.json + %_msbuildexe% build\projects\Signing.proj /t:DoSigning /p:SignType=%SIGN_TYPE% /p:Configuration=%BUILD_CONFIG% /p:ConfigFile=%~dp0build\config\AssemblySignToolData.json + if ERRORLEVEL 1 echo Error running sign tool && goto :failure ) echo ---------------- Done with assembly signing, start package creation --------------- -echo %_msbuildexe% %msbuildflags% build-nuget-packages.proj /p:Configuration=%BUILD_CONFIG% /bl:%~dp0%BUILD_CONFIG%\logs\msbuild.build-nuget-packages.build.%BUILD_CONFIG%.binlog - %_msbuildexe% %msbuildflags% build-nuget-packages.proj /p:Configuration=%BUILD_CONFIG% /bl:%~dp0%BUILD_CONFIG%\logs\msbuild.build-nuget-packages.build.%BUILD_CONFIG%.binlog +echo %_msbuildexe% %msbuildflags% build-nuget-packages.proj /p:Configuration=%BUILD_CONFIG% /t:Pack /bl:%~dp0%BUILD_CONFIG%\logs\msbuild.build-nuget-packages.build.%BUILD_CONFIG%.binlog + %_msbuildexe% %msbuildflags% build-nuget-packages.proj /p:Configuration=%BUILD_CONFIG% /t:Pack /bl:%~dp0%BUILD_CONFIG%\logs\msbuild.build-nuget-packages.build.%BUILD_CONFIG%.binlog if ERRORLEVEL 1 echo Error building NuGet packages && goto :failure if not "%SIGN_TYPE%" == "" ( - echo build\scripts\run-signtool.cmd -MSBuild %_msbuildexe% -SignType %SIGN_TYPE% -Configuration %BUILD_CONFIG% -ConfigFile build\config\PackageSignToolData.json - call build\scripts\run-signtool.cmd -MSBuild %_msbuildexe% -SignType %SIGN_TYPE% -Configuration %BUILD_CONFIG% -ConfigFile build\config\PackageSignToolData.json + echo %_msbuildexe% build\projects\Signing.proj /t:DoSigning /p:SignType=%SIGN_TYPE% /p:Configuration=%BUILD_CONFIG% /p:ConfigFile=%~dp0build\config\PackageSignToolData.json + %_msbuildexe% build\projects\Signing.proj /t:DoSigning /p:SignType=%SIGN_TYPE% /p:Configuration=%BUILD_CONFIG% /p:ConfigFile=%~dp0build\config\PackageSignToolData.json if ERRORLEVEL 1 echo Error running sign tool && goto :failure ) @@ -843,16 +717,16 @@ if "%BUILD_SETUP%" == "1" ( ) if not "%SIGN_TYPE%" == "" ( - echo build\scripts\run-signtool.cmd -MSBuild %_msbuildexe% -SignType %SIGN_TYPE% -Configuration %BUILD_CONFIG% -ConfigFile build\config\InsertionSignToolData.json - call build\scripts\run-signtool.cmd -MSBuild %_msbuildexe% -SignType %SIGN_TYPE% -Configuration %BUILD_CONFIG% -ConfigFile build\config\InsertionSignToolData.json + echo %_msbuildexe% build\projects\Signing.proj /t:DoSigning /p:SignType=%SIGN_TYPE% /p:Configuration=%BUILD_CONFIG% /p:ConfigFile=%~dp0build\config\InsertionSignToolData.json + %_msbuildexe% build\projects\Signing.proj /t:DoSigning /p:SignType=%SIGN_TYPE% /p:Configuration=%BUILD_CONFIG% /p:ConfigFile=%~dp0build\config\InsertionSignToolData.json if ERRORLEVEL 1 echo Error running sign tool && goto :failure ) echo ---------------- Done with signing, building insertion files --------------- if "%BUILD_SETUP%" == "1" ( - echo %_msbuildexe% %msbuildflags% setup\Swix\Microsoft.FSharp.vsmanproj /p:Configuration=%BUILD_CONFIG% /bl:%~dp0%BUILD_CONFIG%\logs\msbuild.setup-swix.build.%BUILD_CONFIG%.binlog - %_msbuildexe% %msbuildflags% setup\Swix\Microsoft.FSharp.vsmanproj /p:Configuration=%BUILD_CONFIG% /bl:%~dp0%BUILD_CONFIG%\logs\msbuild.setup-swix.build.%BUILD_CONFIG%.binlog + echo %_msbuildexe% %msbuildflags% setup\Swix\Microsoft.FSharp.vsmanproj /p:Configuration=%BUILD_CONFIG% /bl:%~dp0%BUILD_CONFIG%\logs\msbuild.setup-swix.build.%BUILD_CONFIG%.binlog + %_msbuildexe% %msbuildflags% setup\Swix\Microsoft.FSharp.vsmanproj /p:Configuration=%BUILD_CONFIG% /bl:%~dp0%BUILD_CONFIG%\logs\msbuild.setup-swix.build.%BUILD_CONFIG%.binlog if ERRORLEVEL 1 echo Error building .vsmanproj && goto :failure ) @@ -868,16 +742,6 @@ if "%COPY_FSCOMP_RESOURCE_FOR_BUILD_FROM_SOURCES%" == "1" ( copy /y src\fsharp\FSharp.Compiler.Private\obj\%BUILD_CONFIG%\net40\FSComp.* src\buildfromsource\FSharp.Compiler.Private ) -@echo set NUNITPATH=packages\NUnit.Console.3.0.0\tools\ -set NUNITPATH=packages\NUnit.Console.3.0.0\tools\ -if not exist %NUNITPATH% echo Error: Could not find %NUNITPATH% && goto :failure - -@echo xcopy "%NUNITPATH%*.*" "%~dp0tests\fsharpqa\testenv\bin\nunit\*.*" /S /Q /Y - xcopy "%NUNITPATH%*.*" "%~dp0tests\fsharpqa\testenv\bin\nunit\*.*" /S /Q /Y - -@echo xcopy "%~dp0tests\fsharpqa\testenv\src\nunit*.*" "%~dp0tests\fsharpqa\testenv\bin\nunit\*.*" /S /Q /Y - xcopy "%~dp0tests\fsharpqa\testenv\src\nunit*.*" "%~dp0tests\fsharpqa\testenv\bin\nunit\*.*" /S /Q /Y - set X86_PROGRAMFILES=%ProgramFiles% if "%OSARCH%"=="AMD64" set X86_PROGRAMFILES=%ProgramFiles(x86)% @@ -911,16 +775,10 @@ if "%no_test%" == "1" goto :success echo ---------------- Done with update, starting tests ----------------------- -if NOT "%INCLUDE_TEST_SPEC_NUNIT%" == "" ( - set WHERE_ARG_NUNIT=--where "%INCLUDE_TEST_SPEC_NUNIT%" -) if NOT "%INCLUDE_TEST_TAGS%" == "" ( set TTAGS_ARG_RUNALL=-ttags:%INCLUDE_TEST_TAGS% ) -echo WHERE_ARG_NUNIT=!WHERE_ARG_NUNIT! -set NUNITPATH=%~dp0tests\fsharpqa\testenv\bin\nunit\ -set NUNIT3_CONSOLE=%~dp0packages\NUnit.Console.3.0.0\tools\nunit3-console.exe set link_exe=%~dp0tests\fsharpqa\testenv\bin\link\link.exe if not exist "%link_exe%" ( echo Error: failed to find "%link_exe%" use nuget to restore the VisualCppTools package @@ -936,33 +794,19 @@ if not exist "%RESULTSDIR%" (mkdir "%RESULTSDIR%") ECHO FSCBINPATH=%FSCBINPATH% ECHO RESULTSDIR=%RESULTSDIR% ECHO link_exe=%link_exe% -ECHO NUNIT3_CONSOLE=%NUNIT3_CONSOLE% -ECHO NUNITPATH=%NUNITPATH% REM ---------------- test-net40-fsharp ----------------------- if "%TEST_NET40_FSHARP_SUITE%" == "1" ( - set OUTPUTARG= - set ERRORARG= - set OUTPUTFILE= - set ERRORFILE= - set XMLFILE=!RESULTSDIR!\test-net40-fsharp-results.xml - if "%CI%" == "1" ( - set OUTPUTFILE=!RESULTSDIR!\test-net40-fsharp-output.log - set OUTPUTARG=--output:"!OUTPUTFILE!" - set ERRORFILE=!RESULTSDIR!\test-net40-fsharp-errors.log - set ERRORARG=--err:"!ERRORFILE!" - ) - - echo "!NUNIT3_CONSOLE!" --verbose "!FSCBINPATH!\FSharp.Tests.FSharpSuite.dll" --framework:V4.0 --work:"!FSCBINPATH!" !OUTPUTARG! !ERRORARG! --result:"!XMLFILE!;format=nunit3" !WHERE_ARG_NUNIT! - "!NUNIT3_CONSOLE!" --verbose "!FSCBINPATH!\FSharp.Tests.FSharpSuite.dll" --framework:V4.0 --work:"!FSCBINPATH!" !OUTPUTARG! !ERRORARG! --result:"!XMLFILE!;format=nunit3" !WHERE_ARG_NUNIT! + set LOGFILE=%~dp0tests\TestResults\FSharp.Tests.FSharpSuite.net40.trx + echo "%_dotnetexe%" test "%~dp0tests\fsharp\FSharp.Tests.FSharpSuite.fsproj" --no-restore --no-build -c %BUILD_CONFIG% -f net46 -l "trx;LogFileName=!LOGFILE!" -o "%~dp0%BUILD_CONFIG%\net40\bin" + "%_dotnetexe%" test "%~dp0tests\fsharp\FSharp.Tests.FSharpSuite.fsproj" --no-restore --no-build -c %BUILD_CONFIG% -f net46 -l "trx;LogFileName=!LOGFILE!" -o "%~dp0%BUILD_CONFIG%\net40\bin" if errorlevel 1 ( - type "!ERRORFILE!" - echo ----------------------------------------------------------------- - echo Error: Running tests net40-fsharp failed, see log above -- FAILED - echo ----------------------------------------------------------------- + echo -------------------------------------------------------------- + echo Error: Running tests net40-fsharp failed, see file `!LOGFILE!` + echo -------------------------------------------------------------- goto :failure ) ) @@ -971,25 +815,25 @@ REM ---------------- test-fcs ----------------------- if "%TEST_FCS%" == "1" ( - del /q fcs\FSharp.Compiler.Service.Tests\TestResults\*.trx - echo "!_dotnet20exe!" test fcs/FSharp.Compiler.Service.Tests/FSharp.Compiler.Service.Tests.fsproj -c Release --logger:trx - "!_dotnet20exe!" test fcs/FSharp.Compiler.Service.Tests/FSharp.Compiler.Service.Tests.fsproj -c Release --logger:trx + set LOGFILE=%~dp0tests\TestResults\FSharp.Compiler.Service.Tests.net40.trx + echo "%_dotnetexe%" test "%~dp0fcs\FSharp.Compiler.Service.Tests\FSharp.Compiler.Service.Tests.fsproj" --no-restore --no-build -c %BUILD_CONFIG% -f net46 -l "trx;LogFileName=!LOGFILE!" + "%_dotnetexe%" test "%~dp0fcs\FSharp.Compiler.Service.Tests\FSharp.Compiler.Service.Tests.fsproj" --no-restore --no-build -c %BUILD_CONFIG% -f net46 -l "trx;LogFileName=!LOGFILE!" if errorlevel 1 ( - type fcs\FSharp.Compiler.Service.Tests\TestResults\*.trx - echo ----------------------------------------------------------------- - echo Error: Running FCS tests failed. See XML logging output above. Search for 'outcome="Failed"' or 'Failed ' - echo . - echo Error: Note that tests were run with both .NET Core and .NET Framework. - echo Error: Try running tests locally and using - echo . - echo dotnet test fcs/FSharp.Compiler.Service.Tests/FSharp.Compiler.Service.Tests.fsproj -c Release --logger:trx - echo . - echo Error: and look for results in - echo . - echo fcs\FSharp.Compiler.Service.Tests\TestResults\*.trx - echo . - echo ----------------------------------------------------------------- + echo -------------------------------------------------------------- + echo Error: Running net40 fcs tests, see file `!LOGFILE!` + echo -------------------------------------------------------------- + goto :failure + ) + + set LOGFILE=%~dp0tests\TestResults\FSharp.Compiler.Service.Tests.coreclr.trx + echo "%_dotnetexe%" test "%~dp0fcs\FSharp.Compiler.Service.Tests\FSharp.Compiler.Service.Tests.fsproj" --no-restore --no-build -c %BUILD_CONFIG% -f netcoreapp2.0 -l "trx;LogFileName=!LOGFILE!" + "%_dotnetexe%" test "%~dp0fcs\FSharp.Compiler.Service.Tests\FSharp.Compiler.Service.Tests.fsproj" --no-restore --no-build -c %BUILD_CONFIG% -f netcoreapp2.0 -l "trx;LogFileName=!LOGFILE!" + + if errorlevel 1 ( + echo -------------------------------------------------------------- + echo Error: Running coreclr fcs tests, see file `!LOGFILE!` + echo -------------------------------------------------------------- goto :failure ) ) @@ -1020,11 +864,11 @@ set HOSTED_COMPILER=1 if "%TEST_NET40_FSHARPQA_SUITE%" == "1" ( - set CSC_PIPE=%~dp0packages\Microsoft.Net.Compilers.2.7.0\tools\csc.exe + set CSC_PIPE=%USERPROFILE%\.nuget\packages\Microsoft.Net.Compilers\2.7.0\tools\csc.exe set FSC=!FSCBINPATH!\fsc.exe set FSCOREDLLPATH=!FSCBinPath!\FSharp.Core.dll set PATH=!FSCBINPATH!;!PATH! - set perlexe=%~dp0packages\StrawberryPerl64.5.22.2.1\Tools\perl\bin\perl.exe + set perlexe=%USERPROFILE%\.nuget\packages\StrawberryPerl64\5.22.2.1\Tools\perl\bin\perl.exe if not exist !perlexe! (echo Error: perl was not downloaded from check the packages directory: !perlexe! && goto :failure ) set OUTPUTFILE=test-net40-fsharpqa-results.log @@ -1051,54 +895,24 @@ REM ---------------- net40-compilerunit ----------------------- if "%TEST_NET40_COMPILERUNIT_SUITE%" == "1" ( - set OUTPUTARG= - set ERRORARG= - set OUTPUTFILE= - set ERRORFILE= - set XMLFILE=!RESULTSDIR!\test-net40-compilerunit-results.xml - if "%CI%" == "1" ( - set OUTPUTFILE=!RESULTSDIR!\test-net40-compilerunit-output.log - set ERRORFILE=!RESULTSDIR!\test-net40-compilerunit-errors.log - set ERRORARG=--err:"!ERRORFILE!" - set OUTPUTARG=--output:"!OUTPUTFILE!" - ) - set ERRORFILE=!RESULTSDIR!\test-net40-compilerunit-errors.log - echo "!NUNIT3_CONSOLE!" --verbose --framework:V4.0 --result:"!XMLFILE!;format=nunit3" !OUTPUTARG! !ERRORARG! --work:"!FSCBINPATH!" "!FSCBINPATH!\..\..\net40\bin\FSharp.Compiler.UnitTests.dll" !WHERE_ARG_NUNIT! - "!NUNIT3_CONSOLE!" --verbose --framework:V4.0 --result:"!XMLFILE!;format=nunit3" !OUTPUTARG! !ERRORARG! --work:"!FSCBINPATH!" "!FSCBINPATH!\..\..\net40\bin\FSharp.Compiler.UnitTests.dll" !WHERE_ARG_NUNIT! + set LOGFILE=%~dp0tests\TestResults\FSharp.Compiler.UnitTests.net40.trx + echo "%_dotnetexe%" test "%~dp0tests\FSharp.Compiler.UnitTests\FSharp.Compiler.UnitTests.fsproj" --no-restore --no-build -c %BUILD_CONFIG% -f net46 -l "trx;LogFileName=!LOGFILE!" + "%_dotnetexe%" test "%~dp0tests\FSharp.Compiler.UnitTests\FSharp.Compiler.UnitTests.fsproj" --no-restore --no-build -c %BUILD_CONFIG% -f net46 -l "trx;LogFileName=!LOGFILE!" if errorlevel 1 ( echo ----------------------------------------------------------------- - type "!OUTPUTFILE!" - echo ----------------------------------------------------------------- - type "!ERRORFILE!" - echo ----------------------------------------------------------------- - echo Error: Running tests net40-compilerunit failed, see logs above -- FAILED + echo Error: Running tests net40-compilerunit failed, see file `!LOGFILE!` echo ----------------------------------------------------------------- goto :failure ) - set OUTPUTARG= - set ERRORARG= - set OUTPUTFILE= - set ERRORFILE= - set XMLFILE=!RESULTSDIR!\test-net40-buildunit-results.xml - if "%CI%" == "1" ( - set OUTPUTFILE=!RESULTSDIR!\test-net40-buildunit-output.log - set ERRORFILE=!RESULTSDIR!\test-net40-buildunit-errors.log - set ERRORARG=--err:"!ERRORFILE!" - set OUTPUTARG=--output:"!OUTPUTFILE!" - ) - set ERRORFILE=!RESULTSDIR!\test-net40-buildunit-errors.log - echo "!NUNIT3_CONSOLE!" --verbose --framework:V4.0 --result:"!XMLFILE!;format=nunit3" !OUTPUTARG! !ERRORARG! --work:"!FSCBINPATH!" "!FSCBINPATH!\FSharp.Build.UnitTests.dll" !WHERE_ARG_NUNIT! - "!NUNIT3_CONSOLE!" --verbose --framework:V4.0 --result:"!XMLFILE!;format=nunit3" !OUTPUTARG! !ERRORARG! --work:"!FSCBINPATH!" "!FSCBINPATH!\FSharp.Build.UnitTests.dll" !WHERE_ARG_NUNIT! + set LOGFILE=%~dp0tests\TestResults\FSharp.Build.UnitTests.net40.trx + echo "%_dotnetexe%" test "%~dp0tests\FSharp.Build.UnitTests\FSharp.Build.UnitTests.fsproj" --no-restore --no-build -c %BUILD_CONFIG% -f net46 -l "trx;LogFileName=!LOGFILE!" + "%_dotnetexe%" test "%~dp0tests\FSharp.Build.UnitTests\FSharp.Build.UnitTests.fsproj" --no-restore --no-build -c %BUILD_CONFIG% -f net46 -l "trx;LogFileName=!LOGFILE!" if errorlevel 1 ( echo ----------------------------------------------------------------- - type "!OUTPUTFILE!" - echo ----------------------------------------------------------------- - type "!ERRORFILE!" - echo ----------------------------------------------------------------- - echo Error: Running tests net40-compilernit failed, see logs above -- FAILED + echo Error: Running tests net40-compilernit failed, see file `!LOGFILE!` echo ----------------------------------------------------------------- goto :failure ) @@ -1108,28 +922,13 @@ REM ---------------- net40-coreunit ----------------------- if "%TEST_NET40_COREUNIT_SUITE%" == "1" ( - set OUTPUTARG= - set ERRORARG= - set OUTPUTFILE= - set ERRORFILE= - set XMLFILE=!RESULTSDIR!\test-net40-coreunit-results.xml - if "%CI%" == "1" ( - set ERRORFILE=!RESULTSDIR!\test-net40-coreunit-errors.log - set OUTPUTFILE=!RESULTSDIR!\test-net40-coreunit-output.log - set ERRORARG=--err:"!ERRORFILE!" - set OUTPUTARG=--output:"!OUTPUTFILE!" - ) - - echo "!NUNIT3_CONSOLE!" --verbose --framework:V4.0 --result:"!XMLFILE!;format=nunit3" !OUTPUTARG! !ERRORARG! --work:"!FSCBINPATH!" "!FSCBINPATH!\FSharp.Core.UnitTests.dll" !WHERE_ARG_NUNIT! - "!NUNIT3_CONSOLE!" --verbose --framework:V4.0 --result:"!XMLFILE!;format=nunit3" !OUTPUTARG! !ERRORARG! --work:"!FSCBINPATH!" "!FSCBINPATH!\FSharp.Core.UnitTests.dll" !WHERE_ARG_NUNIT! + set LOGFILE=%~dp0tests\TestResults\FSharp.Core.UnitTests.net40.trx + echo "%_dotnetexe%" test "%~dp0tests\FSharp.Core.UnitTests\FSharp.Core.UnitTests.fsproj" --no-restore --no-build -c %BUILD_CONFIG% -f net46 -l "trx;LogFileName=!LOGFILE!" + "%_dotnetexe%" test "%~dp0tests\FSharp.Core.UnitTests\FSharp.Core.UnitTests.fsproj" --no-restore --no-build -c %BUILD_CONFIG% -f net46 -l "trx;LogFileName=!LOGFILE!" if errorlevel 1 ( echo ----------------------------------------------------------------- - type "!OUTPUTFILE!" - echo ----------------------------------------------------------------- - type "!ERRORFILE!" - echo ----------------------------------------------------------------- - echo Error: Running tests net40-coreunit failed, see logs above -- FAILED + echo Error: Running tests net40-coreunit failed, see file `!LOGFILE!` echo ----------------------------------------------------------------- goto :failure ) @@ -1139,27 +938,25 @@ REM ---------------- coreclr-coreunit ----------------------- if "%TEST_CORECLR_COREUNIT_SUITE%" == "1" ( - set XMLFILE=!RESULTSDIR!\test-coreclr-coreunit-results.xml - set OUTPUTFILE=!RESULTSDIR!\test-coreclr-coreunit-output.log - set ERRORFILE=!RESULTSDIR!\test-coreclr-coreunit-errors.log - - echo "%_dotnetcliexe%" "%~dp0tests\testbin\!BUILD_CONFIG!\coreclr\FSharp.Build.UnitTests\FSharp.Build.UnitTests.dll" !WHERE_ARG_NUNIT! - "%_dotnetcliexe%" "%~dp0tests\testbin\!BUILD_CONFIG!\coreclr\FSharp.Build.UnitTests\FSharp.Build.UnitTests.dll" !WHERE_ARG_NUNIT! + set LOGFILE=%~dp0tests\TestResults\FSharp.Build.UnitTests.coreclr.trx + echo "%_dotnetexe%" test "%~dp0tests\FSharp.Build.UnitTests\FSharp.Build.UnitTests.fsproj" --no-restore --no-build -c %BUILD_CONFIG% -f netcoreapp2.0 -l "trx;LogFileName=!LOGFILE!" + "%_dotnetexe%" test "%~dp0tests\FSharp.Build.UnitTests\FSharp.Build.UnitTests.fsproj" --no-restore --no-build -c %BUILD_CONFIG% -f netcoreapp2.0 -l "trx;LogFileName=!LOGFILE!" if errorlevel 1 ( echo ----------------------------------------------------------------- - echo Error: Running tests coreclr-coreunit failed, see logs above-- FAILED + echo Error: Running tests coreclr-compilernit failed, see file `!LOGFILE!` echo ----------------------------------------------------------------- goto :failure ) - echo "%_dotnetcliexe%" "%~dp0tests\testbin\!BUILD_CONFIG!\coreclr\FSharp.Core.UnitTests\FSharp.Core.UnitTests.dll" !WHERE_ARG_NUNIT! - "%_dotnetcliexe%" "%~dp0tests\testbin\!BUILD_CONFIG!\coreclr\FSharp.Core.UnitTests\FSharp.Core.UnitTests.dll" !WHERE_ARG_NUNIT! + set LOGFILE=%~dp0tests\TestResults\FSharp.Core.UnitTests.coreclr.trx + echo "%_dotnetexe%" test "%~dp0tests\FSharp.Core.UnitTests\FSharp.Core.UnitTests.fsproj" --no-restore --no-build -c %BUILD_CONFIG% -f netcoreapp2.0 -l "trx;LogFileName=!LOGFILE!" + "%_dotnetexe%" test "%~dp0tests\FSharp.Core.UnitTests\FSharp.Core.UnitTests.fsproj" --no-restore --no-build -c %BUILD_CONFIG% -f netcoreapp2.0 -l "trx;LogFileName=!LOGFILE!" if errorlevel 1 ( - echo ----------------------------------------------------------------- - echo Error: Running tests coreclr-coreunit failed, see logs above-- FAILED - echo ----------------------------------------------------------------- + echo ------------------------------------------------------------------ + echo Error: Running tests coreclr-coreunit failed, see file `!LOGFILE!` + echo ------------------------------------------------------------------ goto :failure ) ) @@ -1167,22 +964,14 @@ if "%TEST_CORECLR_COREUNIT_SUITE%" == "1" ( REM ---------------- coreclr-fsharp ----------------------- if "%TEST_CORECLR_FSHARP_SUITE%" == "1" ( - - set single_threaded=true - set permutations=FSC_CORECLR - - set OUTPUTARG= - set ERRORARG= - set OUTPUTFILE= - set ERRORFILE= - set XMLFILE=!RESULTSDIR!\test-coreclr-fsharp-results.xml - echo "%_dotnetcliexe%" "%~dp0tests\testbin\!BUILD_CONFIG!\coreclr\FSharp.Tests.FSharpSuite.DrivingCoreCLR\FSharp.Tests.FSharpSuite.DrivingCoreCLR.dll" !WHERE_ARG_NUNIT! - "%_dotnetcliexe%" "%~dp0tests\testbin\!BUILD_CONFIG!\coreclr\FSharp.Tests.FSharpSuite.DrivingCoreCLR\FSharp.Tests.FSharpSuite.DrivingCoreCLR.dll" !WHERE_ARG_NUNIT! + set LOGFILE=%~dp0tests\TestResults\FSharp.Tests.FSharpSuite.coreclr.trx + echo "%_dotnetexe%" test "%~dp0tests\fsharp\FSharp.Tests.FSharpSuite.fsproj" --no-restore --no-build -c %BUILD_CONFIG% -f netcoreapp2.0 -l "trx;LogFileName=!LOGFILE!" -o "%~dp0%BUILD_CONFIG%\coreclr\bin" + "%_dotnetexe%" test "%~dp0tests\fsharp\FSharp.Tests.FSharpSuite.fsproj" --no-restore --no-build -c %BUILD_CONFIG% -f netcoreapp2.0 -l "trx;LogFileName=!LOGFILE!" -o "%~dp0%BUILD_CONFIG%\coreclr\bin" if errorlevel 1 ( - echo ----------------------------------------------------------------- - echo Error: Running tests coreclr-fsharp failed, see logs above-- FAILED - echo ----------------------------------------------------------------- + echo ---------------------------------------------------------------- + echo Error: Running tests coreclr-fsharp failed, see file `!LOGFILE!` + echo ---------------------------------------------------------------- goto :failure ) ) @@ -1190,45 +979,24 @@ if "%TEST_CORECLR_FSHARP_SUITE%" == "1" ( REM ---------------- vs-ideunit ----------------------- if "%TEST_VS_IDEUNIT_SUITE%" == "1" ( - - set OUTPUTARG= - set ERRORARG= - set OUTPUTFILE= - set ERRORFILE= - set XMLFILE=!RESULTSDIR!\test-vs-ideunit-results.xml - if "%CI%" == "1" ( - set OUTPUTFILE=!RESULTSDIR!\test-vs-ideunit-output.log - set ERRORFILE=!RESULTSDIR!\test-vs-ideunit-errors.log - set ERRORARG=--err:"!ERRORFILE!" - set OUTPUTARG=--output:"!OUTPUTFILE!" - ) - - rem Verify that VisualFSharp.UnitTests.dll can be loaded by nunit. Report load errors. - pushd !FSCBINPATH! - echo "!NUNIT3_CONSOLE!" --verbose --x86 --framework:V4.0 --work:"!FSCBINPATH!" --workers=1 --agents=1 --full "!FSCBINPATH!\GetTypesVSUnitTests.dll" !WHERE_ARG_NUNIT! - "!NUNIT3_CONSOLE!" --verbose --x86 --framework:V4.0 --work:"!FSCBINPATH!" --workers=1 --agents=1 --full "!FSCBINPATH!\GetTypesVSUnitTests.dll" !WHERE_ARG_NUNIT! - popd + set LOGFILE=%~dp0tests\TestResults\GetTypesVSUnitTests.net40.trx + echo "%_dotnetexe%" test "%~dp0vsintegration\tests\GetTypesVSUnitTests\GetTypesVSUnitTests.fsproj" --no-restore --no-build -c %BUILD_CONFIG% -f net46 -l "trx;LogFileName=!LOGFILE!" + "%_dotnetexe%" test "%~dp0vsintegration\tests\GetTypesVSUnitTests\GetTypesVSUnitTests.fsproj" --no-restore --no-build -c %BUILD_CONFIG% -f net46 -l "trx;LogFileName=!LOGFILE!" if errorlevel 1 ( + echo --------------------------------------------------------------------------- + echo Error: Running tests net40-gettypesvsunittests failed, see file `!LOGFILE!` + echo --------------------------------------------------------------------------- goto :failure ) - pushd !FSCBINPATH! - echo "!NUNIT3_CONSOLE!" --verbose --x86 --framework:V4.0 --result:"!XMLFILE!;format=nunit3" !OUTPUTARG! !ERRORARG! --work:"!FSCBINPATH!" --workers=1 --agents=1 --full "!FSCBINPATH!\VisualFSharp.UnitTests.dll" !WHERE_ARG_NUNIT! - "!NUNIT3_CONSOLE!" --verbose --x86 --framework:V4.0 --result:"!XMLFILE!;format=nunit3" !OUTPUTARG! !ERRORARG! --work:"!FSCBINPATH!" --workers=1 --agents=1 --full "!FSCBINPATH!\VisualFSharp.UnitTests.dll" !WHERE_ARG_NUNIT! - popd - + set LOGFILE=%~dp0tests\TestResults\VisualFSharp.UnitTests.net40.trx + echo "%_dotnetexe%" test "%~dp0vsintegration\tests\UnitTests\VisualFSharp.UnitTests.fsproj" --no-restore --no-build -c %BUILD_CONFIG% -f net46 -l "trx;LogFileName=!LOGFILE!" -o "%~dp0%BUILD_CONFIG%\net40\bin" + "%_dotnetexe%" test "%~dp0vsintegration\tests\UnitTests\VisualFSharp.UnitTests.fsproj" --no-restore --no-build -c %BUILD_CONFIG% -f net46 -l "trx;LogFileName=!LOGFILE!" -o "%~dp0%BUILD_CONFIG%\net40\bin" if errorlevel 1 ( - echo --------begin vs-ide-unit output --------------------- - type "!OUTPUTFILE!" - echo --------end vs-ide-unit output ----------------------- - echo -------begin vs-ide-unit errors ---------------------- - type "!ERRORFILE!" - echo -------end vs-ide-unit errors ------------------------ - echo Error: Running tests vs-ideunit failed, see logs above, search for "Errors and Failures" -- FAILED - echo Command Line for running tests - echo "!NUNIT3_CONSOLE!" --verbose --x86 --framework:V4.0 --result:"!XMLFILE!;format=nunit3" !OUTPUTARG! !ERRORARG! --work:"!FSCBINPATH!" --workers=1 --agents=1 --full "!FSCBINPATH!\VisualFSharp.UnitTests.dll" !WHERE_ARG_NUNIT! - echo ---------------------------------------------------------------------------------------------------- + echo ------------------------------------------------------------ + echo Error: Running tests vs-ideunit failed, see file `!LOGFILE!` + echo ------------------------------------------------------------ goto :failure ) ) diff --git a/build/config/packages.config b/build/config/packages.config deleted file mode 100644 index e131ae53c92..00000000000 --- a/build/config/packages.config +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/build/projects/Directory.Build.props b/build/projects/Directory.Build.props new file mode 100644 index 00000000000..bb8eac309b1 --- /dev/null +++ b/build/projects/Directory.Build.props @@ -0,0 +1,3 @@ + + + diff --git a/build/projects/Directory.Build.targets b/build/projects/Directory.Build.targets new file mode 100644 index 00000000000..ccd47cc0a9a --- /dev/null +++ b/build/projects/Directory.Build.targets @@ -0,0 +1,3 @@ + + + diff --git a/build/projects/PrepareDependencyUptake.proj b/build/projects/PrepareDependencyUptake.proj deleted file mode 100644 index 78ded8de2ad..00000000000 --- a/build/projects/PrepareDependencyUptake.proj +++ /dev/null @@ -1,33 +0,0 @@ - - - - $(MSBuildThisFileDirectory)..\..\Tools\dependencyUptake - $(DependencyUptakeDirectory)\PackageVersions.props - $(DependencyUptakeDirectory)\packages.config - $(DependencyUptakeDirectory)\NuGet.config - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/build/projects/Signing.proj b/build/projects/Signing.proj new file mode 100644 index 00000000000..4999fb6d085 --- /dev/null +++ b/build/projects/Signing.proj @@ -0,0 +1,27 @@ + + + + + net46 + $(RepoRoot)$(Configuration) + $(NuGetPackageRoot)RoslynTools.SignTool\$(RoslynToolsSignToolPackageVersion)\tools\SignTool.exe + -msbuildPath "$(MSBuildBinPath)\msbuild.exe" -nugetPackagesPath "$(NuGetPackageRoot.TrimEnd('\'))" -config "$(ConfigFile)" + -testSign $(SignToolArgs) + -test $(SignToolArgs) + + + + + + + + + + + + + + + + diff --git a/build/scripts/run-signtool.cmd b/build/scripts/run-signtool.cmd deleted file mode 100644 index 15ae3420693..00000000000 --- a/build/scripts/run-signtool.cmd +++ /dev/null @@ -1,69 +0,0 @@ -@echo off -:: Copyright (c) Microsoft Corporation. All Rights Reserved. See License.txt in the project root for license information. -setlocal enableDelayedExpansion -set scriptdir=%~dp0 -set MSBuild= -set SignType= -set ConfigFile= - -:: -:: Validate arguments -:: - -:parsearg -if "%1" == "" goto doneargs -set arg=%1 -set argv=%2 - -if /i "%arg%" == "/?" goto help -if /i "%arg%" == "-h" goto help -if /i "%arg%" == "--help" goto help -if /i "%arg%" == "-MSBuild" ( - set MSBuild=%argv% - shift -) -if /i "%arg%" == "-SignType" ( - set SignType=%argv% - shift -) -if /i "%arg%" == "-Configuration" ( - set Configuration=%argv% - shift -) -if /i "%arg%" == "-ConfigFile" ( - set ConfigFile=%argv% - shift -) - -shift -goto parsearg - -:doneargs - -if not defined MSBuild echo Location of MSBuild.exe not specified. && goto error -if not defined ConfigFile echo Configuration file not specified. && goto error -if not exist "%MSBuild%" echo The specified MSBuild.exe does not exist. && goto error - -set NUGET_PACKAGES=%USERPROFILE%\.nuget\packages -set _signtoolexe=%NUGET_PACKAGES%\RoslynTools.SignTool\1.0.0-beta2-dev3\tools\SignTool.exe -set SignToolArgs=-msbuildPath %MSBuild% -config "%ConfigFile%" -nugetPackagesPath "%NUGET_PACKAGES%" -if /i "%SignType%" == "real" goto runsigntool -if /i "%SignType%" == "test" set SignToolArgs=%SignToolArgs% -testSign && goto runsigntool -set SignToolArgs=%SignToolArgs% -test - -:runsigntool - -if not exist "%_signtoolexe%" echo The signing tool could not be found at location '%_signtoolexe%' && goto error -set SignToolArgs=%SignToolArgs% "%scriptdir%..\..\%Configuration%" -echo "%_signtoolexe%" %SignToolArgs% - "%_signtoolexe%" %SignToolArgs% -if errorlevel 1 goto error -goto :EOF - -:help -echo Usage: %0 -MSBuild path\to\msbuild.exe -ConfigFile path\to\SignToolData.json [-SignType ^] -goto :EOF - -:error -echo Error running the sign tool. -exit /b 1 diff --git a/build/targets/AssemblyVersions.props b/build/targets/AssemblyVersions.props index 5e82721efa6..5ad08a25fb4 100644 --- a/build/targets/AssemblyVersions.props +++ b/build/targets/AssemblyVersions.props @@ -34,18 +34,10 @@ $(VSMajorVersion).0 $(VSMajorVersion).$(VSMinorVersion).0.0 - $(FSCoreVersion) - - - $(FSProductVersion) - - - $(VSAssemblyVersion) - + false + $(IntermediateOutputPath)$(MSBuildProjectName).AssemblyLevelAttributes$(DefaultLanguageSourceExtension) + + + $(NoWarn);2003 + Condition="'$(Language)' != '' AND '$(GenerateAssemblyVersionAttribute)' != 'false'"> + $(FSCoreVersion) + + + $(FSProductVersion) + + + $(VSAssemblyVersion) + $(IntermediateOutputPath)$(MSBuildProjectName).AssemblyVersion$(DefaultLanguageSourceExtension) diff --git a/build/targets/GenerateInternalsVisibleTo.targets b/build/targets/GenerateInternalsVisibleTo.targets index ca4bb15e7ea..4950837d36a 100644 --- a/build/targets/GenerateInternalsVisibleTo.targets +++ b/build/targets/GenerateInternalsVisibleTo.targets @@ -32,13 +32,49 @@ DependsOnTargets="PrepareFSharpGenerateInternalsVisibleToFile;PrepareForBuild" Condition="'@(InternalsVisibleTo)' != ''" BeforeTargets="CoreCompile"> + + + + <_UseWriteCodeFragmentHack Condition="'$(OS)' == 'Unix' and '$(Language)' == 'F#'">true + + + + OutputFile="$(GeneratedFSharpInternalsVisibleToFile)" + Condition="'$(_UseWriteCodeFragmentHack)' != 'true'"> + + + + + <_LinesToWrite Include="// <auto-generated>" /> + <_LinesToWrite Include="namespace FSharp" /> + <_LinesToWrite Include="open System" /> + <_LinesToWrite Include="open System.Reflection" /> + <_LinesToWrite Include="[<assembly: %(_InternalsVisibleToAttribute.Identity)("%(_InternalsVisibleToAttribute._Parameter1)")>]" /> + <_LinesToWrite Include="do()" /> + + + + + + diff --git a/build/targets/PackageVersions.props b/build/targets/PackageVersions.props index 2f68181bd5f..0f1def8f894 100644 --- a/build/targets/PackageVersions.props +++ b/build/targets/PackageVersions.props @@ -2,15 +2,49 @@ + + + $(RestoreSources); + https://www.myget.org/F/fsharp-daily/api/v3/index.json; + https://dotnet.myget.org/F/roslyn-master-nightly/api/v3/index.json; + https://dotnet.myget.org/F/dotnet-core/api/v3/index.json; + https://dotnet.myget.org/F/dotnet-buildtools/api/v3/index.json; + https://dotnet.myget.org/F/roslyn-tools/api/v3/index.json; + https://api.nuget.org/v3/index.json; + https://dotnet.myget.org/F/roslyn/api/v3/index.json; + https://dotnet.myget.org/F/symreader-converter/api/v3/index.json; + + + + $(PB_RestoreSource);$(RestoreSources) + $(MSBuildThisFileDirectory)..\..\Tools\dependencyUptake\PackageVersions.props + $([System.IO.File]::ReadAllText('$(MSBuildThisFileDirectory)..\..\RoslynPackageVersion.txt').Trim()) 1.5.0 + 4.3.0 + 4.3.0 + 4.3.0 4.3.0 - 1.5.0 + 4.3.0 + 4.3.0 + 4.5.0 + 4.3.0 + 4.3.0 1.6.0 - 4.3.0 + 4.3.0 + 1.5.0 + 4.3.0 + 4.3.0 + 4.3.0 + 4.3.0 + 4.3.0 + 4.3.0 + 4.3.0 + 4.3.0 + 4.4.0 $(RoslynPackageVersion) @@ -25,7 +59,6 @@ $(MicrosoftBuildOverallPackagesVersion) $(MicrosoftBuildOverallPackagesVersion) $(MicrosoftBuildOverallPackagesVersion) - 1.0.1 8.0.1 @@ -74,13 +107,29 @@ 11.0.4 7.0.4 + + 0.2.0 + 1.0.0 + 1.0.147 + 10.1.0 + 1.0.0 + + 3.0.0-alpha3 1.0.30 - 1.1.0-roslyn-62714-01 + 1.1.0-beta1-63314-01 8.0.0-alpha + 2.7.0 + 2.0.3 + 15.8.0 1.0.0 + 4.3.0 9.0.1 - 3.5.0 + 3.10.1 + 3.10.0 + 3.10.1 + 1.0.0-beta2-dev3 + 5.22.2.1 0.2.0-beta-000081 diff --git a/fcs/Directory.Build.props b/fcs/Directory.Build.props new file mode 100644 index 00000000000..cdcbdd4b8b3 --- /dev/null +++ b/fcs/Directory.Build.props @@ -0,0 +1,23 @@ + + + $(UserProfile)\.nuget\packages\ + $(HOME)/.nuget/packages/ + $(NuGetPackageRoot)\ + $(NuGetPackageRoot)/ + + + + + $(MSBuildThisFileDirectory)..\Proto\net40\bin + + + + + $(ProtoOutputPath)\Microsoft.FSharp.Targets + $(ProtoOutputPath)\Microsoft.FSharp.NetSdk.props + $(ProtoOutputPath)\Microsoft.FSharp.NetSdk.targets + $(ProtoOutputPath)\Microsoft.FSharp.Overrides.NetSdk.targets + + diff --git a/fcs/Directory.Build.targets b/fcs/Directory.Build.targets new file mode 100644 index 00000000000..bb5b23d29d0 --- /dev/null +++ b/fcs/Directory.Build.targets @@ -0,0 +1,3 @@ + + + diff --git a/fcs/FSharp.Compiler.Service.MSBuild.v12/FSharp.Compiler.Service.MSBuild.v12.fsproj b/fcs/FSharp.Compiler.Service.MSBuild.v12/FSharp.Compiler.Service.MSBuild.v12.fsproj index 32a0b6812d7..42b99d95a05 100644 --- a/fcs/FSharp.Compiler.Service.MSBuild.v12/FSharp.Compiler.Service.MSBuild.v12.fsproj +++ b/fcs/FSharp.Compiler.Service.MSBuild.v12/FSharp.Compiler.Service.MSBuild.v12.fsproj @@ -51,18 +51,8 @@ $(FSharpSourcesRoot)\..\fcs\dependencies\MSBuild.v12.0\Microsoft.Build.Tasks.v12.0.dll false - - - $(FSharpSourcesRoot)\..\packages\Microsoft.Portable.FSharp.Core.$(FSharpCoreFrozenPortablePackageVersion)\lib\profiles\net40\FSharp.Core.dll - false - - - FSharp.Compiler.Service - {2e4d67b4-522d-4cf7-97e4-ba940f0b18f3} - True - \ No newline at end of file diff --git a/fcs/FSharp.Compiler.Service.ProjectCrackerTool/FSharp.Compiler.Service.ProjectCrackerTool.fsproj b/fcs/FSharp.Compiler.Service.ProjectCrackerTool/FSharp.Compiler.Service.ProjectCrackerTool.fsproj index cd0768f8da7..9dddb1cb616 100644 --- a/fcs/FSharp.Compiler.Service.ProjectCrackerTool/FSharp.Compiler.Service.ProjectCrackerTool.fsproj +++ b/fcs/FSharp.Compiler.Service.ProjectCrackerTool/FSharp.Compiler.Service.ProjectCrackerTool.fsproj @@ -24,10 +24,6 @@ - - $(FSharpSourcesRoot)\..\packages\Microsoft.Portable.FSharp.Core.$(FSharpCoreFrozenPortablePackageVersion)\lib\profiles\net40\FSharp.Core.dll - false - $(FSharpSourcesRoot)\..\fcs\dependencies\MSBuild.v12.0\Microsoft.Build.Framework.dll diff --git a/fcs/FSharp.Compiler.Service.Tests/CSharp_Analysis/CSharp_Analysis.csproj b/fcs/FSharp.Compiler.Service.Tests/CSharp_Analysis/CSharp_Analysis.csproj index 49585864e4d..fc00709da42 100644 --- a/fcs/FSharp.Compiler.Service.Tests/CSharp_Analysis/CSharp_Analysis.csproj +++ b/fcs/FSharp.Compiler.Service.Tests/CSharp_Analysis/CSharp_Analysis.csproj @@ -3,6 +3,7 @@ net45;netstandard2.0 false + $(NoWarn);0067;1591 diff --git a/fcs/FSharp.Compiler.Service/FSharp.Compiler.Service.fsproj b/fcs/FSharp.Compiler.Service/FSharp.Compiler.Service.fsproj index a16f39b084c..b831832ea7d 100644 --- a/fcs/FSharp.Compiler.Service/FSharp.Compiler.Service.fsproj +++ b/fcs/FSharp.Compiler.Service/FSharp.Compiler.Service.fsproj @@ -4,6 +4,7 @@ + net45;netstandard2.0 true @@ -16,7 +17,7 @@ $(TargetFramework)\ $(OtherFlags) /warnon:1182 $(OtherFlags) --times - $(NoWarn);44;62;69;65;54;61;75;62;9;2003; + $(NoWarn);44;62;69;65;54;61;75;62;9;2003;NU5125 true true true @@ -46,12 +47,12 @@ AssemblyInfo/AssemblyInfo.fs - + FSComp.txt - - + + FSIstrings.txt - + FSStrings.resx FSStrings.resources @@ -655,7 +656,5 @@ $(FSharpSourcesRoot)\..\packages\System.ValueTuple.4.4.0\lib\netstandard1.0\System.ValueTuple.dll - - - + \ No newline at end of file diff --git a/fcs/build.cmd b/fcs/build.cmd index 731fc76abb7..26244446f6c 100644 --- a/fcs/build.cmd +++ b/fcs/build.cmd @@ -14,6 +14,9 @@ if errorlevel 1 ( exit /b %errorlevel% ) +:: don't care if this fails +dotnet build-server shutdown >NUL 2>&1 + packages\FAKE\tools\FAKE.exe build.fsx %* if errorlevel 1 ( endlocal diff --git a/fcs/build.fsx b/fcs/build.fsx index d5e3df4ac4f..204faa244ab 100644 --- a/fcs/build.fsx +++ b/fcs/build.fsx @@ -75,15 +75,8 @@ Target "Clean" (fun _ -> Target "Restore" (fun _ -> // We assume a paket restore has already been run + runDotnet __SOURCE_DIRECTORY__ "restore ../src/buildtools/buildtools.proj -v n" runDotnet __SOURCE_DIRECTORY__ "restore FSharp.Compiler.Service.sln -v n" - for p in [ "../packages.config" ] do - let rec executeProcess count = - let result = ExecProcess (fun info -> - info.FileName <- FullName @"./../.nuget/NuGet.exe" - info.WorkingDirectory <- FullName @"./.." - info.Arguments <- sprintf "restore %s -PackagesDirectory \"%s\" -ConfigFile \"%s\"" (FullName p) (FullName "./../packages") (FullName "./../NuGet.Config")) TimeSpan.MaxValue - if result <> 0 && count > 1 then executeProcess (count - 1) else result - (executeProcess 5) |> assertExitCodeZero ) Target "BuildVersion" (fun _ -> @@ -91,7 +84,8 @@ Target "BuildVersion" (fun _ -> ) Target "Build" (fun _ -> - runDotnet __SOURCE_DIRECTORY__ "build FSharp.Compiler.Service.sln -v n -c Release" + runDotnet __SOURCE_DIRECTORY__ "build ../src/buildtools/buildtools.proj -v n -c Proto" + runDotnet __SOURCE_DIRECTORY__ "build FSharp.Compiler.Service.sln -v n -c release" ) Target "Test" (fun _ -> @@ -100,11 +94,11 @@ Target "Test" (fun _ -> runDotnet __SOURCE_DIRECTORY__ "build ../tests/projects/Sample_NETCoreSDK_FSharp_Library_netstandard2_0/Sample_NETCoreSDK_FSharp_Library_netstandard2_0.fsproj -v n" // Now run the tests - runDotnet __SOURCE_DIRECTORY__ "test FSharp.Compiler.Service.Tests/FSharp.Compiler.Service.Tests.fsproj -v n -c Release" + runDotnet __SOURCE_DIRECTORY__ "test FSharp.Compiler.Service.Tests/FSharp.Compiler.Service.Tests.fsproj -v n -c release" ) Target "NuGet" (fun _ -> - runDotnet __SOURCE_DIRECTORY__ "pack FSharp.Compiler.Service.sln -v n -c Release" + runDotnet __SOURCE_DIRECTORY__ "pack FSharp.Compiler.Service.sln -v n -c release" ) Target "GenerateDocsEn" (fun _ -> diff --git a/fsharp.proj b/fsharp.proj new file mode 100644 index 00000000000..1cd572a408c --- /dev/null +++ b/fsharp.proj @@ -0,0 +1,134 @@ + + + + Debug + AssemblySearchPaths={HintPathFromItem};{TargetFrameworkDirectory};{RawFileName} + + + + + true + false + false + false + + false + false + false + false + false + + + + + true + true + true + true + true + + true + true + true + true + true + true + true + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <_RunningRestore>true + + + + + + + + + + + + + + + + + + + + + diff --git a/init-tools.cmd b/init-tools.cmd index ede43a60c06..2c1b6d60bdb 100644 --- a/init-tools.cmd +++ b/init-tools.cmd @@ -1,112 +1,38 @@ -@if not defined _echo @echo off -setlocal - -set INIT_TOOLS_LOG=%~dp0init-tools.log -set PACKAGES_DIR=%~dp0packages\ -set TOOLRUNTIME_DIR=%~dp0Tools - -set DOTNET_PATH=%TOOLRUNTIME_DIR%\dotnetcli\ -set DOTNET_CMD=%DOTNET_PATH%dotnet.exe - -set DOTNET_TOOLS_PATH=%TOOLRUNTIME_DIR%\dotnet20\ -set DOTNET_TOOLS_CMD=%DOTNET_TOOLS_PATH%dotnet.exe - -if [%BUILDTOOLS_SOURCE%]==[] set BUILDTOOLS_SOURCE=https://dotnet.myget.org/F/dotnet-buildtools/api/v3/index.json -set /P BUILDTOOLS_VERSION=< "%~dp0BuildToolsVersion.txt" -set BUILD_TOOLS_PATH=%PACKAGES_DIR%microsoft.dotnet.buildtools\%BUILDTOOLS_VERSION%\lib\ -set PROJECT_JSON_PATH=%TOOLRUNTIME_DIR%\%BUILDTOOLS_VERSION% -set PROJECT_JSON_FILE=%PROJECT_JSON_PATH%\project.json -set PROJECT_JSON_CONTENTS={ "dependencies": { "Microsoft.DotNet.BuildTools": "%BUILDTOOLS_VERSION%" , "Microsoft.DotNet.BuildTools.Coreclr": "1.0.4-prerelease"}, "frameworks": { "dnxcore50": { } } } -set BUILD_TOOLS_SEMAPHORE=%PROJECT_JSON_PATH%\init-tools.completed0 -set TOOLS_INIT_RETURN_CODE=0 - -:: if force option is specified then clean the tool runtime and build tools package directory to force it to get recreated -if [%1]==[force] ( - if exist "%TOOLRUNTIME_DIR%" rmdir /S /Q "%TOOLRUNTIME_DIR%" - if exist "%PACKAGES_DIR%microsoft.dotnet.buildtools" rmdir /S /Q "%PACKAGES_DIR%microsoft.dotnet.buildtools" -) - -set /p DOTNET_TOOLS_VERSION=< "%~dp0DotnetCLIToolsVersion.txt" -if not exist "%DOTNET_TOOLS_PATH%\sdk\%DOTNET_TOOLS_VERSION%" ( - :: dotnet cli doesn't yet exist, delete the semaphore - del "%BUILD_TOOLS_SEMAPHORE%" >NUL 2>&1 -) - -:: If sempahore exists do nothing -if exist "%BUILD_TOOLS_SEMAPHORE%" ( - echo Tools are already initialized. - goto :DONE -) - -:: Download Nuget.exe -if NOT exist "%PACKAGES_DIR%NuGet.exe" ( - if NOT exist "%PACKAGES_DIR%" mkdir "%PACKAGES_DIR%" - powershell -NoProfile -ExecutionPolicy unrestricted -Command "$wc = New-Object System.Net.WebClient; $wc.Proxy = [System.Net.WebRequest]::DefaultWebProxy; $wc.Proxy.Credentials = [System.Net.CredentialCache]::DefaultNetworkCredentials; $wc.DownloadFile('https://www.nuget.org/nuget.exe', '%PACKAGES_DIR%NuGet.exe') -) - -if NOT exist "%PROJECT_JSON_PATH%" mkdir "%PROJECT_JSON_PATH%" -echo %PROJECT_JSON_CONTENTS% > "%PROJECT_JSON_FILE%" -echo Running %0 > "%INIT_TOOLS_LOG%" - -if exist "%DOTNET_TOOLS_PATH%" goto :afterdotnettoolsrestore - -echo Installing dotnet OLD VERSION OF THE cli... -echo ========================================== -echo This is temporary until we build using the new dotnetcli -echo The dotnet cli is a large file it may take a few minutes ... -echo powershell -ExecutionPolicy unrestricted -NoProfile -Command ".\scripts\dotnet-install.ps1 -InstallDir %DOTNET_TOOLS_PATH% -Architecture x64 -Version %DOTNET_TOOLS_VERSION% -NoPath true; exit $LastExitCode;" -powershell -ExecutionPolicy unrestricted -NoProfile -Command ".\scripts\dotnet-install.ps1 -InstallDir %DOTNET_TOOLS_PATH% -Architecture x64 -Version %DOTNET_TOOLS_VERSION% -NoPath true; exit $LastExitCode;" -if errorlevel 1 ( - echo ERROR: Could not install dotnet cli correctly. - set TOOLS_INIT_RETURN_CODE=1 - goto :DONE -) -echo "%DOTNET_TOOLS_VERSION% >> "%DOTNET_TOOLS_PATH%\sdk\%DOTNET_TOOLS_VERSION%" -:afterdotnettoolsrestore - -set /p DOTNET_VERSION=< "%~dp0DotnetCLIVersion.txt" -if exist "%DOTNET_CMD%" goto :afterdotnetrestore - -echo Installing dotnet cli... -echo The dotnet cli is a large file it may take a few minutes ... -echo powershell -ExecutionPolicy unrestricted -NoProfile -Command ".\scripts\dotnet-install.ps1 -InstallDir %DOTNET_PATH% -Architecture x64 -Version %DOTNET_VERSION% -NoPath true; exit $LastExitCode;" -powershell -ExecutionPolicy unrestricted -NoProfile -Command ".\scripts\dotnet-install.ps1 -InstallDir %DOTNET_PATH% -Architecture x64 -Version %DOTNET_VERSION% -NoPath true; exit $LastExitCode;" -if errorlevel 1 ( - echo ERROR: Could not install dotnet cli correctly. - set TOOLS_INIT_RETURN_CODE=1 - goto :DONE -) -:afterdotnetrestore - -if exist "%BUILD_TOOLS_PATH%" goto :afterbuildtoolsrestore -echo Restoring BuildTools version %BUILDTOOLS_VERSION%... -echo Running: "%DOTNET_CMD%" restore "%PROJECT_JSON_FILE%" --packages "%PACKAGES_DIR% " --source "%BUILDTOOLS_SOURCE%" >> "%INIT_TOOLS_LOG%" -call "%DOTNET_CMD%" restore "%PROJECT_JSON_FILE%" --packages "%PACKAGES_DIR% " --source "%BUILDTOOLS_SOURCE%" >> "%INIT_TOOLS_LOG%" -if NOT exist "%BUILD_TOOLS_PATH%init-tools.cmd" ( - echo ERROR: Could not restore build tools correctly. See '%INIT_TOOLS_LOG%' for more details. - set TOOLS_INIT_RETURN_CODE=1 - goto :DONE -) - -:afterbuildtoolsrestore - -echo Initializing BuildTools ... -echo Running: "%BUILD_TOOLS_PATH%init-tools.cmd" "%~dp0" "%DOTNET_CMD%" "%TOOLRUNTIME_DIR%" >> "%INIT_TOOLS_LOG%" -call "%BUILD_TOOLS_PATH%init-tools.cmd" "%~dp0" "%DOTNET_CMD%" "%TOOLRUNTIME_DIR%" >> "%INIT_TOOLS_LOG%" - -echo Updating CLI NuGet Frameworks map... -robocopy "%TOOLRUNTIME_DIR%" "%DOTNET_PATH%\sdk\%DOTNET_VERSION%" NuGet.Frameworks.dll /XO >> "%INIT_TOOLS_LOG%" -set UPDATE_CLI_ERRORLEVEL=%ERRORLEVEL% -if %UPDATE_CLI_ERRORLEVEL% GTR 1 ( - echo ERROR: Failed to update Nuget for CLI {Error level %UPDATE_CLI_ERRORLEVEL%}. Please check '%INIT_TOOLS_LOG%' for more details. 1>&2 - exit /b %UPDATE_CLI_ERRORLEVEL% +@echo off +setlocal enabledelayedexpansion + +set /p DOTNET_TOOLS_VERSION=<"%~dp0DotnetCLIToolsVersion.txt" +set DOTNET_TOOLS_PATH=%~dp0Tools\dotnet20 +set dotnetexe=%DOTNET_TOOLS_PATH%\dotnet.exe +set sdksentinel=%DOTNET_TOOLS_PATH%\sdk-version.txt + +:: remove an old copy of the SDK +set cleanup_existing= +if exist "%sdksentinel%" ( + set /p INSTALLED_SDK_VERSION=<"%sdksentinel%" + if not "%DOTNET_TOOLS_VERSION%" == "!INSTALLED_SDK_VERSION!" ( + :: wrong version installed, clean it up + set cleanup_existing=1 + + ) else ( + echo Found up-to-date SDK. + ) +) else ( + set cleanup_existing=1 +) + +if "!cleanup_existing!" == "1" ( + echo Removing stale SDK. + rmdir /s /q "%DOTNET_TOOLS_PATH%" +) + +:: download and install install SDK +if not exist "%dotnetexe%" ( + echo powershell -ExecutionPolicy unrestricted -NoProfile -Command ".\scripts\dotnet-install.ps1 -InstallDir %DOTNET_TOOLS_PATH% -Architecture x64 -Version %DOTNET_TOOLS_VERSION% -NoPath true; exit $LastExitCode;" + powershell -ExecutionPolicy unrestricted -NoProfile -Command ".\scripts\dotnet-install.ps1 -InstallDir %DOTNET_TOOLS_PATH% -Architecture x64 -Version %DOTNET_TOOLS_VERSION% -NoPath true; exit $LastExitCode;" + if errorlevel 1 ( + echo ERROR: Could not install dotnet cli correctly. + exit /b 1 + ) + echo %DOTNET_TOOLS_VERSION%>"%sdksentinel%" ) - -:: Create sempahore file -echo Done initializing tools. -echo Init-Tools.cmd completed for BuildTools Version: %BUILDTOOLS_VERSION% > "%BUILD_TOOLS_SEMAPHORE%" - -:DONE - -exit /b %TOOLS_INIT_RETURN_CODE% - diff --git a/mono/cibuild.sh b/mono/cibuild.sh index e91b33e7839..9a5ea5af571 100755 --- a/mono/cibuild.sh +++ b/mono/cibuild.sh @@ -1,7 +1,7 @@ #!/bin/bash # note: expects to run from top directory -./mono/latest-mono-stable.sh +#./mono/latest-mono-stable.sh make Configuration=$@ #sudo make install Configuration=$@ #./mono/test-mono.sh \ No newline at end of file diff --git a/packages.config b/packages.config deleted file mode 100644 index 0f658bb45ee..00000000000 --- a/packages.config +++ /dev/null @@ -1,89 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/proto.proj b/proto.proj new file mode 100644 index 00000000000..96f223470ec --- /dev/null +++ b/proto.proj @@ -0,0 +1,30 @@ + + + + Proto + AssemblySearchPaths={HintPathFromItem};{TargetFrameworkDirectory};{RawFileName} + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/scripts/dotnet-install.sh b/scripts/dotnet-install.sh index 451525269ee..0d43070726d 100755 --- a/scripts/dotnet-install.sh +++ b/scripts/dotnet-install.sh @@ -22,7 +22,7 @@ exec 3>&1 # Setup some colors to use. These need to work in fairly limited shells, like the Ubuntu Docker container where there are only 8 colors. # See if stdout is a terminal -if [ -t 1 ]; then +if [ -t 1 ] && command -v tput > /dev/null; then # see if it supports colors ncolors=$(tput colors) if [ -n "$ncolors" ] && [ $ncolors -ge 8 ]; then @@ -39,6 +39,10 @@ if [ -t 1 ]; then fi fi +say_warning() { + printf "%b\n" "${yellow:-}dotnet_install: Warning: $1${normal:-}" +} + say_err() { printf "%b\n" "${red:-}dotnet_install: Error: $1${normal:-}" >&2 } @@ -55,7 +59,10 @@ say_verbose() { fi } -get_os_download_name_from_platform() { +# This platform list is finite - if the SDK/Runtime has supported Linux distribution-specific assets, +# then and only then should the Linux distribution appear in this list. +# Adding a Linux distribution to this list does not imply distribution-specific support. +get_legacy_os_name_from_platform() { eval $invocation platform="$1" @@ -68,6 +75,10 @@ get_os_download_name_from_platform() { echo "debian" return 0 ;; + "debian.9") + echo "debian.9" + return 0 + ;; "fedora.23") echo "fedora.23" return 0 @@ -76,6 +87,14 @@ get_os_download_name_from_platform() { echo "fedora.24" return 0 ;; + "fedora.27") + echo "fedora.27" + return 0 + ;; + "fedora.28") + echo "fedora.28" + return 0 + ;; "opensuse.13.2") echo "opensuse.13.2" return 0 @@ -84,6 +103,10 @@ get_os_download_name_from_platform() { echo "opensuse.42.1" return 0 ;; + "opensuse.42.3") + echo "opensuse.42.3" + return 0 + ;; "rhel.7"*) echo "rhel" return 0 @@ -100,6 +123,10 @@ get_os_download_name_from_platform() { echo "ubuntu.16.10" return 0 ;; + "ubuntu.18.04") + echo "ubuntu.18.04" + return 0 + ;; "alpine.3.4.3") echo "alpine" return 0 @@ -108,6 +135,30 @@ get_os_download_name_from_platform() { return 1 } +get_linux_platform_name() { + eval $invocation + + if [ -n "$runtime_id" ]; then + echo "${runtime_id%-*}" + return 0 + else + if [ -e /etc/os-release ]; then + . /etc/os-release + echo "$ID.$VERSION_ID" + return 0 + elif [ -e /etc/redhat-release ]; then + local redhatRelease=$(/dev/null | grep libunwind)" ] && say_warning "Unable to locate libunwind. Probable prerequisite missing; please install libunwind." + [ -z "$($LDCONFIG_COMMAND 2>/dev/null | grep libssl)" ] && say_warning "Unable to locate libssl. Probable prerequisite missing; please install libssl." + [ -z "$($LDCONFIG_COMMAND 2>/dev/null | grep libicu)" ] && say_warning "Unable to locate libicu. Probable prerequisite missing; please install libicu." + [ -z "$($LDCONFIG_COMMAND 2>/dev/null | grep -F libcurl.so)" ] && say_warning "Unable to locate libcurl. Probable prerequisite missing; please install libcurl." fi - + return 0 } @@ -207,7 +265,7 @@ check_pre_reqs() { # input - $1 to_lowercase() { #eval $invocation - + echo "$1" | tr '[:upper:]' '[:lower:]' return 0 } @@ -216,8 +274,8 @@ to_lowercase() { # input - $1 remove_trailing_slash() { #eval $invocation - - local input=${1:-} + + local input="${1:-}" echo "${input%/}" return 0 } @@ -226,8 +284,8 @@ remove_trailing_slash() { # input - $1 remove_beginning_slash() { #eval $invocation - - local input=${1:-} + + local input="${1:-}" echo "${input#/}" return 0 } @@ -237,15 +295,15 @@ remove_beginning_slash() { # child_path - $2 - this parameter can be empty combine_paths() { eval $invocation - + # TODO: Consider making it work with any number of paths. For now: if [ ! -z "${3:-}" ]; then say_err "combine_paths: Function takes two parameters." return 1 fi - - local root_path=$(remove_trailing_slash $1) - local child_path=$(remove_beginning_slash ${2:-}) + + local root_path="$(remove_trailing_slash "$1")" + local child_path="$(remove_beginning_slash "${2:-}")" say_verbose "combine_paths: root_path=$root_path" say_verbose "combine_paths: child_path=$child_path" echo "$root_path/$child_path" @@ -254,8 +312,22 @@ combine_paths() { get_machine_architecture() { eval $invocation - - # Currently the only one supported + + if command -v uname > /dev/null; then + CPUName=$(uname -m) + case $CPUName in + armv7l) + echo "arm" + return 0 + ;; + aarch64) + echo "arm64" + return 0 + ;; + esac + fi + + # Always default to 'x64' echo "x64" return 0 } @@ -264,23 +336,27 @@ get_machine_architecture() { # architecture - $1 get_normalized_architecture_from_architecture() { eval $invocation - - local architecture=$(to_lowercase $1) - case $architecture in + + local architecture="$(to_lowercase "$1")" + case "$architecture" in \) - echo "$(get_normalized_architecture_from_architecture $(get_machine_architecture))" + echo "$(get_normalized_architecture_from_architecture "$(get_machine_architecture)")" return 0 ;; amd64|x64) echo "x64" return 0 ;; - x86) - say_err "Architecture \`x86\` currently not supported" - return 1 + arm) + echo "arm" + return 0 + ;; + arm64) + echo "arm64" + return 0 ;; esac - + say_err "Architecture \`$architecture\` not supported. If you think this is a bug, please report it at https://github.com/dotnet/cli/issues" return 1 } @@ -294,8 +370,8 @@ get_normalized_architecture_from_architecture() { # version_text - stdin get_version_from_version_info() { eval $invocation - - cat | tail -n 1 + + cat | tail -n 1 | sed 's/\r$//' return 0 } @@ -303,8 +379,8 @@ get_version_from_version_info() { # version_text - stdin get_commit_hash_from_version_info() { eval $invocation - - cat | head -n 1 + + cat | head -n 1 | sed 's/\r$//' return 0 } @@ -314,14 +390,14 @@ get_commit_hash_from_version_info() { # specific_version - $3 is_dotnet_package_installed() { eval $invocation - - local install_root=$1 - local relative_path_to_package=$2 - local specific_version=${3//[$'\t\r\n']} - - local dotnet_package_path=$(combine_paths $(combine_paths $install_root $relative_path_to_package) $specific_version) + + local install_root="$1" + local relative_path_to_package="$2" + local specific_version="${3//[$'\t\r\n']}" + + local dotnet_package_path="$(combine_paths "$(combine_paths "$install_root" "$relative_path_to_package")" "$specific_version")" say_verbose "is_dotnet_package_installed: dotnet_package_path=$dotnet_package_path" - + if [ -d "$dotnet_package_path" ]; then return 0 else @@ -333,27 +409,33 @@ is_dotnet_package_installed() { # azure_feed - $1 # channel - $2 # normalized_architecture - $3 +# coherent - $4 get_latest_version_info() { eval $invocation - - local azure_feed=$1 - local channel=$2 - local normalized_architecture=$3 - local coherent=$4 + + local azure_feed="$1" + local channel="$2" + local normalized_architecture="$3" + local coherent="$4" local version_file_url=null - if [ "$shared_runtime" = true ]; then + if [[ "$runtime" == "dotnet" ]]; then version_file_url="$uncached_feed/Runtime/$channel/latest.version" - else + elif [[ "$runtime" == "aspnetcore" ]]; then + version_file_url="$uncached_feed/aspnetcore/Runtime/$channel/latest.version" + elif [ -z "$runtime" ]; then if [ "$coherent" = true ]; then version_file_url="$uncached_feed/Sdk/$channel/latest.coherent.version" else version_file_url="$uncached_feed/Sdk/$channel/latest.version" fi + else + say_err "Invalid value for \$runtime" + return 1 fi say_verbose "get_latest_version_info: latest url: $version_file_url" - - download $version_file_url + + download "$version_file_url" return $? } @@ -364,29 +446,29 @@ get_latest_version_info() { # version - $4 get_specific_version_from_version() { eval $invocation - - local azure_feed=$1 - local channel=$2 - local normalized_architecture=$3 - local version=$(to_lowercase $4) - case $version in + local azure_feed="$1" + local channel="$2" + local normalized_architecture="$3" + local version="$(to_lowercase "$4")" + + case "$version" in latest) local version_info - version_info="$(get_latest_version_info $azure_feed $channel $normalized_architecture false)" || return 1 + version_info="$(get_latest_version_info "$azure_feed" "$channel" "$normalized_architecture" false)" || return 1 say_verbose "get_specific_version_from_version: version_info=$version_info" echo "$version_info" | get_version_from_version_info return 0 ;; coherent) local version_info - version_info="$(get_latest_version_info $azure_feed $channel $normalized_architecture true)" || return 1 + version_info="$(get_latest_version_info "$azure_feed" "$channel" "$normalized_architecture" true)" || return 1 say_verbose "get_specific_version_from_version: version_info=$version_info" echo "$version_info" | get_version_from_version_info return 0 ;; *) - echo $version + echo "$version" return 0 ;; esac @@ -399,22 +481,26 @@ get_specific_version_from_version() { # specific_version - $4 construct_download_link() { eval $invocation - - local azure_feed=$1 - local channel=$2 - local normalized_architecture=$3 - local specific_version=${4//[$'\t\r\n']} - + + local azure_feed="$1" + local channel="$2" + local normalized_architecture="$3" + local specific_version="${4//[$'\t\r\n']}" + local osname - osname=$(get_current_os_name) || return 1 + osname="$(get_current_os_name)" || return 1 local download_link=null - if [ "$shared_runtime" = true ]; then + if [[ "$runtime" == "dotnet" ]]; then download_link="$azure_feed/Runtime/$specific_version/dotnet-runtime-$specific_version-$osname-$normalized_architecture.tar.gz" - else + elif [[ "$runtime" == "aspnetcore" ]]; then + download_link="$azure_feed/aspnetcore/Runtime/$specific_version/aspnetcore-runtime-$specific_version-$osname-$normalized_architecture.tar.gz" + elif [ -z "$runtime" ]; then download_link="$azure_feed/Sdk/$specific_version/dotnet-sdk-$specific_version-$osname-$normalized_architecture.tar.gz" + else + return 1 fi - + echo "$download_link" return 0 } @@ -426,20 +512,22 @@ construct_download_link() { # specific_version - $4 construct_legacy_download_link() { eval $invocation - - local azure_feed=$1 - local channel=$2 - local normalized_architecture=$3 - local specific_version=${4//[$'\t\r\n']} + + local azure_feed="$1" + local channel="$2" + local normalized_architecture="$3" + local specific_version="${4//[$'\t\r\n']}" local distro_specific_osname - distro_specific_osname=$(get_distro_specific_os_name) || return 1 + distro_specific_osname="$(get_legacy_os_name)" || return 1 local legacy_download_link=null - if [ "$shared_runtime" = true ]; then + if [[ "$runtime" == "dotnet" ]]; then legacy_download_link="$azure_feed/Runtime/$specific_version/dotnet-$distro_specific_osname-$normalized_architecture.$specific_version.tar.gz" - else + elif [ -z "$runtime" ]; then legacy_download_link="$azure_feed/Sdk/$specific_version/dotnet-dev-$distro_specific_osname-$normalized_architecture.$specific_version.tar.gz" + else + return 1 fi echo "$legacy_download_link" @@ -448,9 +536,9 @@ construct_legacy_download_link() { get_user_install_path() { eval $invocation - + if [ ! -z "${DOTNET_INSTALL_DIR:-}" ]; then - echo $DOTNET_INSTALL_DIR + echo "$DOTNET_INSTALL_DIR" else echo "$HOME/.dotnet" fi @@ -461,15 +549,15 @@ get_user_install_path() { # install_dir - $1 resolve_installation_path() { eval $invocation - + local install_dir=$1 if [ "$install_dir" = "" ]; then - local user_install_path=$(get_user_install_path) + local user_install_path="$(get_user_install_path)" say_verbose "resolve_installation_path: user_install_path=$user_install_path" echo "$user_install_path" return 0 fi - + echo "$install_dir" return 0 } @@ -478,16 +566,16 @@ resolve_installation_path() { # install_root - $1 get_installed_version_info() { eval $invocation - - local install_root=$1 - local version_file=$(combine_paths "$install_root" "$local_version_file_relative_path") + + local install_root="$1" + local version_file="$(combine_paths "$install_root" "$local_version_file_relative_path")" say_verbose "Local version file: $version_file" if [ ! -z "$version_file" ] | [ -r "$version_file" ]; then - local version_info="$(cat $version_file)" + local version_info="$(cat "$version_file")" echo "$version_info" return 0 fi - + say_verbose "Local version file not found." return 0 } @@ -496,9 +584,9 @@ get_installed_version_info() { # relative_or_absolute_path - $1 get_absolute_path() { eval $invocation - + local relative_or_absolute_path=$1 - echo $(cd $(dirname "$1") && pwd -P)/$(basename "$1") + echo "$(cd "$(dirname "$1")" && pwd -P)/$(basename "$1")" return 0 } @@ -510,17 +598,25 @@ get_absolute_path() { copy_files_or_dirs_from_list() { eval $invocation - local root_path=$(remove_trailing_slash $1) - local out_path=$(remove_trailing_slash $2) - local override=$3 - local override_switch=$(if [ "$override" = false ]; then printf -- "-n"; fi) - + local root_path="$(remove_trailing_slash "$1")" + local out_path="$(remove_trailing_slash "$2")" + local override="$3" + local osname="$(get_current_os_name)" + local override_switch=$( + if [ "$override" = false ]; then + if [[ "$osname" == "linux-musl" ]]; then + printf -- "-u"; + else + printf -- "-n"; + fi + fi) + cat | uniq | while read -r file_path; do - local path=$(remove_beginning_slash ${file_path#$root_path}) - local target=$out_path/$path + local path="$(remove_beginning_slash "${file_path#$root_path}")" + local target="$out_path/$path" if [ "$override" = true ] || (! ([ -d "$target" ] || [ -e "$target" ])); then - mkdir -p $out_path/$(dirname $path) - cp -R $override_switch $root_path/$path $target + mkdir -p "$out_path/$(dirname "$path")" + cp -R $override_switch "$root_path/$path" "$target" fi done } @@ -530,21 +626,21 @@ copy_files_or_dirs_from_list() { # out_path - $2 extract_dotnet_package() { eval $invocation - - local zip_path=$1 - local out_path=$2 - - local temp_out_path=$(mktemp -d $temporary_file_template) - + + local zip_path="$1" + local out_path="$2" + + local temp_out_path="$(mktemp -d "$temporary_file_template")" + local failed=false tar -xzf "$zip_path" -C "$temp_out_path" > /dev/null || failed=true - + local folders_with_version_regex='^.*/[0-9]+\.[0-9]+[^/]+/' - find $temp_out_path -type f | grep -Eo $folders_with_version_regex | copy_files_or_dirs_from_list $temp_out_path $out_path false - find $temp_out_path -type f | grep -Ev $folders_with_version_regex | copy_files_or_dirs_from_list $temp_out_path $out_path true - - rm -rf $temp_out_path - + find "$temp_out_path" -type f | grep -Eo "$folders_with_version_regex" | sort | copy_files_or_dirs_from_list "$temp_out_path" "$out_path" false + find "$temp_out_path" -type f | grep -Ev "$folders_with_version_regex" | copy_files_or_dirs_from_list "$temp_out_path" "$out_path" "$override_non_versioned_files" + + rm -rf "$temp_out_path" + if [ "$failed" = true ]; then say_err "Extraction failed" return 1 @@ -557,14 +653,19 @@ extract_dotnet_package() { download() { eval $invocation - local remote_path=$1 - local out_path=${2:-} + local remote_path="$1" + local out_path="${2:-}" + + if [[ "$remote_path" != "http"* ]]; then + cp "$remote_path" "$out_path" + return $? + fi local failed=false if machine_has "curl"; then - downloadcurl $remote_path $out_path || failed=true + downloadcurl "$remote_path" "$out_path" || failed=true elif machine_has "wget"; then - downloadwget $remote_path $out_path || failed=true + downloadwget "$remote_path" "$out_path" || failed=true else failed=true fi @@ -577,14 +678,17 @@ download() { downloadcurl() { eval $invocation - local remote_path=$1 - local out_path=${2:-} + local remote_path="$1" + local out_path="${2:-}" + + # Append feed_credential as late as possible before calling curl to avoid logging feed_credential + remote_path="${remote_path}${feed_credential}" local failed=false if [ -z "$out_path" ]; then - curl --retry 10 -sSL -f --create-dirs $remote_path || failed=true + curl --retry 10 -sSL -f --create-dirs "$remote_path" || failed=true else - curl --retry 10 -sSL -f --create-dirs -o $out_path $remote_path || failed=true + curl --retry 10 -sSL -f --create-dirs -o "$out_path" "$remote_path" || failed=true fi if [ "$failed" = true ]; then say_verbose "Curl download failed" @@ -595,14 +699,17 @@ downloadcurl() { downloadwget() { eval $invocation - local remote_path=$1 - local out_path=${2:-} + local remote_path="$1" + local out_path="${2:-}" + + # Append feed_credential as late as possible before calling wget to avoid logging feed_credential + remote_path="${remote_path}${feed_credential}" local failed=false if [ -z "$out_path" ]; then - wget -q --tries 10 $remote_path || failed=true + wget -q --tries 10 -O - "$remote_path" || failed=true else - wget -v --tries 10 -O $out_path $remote_path || failed=true + wget --tries 10 -O "$out_path" "$remote_path" || failed=true fi if [ "$failed" = true ]; then say_verbose "Wget download failed" @@ -615,20 +722,20 @@ calculate_vars() { eval $invocation valid_legacy_download_link=true - normalized_architecture=$(get_normalized_architecture_from_architecture "$architecture") + normalized_architecture="$(get_normalized_architecture_from_architecture "$architecture")" say_verbose "normalized_architecture=$normalized_architecture" - - specific_version=$(get_specific_version_from_version $azure_feed $channel $normalized_architecture $version) + + specific_version="$(get_specific_version_from_version "$azure_feed" "$channel" "$normalized_architecture" "$version")" say_verbose "specific_version=$specific_version" if [ -z "$specific_version" ]; then say_err "Could not get version information." return 1 fi - - download_link=$(construct_download_link $azure_feed $channel $normalized_architecture $specific_version) + + download_link="$(construct_download_link "$azure_feed" "$channel" "$normalized_architecture" "$specific_version")" say_verbose "download_link=$download_link" - legacy_download_link=$(construct_legacy_download_link $azure_feed $channel $normalized_architecture $specific_version) || valid_legacy_download_link=false + legacy_download_link="$(construct_legacy_download_link "$azure_feed" "$channel" "$normalized_architecture" "$specific_version")" || valid_legacy_download_link=false if [ "$valid_legacy_download_link" = true ]; then say_verbose "legacy_download_link=$legacy_download_link" @@ -636,39 +743,74 @@ calculate_vars() { say_verbose "Cound not construct a legacy_download_link; omitting..." fi - install_root=$(resolve_installation_path $install_dir) + install_root="$(resolve_installation_path "$install_dir")" say_verbose "install_root=$install_root" } install_dotnet() { eval $invocation local download_failed=false + local asset_name='' + local asset_relative_path='' + + if [[ "$runtime" == "dotnet" ]]; then + asset_relative_path="shared/Microsoft.NETCore.App" + asset_name=".NET Core Runtime" + elif [[ "$runtime" == "aspnetcore" ]]; then + asset_relative_path="shared/Microsoft.AspNetCore.App" + asset_name="ASP.NET Core Runtime" + elif [ -z "$runtime" ]; then + asset_relative_path="sdk" + asset_name=".NET Core SDK" + else + say_err "Invalid value for \$runtime" + return 1 + fi - if is_dotnet_package_installed $install_root "sdk" $specific_version; then - say ".NET SDK version $specific_version is already installed." + # Check if the SDK version is already installed. + if is_dotnet_package_installed "$install_root" "$asset_relative_path" "$specific_version"; then + say "$asset_name version $specific_version is already installed." return 0 fi - - mkdir -p $install_root - zip_path=$(mktemp $temporary_file_template) + + mkdir -p "$install_root" + zip_path="$(mktemp "$temporary_file_template")" say_verbose "Zip path: $zip_path" say "Downloading link: $download_link" - download "$download_link" $zip_path || download_failed=true + + # Failures are normal in the non-legacy case for ultimately legacy downloads. + # Do not output to stderr, since output to stderr is considered an error. + download "$download_link" "$zip_path" 2>&1 || download_failed=true # if the download fails, download the legacy_download_link - if [ "$download_failed" = true ] && [ "$valid_legacy_download_link" = true ]; then + if [ "$download_failed" = true ]; then say "Cannot download: $download_link" - download_link=$legacy_download_link - zip_path=$(mktemp $temporary_file_template) - say_verbose "Legacy zip path: $zip_path" - say "Downloading legacy link: $download_link" - download "$download_link" $zip_path + + if [ "$valid_legacy_download_link" = true ]; then + download_failed=false + download_link="$legacy_download_link" + zip_path="$(mktemp "$temporary_file_template")" + say_verbose "Legacy zip path: $zip_path" + say "Downloading legacy link: $download_link" + download "$download_link" "$zip_path" 2>&1 || download_failed=true + fi fi - + + if [ "$download_failed" = true ]; then + say_err "Could not download $asset_name version $specific_version" + return 1 + fi + say "Extracting zip from $download_link" - extract_dotnet_package $zip_path $install_root - + extract_dotnet_package "$zip_path" "$install_root" + + # Check if the SDK version is now installed; if not, fail the installation. + if ! is_dotnet_package_installed "$install_root" "$asset_relative_path" "$specific_version"; then + say_err "$asset_name version $specific_version failed to install with an unknown error." + return 1 + fi + return 0 } @@ -682,19 +824,22 @@ install_dir="" architecture="" dry_run=false no_path=false +no_cdn=false azure_feed="https://dotnetcli.azureedge.net/dotnet" uncached_feed="https://dotnetcli.blob.core.windows.net/dotnet" +feed_credential="" verbose=false -shared_runtime=false +runtime="" runtime_id="" +override_non_versioned_files=true while [ $# -ne 0 ] do - name=$1 - case $name in + name="$1" + case "$name" in -c|--channel|-[Cc]hannel) shift - channel=$1 + channel="$1" ;; -v|--version|-[Vv]ersion) shift @@ -709,7 +854,18 @@ do architecture="$1" ;; --shared-runtime|-[Ss]hared[Rr]untime) - shared_runtime=true + say_warning "The --shared-runtime flag is obsolete and may be removed in a future version of this script. The recommended usage is to specify '--runtime dotnet'." + if [ -z "$runtime" ]; then + runtime="dotnet" + fi + ;; + --runtime|-[Rr]untime) + shift + runtime="$1" + if [[ "$runtime" != "dotnet" ]] && [[ "$runtime" != "aspnetcore" ]]; then + say_err "Unsupported value for --runtime: '$1'. Valid values are 'dotnet' and 'aspnetcore'." + exit 1 + fi ;; --dry-run|-[Dd]ry[Rr]un) dry_run=true @@ -720,6 +876,9 @@ do --verbose|-[Vv]erbose) verbose=true ;; + --no-cdn|-[Nn]o[Cc]dn) + no_cdn=true + ;; --azure-feed|-[Aa]zure[Ff]eed) shift azure_feed="$1" @@ -728,12 +887,19 @@ do shift uncached_feed="$1" ;; + --feed-credential|-[Ff]eed[Cc]redential) + shift + feed_credential="$1" + ;; --runtime-id|-[Rr]untime[Ii]d) shift runtime_id="$1" ;; + --skip-non-versioned-files|-[Ss]kip[Nn]on[Vv]ersioned[Ff]iles) + override_non_versioned_files=false + ;; -?|--?|-h|--help|-[Hh]elp) - script_name="$(basename $0)" + script_name="$(basename "$0")" echo ".NET Tools Installer" echo "Usage: $script_name [-c|--channel ] [-v|--version ] [-p|--prefix ]" echo " $script_name -h|-?|--help" @@ -741,7 +907,7 @@ do echo "$script_name is a simple command line interface for obtaining dotnet cli." echo "" echo "Options:" - echo " -c,--channel Download from the CHANNEL specified, Defaults to \`$channel\`." + echo " -c,--channel Download from the channel specified, Defaults to \`$channel\`." echo " -Channel" echo " Possible values:" echo " - Current - most current release" @@ -758,20 +924,32 @@ do echo " coherent applies only to SDK downloads" echo " - 3-part version in a format A.B.C - represents specific version of build" echo " examples: 2.0.0-preview2-006120; 1.1.0" - echo " -i,--install-dir Install under specified location (see Install Location below)" + echo " -i,--install-dir Install under specified location (see Install Location below)" echo " -InstallDir" - echo " --architecture Architecture of .NET Tools. Currently only x64 is supported." + echo " --architecture Architecture of dotnet binaries to be installed, Defaults to \`$architecture\`." echo " --arch,-Architecture,-Arch" - echo " --shared-runtime Installs just the shared runtime bits, not the entire SDK." - echo " -SharedRuntime" - echo " --dry-run,-DryRun Do not perform installation. Display download link." - echo " --no-path, -NoPath Do not set PATH for the current process." - echo " --verbose,-Verbose Display diagnostics information." - echo " --azure-feed,-AzureFeed Azure feed location. Defaults to $azure_feed, This parameter typically is not changed by the user." - echo " --uncached-feed,-UncachedFeed Uncached feed location. This parameter typically is not changed by the user." - echo " --runtime-id Installs the .NET Tools for the given platform (use linux-x64 for portable linux)." + echo " Possible values: x64, arm, and arm64" + echo " --runtime Installs a shared runtime only, without the SDK." + echo " -Runtime" + echo " Possible values:" + echo " - dotnet - the Microsoft.NETCore.App shared runtime" + echo " - aspnetcore - the Microsoft.AspNetCore.App shared runtime" + echo " --skip-non-versioned-files Skips non-versioned files if they already exist, such as the dotnet executable." + echo " -SkipNonVersionedFiles" + echo " --dry-run,-DryRun Do not perform installation. Display download link." + echo " --no-path, -NoPath Do not set PATH for the current process." + echo " --verbose,-Verbose Display diagnostics information." + echo " --azure-feed,-AzureFeed Azure feed location. Defaults to $azure_feed, This parameter typically is not changed by the user." + echo " --uncached-feed,-UncachedFeed Uncached feed location. This parameter typically is not changed by the user." + echo " --no-cdn,-NoCdn Disable downloading from the Azure CDN, and use the uncached feed directly." + echo " --feed-credential,-FeedCredential Azure feed shared access token. This parameter typically is not specified." + echo " --runtime-id Installs the .NET Tools for the given platform (use linux-x64 for portable linux)." echo " -RuntimeId" - echo " -?,--?,-h,--help,-Help Shows this help message" + echo " -?,--?,-h,--help,-Help Shows this help message" + echo "" + echo "Obsolete parameters:" + echo " --shared-runtime The recommended alternative is '--runtime dotnet'." + echo " -SharedRuntime Installs just the shared runtime bits, not the entire SDK." echo "" echo "Install Location:" echo " Location is chosen in following order:" @@ -789,6 +967,10 @@ do shift done +if [ "$no_cdn" = true ]; then + azure_feed="$uncached_feed" +fi + check_min_reqs calculate_vars @@ -797,17 +979,17 @@ if [ "$dry_run" = true ]; then if [ "$valid_legacy_download_link" = true ]; then say "Legacy payload URL: $legacy_download_link" fi - say "Repeatable invocation: ./$(basename $0) --version $specific_version --channel $channel --install-dir $install_dir" + say "Repeatable invocation: ./$(basename "$0") --version $specific_version --channel $channel --install-dir $install_dir" exit 0 fi check_pre_reqs install_dotnet -bin_path=$(get_absolute_path $(combine_paths $install_root $bin_folder_relative_path)) +bin_path="$(get_absolute_path "$(combine_paths "$install_root" "$bin_folder_relative_path")")" if [ "$no_path" = false ]; then say "Adding to current process PATH: \`$bin_path\`. Note: This change will be visible only when sourcing script." - export PATH=$bin_path:$PATH + export PATH="$bin_path":"$PATH" else say "Binaries of dotnet can be found in $bin_path" fi diff --git a/setup/Directory.Build.props b/setup/Directory.Build.props new file mode 100644 index 00000000000..64b72eafc9f --- /dev/null +++ b/setup/Directory.Build.props @@ -0,0 +1,12 @@ + + + + + + + + true + false + + + diff --git a/setup/Directory.Build.targets b/setup/Directory.Build.targets new file mode 100644 index 00000000000..0619a12001e --- /dev/null +++ b/setup/Directory.Build.targets @@ -0,0 +1,4 @@ + + + + diff --git a/setup/FSharp.Setup.props b/setup/FSharp.Setup.props index 899f78e6baa..25398779040 100644 --- a/setup/FSharp.Setup.props +++ b/setup/FSharp.Setup.props @@ -1,31 +1,23 @@ - + - 2.0 - 3.10 - 3.10.0.1503 $(MSBuildThisFileDirectory) - $(SetupRootFolder)\..\packages\WiX.Toolset.2015.$(WiXToolset2015Version)\tools\wix - $(SetupRootFolder)\..\packages - - $(VSMajorVersion).$(VSMinorVersion).$(BUILD_BUILDNUMBER) - net40 Debug AnyCPU $(SetupRootFolder)\..\$(Configuration) - $(BinariesDir)\$(TargetDotnetProfile)\bin\ + $(BinariesDir)\net40\bin\ $(BinariesDir)\insertion obj\$(Configuration)\ $(BinariesDir)\setup diff --git a/setup/Swix/Directory.Build.props b/setup/Swix/Directory.Build.props new file mode 100644 index 00000000000..92203d4e217 --- /dev/null +++ b/setup/Swix/Directory.Build.props @@ -0,0 +1,14 @@ + + + + + neutral + false + vsix + true + $(FSharpSourcesRoot)\..\$(Configuration) + $(BinariesFolder)\insertion + $(MSBuildProjectDirectory)\obj + + + diff --git a/setup/Swix/Directory.Build.targets b/setup/Swix/Directory.Build.targets new file mode 100644 index 00000000000..14437118703 --- /dev/null +++ b/setup/Swix/Directory.Build.targets @@ -0,0 +1,3 @@ + + + diff --git a/setup/Swix/Microsoft.FSharp.Compiler.Resources/Microsoft.FSharp.Compiler.Resources.swixproj b/setup/Swix/Microsoft.FSharp.Compiler.Resources/Microsoft.FSharp.Compiler.Resources.swixproj index d722fb0293e..166cbb2d519 100644 --- a/setup/Swix/Microsoft.FSharp.Compiler.Resources/Microsoft.FSharp.Compiler.Resources.swixproj +++ b/setup/Swix/Microsoft.FSharp.Compiler.Resources/Microsoft.FSharp.Compiler.Resources.swixproj @@ -1,21 +1,13 @@ - + + + + - ..\..\..\src - neutral - false - vsix - true - Debug - $(FSharpSourcesRoot)\..\$(Configuration) - $(BinariesFolder)\insertion Microsoft.FSharp.Compiler.Resources.$(LocaleCode) - $(MSBuildThisFileDirectory)obj - - $(PackagePreprocessorDefinitions);BinariesFolder=$(BinariesFolder) $(PackagePreprocessorDefinitions);FSharpPackageVersion=$(FSharpPackageVersion) @@ -35,7 +27,6 @@ - - - + + diff --git a/setup/Swix/Microsoft.FSharp.Compiler/Files.swr b/setup/Swix/Microsoft.FSharp.Compiler/Files.swr index e546ffe0b30..58129a51ee0 100644 --- a/setup/Swix/Microsoft.FSharp.Compiler/Files.swr +++ b/setup/Swix/Microsoft.FSharp.Compiler/Files.swr @@ -24,7 +24,7 @@ folder "InstallDir:Common7\IDE\CommonExtensions\Microsoft\FSharp" file source="$(BinariesFolder)\net40\bin\FSharp.Build.dll" vs.file.ngen=yes vs.file.ngenArchitecture=All vs.file.ngenPriority=2 - file source="$(PackagesFolder)\Microsoft.VisualFSharp.Type.Providers.Redist.$(MicrosoftVisualFSharpTypeProvidersRedistPackageVersion)\content\4.3.0.0\FSharp.Data.TypeProviders.dll" + file source="$(PackagesFolder)\Microsoft.VisualFSharp.Type.Providers.Redist\$(MicrosoftVisualFSharpTypeProvidersRedistPackageVersion)\content\4.3.0.0\FSharp.Data.TypeProviders.dll" file source="$(BinariesFolder)\net40\bin\Microsoft.Build.dll" file source="$(BinariesFolder)\net40\bin\Microsoft.Build.Framework.dll" file source="$(BinariesFolder)\net40\bin\Microsoft.Build.Tasks.Core.dll" diff --git a/setup/Swix/Microsoft.FSharp.Compiler/Microsoft.FSharp.Compiler.swixproj b/setup/Swix/Microsoft.FSharp.Compiler/Microsoft.FSharp.Compiler.swixproj index d748087bfcc..955da213a71 100644 --- a/setup/Swix/Microsoft.FSharp.Compiler/Microsoft.FSharp.Compiler.swixproj +++ b/setup/Swix/Microsoft.FSharp.Compiler/Microsoft.FSharp.Compiler.swixproj @@ -1,27 +1,16 @@ - + + + + - $(MSBuildThisFileDirectory)..\..\..\src - $(FSharpSourcesRoot)\.. - neutral - false - vsix - true - Debug - $(FSharpSourcesRoot)\..\$(Configuration) - $(FSharpSourcesRoot)\..\packages - $(BinariesFolder)\insertion Microsoft.FSharp.Compiler - $(MSBuildThisFileDirectory)obj - - - $(PackagePreprocessorDefinitions);BinariesFolder=$(BinariesFolder) - $(PackagePreprocessorDefinitions);PackagesFolder=$(PackagesFolder) + $(PackagePreprocessorDefinitions);PackagesFolder=$(NuGetPackageRoot) $(PackagePreprocessorDefinitions);FSharpTreeRoot=$(FSharpTreeRoot) $(PackagePreprocessorDefinitions);FSharpPackageVersion=$(FSharpPackageVersion) $(PackagePreprocessorDefinitions);MicrosoftVisualFSharpTypeProvidersRedistPackageVersion=$(MicrosoftVisualFSharpTypeProvidersRedistPackageVersion) @@ -36,7 +25,6 @@ - - - + + diff --git a/setup/Swix/Microsoft.FSharp.Dependencies/Files.swr b/setup/Swix/Microsoft.FSharp.Dependencies/Files.swr index 29a77d01c79..6ded7ba325f 100644 --- a/setup/Swix/Microsoft.FSharp.Dependencies/Files.swr +++ b/setup/Swix/Microsoft.FSharp.Dependencies/Files.swr @@ -4,11 +4,11 @@ package name=Microsoft.FSharp.Dependencies version=$(FSharpPackageVersion) folder "InstallDir:MSBuild\Microsoft\VisualStudio\v$(VSGeneralVersion)\FSharp" - file "Microsoft.FSharp.targets" source="$(BinariesFolder)\setup\resources\Microsoft.FSharp.Shim.targets" - file "Microsoft.Portable.FSharp.targets" source="$(BinariesFolder)\setup\resources\Microsoft.Portable.FSharp.Shim.targets" - file "Microsoft.FSharp.NetSdk.targets" source="$(BinariesFolder)\setup\resources\Microsoft.FSharp.NetSdk.Shim.targets" - file "Microsoft.FSharp.Overrides.NetSdk.targets" source="$(BinariesFolder)\setup\resources\Microsoft.FSharp.Overrides.NetSdk.Shim.targets" - file "Microsoft.FSharp.NetSdk.props" source="$(BinariesFolder)\setup\resources\Microsoft.FSharp.NetSdk.Shim.props" + file "Microsoft.FSharp.targets" source="$(BinariesFolder)\setup\$(TargetFramework)\resources\Microsoft.FSharp.Shim.targets" + file "Microsoft.Portable.FSharp.targets" source="$(BinariesFolder)\setup\$(TargetFramework)\resources\Microsoft.Portable.FSharp.Shim.targets" + file "Microsoft.FSharp.NetSdk.targets" source="$(BinariesFolder)\setup\$(TargetFramework)\resources\Microsoft.FSharp.NetSdk.Shim.targets" + file "Microsoft.FSharp.Overrides.NetSdk.targets" source="$(BinariesFolder)\setup\$(TargetFramework)\resources\Microsoft.FSharp.Overrides.NetSdk.Shim.targets" + file "Microsoft.FSharp.NetSdk.props" source="$(BinariesFolder)\setup\$(TargetFramework)\resources\Microsoft.FSharp.NetSdk.Shim.props" folder "InstallDir:Common7\IDE\PublicAssemblies" file source="$(BinariesFolder)\net40\bin\FSharp.Core.dll" vs.file.ngen=yes diff --git a/setup/Swix/Microsoft.FSharp.Dependencies/Microsoft.FSharp.Dependencies.swixproj b/setup/Swix/Microsoft.FSharp.Dependencies/Microsoft.FSharp.Dependencies.swixproj index 06d75f70f72..dd1452bbefc 100644 --- a/setup/Swix/Microsoft.FSharp.Dependencies/Microsoft.FSharp.Dependencies.swixproj +++ b/setup/Swix/Microsoft.FSharp.Dependencies/Microsoft.FSharp.Dependencies.swixproj @@ -1,26 +1,17 @@ - + + + + - ..\..\..\src - neutral - false - vsix - true - Debug - $(FSharpSourcesRoot)\..\$(Configuration) - $(FSharpSourcesRoot)\..\packages - $(BinariesFolder)\insertion Microsoft.FSharp.Dependencies - $(MSBuildThisFileDirectory)obj - - $(PackagePreprocessorDefinitions);BinariesFolder=$(BinariesFolder) - $(PackagePreprocessorDefinitions);PackagesFolder=$(PackagesFolder) $(PackagePreprocessorDefinitions);FSharpPackageVersion=$(FSharpPackageVersion) + $(PackagePreprocessorDefinitions);TargetFramework=$(TargetFramework) $(PackagePreprocessorDefinitions);VSGeneralVersion=$(VSGeneralVersion) @@ -31,10 +22,10 @@ + - - - + + diff --git a/setup/Swix/Microsoft.FSharp.IDE/Files.swr b/setup/Swix/Microsoft.FSharp.IDE/Files.swr index bf544b4be14..0d47c502090 100644 --- a/setup/Swix/Microsoft.FSharp.IDE/Files.swr +++ b/setup/Swix/Microsoft.FSharp.IDE/Files.swr @@ -4,10 +4,10 @@ package name=Microsoft.FSharp.IDE version=$(FSharpPackageVersion) folder "InstallDir:Common7\IDE\NewScriptItems" - file source="$(BinariesFolder)\setup\resources\NewFileDialog\Script\NewFSharpScriptItems.vsdir" - file source="$(BinariesFolder)\setup\resources\NewFileDialog\Script\Script.fsx" + file source="$(BinariesFolder)\setup\$(TargetFramework)\resources\NewFileDialog\Script\NewFSharpScriptItems.vsdir" + file source="$(BinariesFolder)\setup\$(TargetFramework)\resources\NewFileDialog\Script\Script.fsx" folder "InstallDir:Common7\IDE\NewFileItems" - file source="$(BinariesFolder)\setup\resources\NewFileDialog\General\NewFSharpFileItems.vsdir" - file source="$(BinariesFolder)\setup\resources\NewFileDialog\General\File.fs" - file source="$(BinariesFolder)\setup\resources\NewFileDialog\General\Script.fsx" + file source="$(BinariesFolder)\setup\$(TargetFramework)\resources\NewFileDialog\General\NewFSharpFileItems.vsdir" + file source="$(BinariesFolder)\setup\$(TargetFramework)\resources\NewFileDialog\General\File.fs" + file source="$(BinariesFolder)\setup\$(TargetFramework)\resources\NewFileDialog\General\Script.fsx" diff --git a/setup/Swix/Microsoft.FSharp.IDE/Microsoft.FSharp.IDE.swixproj b/setup/Swix/Microsoft.FSharp.IDE/Microsoft.FSharp.IDE.swixproj index 47c00dd88fe..b26924e23c2 100644 --- a/setup/Swix/Microsoft.FSharp.IDE/Microsoft.FSharp.IDE.swixproj +++ b/setup/Swix/Microsoft.FSharp.IDE/Microsoft.FSharp.IDE.swixproj @@ -1,26 +1,17 @@ - + + + + - $(MSBuildThisFileDirectory)..\..\..\src - neutral - false - vsix - true - Debug - $(FSharpSourcesRoot)\..\$(Configuration) - $(FSharpSourcesRoot)\..\packages - $(BinariesFolder)\insertion Microsoft.FSharp.IDE - $(MSBuildThisFileDirectory)obj - - $(PackagePreprocessorDefinitions);BinariesFolder=$(BinariesFolder) - $(PackagePreprocessorDefinitions);PackagesFolder=$(PackagesFolder) $(PackagePreprocessorDefinitions);FSharpPackageVersion=$(FSharpPackageVersion) + $(PackagePreprocessorDefinitions);TargetFramework=$(TargetFramework) @@ -30,9 +21,9 @@ + - - - + + diff --git a/setup/Swix/Microsoft.FSharp.SDK/Files.swr b/setup/Swix/Microsoft.FSharp.SDK/Files.swr index 228bc933437..cffd90ed366 100644 --- a/setup/Swix/Microsoft.FSharp.SDK/Files.swr +++ b/setup/Swix/Microsoft.FSharp.SDK/Files.swr @@ -7,96 +7,96 @@ folder "InstallDir:Common7\IDE\CommonExtensions\Microsoft\FSharpSdk" folder ".NETCore" folder "3.3.1.0" - file source="$(PackagesFolder)\Microsoft.VisualFSharp.Core.Redist.1.0.0\content\.NETCore\3.3.1.0\FSharp.Core.dll" - file source="$(PackagesFolder)\Microsoft.VisualFSharp.Core.Redist.1.0.0\content\.NETCore\3.3.1.0\FSharp.Core.optdata" - file source="$(PackagesFolder)\Microsoft.VisualFSharp.Core.Redist.1.0.0\content\.NETCore\3.3.1.0\FSharp.Core.sigdata" - file source="$(PackagesFolder)\Microsoft.VisualFSharp.Core.Redist.1.0.0\content\.NETCore\3.3.1.0\FSharp.Core.xml" + file source="$(PackagesFolder)\Microsoft.VisualFSharp.Core.Redist\1.0.0\content\.NETCore\3.3.1.0\FSharp.Core.dll" + file source="$(PackagesFolder)\Microsoft.VisualFSharp.Core.Redist\1.0.0\content\.NETCore\3.3.1.0\FSharp.Core.optdata" + file source="$(PackagesFolder)\Microsoft.VisualFSharp.Core.Redist\1.0.0\content\.NETCore\3.3.1.0\FSharp.Core.sigdata" + file source="$(PackagesFolder)\Microsoft.VisualFSharp.Core.Redist\1.0.0\content\.NETCore\3.3.1.0\FSharp.Core.xml" folder "3.7.4.0" - file source="$(PackagesFolder)\Microsoft.VisualFSharp.Core.Redist.1.0.0\content\.NETCore\3.7.4.0\FSharp.Core.dll" - file source="$(PackagesFolder)\Microsoft.VisualFSharp.Core.Redist.1.0.0\content\.NETCore\3.7.4.0\FSharp.Core.optdata" - file source="$(PackagesFolder)\Microsoft.VisualFSharp.Core.Redist.1.0.0\content\.NETCore\3.7.4.0\FSharp.Core.sigdata" - file source="$(PackagesFolder)\Microsoft.VisualFSharp.Core.Redist.1.0.0\content\.NETCore\3.7.4.0\FSharp.Core.xml" + file source="$(PackagesFolder)\Microsoft.VisualFSharp.Core.Redist\1.0.0\content\.NETCore\3.7.4.0\FSharp.Core.dll" + file source="$(PackagesFolder)\Microsoft.VisualFSharp.Core.Redist\1.0.0\content\.NETCore\3.7.4.0\FSharp.Core.optdata" + file source="$(PackagesFolder)\Microsoft.VisualFSharp.Core.Redist\1.0.0\content\.NETCore\3.7.4.0\FSharp.Core.sigdata" + file source="$(PackagesFolder)\Microsoft.VisualFSharp.Core.Redist\1.0.0\content\.NETCore\3.7.4.0\FSharp.Core.xml" folder "3.7.41.0" - file source="$(PackagesFolder)\Microsoft.Portable.FSharp.Core.10.1.0\lib\profiles\portable-net45+netcore45\FSharp.Core.dll" - file source="$(PackagesFolder)\Microsoft.Portable.FSharp.Core.10.1.0\lib\profiles\portable-net45+netcore45\FSharp.Core.optdata" - file source="$(PackagesFolder)\Microsoft.Portable.FSharp.Core.10.1.0\lib\profiles\portable-net45+netcore45\FSharp.Core.sigdata" - file source="$(PackagesFolder)\Microsoft.Portable.FSharp.Core.10.1.0\lib\profiles\portable-net45+netcore45\FSharp.Core.xml" + file source="$(PackagesFolder)\Microsoft.Portable.FSharp.Core\10.1.0\lib\profiles\portable-net45+netcore45\FSharp.Core.dll" + file source="$(PackagesFolder)\Microsoft.Portable.FSharp.Core\10.1.0\lib\profiles\portable-net45+netcore45\FSharp.Core.optdata" + file source="$(PackagesFolder)\Microsoft.Portable.FSharp.Core\10.1.0\lib\profiles\portable-net45+netcore45\FSharp.Core.sigdata" + file source="$(PackagesFolder)\Microsoft.Portable.FSharp.Core\10.1.0\lib\profiles\portable-net45+netcore45\FSharp.Core.xml" folder "3.78.3.1" - file source="$(PackagesFolder)\Microsoft.VisualFSharp.Core.Redist.1.0.0\content\.NETCore\3.78.3.1\FSharp.Core.dll" - file source="$(PackagesFolder)\Microsoft.VisualFSharp.Core.Redist.1.0.0\content\.NETCore\3.78.3.1\FSharp.Core.optdata" - file source="$(PackagesFolder)\Microsoft.VisualFSharp.Core.Redist.1.0.0\content\.NETCore\3.78.3.1\FSharp.Core.sigdata" - file source="$(PackagesFolder)\Microsoft.VisualFSharp.Core.Redist.1.0.0\content\.NETCore\3.78.3.1\FSharp.Core.xml" + file source="$(PackagesFolder)\Microsoft.VisualFSharp.Core.Redist\1.0.0\content\.NETCore\3.78.3.1\FSharp.Core.dll" + file source="$(PackagesFolder)\Microsoft.VisualFSharp.Core.Redist\1.0.0\content\.NETCore\3.78.3.1\FSharp.Core.optdata" + file source="$(PackagesFolder)\Microsoft.VisualFSharp.Core.Redist\1.0.0\content\.NETCore\3.78.3.1\FSharp.Core.sigdata" + file source="$(PackagesFolder)\Microsoft.VisualFSharp.Core.Redist\1.0.0\content\.NETCore\3.78.3.1\FSharp.Core.xml" folder "3.78.4.0" - file source="$(PackagesFolder)\Microsoft.VisualFSharp.Core.Redist.1.0.0\content\.NETCore\3.78.4.0\FSharp.Core.dll" - file source="$(PackagesFolder)\Microsoft.VisualFSharp.Core.Redist.1.0.0\content\.NETCore\3.78.4.0\FSharp.Core.optdata" - file source="$(PackagesFolder)\Microsoft.VisualFSharp.Core.Redist.1.0.0\content\.NETCore\3.78.4.0\FSharp.Core.sigdata" - file source="$(PackagesFolder)\Microsoft.VisualFSharp.Core.Redist.1.0.0\content\.NETCore\3.78.4.0\FSharp.Core.xml" + file source="$(PackagesFolder)\Microsoft.VisualFSharp.Core.Redist\1.0.0\content\.NETCore\3.78.4.0\FSharp.Core.dll" + file source="$(PackagesFolder)\Microsoft.VisualFSharp.Core.Redist\1.0.0\content\.NETCore\3.78.4.0\FSharp.Core.optdata" + file source="$(PackagesFolder)\Microsoft.VisualFSharp.Core.Redist\1.0.0\content\.NETCore\3.78.4.0\FSharp.Core.sigdata" + file source="$(PackagesFolder)\Microsoft.VisualFSharp.Core.Redist\1.0.0\content\.NETCore\3.78.4.0\FSharp.Core.xml" folder "3.78.41.0" - file source="$(PackagesFolder)\Microsoft.Portable.FSharp.Core.10.1.0\lib\profiles\portable-net45+netcore45+wp8\FSharp.Core.dll" - file source="$(PackagesFolder)\Microsoft.Portable.FSharp.Core.10.1.0\lib\profiles\portable-net45+netcore45+wp8\FSharp.Core.optdata" - file source="$(PackagesFolder)\Microsoft.Portable.FSharp.Core.10.1.0\lib\profiles\portable-net45+netcore45+wp8\FSharp.Core.sigdata" - file source="$(PackagesFolder)\Microsoft.Portable.FSharp.Core.10.1.0\lib\profiles\portable-net45+netcore45+wp8\FSharp.Core.xml" + file source="$(PackagesFolder)\Microsoft.Portable.FSharp.Core\10.1.0\lib\profiles\portable-net45+netcore45+wp8\FSharp.Core.dll" + file source="$(PackagesFolder)\Microsoft.Portable.FSharp.Core\10.1.0\lib\profiles\portable-net45+netcore45+wp8\FSharp.Core.optdata" + file source="$(PackagesFolder)\Microsoft.Portable.FSharp.Core\10.1.0\lib\profiles\portable-net45+netcore45+wp8\FSharp.Core.sigdata" + file source="$(PackagesFolder)\Microsoft.Portable.FSharp.Core\10.1.0\lib\profiles\portable-net45+netcore45+wp8\FSharp.Core.xml" folder "3.259.3.1" - file source="$(PackagesFolder)\Microsoft.VisualFSharp.Core.Redist.1.0.0\content\.NETCore\3.259.3.1\FSharp.Core.dll" - file source="$(PackagesFolder)\Microsoft.VisualFSharp.Core.Redist.1.0.0\content\.NETCore\3.259.3.1\FSharp.Core.optdata" - file source="$(PackagesFolder)\Microsoft.VisualFSharp.Core.Redist.1.0.0\content\.NETCore\3.259.3.1\FSharp.Core.sigdata" - file source="$(PackagesFolder)\Microsoft.VisualFSharp.Core.Redist.1.0.0\content\.NETCore\3.259.3.1\FSharp.Core.xml" + file source="$(PackagesFolder)\Microsoft.VisualFSharp.Core.Redist\1.0.0\content\.NETCore\3.259.3.1\FSharp.Core.dll" + file source="$(PackagesFolder)\Microsoft.VisualFSharp.Core.Redist\1.0.0\content\.NETCore\3.259.3.1\FSharp.Core.optdata" + file source="$(PackagesFolder)\Microsoft.VisualFSharp.Core.Redist\1.0.0\content\.NETCore\3.259.3.1\FSharp.Core.sigdata" + file source="$(PackagesFolder)\Microsoft.VisualFSharp.Core.Redist\1.0.0\content\.NETCore\3.259.3.1\FSharp.Core.xml" folder "3.259.4.0" - file source="$(PackagesFolder)\Microsoft.VisualFSharp.Core.Redist.1.0.0\content\.NETCore\3.259.4.0\FSharp.Core.dll" - file source="$(PackagesFolder)\Microsoft.VisualFSharp.Core.Redist.1.0.0\content\.NETCore\3.259.4.0\FSharp.Core.optdata" - file source="$(PackagesFolder)\Microsoft.VisualFSharp.Core.Redist.1.0.0\content\.NETCore\3.259.4.0\FSharp.Core.sigdata" - file source="$(PackagesFolder)\Microsoft.VisualFSharp.Core.Redist.1.0.0\content\.NETCore\3.259.4.0\FSharp.Core.xml" + file source="$(PackagesFolder)\Microsoft.VisualFSharp.Core.Redist\1.0.0\content\.NETCore\3.259.4.0\FSharp.Core.dll" + file source="$(PackagesFolder)\Microsoft.VisualFSharp.Core.Redist\1.0.0\content\.NETCore\3.259.4.0\FSharp.Core.optdata" + file source="$(PackagesFolder)\Microsoft.VisualFSharp.Core.Redist\1.0.0\content\.NETCore\3.259.4.0\FSharp.Core.sigdata" + file source="$(PackagesFolder)\Microsoft.VisualFSharp.Core.Redist\1.0.0\content\.NETCore\3.259.4.0\FSharp.Core.xml" folder "3.259.41.0" - file source="$(PackagesFolder)\Microsoft.Portable.FSharp.Core.10.1.0\lib\profiles\portable-net45+netcore45+wpa81+wp8\FSharp.Core.dll" - file source="$(PackagesFolder)\Microsoft.Portable.FSharp.Core.10.1.0\lib\profiles\portable-net45+netcore45+wpa81+wp8\FSharp.Core.optdata" - file source="$(PackagesFolder)\Microsoft.Portable.FSharp.Core.10.1.0\lib\profiles\portable-net45+netcore45+wpa81+wp8\FSharp.Core.sigdata" - file source="$(PackagesFolder)\Microsoft.Portable.FSharp.Core.10.1.0\lib\profiles\portable-net45+netcore45+wpa81+wp8\FSharp.Core.xml" + file source="$(PackagesFolder)\Microsoft.Portable.FSharp.Core\10.1.0\lib\profiles\portable-net45+netcore45+wpa81+wp8\FSharp.Core.dll" + file source="$(PackagesFolder)\Microsoft.Portable.FSharp.Core\10.1.0\lib\profiles\portable-net45+netcore45+wpa81+wp8\FSharp.Core.optdata" + file source="$(PackagesFolder)\Microsoft.Portable.FSharp.Core\10.1.0\lib\profiles\portable-net45+netcore45+wpa81+wp8\FSharp.Core.sigdata" + file source="$(PackagesFolder)\Microsoft.Portable.FSharp.Core\10.1.0\lib\profiles\portable-net45+netcore45+wpa81+wp8\FSharp.Core.xml" folder ".NETFramework\v4.0" folder "4.3.0.0" - file source="$(PackagesFolder)\Microsoft.VisualFSharp.Core.Redist.1.0.0\content\.NETFramework\v4.0\4.3.0.0\FSharp.Core.dll" - file source="$(PackagesFolder)\Microsoft.VisualFSharp.Core.Redist.1.0.0\content\.NETFramework\v4.0\4.3.0.0\FSharp.Core.optdata" - file source="$(PackagesFolder)\Microsoft.VisualFSharp.Core.Redist.1.0.0\content\.NETFramework\v4.0\4.3.0.0\FSharp.Core.sigdata" - file source="$(PackagesFolder)\Microsoft.VisualFSharp.Core.Redist.1.0.0\content\.NETFramework\v4.0\4.3.0.0\FSharp.Core.xml" + file source="$(PackagesFolder)\Microsoft.VisualFSharp.Core.Redist\1.0.0\content\.NETFramework\v4.0\4.3.0.0\FSharp.Core.dll" + file source="$(PackagesFolder)\Microsoft.VisualFSharp.Core.Redist\1.0.0\content\.NETFramework\v4.0\4.3.0.0\FSharp.Core.optdata" + file source="$(PackagesFolder)\Microsoft.VisualFSharp.Core.Redist\1.0.0\content\.NETFramework\v4.0\4.3.0.0\FSharp.Core.sigdata" + file source="$(PackagesFolder)\Microsoft.VisualFSharp.Core.Redist\1.0.0\content\.NETFramework\v4.0\4.3.0.0\FSharp.Core.xml" folder "4.3.1.0" - file source="$(PackagesFolder)\Microsoft.VisualFSharp.Core.Redist.1.0.0\content\.NETFramework\v4.0\4.3.1.0\FSharp.Core.dll" - file source="$(PackagesFolder)\Microsoft.VisualFSharp.Core.Redist.1.0.0\content\.NETFramework\v4.0\4.3.1.0\FSharp.Core.optdata" - file source="$(PackagesFolder)\Microsoft.VisualFSharp.Core.Redist.1.0.0\content\.NETFramework\v4.0\4.3.1.0\FSharp.Core.sigdata" - file source="$(PackagesFolder)\Microsoft.VisualFSharp.Core.Redist.1.0.0\content\.NETFramework\v4.0\4.3.1.0\FSharp.Core.xml" + file source="$(PackagesFolder)\Microsoft.VisualFSharp.Core.Redist\1.0.0\content\.NETFramework\v4.0\4.3.1.0\FSharp.Core.dll" + file source="$(PackagesFolder)\Microsoft.VisualFSharp.Core.Redist\1.0.0\content\.NETFramework\v4.0\4.3.1.0\FSharp.Core.optdata" + file source="$(PackagesFolder)\Microsoft.VisualFSharp.Core.Redist\1.0.0\content\.NETFramework\v4.0\4.3.1.0\FSharp.Core.sigdata" + file source="$(PackagesFolder)\Microsoft.VisualFSharp.Core.Redist\1.0.0\content\.NETFramework\v4.0\4.3.1.0\FSharp.Core.xml" folder "4.4.0.0" - file source="$(PackagesFolder)\Microsoft.VisualFSharp.Core.Redist.1.0.0\content\.NETFramework\v4.0\4.4.0.0\FSharp.Core.dll" - file source="$(PackagesFolder)\Microsoft.VisualFSharp.Core.Redist.1.0.0\content\.NETFramework\v4.0\4.4.0.0\FSharp.Core.optdata" - file source="$(PackagesFolder)\Microsoft.VisualFSharp.Core.Redist.1.0.0\content\.NETFramework\v4.0\4.4.0.0\FSharp.Core.sigdata" - file source="$(PackagesFolder)\Microsoft.VisualFSharp.Core.Redist.1.0.0\content\.NETFramework\v4.0\4.4.0.0\FSharp.Core.xml" + file source="$(PackagesFolder)\Microsoft.VisualFSharp.Core.Redist\1.0.0\content\.NETFramework\v4.0\4.4.0.0\FSharp.Core.dll" + file source="$(PackagesFolder)\Microsoft.VisualFSharp.Core.Redist\1.0.0\content\.NETFramework\v4.0\4.4.0.0\FSharp.Core.optdata" + file source="$(PackagesFolder)\Microsoft.VisualFSharp.Core.Redist\1.0.0\content\.NETFramework\v4.0\4.4.0.0\FSharp.Core.sigdata" + file source="$(PackagesFolder)\Microsoft.VisualFSharp.Core.Redist\1.0.0\content\.NETFramework\v4.0\4.4.0.0\FSharp.Core.xml" folder "4.4.1.0" - file source="$(PackagesFolder)\Microsoft.Portable.FSharp.Core.10.1.0\lib\versions\4.4.1.0\FSharp.Core.dll" - file source="$(PackagesFolder)\Microsoft.Portable.FSharp.Core.10.1.0\lib\versions\4.4.1.0\FSharp.Core.optdata" - file source="$(PackagesFolder)\Microsoft.Portable.FSharp.Core.10.1.0\lib\versions\4.4.1.0\FSharp.Core.sigdata" - file source="$(PackagesFolder)\Microsoft.Portable.FSharp.Core.10.1.0\lib\versions\4.4.1.0\FSharp.Core.xml" + file source="$(PackagesFolder)\Microsoft.Portable.FSharp.Core\10.1.0\lib\versions\4.4.1.0\FSharp.Core.dll" + file source="$(PackagesFolder)\Microsoft.Portable.FSharp.Core\10.1.0\lib\versions\4.4.1.0\FSharp.Core.optdata" + file source="$(PackagesFolder)\Microsoft.Portable.FSharp.Core\10.1.0\lib\versions\4.4.1.0\FSharp.Core.sigdata" + file source="$(PackagesFolder)\Microsoft.Portable.FSharp.Core\10.1.0\lib\versions\4.4.1.0\FSharp.Core.xml" folder "4.4.3.0" - file source="$(PackagesFolder)\FSharp.Core.4.3.4\lib\net45\FSharp.Core.dll" - file source="$(PackagesFolder)\FSharp.Core.4.3.4\lib\net45\FSharp.Core.optdata" - file source="$(PackagesFolder)\FSharp.Core.4.3.4\lib\net45\FSharp.Core.sigdata" - file source="$(PackagesFolder)\FSharp.Core.4.3.4\lib\net45\FSharp.Core.xml" + file source="$(PackagesFolder)\FSharp.Core\4.3.4\lib\net45\FSharp.Core.dll" + file source="$(PackagesFolder)\FSharp.Core\4.3.4\lib\net45\FSharp.Core.optdata" + file source="$(PackagesFolder)\FSharp.Core\4.3.4\lib\net45\FSharp.Core.sigdata" + file source="$(PackagesFolder)\FSharp.Core\4.3.4\lib\net45\FSharp.Core.xml" folder ".NETPortable" folder "2.3.5.0" - file source="$(PackagesFolder)\Microsoft.VisualFSharp.Core.Redist.1.0.0\content\.NETPortable\2.3.5.0\FSharp.Core.dll" - file source="$(PackagesFolder)\Microsoft.VisualFSharp.Core.Redist.1.0.0\content\.NETPortable\2.3.5.0\FSharp.Core.optdata" - file source="$(PackagesFolder)\Microsoft.VisualFSharp.Core.Redist.1.0.0\content\.NETPortable\2.3.5.0\FSharp.Core.sigdata" - file source="$(PackagesFolder)\Microsoft.VisualFSharp.Core.Redist.1.0.0\content\.NETPortable\2.3.5.0\FSharp.Core.xml" + file source="$(PackagesFolder)\Microsoft.VisualFSharp.Core.Redist\1.0.0\content\.NETPortable\2.3.5.0\FSharp.Core.dll" + file source="$(PackagesFolder)\Microsoft.VisualFSharp.Core.Redist\1.0.0\content\.NETPortable\2.3.5.0\FSharp.Core.optdata" + file source="$(PackagesFolder)\Microsoft.VisualFSharp.Core.Redist\1.0.0\content\.NETPortable\2.3.5.0\FSharp.Core.sigdata" + file source="$(PackagesFolder)\Microsoft.VisualFSharp.Core.Redist\1.0.0\content\.NETPortable\2.3.5.0\FSharp.Core.xml" folder "2.3.5.1" - file source="$(PackagesFolder)\Microsoft.VisualFSharp.Core.Redist.1.0.0\content\.NETPortable\2.3.5.1\FSharp.Core.dll" - file source="$(PackagesFolder)\Microsoft.VisualFSharp.Core.Redist.1.0.0\content\.NETPortable\2.3.5.1\FSharp.Core.optdata" - file source="$(PackagesFolder)\Microsoft.VisualFSharp.Core.Redist.1.0.0\content\.NETPortable\2.3.5.1\FSharp.Core.sigdata" - file source="$(PackagesFolder)\Microsoft.VisualFSharp.Core.Redist.1.0.0\content\.NETPortable\2.3.5.1\FSharp.Core.xml" + file source="$(PackagesFolder)\Microsoft.VisualFSharp.Core.Redist\1.0.0\content\.NETPortable\2.3.5.1\FSharp.Core.dll" + file source="$(PackagesFolder)\Microsoft.VisualFSharp.Core.Redist\1.0.0\content\.NETPortable\2.3.5.1\FSharp.Core.optdata" + file source="$(PackagesFolder)\Microsoft.VisualFSharp.Core.Redist\1.0.0\content\.NETPortable\2.3.5.1\FSharp.Core.sigdata" + file source="$(PackagesFolder)\Microsoft.VisualFSharp.Core.Redist\1.0.0\content\.NETPortable\2.3.5.1\FSharp.Core.xml" folder "3.47.4.0" - file source="$(PackagesFolder)\Microsoft.VisualFSharp.Core.Redist.1.0.0\content\.NETPortable\3.47.4.0\FSharp.Core.dll" - file source="$(PackagesFolder)\Microsoft.VisualFSharp.Core.Redist.1.0.0\content\.NETPortable\3.47.4.0\FSharp.Core.optdata" - file source="$(PackagesFolder)\Microsoft.VisualFSharp.Core.Redist.1.0.0\content\.NETPortable\3.47.4.0\FSharp.Core.sigdata" - file source="$(PackagesFolder)\Microsoft.VisualFSharp.Core.Redist.1.0.0\content\.NETPortable\3.47.4.0\FSharp.Core.xml" + file source="$(PackagesFolder)\Microsoft.VisualFSharp.Core.Redist\1.0.0\content\.NETPortable\3.47.4.0\FSharp.Core.dll" + file source="$(PackagesFolder)\Microsoft.VisualFSharp.Core.Redist\1.0.0\content\.NETPortable\3.47.4.0\FSharp.Core.optdata" + file source="$(PackagesFolder)\Microsoft.VisualFSharp.Core.Redist\1.0.0\content\.NETPortable\3.47.4.0\FSharp.Core.sigdata" + file source="$(PackagesFolder)\Microsoft.VisualFSharp.Core.Redist\1.0.0\content\.NETPortable\3.47.4.0\FSharp.Core.xml" folder "3.47.41.0" - file source="$(PackagesFolder)\Microsoft.Portable.FSharp.Core.10.1.0\lib\profiles\portable-net45+sl5+netcore45\FSharp.Core.dll" - file source="$(PackagesFolder)\Microsoft.Portable.FSharp.Core.10.1.0\lib\profiles\portable-net45+sl5+netcore45\FSharp.Core.optdata" - file source="$(PackagesFolder)\Microsoft.Portable.FSharp.Core.10.1.0\lib\profiles\portable-net45+sl5+netcore45\FSharp.Core.sigdata" - file source="$(PackagesFolder)\Microsoft.Portable.FSharp.Core.10.1.0\lib\profiles\portable-net45+sl5+netcore45\FSharp.Core.xml" + file source="$(PackagesFolder)\Microsoft.Portable.FSharp.Core\10.1.0\lib\profiles\portable-net45+sl5+netcore45\FSharp.Core.dll" + file source="$(PackagesFolder)\Microsoft.Portable.FSharp.Core\10.1.0\lib\profiles\portable-net45+sl5+netcore45\FSharp.Core.optdata" + file source="$(PackagesFolder)\Microsoft.Portable.FSharp.Core\10.1.0\lib\profiles\portable-net45+sl5+netcore45\FSharp.Core.sigdata" + file source="$(PackagesFolder)\Microsoft.Portable.FSharp.Core\10.1.0\lib\profiles\portable-net45+sl5+netcore45\FSharp.Core.xml" diff --git a/setup/Swix/Microsoft.FSharp.SDK/Microsoft.FSharp.SDK.swixproj b/setup/Swix/Microsoft.FSharp.SDK/Microsoft.FSharp.SDK.swixproj index 9256eadc32f..aac26eaaa0d 100644 --- a/setup/Swix/Microsoft.FSharp.SDK/Microsoft.FSharp.SDK.swixproj +++ b/setup/Swix/Microsoft.FSharp.SDK/Microsoft.FSharp.SDK.swixproj @@ -1,24 +1,15 @@ - + + + + - ..\..\..\src - neutral - false - vsix Microsoft.FSharp.SDK - true - Debug - $(FSharpSourcesRoot)\..\$(Configuration) - $(FSharpSourcesRoot)\..\packages - $(BinariesFolder)\insertion - $(MSBuildThisFileDirectory)obj - - - $(PackagePreprocessorDefinitions);PackagesFolder=$(PackagesFolder) + $(PackagePreprocessorDefinitions);PackagesFolder=$(NuGetPackageRoot) $(PackagePreprocessorDefinitions);FSharpPackageVersion=$(FSharpPackageVersion) @@ -30,7 +21,6 @@ - - - + + diff --git a/setup/Swix/Microsoft.FSharp.Vsix.Resources/Microsoft.FSharp.Vsix.Resources.swixproj b/setup/Swix/Microsoft.FSharp.Vsix.Resources/Microsoft.FSharp.Vsix.Resources.swixproj index 2277444e075..fd39c147b4c 100644 --- a/setup/Swix/Microsoft.FSharp.Vsix.Resources/Microsoft.FSharp.Vsix.Resources.swixproj +++ b/setup/Swix/Microsoft.FSharp.Vsix.Resources/Microsoft.FSharp.Vsix.Resources.swixproj @@ -1,20 +1,12 @@ - + + + + - ..\..\..\src - neutral - false - true - Debug - $(FSharpSourcesRoot)\..\$(Configuration) - $(BinariesFolder)\insertion Microsoft.FSharp.VSIX.Full.Resources.$(LocaleCode) - $(MSBuildThisFileDirectory)obj - vsix - - $(PackagePreprocessorDefinitions);BinariesFolder=$(BinariesFolder) @@ -26,15 +18,16 @@ $(PackagePreprocessorDefinitions);LocaleSpecificCulture=$(LocaleSpecificCulture) $(PackagePreprocessorDefinitions);IsLangPack=$(IsLangPack) - + - + + @@ -45,7 +38,6 @@ - - - + + diff --git a/setup/Swix/Microsoft.FSharp.vsmanproj b/setup/Swix/Microsoft.FSharp.vsmanproj index f89afddafa0..d2b0388c272 100644 --- a/setup/Swix/Microsoft.FSharp.vsmanproj +++ b/setup/Swix/Microsoft.FSharp.vsmanproj @@ -1,44 +1,42 @@ - + - + - - ..\..\src - true - true - true - $(FSharpSourcesRoot)\..\$(Configuration)\insertion - $(OutputPath) - $(FSharpPackageVersion) - + + true + true + $(OutputPath) + $(FSharpPackageVersion) + - - - - - - + + + + + + - + + + - - - + + + + - - - - + - + + + + + + + + - - + - - - - - - \ No newline at end of file + diff --git a/setup/build-insertion.proj b/setup/build-insertion.proj index 35496258dee..b132d3edfea 100644 --- a/setup/build-insertion.proj +++ b/setup/build-insertion.proj @@ -1,47 +1,47 @@ - - - - + + + + + + . + Debug + + + + + + Swix\Microsoft.FSharp.SDK\Microsoft.FSharp.SDK.swixproj + + + Swix\Microsoft.FSharp.Compiler\Microsoft.FSharp.Compiler.swixproj + + + + + + + + + - . - net40 - Debug + AssemblySearchPaths={HintPathFromItem};{TargetFrameworkDirectory};{RawFileName} + + + + + + + + + + + + - - - - - - Swix\Microsoft.FSharp.SDK\Microsoft.FSharp.SDK.swixproj - - - Swix\Microsoft.FSharp.Compiler\Microsoft.FSharp.Compiler.swixproj - - - - - - - - - - - AssemblySearchPaths={HintPathFromItem};{TargetFrameworkDirectory};{RawFileName} - - - - - - - - - - - diff --git a/setup/fsharp-setup-build.csproj b/setup/fsharp-setup-build.csproj new file mode 100644 index 00000000000..7968f56c51b --- /dev/null +++ b/setup/fsharp-setup-build.csproj @@ -0,0 +1,70 @@ + + + + + + net46 + + + + + + + + + + + + + + + + + + + ..\vsintegration\Vsix\VisualFSharpFull\VisualFSharpFull.csproj + + + ..\vsintegration\Vsix\VisualFSharpTemplates\VisualFSharpTemplates.csproj + + + + + + + + + + Swix\Microsoft.FSharp.Dependencies\Microsoft.FSharp.Dependencies.swixproj + + + Swix\Microsoft.FSharp.IDE\Microsoft.FSharp.IDE.swixproj + + + + + + + + + + + + + + + AssemblySearchPaths={HintPathFromItem};{TargetFrameworkDirectory};{RawFileName} + + + + + + diff --git a/setup/fsharp-setup-build.proj b/setup/fsharp-setup-build.proj deleted file mode 100644 index e56e3191bd1..00000000000 --- a/setup/fsharp-setup-build.proj +++ /dev/null @@ -1,59 +0,0 @@ - - - - - - - . - net40 - Debug - - - - - - - - ..\vsintegration\Vsix\VisualFSharpFull\VisualFSharpFull.csproj - - - ..\vsintegration\Vsix\VisualFSharpTemplates\VisualFSharpTemplates.csproj - - - - - - - - - - Swix\Microsoft.FSharp.Dependencies\Microsoft.FSharp.Dependencies.swixproj - - - Swix\Microsoft.FSharp.IDE\Microsoft.FSharp.IDE.swixproj - - - - - - - AssemblySearchPaths={HintPathFromItem};{TargetFrameworkDirectory};{RawFileName} - - - - - - - - - - - - - diff --git a/setup/packages.config b/setup/packages.config deleted file mode 100644 index f6caa5c2da4..00000000000 --- a/setup/packages.config +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - - - - - - - - - diff --git a/src/Directory.Build.props b/src/Directory.Build.props new file mode 100644 index 00000000000..bb8eac309b1 --- /dev/null +++ b/src/Directory.Build.props @@ -0,0 +1,3 @@ + + + diff --git a/src/Directory.Build.targets b/src/Directory.Build.targets new file mode 100644 index 00000000000..ccd47cc0a9a --- /dev/null +++ b/src/Directory.Build.targets @@ -0,0 +1,3 @@ + + + diff --git a/src/FSharpSource.Profiles.targets b/src/FSharpSource.Profiles.targets deleted file mode 100644 index 3dc3cdd5fb3..00000000000 --- a/src/FSharpSource.Profiles.targets +++ /dev/null @@ -1,57 +0,0 @@ - - - - - - $(DefineConstants);CROSS_PLATFORM_COMPILER - $(DefineConstants);ENABLE_MONO_SUPPORT - $(DefineConstants);BE_SECURITY_TRANSPARENT - $(DefineConstants);FX_LCIDFROMCODEPAGE - - - - - - - $(DefineConstants);NETSTANDARD - $(DefineConstants);NETSTANDARD1_6 - $(DefineConstants);FX_NO_APP_DOMAINS - $(DefineConstants);FX_NO_ARRAY_LONG_LENGTH - $(DefineConstants);FX_NO_BEGINEND_READWRITE - $(DefineConstants);FX_NO_BINARY_SERIALIZATION - $(DefineConstants);FX_NO_CONVERTER - $(DefineConstants);FX_NO_DEFAULT_DEPENDENCY_TYPE - $(DefineConstants);FX_NO_CORHOST_SIGNER - $(DefineConstants);FX_NO_EVENTWAITHANDLE_IDISPOSABLE - $(DefineConstants);FX_NO_EXIT_CONTEXT_FLAGS - $(DefineConstants);FX_NO_HEAPTERMINATION - $(DefineConstants);FX_NO_LINKEDRESOURCES - $(DefineConstants);FX_NO_LOADER_OPTIMIZATION - $(DefineConstants);FX_NO_PARAMETERIZED_THREAD_START - $(DefineConstants);FX_NO_PDB_READER - $(DefineConstants);FX_NO_PDB_WRITER - $(DefineConstants);FX_NO_REFLECTION_MODULE_HANDLES - $(DefineConstants);FX_NO_REFLECTION_ONLY - $(DefineConstants);FX_NO_RUNTIMEENVIRONMENT - $(DefineConstants);FX_NO_SECURITY_PERMISSIONS - $(DefineConstants);FX_NO_SERVERCODEPAGES - $(DefineConstants);FX_NO_SYMBOLSTORE - $(DefineConstants);FX_NO_SYSTEM_CONFIGURATION - $(DefineConstants);FX_NO_THREAD - $(DefineConstants);FX_NO_THREADABORT - $(DefineConstants);FX_NO_WAITONE_MILLISECONDS - $(DefineConstants);FX_NO_WEB_CLIENT - $(DefineConstants);FX_NO_WIN_REGISTRY - $(DefineConstants);FX_NO_WINFORMS - $(DefineConstants);FX_NO_INDENTED_TEXT_WRITER - $(DefineConstants);FX_REDUCED_EXCEPTIONS - $(DefineConstants);FX_REDUCED_CONSOLE - $(DefineConstants);FX_RESHAPED_REFEMIT - $(DefineConstants);FX_RESHAPED_GLOBALIZATION - $(DefineConstants);FX_RESHAPED_REFLECTION - $(DefineConstants);FX_RESHAPED_MSBUILD - $(OtherFlags) --simpleresolution - netstandard1.6 - - - diff --git a/src/FSharpSource.Settings.targets b/src/FSharpSource.Settings.targets deleted file mode 100644 index 3f0d657a9b5..00000000000 --- a/src/FSharpSource.Settings.targets +++ /dev/null @@ -1,174 +0,0 @@ - - - - - - - Debug - $(ConfigurationGroup) - $(TargetGroup)_$(Configuration) - $(OSGroup)_$(Configuration) - - - - Debug - Release - Debug - - - - - - - - true - net40 - - - net40 - FSharp - true - true - true - - - - obj\$(Configuration)\$(TargetDotnetProfile)\ - obj\$(Configuration)\$(TargetDotnetProfile)\$(PortableProfileBeingReferenced)\ - - - obj\$(Configuration)\$(TargetDotnetProfile)\ - obj\$(Configuration)\$(TargetDotnetProfile)\$(PortableProfileBeingReferenced)\ - - - 10.1.0 - 10.2.0 - 10.2 - - - 3.5.0 - 3.5.0.0 - $(FSharpSourcesRoot)\..\packages\NUnit.$(NUnitVersion)\lib\net45 - - true - - $(MSBuildThisFileDirectory)..\Tools\dependencyUptake\PackageVersions.props - - - true - true - 0.2.0-beta-000081 - - - - - - - - false - true - true - $(FSharpSourcesRoot)\fsharp\msft.pubkey - true - true - - - - - true - false - true - $(MSBuildThisFileDirectory)..\packages\Microsoft.VSSDK.BuildTools.$(MicrosoftVSSDKBuildToolsPackageVersion)\tools\vssdk - $(MSBuildThisFileDirectory)..\packages\Microsoft.VSSDK.BuildTools.$(MicrosoftVSSDKBuildToolsPackageVersion)\tools\vssdk\bin - $(MSBuildThisFileDirectory)..\packages\Microsoft.VSSDK.BuildTools.$(MicrosoftVSSDKBuildToolsPackageVersion)\tools\vssdk\Microsoft.VsSDK.targets - $(MSBuildThisFileDirectory)..\packages\Microsoft.VSSDK.BuildTools.$(MicrosoftVSSDKBuildToolsPackageVersion)\tools\vssdk\inc - $(MSBuildThisFileDirectory)..\packages\Microsoft.VSSDK.BuildTools.$(MicrosoftVSSDKBuildToolsPackageVersion)\tools\vssdk\schemas\VSIXManifestSchema.xsd - - - - - $(OtherFlags) --times - $(NoWarn);69;65;54;61;75 - - - - - full - portable - - false - prompt - $(OtherFlags) --no-jit-optimize - true - DEBUG;TRACE;CODE_ANALYSIS;$(DefineConstants) - DEBUG=True,TRACE=True,CODE_ANALYSIS=True,$(DefineConstants) - - - - - pdbonly - portable - - true - false - prompt - TRACE;$(DefineConstants) - TRACE=True,$(DefineConstants) - - - - - full - portable - true - DEBUG;NO_STRONG_NAMES;$(DefineConstants) - - - - - bin\$(Configuration) - 3 - - - - - $([System.DateTime]::Now.ToString(`yyMMdd`)) - 1.0.0 - $(NuGetReleaseVersion)-rc - $(NuGetPreReleaseVersion)-$(BuildRevision.Trim()) - $(MSBuildThisFileDirectory)..\packages - $(NUGET_PACKAGES) - - - - - $(FSharpSourcesRoot)\..\packages\FsLexYacc.7.0.6\build - $(FSharpSourcesRoot)\..\packages\FsLexYacc.7.0.6\build - fsi.exe - fslex.exe - fsyacc.exe - - - - $(FSharpSourcesRoot)\..\packages\FSharp.Compiler.Tools.4.1.27\tools - - - - 14.0.0.0 - - - - - - - - en;$(XlfLanguages) - - - - - - - diff --git a/src/FSharpSource.targets b/src/FSharpSource.targets deleted file mode 100644 index 1d513b81e87..00000000000 --- a/src/FSharpSource.targets +++ /dev/null @@ -1,383 +0,0 @@ - - - - - - $(MSBuildThisFileDirectory)..\ - - - - fs - - - - - - true - false - false - NO_STRONG_NAMES;$(DefineConstants) - - - - - $(FSharpSourcesRoot)\fsharp\test.snk - false - STRONG_NAME_FSHARP_COMPILER_WITH_TEST_KEY;$(DefineConstants) - - - - - $(FSCoreVersion) - $(OtherFlags) --version:"$(MicroBuildAssemblyVersion)" - - - - $(IntermediateOutputPath)source_link.json - - - - - MSBUILD_AT_LEAST_14;$(DefineConstants) - - - - - false - - - - $(FSharpSourcesRoot)\..\packages - 3.0.0-alpha3 - 3.0.0.0 - $(FSharpSourcesRoot)\..\packages\FsCheck.$(FsCheckVersion)\lib\ - - - - - - v4.6 - - - - - - netcore - - v5.0 - false - .NETStandard,Version=v1.6 - true - - - - bin\$(Configuration)\netcoreapp1.0 - true - true - win7-x64 - $(FSharpSourcesRoot)\..\tests\testbin\$(Configuration)\coreclr\$(AssemblyName) - Exe - .dll - - - - true - $(FSharpSourcesRoot)\..\tests\testbin\$(Configuration)\coreclr\FSC - true - $(FSharpSourcesRoot)\..\tests\testbin\$(Configuration)\coreclr\FSC - - - - - $(TargetDotnetProfile) - fsharp30\$(TargetDotnetProfile) - fsharp31\$(TargetDotnetProfile) - fsharp40\$(TargetDotnetProfile) - $(TargetDotnetProfile) - obj\$(Configuration)\$(TargetFrameworkOutputDirectory)\ - - - - - - $(FSharpSourcesRoot)\..\$(Configuration)\$(ProtoFlavour)\bin - - $([System.IO.File]::ReadAllText('$(MSBuildThisFileDirectory)..\DotnetCLIToolsVersion.txt').Trim()) - $(MSBuildThisFileDirectory)..\Tools\dotnet20\sdk\$(DotnetSdkVersion)\FSharp - - - ..\packages\FSharp.Compiler.Tools.4.1.27\tools\Microsoft.FSharp.Targets - - - $(FSharpSourcesRoot)\..\Tools\dotnet20 - dotnet.exe - dotnet - $(FSharpNetCoreLkgPath)\fsc.exe - - - - - - $(FSharpSourcesRoot)\..\$(Configuration)\$(ProtoFlavour)\bin - ..\packages\FSharp.Compiler.Tools.4.1.27\tools\Microsoft.FSharp.Targets - - - - - - $(FSharpSourcesRoot)\..\$(Configuration)\$(TargetFrameworkOutputDirectory)\bin - $(FSharpSourcesRoot)\..\Proto\$(ProtoFlavour)\bin - fsc.exe - ..\Proto\$(ProtoFlavour)\bin\Microsoft.Portable.FSharp.targets - - - - - - $(FSharpSourcesRoot)\..\$(Configuration)\$(TargetFrameworkOutputDirectory)\bin - $(FSharpSourcesRoot)\..\Proto\$(ProtoFlavour)\bin - fsc.exe - ..\Proto\$(ProtoFlavour)\bin\Microsoft.FSharp.Targets - - - - - - ValidateBuildTools;$(CompileDependsOn) - - - - - - - - - - - - - - - - - - - - - - - - - - $(NUGET_PACKAGES) - - $(FSharpSourcesRoot)\..\.nuget\ - -ConfigFile "$(NuGetConfigFile)" - "$(NuGetToolPath)NuGet.exe install -OutputDirectory "$(PackagesDir)" -Config "$(NuGetToolPath)..\NuGet.Config" - "$(NuGetToolPath)NuGet.exe" restore -OutputDirectory "$(PackagesDir)" -Config "$(NuGetToolPath)..\NuGet.Config" - - - true - - - - - - $(OutputPath)$(AssemblyName).xml - - - - https://github.com/Microsoft/visualfsharp/blob/master/License.txt - https://github.com/Microsoft/visualfsharp - $(NuGetPerBuildPreReleaseVersion) - Microsoft - Visual F# Compiler FSharp coreclr functional programming - - - - - $(CompileDependsOn);CopyAndSubstituteTextFiles - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $([System.IO.Directory]::GetParent($(MSBuildThisFileDirectory.TrimEnd("\")))) - $(SrcRootDirectory.Replace("\", "\\")) - - - - - - - - - - - - - - $([System.IO.Path]::GetDirectoryName($(BuildVersionFilePath))) - - - - - - - - $([System.IO.Path]::GetDirectoryName($(BuildVersionFilePath))) - $(NuGetPerBuildPreReleaseVersion) - $([MSBuild]::Add($(PackageVersionMinor), 1)) - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/Microbuild.Settings.targets b/src/Microbuild.Settings.targets deleted file mode 100644 index 6e11e3f2206..00000000000 --- a/src/Microbuild.Settings.targets +++ /dev/null @@ -1,13 +0,0 @@ - - - - - 0.2.0 - - - - - - - - diff --git a/src/buildfromsource/BuildFromSource.targets b/src/buildfromsource/BuildFromSource.targets index bfcd3d48e82..223415a1a9b 100644 --- a/src/buildfromsource/BuildFromSource.targets +++ b/src/buildfromsource/BuildFromSource.targets @@ -34,7 +34,6 @@ net40 - diff --git a/src/buildfromsource/Directory.Build.targets b/src/buildfromsource/Directory.Build.targets new file mode 100644 index 00000000000..ea0ce741b15 --- /dev/null +++ b/src/buildfromsource/Directory.Build.targets @@ -0,0 +1,5 @@ + + + + + diff --git a/src/buildfromsource/FSharp.Compiler.nuget/FSharp.Compiler.nuget.fsproj b/src/buildfromsource/FSharp.Compiler.nuget/FSharp.Compiler.nuget.fsproj index 92144d8db07..0a6b022ba75 100644 --- a/src/buildfromsource/FSharp.Compiler.nuget/FSharp.Compiler.nuget.fsproj +++ b/src/buildfromsource/FSharp.Compiler.nuget/FSharp.Compiler.nuget.fsproj @@ -25,7 +25,7 @@ - $(FSharpSourcesRoot)\fsharp\FSharp.Compiler.nuget\Microsoft.FSharp.Compiler.nuspec + Microsoft.FSharp.Compiler.nuspec licenseUrl=$(PackageLicenceUrl);version=$(PackageVersion);authors=$(PackageAuthors);projectUrl=$(PackageProjectUrl);tags=$(PackageTags) $(OutputPath)/$(TargetFramework) diff --git a/src/fsharp/FSharp.Compiler.nuget/Testing.FSharp.Compiler.nuspec b/src/buildfromsource/FSharp.Compiler.nuget/Microsoft.FSharp.Compiler.nuspec similarity index 52% rename from src/fsharp/FSharp.Compiler.nuget/Testing.FSharp.Compiler.nuspec rename to src/buildfromsource/FSharp.Compiler.nuget/Microsoft.FSharp.Compiler.nuspec index d2dd36b3174..d77c01e9ecc 100644 --- a/src/fsharp/FSharp.Compiler.nuget/Testing.FSharp.Compiler.nuspec +++ b/src/buildfromsource/FSharp.Compiler.nuget/Microsoft.FSharp.Compiler.nuspec @@ -1,9 +1,11 @@ - Testing.FSharp.Compiler + Microsoft.FSharp.Compiler - Test deployable versionthe fsharp compiler fsc.exe. Supported Platforms: - .NET Core (.netstandard1.6) + .NET Core compatible version of the F# compiler fsc.exe. + Supported Platforms: - .NET Core (.netstandard2.0). + Commit hash: $githeadsha$. en-US true @@ -13,53 +15,69 @@ $projectUrl$ $tags$ - - - + + + - - - - - - - + + + + + + - - - - - - - + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/buildfromsource/FSharp.Core/FSharp.Core.fsproj b/src/buildfromsource/FSharp.Core/FSharp.Core.fsproj index 29030516ebd..fae084de12a 100644 --- a/src/buildfromsource/FSharp.Core/FSharp.Core.fsproj +++ b/src/buildfromsource/FSharp.Core/FSharp.Core.fsproj @@ -25,7 +25,7 @@ Primitives/prim-types-prelude.fs - + Primitives/SR.fs diff --git a/src/fsharp/FSharp.Core/SR.fs b/src/buildfromsource/FSharp.Core/SR.fs similarity index 100% rename from src/fsharp/FSharp.Core/SR.fs rename to src/buildfromsource/FSharp.Core/SR.fs diff --git a/src/buildfromsource/Fsc/Fsc.fsproj b/src/buildfromsource/Fsc/Fsc.fsproj index d1b1bfa2f80..c5178aaca2e 100644 --- a/src/buildfromsource/Fsc/Fsc.fsproj +++ b/src/buildfromsource/Fsc/Fsc.fsproj @@ -29,7 +29,6 @@ - diff --git a/src/buildfromsource/targets/PackageVersions.props b/src/buildfromsource/targets/PackageVersions.props index e4f39318bac..afb00824fb9 100644 --- a/src/buildfromsource/targets/PackageVersions.props +++ b/src/buildfromsource/targets/PackageVersions.props @@ -22,10 +22,11 @@ 4.4.0 - 15.1.548 - 15.1.548 - 15.1.548 - 15.1.548 + 15.8.166 + $(MicrosoftBuildOverallPackagesVersion) + $(MicrosoftBuildOverallPackagesVersion) + $(MicrosoftBuildOverallPackagesVersion) + $(MicrosoftBuildOverallPackagesVersion) 4.3.0 diff --git a/src/buildtools/Directory.Build.props b/src/buildtools/Directory.Build.props new file mode 100644 index 00000000000..bb5b23d29d0 --- /dev/null +++ b/src/buildtools/Directory.Build.props @@ -0,0 +1,3 @@ + + + diff --git a/src/buildtools/Directory.Build.targets b/src/buildtools/Directory.Build.targets new file mode 100644 index 00000000000..bb5b23d29d0 --- /dev/null +++ b/src/buildtools/Directory.Build.targets @@ -0,0 +1,3 @@ + + + diff --git a/src/buildtools/buildtools.proj b/src/buildtools/buildtools.proj new file mode 100644 index 00000000000..593f086dd07 --- /dev/null +++ b/src/buildtools/buildtools.proj @@ -0,0 +1,32 @@ + + + + Debug + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/buildtools/buildtools.targets b/src/buildtools/buildtools.targets index f82f981542c..9285a376e88 100644 --- a/src/buildtools/buildtools.targets +++ b/src/buildtools/buildtools.targets @@ -1,69 +1,56 @@ - + $(DotNetExe) + + + + + + + $(MSBuildThisFileDirectory)fslex\bin\Proto\netcoreapp2.0\fslex.dll + + + + + + + + + + + + + + + + + + + $(MSBuildThisFileDirectory)fsyacc\bin\Proto\netcoreapp2.0\fsyacc.dll + + + + + + + + + + + + + -WARNING: DO NOT MODIFY this file unless you are knowledgeable about MSBuild and have - created a backup copy. Incorrect changes to this file will make it - impossible to load or build your projects from the command-line or the IDE. - -PowerPack build rules. - -Copyright (C) Microsoft Corporation. All rights reserved. -*********************************************************************************************** ---> - - - - CallFsLex;CallFsYacc;$(CompileDependsOn) - $(MSBuildThisFileDirectory) - fslex.exe - $(MSBuildThisFileDirectory) - fsyacc.exe - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - false - - - false - - - - diff --git a/src/buildtools/fslex/fslex.fs b/src/buildtools/fslex/fslex.fs index 46795d728ef..d2f1af826bd 100644 --- a/src/buildtools/fslex/fslex.fs +++ b/src/buildtools/fslex/fslex.fs @@ -67,7 +67,8 @@ let sentinel = 255 * 256 + 255 let lineCount = ref 0 let cfprintfn (os: #TextWriter) fmt = Printf.kfprintf (fun () -> incr lineCount; os.WriteLine()) os fmt -let main() = +[] +let main(args: string[]) = try let filename = (match !input with Some x -> x | None -> failwith "no input given") let domain = if !unicode then "Unicode" else "Ascii" @@ -216,10 +217,8 @@ let main() = printLinesIfCodeDefined spec.BottomCode cfprintfn os "# 3000000 \"%s\"" output; + 0 with e -> eprintf "FSLEX: error FSL000: %s" (match e with Failure s -> s | e -> e.ToString()); exit 1 - - -let result = main() diff --git a/src/buildtools/fslex/fslex.fsproj b/src/buildtools/fslex/fslex.fsproj index 9fba6aab33f..9e21a860d8c 100644 --- a/src/buildtools/fslex/fslex.fsproj +++ b/src/buildtools/fslex/fslex.fsproj @@ -1,12 +1,22 @@ - + + Exe netcoreapp2.0 INTERNALIZED_FSLEXYACC_RUNTIME;$(DefineConstant) - + + + + + + + + + + diff --git a/src/buildtools/fslex/fslex.fsx b/src/buildtools/fslex/fslex.fsx deleted file mode 100644 index 82e434bcbbe..00000000000 --- a/src/buildtools/fslex/fslex.fsx +++ /dev/null @@ -1,3 +0,0 @@ -#load "Lexing.fsi" "Lexing.fs" "Parsing.fsi" "Parsing.fs" "Arg.fsi" "Arg.fs" "fslexast.fs" "fslexpars.fs" "fslexlex.fs" "fslex.fs" - -let v = FsLexYacc.FsLex.Driver.result diff --git a/src/buildtools/fssrgen/fssrgen.fsproj b/src/buildtools/fssrgen/fssrgen.fsproj deleted file mode 100644 index d6d06d53dfe..00000000000 --- a/src/buildtools/fssrgen/fssrgen.fsproj +++ /dev/null @@ -1,12 +0,0 @@ - - - - netcoreapp2.0 - COMPILED;$(DefineConstant) - - - - - - - diff --git a/src/buildtools/fssrgen/fssrgen.fsx b/src/buildtools/fssrgen/fssrgen.fsx deleted file mode 100644 index 4fe5bbb38e1..00000000000 --- a/src/buildtools/fssrgen/fssrgen.fsx +++ /dev/null @@ -1,476 +0,0 @@ -// Copyright (c) Microsoft Corporation. All Rights Reserved. See License.txt in the project root for license information. -let PrintErr(filename, line, msg) = - printfn "%s(%d): error : %s" filename line msg - -let Err(filename, line, msg) = - PrintErr(filename, line, msg) - printfn "Note that the syntax of each line is one of these three alternatives:" - printfn "# comment" - printfn "ident,\"string\"" - printfn "errNum,ident,\"string\"" - failwith (sprintf "there were errors in the file '%s'" filename) - -let xmlBoilerPlateString = @" - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - -" - - -type HoleType = string - - -// The kinds of 'holes' we can do -let ComputeHoles filename lineNum (txt:string) : ResizeArray * string = - // takes in a %d%s kind of string, returns array of HoleType and {0}{1} kind of string - let mutable i = 0 - let mutable holeNumber = 0 - let mutable holes = ResizeArray() // order - let sb = new System.Text.StringBuilder() - let AddHole holeType = - sb.Append(sprintf "{%d}" holeNumber) |> ignore - holeNumber <- holeNumber + 1 - holes.Add(holeType) - while i < txt.Length do - if txt.[i] = '%' then - if i+1 = txt.Length then - Err(filename, lineNum, "(at end of string) % must be followed by d, f, s, or %") - else - match txt.[i+1] with - | 'd' -> AddHole "System.Int32" - | 'f' -> AddHole "System.Double" - | 's' -> AddHole "System.String" - | '%' -> sb.Append('%') |> ignore - | c -> Err(filename, lineNum, sprintf "'%%%c' is not a valid sequence, only %%d %%f %%s or %%%%" c) - i <- i + 2 - else - match txt.[i] with - | '{' -> sb.Append "{{" |> ignore - | '}' -> sb.Append "}}" |> ignore - | c -> sb.Append c |> ignore - i <- i + 1 - //printfn "holes.Length = %d, lineNum = %d" holes.Length //lineNum txt - (holes, sb.ToString()) - -let Unquote (s : string) = - if s.StartsWith "\"" && s.EndsWith "\"" then s.Substring(1, s.Length - 2) - else failwith "error message string should be quoted" - -let ParseLine filename lineNum (txt:string) = - let mutable errNum = None - let identB = new System.Text.StringBuilder() - let mutable i = 0 - // parse optional error number - if i < txt.Length && System.Char.IsDigit txt.[i] then - let numB = new System.Text.StringBuilder() - while i < txt.Length && System.Char.IsDigit txt.[i] do - numB.Append txt.[i] |> ignore - i <- i + 1 - errNum <- Some(int (numB.ToString())) - if i = txt.Length || not(txt.[i] = ',') then - Err(filename, lineNum, sprintf "After the error number '%d' there should be a comma" errNum.Value) - // Skip the comma - i <- i + 1 - // parse short identifier - if i < txt.Length && not(System.Char.IsLetter(txt.[i])) then - Err(filename, lineNum, sprintf "The first character in the short identifier should be a letter, but found '%c'" txt.[i]) - while i < txt.Length && System.Char.IsLetterOrDigit txt.[i] do - identB.Append txt.[i] |> ignore - i <- i + 1 - let ident = identB.ToString() - if ident.Length = 0 then - Err(filename, lineNum, "Did not find the short identifier") - else - if i = txt.Length || not(txt.[i] = ',') then - Err(filename, lineNum, sprintf "After the identifier '%s' there should be a comma" ident) - else - // Skip the comma - i <- i + 1 - if i = txt.Length then - Err(filename, lineNum, sprintf "After the identifier '%s' and comma, there should be the quoted string resource" ident) - else - let str = - try - System.String.Format(Unquote(txt.Substring i)) // Format turns e.g '\n' into that char, but also requires that we 'escape' curlies in the original .txt file, e.g. "{{" - with - e -> Err(filename, lineNum, sprintf "Error calling System.String.Format (note that curly braces must be escaped, and there cannot be trailing space on the line): >>>%s<<< -- %s" (txt.Substring i) e.Message) - let holes, netFormatString = ComputeHoles filename lineNum str - (lineNum, (errNum,ident), str, holes.ToArray(), netFormatString) - -let stringBoilerPlatePrefix = @" -open Microsoft.FSharp.Core.LanguagePrimitives.IntrinsicOperators -open Microsoft.FSharp.Reflection -open System.Reflection -// (namespaces below for specific case of using the tool to compile FSharp.Core itself) -open Microsoft.FSharp.Core -open Microsoft.FSharp.Core.Operators -open Microsoft.FSharp.Text -open Microsoft.FSharp.Collections -open Printf -" -let StringBoilerPlate filename = - - @" - // BEGIN BOILERPLATE - - static let getCurrentAssembly () = - #if FX_RESHAPED_REFLECTION - typeof.GetTypeInfo().Assembly - #else - System.Reflection.Assembly.GetExecutingAssembly() - #endif - - static let getTypeInfo (t: System.Type) = - #if FX_RESHAPED_REFLECTION - t.GetTypeInfo() - #else - t - #endif - - static let resources = lazy (new System.Resources.ResourceManager(""" + filename + @""", getCurrentAssembly())) - - static let GetString(name:string) = - let s = resources.Value.GetString(name, System.Globalization.CultureInfo.CurrentUICulture) - #if DEBUG - if null = s then - System.Diagnostics.Debug.Assert(false, sprintf ""**RESOURCE ERROR**: Resource token %s does not exist!"" name) - #endif - s - - static let mkFunctionValue (tys: System.Type[]) (impl:obj->obj) = - FSharpValue.MakeFunction(FSharpType.MakeFunctionType(tys.[0],tys.[1]), impl) - - static let funTyC = typeof<(obj -> obj)>.GetGenericTypeDefinition() - - static let isNamedType(ty:System.Type) = not (ty.IsArray || ty.IsByRef || ty.IsPointer) - static let isFunctionType (ty1:System.Type) = - isNamedType(ty1) && getTypeInfo(ty1).IsGenericType && (ty1.GetGenericTypeDefinition()).Equals(funTyC) - - static let rec destFunTy (ty:System.Type) = - if isFunctionType ty then - ty, ty.GetGenericArguments() - else - match getTypeInfo(ty).BaseType with - | null -> failwith ""destFunTy: not a function type"" - | b -> destFunTy b - - static let buildFunctionForOneArgPat (ty: System.Type) impl = - let _,tys = destFunTy ty - let rty = tys.[1] - // PERF: this technique is a bit slow (e.g. in simple cases, like 'sprintf ""%x""') - mkFunctionValue tys (fun inp -> impl rty inp) - - static let capture1 (fmt:string) i args ty (go : obj list -> System.Type -> int -> obj) : obj = - match fmt.[i] with - | '%' -> go args ty (i+1) - | 'd' - | 'f' - | 's' -> buildFunctionForOneArgPat ty (fun rty n -> go (n::args) rty (i+1)) - | _ -> failwith ""bad format specifier"" - - // newlines and tabs get converted to strings when read from a resource file - // this will preserve their original intention - static let postProcessString (s : string) = - s.Replace(""\\n"",""\n"").Replace(""\\t"",""\t"").Replace(""\\r"",""\r"").Replace(""\\\"""", ""\"""") - - static let createMessageString (messageString : string) (fmt : Printf.StringFormat<'T>) : 'T = - let fmt = fmt.Value // here, we use the actual error string, as opposed to the one stored as fmt - let len = fmt.Length - - /// Function to capture the arguments and then run. - let rec capture args ty i = - if i >= len || (fmt.[i] = '%' && i+1 >= len) then - let b = new System.Text.StringBuilder() - b.AppendFormat(messageString, [| for x in List.rev args -> x |]) |> ignore - box(b.ToString()) - // REVIEW: For these purposes, this should be a nop, but I'm leaving it - // in incase we ever decide to support labels for the error format string - // E.g., ""%s%d"" - elif System.Char.IsSurrogatePair(fmt,i) then - capture args ty (i+2) - else - match fmt.[i] with - | '%' -> - let i = i+1 - capture1 fmt i args ty capture - | _ -> - capture args ty (i+1) - - (unbox (capture [] (typeof<'T>) 0) : 'T) - - static let mutable swallowResourceText = false - - static let GetStringFunc((messageID : string),(fmt : Printf.StringFormat<'T>)) : 'T = - if swallowResourceText then - sprintf fmt - else - let mutable messageString = GetString(messageID) - messageString <- postProcessString messageString - createMessageString messageString fmt - - /// If set to true, then all error messages will just return the filled 'holes' delimited by ',,,'s - this is for language-neutral testing (e.g. localization-invariant baselines). - static member SwallowResourceText with get () = swallowResourceText - and set (b) = swallowResourceText <- b - // END BOILERPLATE -" - -let RunMain(filename, outFilename, outXmlFilenameOpt, projectNameOpt) = - try - let justfilename = System.IO.Path.GetFileNameWithoutExtension(filename) - if justfilename |> Seq.exists (fun c -> not(System.Char.IsLetterOrDigit(c))) then - Err(filename, 0, sprintf "The filename '%s' is not allowed; only letters and digits can be used, as the filename also becomes the namespace for the SR class" justfilename) - - printfn "fssrgen.fsx: Reading %s" filename - let lines = System.IO.File.ReadAllLines(filename) - |> Array.mapi (fun i s -> i,s) // keep line numbers - |> Array.filter (fun (i,s) -> not(s.StartsWith "#")) // filter out comments - - printfn "fssrgen.fsx: Parsing %s" filename - let stringInfos = lines |> Array.map (fun (i,s) -> ParseLine filename i s) - // now we have array of (lineNum, ident, str, holes, netFormatString) // str has %d, netFormatString has {0} - - printfn "fssrgen.fsx: Validating %s" filename - // validate that all the idents are unique - let allIdents = new System.Collections.Generic.Dictionary() - for (line,(_,ident),_,_,_) in stringInfos do - if allIdents.ContainsKey(ident) then - Err(filename,line,sprintf "Identifier '%s' is already used previously on line %d - each identifier must be unique" ident allIdents.[ident]) - allIdents.Add(ident,line) - - printfn "fssrgen.fsx: Validating uniqueness of %s" filename - // validate that all the strings themselves are unique - let allStrs = new System.Collections.Generic.Dictionary() - for (line,(_,ident),str,_,_) in stringInfos do - if allStrs.ContainsKey(str) then - let prevLine,prevIdent = allStrs.[str] - Err(filename,line,sprintf "String '%s' already appears on line %d with identifier '%s' - each string must be unique" str prevLine prevIdent) - allStrs.Add(str,(line,ident)) - - printfn "fssrgen.fsx: Generating %s" outFilename - use outStream = System.IO.File.Create outFilename - use out = new System.IO.StreamWriter(outStream) - fprintfn out "// This is a generated file; the original input is '%s'" filename - fprintfn out "namespace %s" justfilename - if Option.isNone outXmlFilenameOpt then - fprintfn out "type internal SR private() =" - else - fprintfn out "%s" stringBoilerPlatePrefix - fprintfn out "type internal SR private() =" - let theResourceName = match projectNameOpt with Some p -> sprintf "%s.%s" p justfilename | None -> justfilename - fprintfn out "%s" (StringBoilerPlate theResourceName) - - printfn "fssrgen.fsx: Generating resource methods for %s" outFilename - // gen each resource method - stringInfos |> Seq.iter (fun (lineNum, (optErrNum,ident), str, holes, netFormatString) -> - let formalArgs = new System.Text.StringBuilder() - let actualArgs = new System.Text.StringBuilder() - let firstTime = ref true - let n = ref 0 - formalArgs.Append "(" |> ignore - for hole in holes do - if !firstTime then - firstTime := false - else - formalArgs.Append ", " |> ignore - actualArgs.Append " " |> ignore - formalArgs.Append(sprintf "a%d : %s" !n hole) |> ignore - actualArgs.Append(sprintf "a%d" !n) |> ignore - n := !n + 1 - formalArgs.Append ")" |> ignore - fprintfn out " /// %s" str - fprintfn out " /// (Originally from %s:%d)" filename (lineNum+1) - let justPercentsFromFormatString = - (holes |> Array.fold (fun acc holeType -> - acc + match holeType with - | "System.Int32" -> ",,,%d" - | "System.Double" -> ",,,%f" - | "System.String" -> ",,,%s" - | _ -> failwith "unreachable") "") + ",,," - let errPrefix = match optErrNum with - | None -> "" - | Some n -> sprintf "%d, " n - if Option.isNone outXmlFilenameOpt then - fprintfn out " static member %s%s = (%ssprintf \"%s\" %s)" ident (formalArgs.ToString()) errPrefix str (actualArgs.ToString()) - else - fprintfn out " static member %s%s = (%sGetStringFunc(\"%s\",\"%s\") %s)" ident (formalArgs.ToString()) errPrefix ident justPercentsFromFormatString (actualArgs.ToString()) - ) - - if Option.isSome outXmlFilenameOpt then - printfn "fssrgen.fsx: Generating .resx for %s" outFilename - fprintfn out "" - // gen validation method - fprintfn out " /// Call this method once to validate that all known resources are valid; throws if not" - fprintfn out " static member RunStartupValidation() =" - stringInfos |> Seq.iter (fun (lineNum, (optErrNum,ident), str, holes, netFormatString) -> - fprintfn out " ignore(GetString(\"%s\"))" ident - ) - fprintfn out " ()" // in case there are 0 strings, we need the generated code to parse - // gen to resx - let xd = new System.Xml.XmlDocument() - xd.LoadXml(xmlBoilerPlateString) - stringInfos |> Seq.iter (fun (lineNum, (optErrNum,ident), str, holes, netFormatString) -> - let xn = xd.CreateElement("data") - xn.SetAttribute("name",ident) |> ignore - xn.SetAttribute("xml:space","preserve") |> ignore - let xnc = xd.CreateElement "value" - xn.AppendChild xnc |> ignore - xnc.AppendChild(xd.CreateTextNode netFormatString) |> ignore - xd.LastChild.AppendChild xn |> ignore - ) - use outXmlStream = System.IO.File.Create outXmlFilenameOpt.Value - xd.Save outXmlStream - printfn "fssrgen.fsx: Done %s" outFilename - 0 - with e -> - PrintErr(filename, 0, sprintf "An exception occurred when processing '%s'\n%s" filename (e.ToString())) - 1 - -#if COMPILED -[] -#endif -let Main args = - - match args |> List.ofArray with - | [ inputFile; outFile; ] -> - let filename = System.IO.Path.GetFullPath(inputFile) - let outFilename = System.IO.Path.GetFullPath(outFile) - - RunMain(filename, outFilename, None, None) - - | [ inputFile; outFile; outXml ] -> - let filename = System.IO.Path.GetFullPath inputFile - let outFilename = System.IO.Path.GetFullPath outFile - let outXmlFilename = System.IO.Path.GetFullPath outXml - - RunMain(filename, outFilename, Some outXmlFilename, None) - - | [ inputFile; outFile; outXml; projectName ] -> - let filename = System.IO.Path.GetFullPath inputFile - let outFilename = System.IO.Path.GetFullPath outFile - let outXmlFilename = System.IO.Path.GetFullPath outXml - - RunMain(filename, outFilename, Some outXmlFilename, Some projectName) - - | _ -> - printfn "Error: invalid arguments." - printfn "Usage: " - 1 -#if !COMPILED -printfn "fssrgen: args = %A" fsi.CommandLineArgs -Main (fsi.CommandLineArgs |> Seq.skip 1 |> Seq.toArray) -#endif diff --git a/src/buildtools/fssrgen/fssrgen.targets b/src/buildtools/fssrgen/fssrgen.targets deleted file mode 100644 index 525015ae163..00000000000 --- a/src/buildtools/fssrgen/fssrgen.targets +++ /dev/null @@ -1,57 +0,0 @@ - - - - - ProcessFsSrGen;$(PrepareForBuildDependsOn) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - false - - - diff --git a/src/buildtools/fsyacc/fsyacc.fs b/src/buildtools/fsyacc/fsyacc.fs index 513262f29db..185ff33232b 100644 --- a/src/buildtools/fsyacc/fsyacc.fs +++ b/src/buildtools/fsyacc/fsyacc.fs @@ -523,9 +523,11 @@ let main() = logf (fun oso -> oso.Close()) -let result = - try main() +[] +let result(args: string[]) = + try + main() + 0 with e -> - eprintf "FSYACC: error FSY000: %s" (match e with Failure s -> s | e -> e.Message); - exit 1 - + eprintf "FSYACC: error FSY000: %s" (match e with Failure s -> s | e -> e.Message); + 1 diff --git a/src/buildtools/fsyacc/fsyacc.fsproj b/src/buildtools/fsyacc/fsyacc.fsproj index 32a1d6f3317..286c7a4eb12 100644 --- a/src/buildtools/fsyacc/fsyacc.fsproj +++ b/src/buildtools/fsyacc/fsyacc.fsproj @@ -1,12 +1,22 @@ - + + Exe netcoreapp2.0 INTERNALIZED_FSLEXYACC_RUNTIME;$(DefineConstant) - + + + + + + + + + + diff --git a/src/buildtools/fsyacc/fsyacc.fsx b/src/buildtools/fsyacc/fsyacc.fsx deleted file mode 100644 index 65b608372f8..00000000000 --- a/src/buildtools/fsyacc/fsyacc.fsx +++ /dev/null @@ -1,3 +0,0 @@ -#load "Lexing.fsi" "Lexing.fs" "Parsing.fsi" "Parsing.fs" "Arg.fsi" "Arg.fs" "fsyaccast.fs" "fsyaccpars.fs" "fsyacclex.fs" "fsyacc.fs" - -let v = FsLexYacc.FsYacc.Driver.result diff --git a/src/fsharp-proto-build.proj b/src/fsharp-proto-build.proj deleted file mode 100644 index 5dc178032ef..00000000000 --- a/src/fsharp-proto-build.proj +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - - - - - - - - - diff --git a/src/fsharp/Directory.Build.props b/src/fsharp/Directory.Build.props new file mode 100644 index 00000000000..57c8aa24ba7 --- /dev/null +++ b/src/fsharp/Directory.Build.props @@ -0,0 +1,11 @@ + + + + + + true + true + false + + + diff --git a/src/fsharp/Directory.Build.targets b/src/fsharp/Directory.Build.targets new file mode 100644 index 00000000000..068f4dc3c51 --- /dev/null +++ b/src/fsharp/Directory.Build.targets @@ -0,0 +1,4 @@ + + + + diff --git a/src/fsharp/Directory.Nuget.props b/src/fsharp/Directory.Nuget.props new file mode 100644 index 00000000000..97266b7c79d --- /dev/null +++ b/src/fsharp/Directory.Nuget.props @@ -0,0 +1,26 @@ + + + + https://github.com/Microsoft/visualfsharp/blob/master/License.txt + https://github.com/Microsoft/visualfsharp + Microsoft and F# Software Foundation + Microsoft and F# Software Foundation + Visual F# Compiler FSharp functional programming + (C) Microsoft Corporation. All rights reserved. + + $(GitHeadSha) + [developer build] + + + licenseUrl=$(PackageLicenceUrl); + authors=$(PackageAuthors); + owners=$(PackageOwners); + projectUrl=$(PackageProjectUrl); + copyright=$(PackageCopyright); + tags=$(PackageTags); + githeadsha=$(NormalizedGitHeadSha); + configuration=$(Configuration); + + + + diff --git a/src/fsharp/Directory.Nuget.targets b/src/fsharp/Directory.Nuget.targets new file mode 100644 index 00000000000..65ad4cb8fe7 --- /dev/null +++ b/src/fsharp/Directory.Nuget.targets @@ -0,0 +1,21 @@ + + + + + $(NuspecProperties); + packageId=$(PackageId); + version=$(PackageVersion); + + + + + + + + + + + + + diff --git a/src/fsharp/FSharp.Build-proto/FSharp.Build-proto.fsproj b/src/fsharp/FSharp.Build-proto/FSharp.Build-proto.fsproj deleted file mode 100644 index 1bae3eda985..00000000000 --- a/src/fsharp/FSharp.Build-proto/FSharp.Build-proto.fsproj +++ /dev/null @@ -1,111 +0,0 @@ - - - - - $(MSBuildProjectDirectory)\..\.. - Proto - AnyCPU - - - - - - Library - FSharp.Build - true - LKG - {D8BC791F-C1A9-49DC-9432-0F3090537555} - - - - FSBuild.txt - - - CompilerLocationUtils.fs - - - CreateFSharpManifestResourceName.fs - - - FSharpCommandLineBuilder.fs - - - Fsc.fs - - - FSharpEmbedResourceText.fs - - - FSharpEmbedResXSource.fs - - - WriteCodeFragment.fs - - - Microsoft.FSharp.Targets - - - Microsoft.Portable.FSharp.Targets - - - Microsoft.FSharp.NetSdk.props - - - Microsoft.FSharp.NetSdk.targets - - - Microsoft.FSharp.Overrides.NetSdk.targets - - - Microsoft.VisualFSharp.Type.Providers.Redist - - - - - - - - - - - - $(FSharpSourcesRoot)\..\packages\Microsoft.Build.Framework.$(MicrosoftBuildFrameworkPackageVersion)\lib\net46\Microsoft.Build.Framework.dll - - - $(FSharpSourcesRoot)\..\packages\Microsoft.Build.$(MicrosoftBuildPackageVersion)\lib\net46\Microsoft.Build.dll - - - $(FSharpSourcesRoot)\..\packages\Microsoft.Build.Utilities.Core.$(MicrosoftBuildUtilitiesCorePackageVersion)\lib\net46\Microsoft.Build.Utilities.Core.dll - - - $(FSharpSourcesRoot)\..\packages\Microsoft.Build.Tasks.Core.$(MicrosoftBuildTasksCorePackageVersion)\lib\net46\Microsoft.Build.Tasks.Core.dll - - - $(FSharpSourcesRoot)\..\packages\Microsoft.Build.Tasks.Core.$(MicrosoftBuildTasksCorePackageVersion)\lib\net46\Microsoft.Build.Tasks.Core.dll - - - $(FSharpSourcesRoot)\..\packages\System.IO.Compression.$(SystemIoCompressionPackageVersion)\lib\net46\System.IO.Compression.dll - - - - - $(FSharpSourcesRoot)\..\packages\Microsoft.Build.Framework.14.3.0\lib\net45\Microsoft.Build.Framework.dll - - - $(FSharpSourcesRoot)\..\packages\Microsoft.Build.14.3.0\lib\net45\Microsoft.Build.dll - - - $(FSharpSourcesRoot)\..\packages\Microsoft.Build.Utilities.Core.14.3.0\lib\net45\Microsoft.Build.Utilities.Core.dll - - - $(FSharpSourcesRoot)\..\packages\Microsoft.Build.Tasks.Core.14.3.0\lib\net45\Microsoft.Build.Tasks.Core.dll - - - - - {DED3BBD7-53F4-428A-8C9F-27968E768605} - FSharp.Core - - - - diff --git a/src/fsharp/FSharp.Build/FSharp.Build.fsproj b/src/fsharp/FSharp.Build/FSharp.Build.fsproj index 0046e733380..f5b606cd451 100644 --- a/src/fsharp/FSharp.Build/FSharp.Build.fsproj +++ b/src/fsharp/FSharp.Build/FSharp.Build.fsproj @@ -1,30 +1,18 @@ - - - $(MSBuildProjectDirectory)\..\.. - FSharp - true - - - + - Debug - AnyCPU Library + net46;netstandard2.0 FSharp.Build + $(NoWarn);45;55;62;75;1204 true - {702A7979-BCF9-4C41-853E-3ADFC9897890} + $(OtherFlags) --maxerrors:20 --extraoptimizationloops:1 + true - - $(FSharpSourcesRoot)\..\loc\lcl\{Lang}\$(AssemblyName).dll.lcl - $(FSharpSourcesRoot)\..\loc\lci\$(AssemblyName).dll.lci - false - false - @@ -42,54 +30,20 @@ - - - - - - - - - $(FSharpSourcesRoot)\..\packages\Microsoft.Build.Framework.$(MicrosoftBuildFrameworkPackageVersion)\lib\net46\Microsoft.Build.Framework.dll - - - $(FSharpSourcesRoot)\..\packages\Microsoft.Build.$(MicrosoftBuildPackageVersion)\lib\net46\Microsoft.Build.dll - - - $(FSharpSourcesRoot)\..\packages\Microsoft.Build.Utilities.Core.$(MicrosoftBuildUtilitiesCorePackageVersion)\lib\net46\Microsoft.Build.Utilities.Core.dll - - - $(FSharpSourcesRoot)\..\packages\Microsoft.Build.Tasks.Core.$(MicrosoftBuildTasksCorePackageVersion)\lib\net46\Microsoft.Build.Tasks.Core.dll - - - $(FSharpSourcesRoot)\..\packages\Microsoft.Build.Tasks.Core.$(MicrosoftBuildTasksCorePackageVersion)\lib\net46\Microsoft.Build.Tasks.Core.dll - - - $(FSharpSourcesRoot)\..\packages\System.IO.Compression.$(SystemIoCompressionPackageVersion)\lib\net46\System.IO.Compression.dll - - - $(FSharpSourcesRoot)\..\packages\Microsoft.VisualFSharp.Type.Providers.Redist.$(MicrosoftVisualFSharpTypeProvidersRedistPackageVersion)\content\4.3.0.0\FSharp.Data.TypeProviders.dll - + + - - - $(FSharpSourcesRoot)\..\packages\Microsoft.Build.Framework.14.3.0\lib\net45\Microsoft.Build.Framework.dll - - - $(FSharpSourcesRoot)\..\packages\Microsoft.Build.14.3.0\lib\net45\Microsoft.Build.dll - - - $(FSharpSourcesRoot)\..\packages\Microsoft.Build.Utilities.Core.14.3.0\lib\net45\Microsoft.Build.Utilities.Core.dll - - - $(FSharpSourcesRoot)\..\packages\Microsoft.Build.Tasks.Core.14.3.0\lib\net45\Microsoft.Build.Tasks.Core.dll - + + + + - - {DED3BBD7-53F4-428A-8C9F-27968E768605} - FSharp.Core - + + + + + - + diff --git a/src/fsharp/FSharp.Build/Microsoft.FSharp.NetSdk.props b/src/fsharp/FSharp.Build/Microsoft.FSharp.NetSdk.props index a992617ca4d..fb8bbf94c72 100644 --- a/src/fsharp/FSharp.Build/Microsoft.FSharp.NetSdk.props +++ b/src/fsharp/FSharp.Build/Microsoft.FSharp.NetSdk.props @@ -55,7 +55,7 @@ WARNING: DO NOT MODIFY this file unless you are knowledgeable about MSBuild and true - + $([System.IO.Path]::GetDirectoryName($(DOTNET_HOST_PATH))) $([System.IO.Path]::GetFileName($(DOTNET_HOST_PATH))) "$(MSBuildThisFileDirectory)fsc.exe" diff --git a/src/fsharp/FSharp.Build/project.json b/src/fsharp/FSharp.Build/project.json deleted file mode 100644 index 849f4f7f42f..00000000000 --- a/src/fsharp/FSharp.Build/project.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "dependencies": { - "Microsoft.Build": "15.6.85", - "Microsoft.Build.Framework": "15.6.85", - "Microsoft.Build.Tasks.Core": "15.6.85", - "Microsoft.Build.Utilities.Core": "15.6.85", - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.Win32.Registry": { - "version": "4.3.0", - "exclude": "Compile" - }, - "System.AppContext": "4.3.0", - "System.Diagnostics.Tools": "4.3.0", - "System.Reflection.Primitives": "4.3.0", - "System.Resources.ResourceManager": "4.3.0" - }, - "runtimes": { - "win7-x86": { }, - "win7-x64": { }, - "osx.10.11-x64": { }, - "ubuntu.14.04-x64": { } - }, - "frameworks": { - "netstandard1.6": { - "imports": "portable-net45+win8" - } - } -} \ No newline at end of file diff --git a/src/fsharp/FSharp.Compiler.Interactive.Settings/FSharp.Compiler.Interactive.Settings.fsproj b/src/fsharp/FSharp.Compiler.Interactive.Settings/FSharp.Compiler.Interactive.Settings.fsproj index 5e0d312c22a..e077d488a16 100644 --- a/src/fsharp/FSharp.Compiler.Interactive.Settings/FSharp.Compiler.Interactive.Settings.fsproj +++ b/src/fsharp/FSharp.Compiler.Interactive.Settings/FSharp.Compiler.Interactive.Settings.fsproj @@ -1,19 +1,15 @@ - - - $(MSBuildProjectDirectory)\..\.. - FSharp - true - - + + - Debug - AnyCPU - {649FA588-F02E-457C-9FCF-87E46407481E} Library + net46;netstandard1.6 FSharp.Compiler.Interactive.Settings - 512 + $(NoWarn);45;55;62;75;1182;1204 + true + $(OtherFlags) --maxerrors:20 --extraoptimizationloops:1 + true @@ -30,19 +26,12 @@ - - - - - - - - + + + - - {DED3BBD7-53F4-428A-8C9F-27968E768605} - FSharp.Core - + + diff --git a/src/fsharp/FSharp.Compiler.Interactive.Settings/project.json b/src/fsharp/FSharp.Compiler.Interactive.Settings/project.json deleted file mode 100644 index 90a6faf3ff3..00000000000 --- a/src/fsharp/FSharp.Compiler.Interactive.Settings/project.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "dependencies": { - "NETStandard.Library": "1.6.1", - "System.Linq.Expressions": "4.3.0", - "System.Reflection.TypeExtensions": "4.3.0", - "System.Runtime.Loader": "4.3.0", - "System.Threading.Thread": "4.3.0" - }, - "runtimes": { - "win7-x86": { }, - "win7-x64": { }, - "osx.10.11-x64": { }, - "ubuntu.14.04-x64": { } - }, - "frameworks": { - "netstandard1.6": { } - } -} diff --git a/src/fsharp/FSharp.Compiler.Private/FSharp.Compiler.Private.fsproj b/src/fsharp/FSharp.Compiler.Private/FSharp.Compiler.Private.fsproj index 0c72713522c..35ca26f1df2 100644 --- a/src/fsharp/FSharp.Compiler.Private/FSharp.Compiler.Private.fsproj +++ b/src/fsharp/FSharp.Compiler.Private/FSharp.Compiler.Private.fsproj @@ -1,26 +1,24 @@ - - - $(MSBuildProjectDirectory)\..\.. - FSharp - true - - + + - Debug - AnyCPU Library + net46;netstandard1.6 FSharp.Compiler.Private - COMPILER;$(DefineConstants) - $(NoWarn);62;9 - {2E4D67B4-522D-4CF7-97E4-BA940F0B18F3} + $(NoWarn);45;55;62;75;1204 true - 0x06800000 - $(OtherFlags) /warnon:1182 + $(DefineConstants);COMPILER + $(OtherFlags) --warnon:1182 --maxerrors:20 --extraoptimizationloops:1 + true + true + + + + + full - - + @@ -32,9 +30,7 @@ - - - + @@ -55,6 +51,7 @@ + FSComp.txt @@ -223,7 +220,7 @@ AbsIL\ilmorph.fs - + AbsIL\ilsign.fs @@ -660,49 +657,41 @@ Misc/LegacyHostedCompilerForTesting.fs + - - - - + - - - - - + + - - ..\..\..\packages\System.Reflection.Metadata.$(SystemReflectionMetadataPackageVersion)\lib\portable-net45+win8\System.Reflection.Metadata.dll - - - ..\..\..\packages\System.Collections.Immutable.$(SystemCollectionsImmutablePackageVersion)\lib\netstandard1.0\System.Collections.Immutable.dll - - - ..\..\..\packages\System.ValueTuple.$(SystemValueTuplePackageVersion)\lib\netstandard1.0\System.ValueTuple.dll - - - ..\..\..\packages\System.IO.Compression.$(SystemIoCompressionPackageVersion)\lib\net46\System.IO.Compression.dll - + + + + + - - - $(FSharpSourcesRoot)\..\packages\Microsoft.Build.Framework.$(MicrosoftBuildFrameworkPackageVersion)\lib\net46\Microsoft.Build.Framework.dll - - - $(FSharpSourcesRoot)\..\packages\Microsoft.Build.$(MicrosoftBuildPackageVersion)\lib\net46\Microsoft.Build.dll - - - $(FSharpSourcesRoot)\..\packages\Microsoft.Build.Utilities.Core.$(MicrosoftBuildUtilitiesCorePackageVersion)\lib\net46\Microsoft.Build.Utilities.Core.dll - - - $(FSharpSourcesRoot)\..\packages\Microsoft.Build.Tasks.Core.$(MicrosoftBuildTasksCorePackageVersion)\lib\net46\Microsoft.Build.Tasks.Core.dll - + + + + - - {DED3BBD7-53F4-428A-8C9F-27968E768605} - FSharp.Core - + + + + + + + + + + + + + + + + + diff --git a/src/fsharp/FSharp.Compiler.Private/project.json b/src/fsharp/FSharp.Compiler.Private/project.json deleted file mode 100644 index b9bf7861ae6..00000000000 --- a/src/fsharp/FSharp.Compiler.Private/project.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "dependencies": { - "NETStandard.Library": "1.6.1", - "System.Collections.Immutable": "1.5.0", - "System.Diagnostics.Process": "4.3.0", - "System.Diagnostics.TraceSource": "4.3.0", - "System.Linq.Expressions": "4.3.0", - "System.Linq.Queryable": "4.3.0", - "System.Net.Requests": "4.3.0", - "System.Reflection.Emit": "4.3.0", - "System.Reflection.Metadata": "1.6.0", - "System.Reflection.TypeExtensions": "4.3.0", - "System.Runtime": "4.3.0", - "System.Runtime.InteropServices": "4.3.0", - "System.Runtime.Loader": "4.3.0", - "System.Security.Cryptography.Algorithms": "4.3.0", - "System.Threading.Tasks.Parallel": "4.3.0", - "System.Threading.Thread": "4.3.0", - "System.Threading.ThreadPool": "4.3.0", - "System.ValueTuple": "4.3.0" - }, - "runtimes": { - "win7-x86": { }, - "win7-x64": { }, - "osx.10.11-x64": { }, - "ubuntu.14.04-x64": { } - }, - "frameworks": { - "netstandard1.6": { - "imports": "portable-net45+win8" - } - } -} - diff --git a/src/fsharp/FSharp.Compiler.Server.Shared/FSharp.Compiler.Server.Shared.fsproj b/src/fsharp/FSharp.Compiler.Server.Shared/FSharp.Compiler.Server.Shared.fsproj index 91eadb4875e..4feaf0da4e1 100644 --- a/src/fsharp/FSharp.Compiler.Server.Shared/FSharp.Compiler.Server.Shared.fsproj +++ b/src/fsharp/FSharp.Compiler.Server.Shared/FSharp.Compiler.Server.Shared.fsproj @@ -1,42 +1,30 @@ - + + - $(MSBuildProjectDirectory)\..\.. - FSharp - true - - - - Debug - AnyCPU - {d5870cf0-ed51-4cbc-b3d7-6f56da84ac06} - Library + net46 FSharp.Compiler.Server.Shared - v4.6 + true + + - - - - - - - + + + + - - {DED3BBD7-53F4-428A-8C9F-27968E768605} - FSharp.Core - + - + diff --git a/src/fsharp/FSharp.Compiler.nuget/Directory.Build.props b/src/fsharp/FSharp.Compiler.nuget/Directory.Build.props new file mode 100644 index 00000000000..68113d9e9ca --- /dev/null +++ b/src/fsharp/FSharp.Compiler.nuget/Directory.Build.props @@ -0,0 +1,13 @@ + + + + + + + netcoreapp2.1 + Microsoft.FSharp.Compiler.nuspec + -rtm-$(NuGetPackageVersionSuffix) + $(FSPackageVersion)$(PreReleaseSuffix) + + + diff --git a/src/fsharp/FSharp.Compiler.nuget/Directory.Build.targets b/src/fsharp/FSharp.Compiler.nuget/Directory.Build.targets new file mode 100644 index 00000000000..a20d4be41e6 --- /dev/null +++ b/src/fsharp/FSharp.Compiler.nuget/Directory.Build.targets @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/src/fsharp/FSharp.Compiler.nuget/FSharp.Compiler.Template.nuget.props b/src/fsharp/FSharp.Compiler.nuget/FSharp.Compiler.Template.nuget.props deleted file mode 100644 index 4bb58eff671..00000000000 --- a/src/fsharp/FSharp.Compiler.nuget/FSharp.Compiler.Template.nuget.props +++ /dev/null @@ -1,21 +0,0 @@ - - - $(MSBuildProjectDirectory)\..\.. - rc - obj\BuildVersionFile.props - - - - - - https://github.com/Microsoft/visualfsharp/blob/master/License.txt - https://github.com/Microsoft/visualfsharp - Microsoft and F# Software Foundation - Visual F# Compiler FSharp functional programming - $(FSharpSourcesRoot)\..\$(Configuration)\coreclr\bin - -rtm-$(NuGetPackageVersionSuffix) - $(FSPackageVersion)$(PreReleaseSuffix) - - - - diff --git a/src/fsharp/FSharp.Compiler.nuget/FSharp.Compiler.Template.nuget.targets b/src/fsharp/FSharp.Compiler.nuget/FSharp.Compiler.Template.nuget.targets deleted file mode 100644 index ec624f3287a..00000000000 --- a/src/fsharp/FSharp.Compiler.nuget/FSharp.Compiler.Template.nuget.targets +++ /dev/null @@ -1,47 +0,0 @@ - - - - - - - fsi - {d0e98c0d-490b-4c61-9329-0862f6e87645} - True - - - Fsc - {C94C257C-3C0A-4858-B5D8-D746498D1F08} - True - - - - - - - - - - - - - - - $(GitHeadSha) - [developer build] - -prop "licenseUrl=$(PackageLicenceUrl)" -prop "version=$(PackageVersion)" -prop "authors=$(PackageAuthors)" -prop "projectUrl=$(PackageProjectUrl)" -prop "tags=$(PackageTags)" -prop "githeadsha=$(NormalizedGitHeadSha)" - - - - - - - - - diff --git a/src/fsharp/FSharp.Compiler.nuget/Microsoft.FSharp.Compiler.csproj b/src/fsharp/FSharp.Compiler.nuget/Microsoft.FSharp.Compiler.csproj new file mode 100644 index 00000000000..eef53d7dc4e --- /dev/null +++ b/src/fsharp/FSharp.Compiler.nuget/Microsoft.FSharp.Compiler.csproj @@ -0,0 +1,7 @@ + + + + Microsoft.FSharp.Compiler + + + diff --git a/src/fsharp/FSharp.Compiler.nuget/Microsoft.FSharp.Compiler.nuget.proj b/src/fsharp/FSharp.Compiler.nuget/Microsoft.FSharp.Compiler.nuget.proj deleted file mode 100644 index 53ed79e8acb..00000000000 --- a/src/fsharp/FSharp.Compiler.nuget/Microsoft.FSharp.Compiler.nuget.proj +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/src/fsharp/FSharp.Compiler.nuget/Microsoft.FSharp.Compiler.nuspec b/src/fsharp/FSharp.Compiler.nuget/Microsoft.FSharp.Compiler.nuspec index 4130025ffbe..ac76a4a2403 100644 --- a/src/fsharp/FSharp.Compiler.nuget/Microsoft.FSharp.Compiler.nuspec +++ b/src/fsharp/FSharp.Compiler.nuget/Microsoft.FSharp.Compiler.nuspec @@ -1,10 +1,10 @@ - Microsoft.FSharp.Compiler + $packageId$ - .NET Core compatible version of the fsharp compiler fsc.exe. - Supported Platforms: - .NET Core (.netstandard1.6). + .NET Core compatible version of the F# compiler fsc.exe. + Supported Platforms: - .NET Core (.netstandard2.0). Commit hash: $githeadsha$. en-US @@ -15,70 +15,69 @@ $projectUrl$ $tags$ - - - + + + - - - - - - - + + + + + + - - - - - - - + + + + + + + - - - - - - + + + + + + - - - - - - + + + + + + - - - - - - + + + + + + - - - - - - + + + + + + - - - - + + + + diff --git a/src/fsharp/FSharp.Compiler.nuget/Program.fs b/src/fsharp/FSharp.Compiler.nuget/Program.fs deleted file mode 100644 index 4c6ddb51f96..00000000000 --- a/src/fsharp/FSharp.Compiler.nuget/Program.fs +++ /dev/null @@ -1,6 +0,0 @@ -namespace DummyMain - -module DummyMain = - -[] -let main _args = 0 \ No newline at end of file diff --git a/src/fsharp/FSharp.Compiler.nuget/Testing.FSharp.Compiler.csproj b/src/fsharp/FSharp.Compiler.nuget/Testing.FSharp.Compiler.csproj new file mode 100644 index 00000000000..44a831fed38 --- /dev/null +++ b/src/fsharp/FSharp.Compiler.nuget/Testing.FSharp.Compiler.csproj @@ -0,0 +1,7 @@ + + + + Testing.FSharp.Compiler + + + diff --git a/src/fsharp/FSharp.Compiler.nuget/Testing.FSharp.Compiler.nuget.proj b/src/fsharp/FSharp.Compiler.nuget/Testing.FSharp.Compiler.nuget.proj deleted file mode 100644 index dc9f19add52..00000000000 --- a/src/fsharp/FSharp.Compiler.nuget/Testing.FSharp.Compiler.nuget.proj +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/src/fsharp/FSharp.Core.nuget/FSharp.Core.nuget.proj b/src/fsharp/FSharp.Core.nuget/FSharp.Core.nuget.proj deleted file mode 100644 index 550d2fb7245..00000000000 --- a/src/fsharp/FSharp.Core.nuget/FSharp.Core.nuget.proj +++ /dev/null @@ -1,76 +0,0 @@ - - - $(MSBuildProjectDirectory)\..\.. - rc - obj\BuildVersionFile.props - - - - - - https://github.com/Microsoft/visualfsharp/blob/master/License.txt - https://github.com/Microsoft/visualfsharp - Microsoft and F# Software Foundation - Visual F# Compiler FSharp functional programming - Microsoft and F# Software Foundation - (C) Microsoft Corporation. All rights reserved. - true - $(FSharpSourcesRoot)\..\$(Configuration)\artifacts - - - - - - - - - - FSharp.Core - {C94C257C-3C0A-4858-B5D8-D746498D1F08} - True - - - - - - - - - - - - - - - - - - - - X.X.XXX - - $(FSharpCoreFrozenPortableTargetPackageVersion) - $(FSharpCoreFrozenPortableTargetMajorVersion) - - $(FSCorePackageVersion) - $(FSCoreMajorVersion) - - - $(GitHeadSha) - [developer build] - -prop "licenseUrl=$(PackageLicenceUrl)" -prop "version=$(PackageVersion)" -prop "authors=$(PackageAuthors)" -prop "projectUrl=$(PackageProjectUrl)" -prop "tags=$(PackageTags)" -prop "githeadsha=$(NormalizedGitHeadSha)" -prop "owners=$(PackageOwners)" -prop "copyright=$(PackageCopyright)" -prop "requireLicenseAcceptance=$(PackageRequireLicenceAcceptence)" - - - - - - - - - - diff --git a/src/fsharp/FSharp.Core.nuget/Microsoft.Portable.FSharp.Core.nuspec b/src/fsharp/FSharp.Core.nuget/Microsoft.Portable.FSharp.Core.nuspec deleted file mode 100644 index 7ca41bb2168..00000000000 --- a/src/fsharp/FSharp.Core.nuget/Microsoft.Portable.FSharp.Core.nuspec +++ /dev/null @@ -1,27 +0,0 @@ - - - - - Microsoft.Portable.FSharp.Core - Frozen portable profiles - en-US - false - $version$ - $authors$ - $licenseUrl$ - $projectUrl$ - $tags$ - - - - - - - - - - - - - - diff --git a/src/fsharp/FSharp.Core/Directory.Build.props b/src/fsharp/FSharp.Core/Directory.Build.props new file mode 100644 index 00000000000..cee6fa763d9 --- /dev/null +++ b/src/fsharp/FSharp.Core/Directory.Build.props @@ -0,0 +1,14 @@ + + + + + + + + $(NuspecProperties); + fsCoreMajorVersion=$(FSCoreMajorVersion); + fsPackageMajorVersion=$(FSPackageMajorVersion); + + + + diff --git a/src/fsharp/FSharp.Core/Directory.Build.targets b/src/fsharp/FSharp.Core/Directory.Build.targets new file mode 100644 index 00000000000..8bf68e8bc7b --- /dev/null +++ b/src/fsharp/FSharp.Core/Directory.Build.targets @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/fsharp/FSharp.Core/FSharp.Core.fsproj b/src/fsharp/FSharp.Core/FSharp.Core.fsproj index 8681b9c4fc5..ce9fa915f91 100644 --- a/src/fsharp/FSharp.Core/FSharp.Core.fsproj +++ b/src/fsharp/FSharp.Core/FSharp.Core.fsproj @@ -1,48 +1,23 @@ - + - $(MSBuildProjectDirectory)\..\.. - FSharp - LKG - v4.5 - - - - - - AnyCPU - {DED3BBD7-53F4-428A-8C9F-27968E768605} Library + net45;netstandard1.6 FSharp.Core - FSHARP_CORE;$(DefineConstants) - BUILDING_WITH_LKG;$(DefineConstants) + FSharp.Core + $(FSCorePackageVersion) + FSharp.Core.nuspec $(NoWarn);45;55;62;75;1204 - 0x05000000 - true true - $(OtherFlags) --warnon:1182 --compiling-fslib --extraoptimizationloops:1 - $(OtherFlags) --warnon:3218 - $(OtherFlags) --maxerrors:20 - $(OtherFlags) --warnon:1182 --compiling-fslib --maxerrors:20 --extraoptimizationloops:1 - $(OtherFlags) --compiling-fslib-40 + $(DefineConstants);FSHARP_CORE + BUILDING_WITH_LKG;$(DefineConstants) + $(OtherFlags) --warnon:1182 --compiling-fslib --compiling-fslib-40 --maxerrors:20 --extraoptimizationloops:1 - - - - PreserveNewest - - - - - false - - - - + true true false @@ -55,9 +30,6 @@ Primitives/prim-types-prelude.fs - - Primitives/SR.fs - Primitives/prim-types.fsi @@ -246,22 +218,17 @@ - - - - - false - + + + + - - + + + - - - - @@ -275,20 +242,4 @@ - - - - -prop "licenseUrl=$(PackageLicenceUrl)" -prop "version=$(FSharpCoreFrozenPortablePackageVersion)" -prop "authors=$(PackageAuthors)" -prop "projectUrl=$(PackageProjectUrl)" -prop "tags=$(PackageTags)" - - - - - - - diff --git a/src/fsharp/FSharp.Core.nuget/FSharp.Core.nuspec b/src/fsharp/FSharp.Core/FSharp.Core.nuspec similarity index 69% rename from src/fsharp/FSharp.Core.nuget/FSharp.Core.nuspec rename to src/fsharp/FSharp.Core/FSharp.Core.nuspec index d71634de277..21b484cb8ab 100644 --- a/src/fsharp/FSharp.Core.nuget/FSharp.Core.nuspec +++ b/src/fsharp/FSharp.Core/FSharp.Core.nuspec @@ -1,12 +1,11 @@ - FSharp.Core - FSharp.Core for F# 4.5 - FSharp.Core for F# 4.5 + FSharp.Core for F# $fsCoreMajorVersion$ + FSharp.Core for F# $fsCoreMajorVersion$ - FSharp.Core redistributables from Visual F# Tools version 10.2 For F# 4.5 + FSharp.Core redistributables from Visual F# Tools version $fsPackageMajorVersion$ For F# $fsCoreMajorVersion$ Supported Platforms: .NET Framework 4.5+ (net45) netstandard1.6 (netstandard1.6) @@ -22,7 +21,7 @@ $projectUrl$ http://fsharp.org/img/logo.png $tags$ - $requireLicenseAcceptance$ + true en-US @@ -57,18 +56,18 @@ - - - - + + + + - - - - + + + + - - + + diff --git a/src/fsharp/FSharp.Core/project.json b/src/fsharp/FSharp.Core/project.json deleted file mode 100644 index b2f99bd2a16..00000000000 --- a/src/fsharp/FSharp.Core/project.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "dependencies": { - "NETStandard.Library": "1.6.1", - "System.Collections": "4.3.0", - "System.Console": "4.3.0", - "System.Diagnostics.Debug": "4.3.0", - "System.Diagnostics.Tools": "4.3.0", - "System.Globalization": "4.3.0", - "System.IO": "4.3.0", - "System.Linq": "4.3.0", - "System.Linq.Expressions": "4.3.0", - "System.Linq.Queryable": "4.3.0", - "System.Net.Requests": "4.3.0", - "System.Reflection": "4.3.0", - "System.Reflection.Extensions": "4.3.0", - "System.Resources.ResourceManager":"4.3.0", - "System.Runtime": "4.3.0", - "System.Runtime.Extensions": "4.3.0", - "System.Runtime.Numerics": "4.3.0", - "System.Text.RegularExpressions": "4.3.0", - "System.Threading": "4.3.0", - "System.Threading.Tasks": "4.3.0", - "System.Threading.Tasks.Parallel": "4.3.0", - "System.Threading.Thread": "4.3.0", - "System.Threading.ThreadPool": "4.3.0", - "System.Threading.Timer": "4.3.0" - }, - "frameworks": { - "netstandard1.6": { } - } -} diff --git a/src/fsharp/Fsc-proto/Fsc-proto.fsproj b/src/fsharp/Fsc-proto/Fsc-proto.fsproj deleted file mode 100644 index 5cccf4f17a2..00000000000 --- a/src/fsharp/Fsc-proto/Fsc-proto.fsproj +++ /dev/null @@ -1,499 +0,0 @@ - - - - - $(MSBuildProjectDirectory)\..\.. - Proto - - - - x86 - Exe - $(NoWarn);62 - fsc - NO_EXTENSIONTYPING;$(DefineConstants) - COMPILER;$(DefineConstants) - $(NoWarn);35;44;62;9;60;86;47;1203 - LKG - {9D7C9060-9263-40EB-8FE3-1E4E3C6D941C} - true - $(OtherFlags) --warnon:1182 - $(OtherFlags) --stackReserveSize:4096000 - - - - FSComp.txt - - - - --unicode --lexlib Internal.Utilities.Text.Lexing - pplex.fsl - - - --module Microsoft.FSharp.Compiler.PPParser --open Microsoft.FSharp.Compiler --internal --lexlib Internal.Utilities.Text.Lexing --parslib Internal.Utilities.Text.Parsing - pppars.fsy - - - --unicode --lexlib Internal.Utilities.Text.Lexing - lex.fsl - - - --unicode --lexlib Internal.Utilities.Text.Lexing - illex.fsl - - - --module Microsoft.FSharp.Compiler.Parser --open Microsoft.FSharp.Compiler --internal --lexlib Internal.Utilities.Text.Lexing --parslib Internal.Utilities.Text.Parsing - pars.fsy - - - --module Microsoft.FSharp.Compiler.AbstractIL.Internal.AsciiParser --open Microsoft.FSharp.Compiler.AbstractIL --internal --lexlib Internal.Utilities.Text.Lexing --parslib Internal.Utilities.Text.Parsing - ilpars.fsy - - - Logger.fsi - - - Logger.fs - - - Reflection\reshapedreflection.fs - - - sformat.fsi - - - sformat.fs - - - sr.fsi - - - sr.fs - - - prim-lexing.fsi - - - prim-lexing.fs - - - prim-parsing.fsi - - - prim-parsing.fs - - - ResizeArray.fsi - - - ResizeArray.fs - - - HashMultiMap.fsi - - - HashMultiMap.fs - - - Utilities\EditDistance.fs - - - TaggedCollections.fsi - - - TaggedCollections.fs - - - Utilities\ildiag.fsi - - - Utilities\ildiag.fs - - - illib.fs - - - filename.fsi - - - filename.fs - - - zmap.fsi - - - zmap.fs - - - zset.fsi - - - zset.fs - - - bytes.fsi - - - bytes.fs - - - ReferenceResolver.fs - - - il.fsi - - - il.fs - - - ilx.fsi - - - ilx.fs - - - ilascii.fsi - - - ilascii.fs - - - ilprint.fsi - - - ilprint.fs - - - ilmorph.fsi - - - ilmorph.fs - - - ilsign.fs - - - ilsupp.fsi - - - ilsupp.fs - - - - - ilbinary.fsi - - - ilbinary.fs - - - lib.fs - - - range.fsi - - - range.fs - - - rational.fsi - - - rational.fs - - - ErrorLogger.fs - - - ErrorResolutionHints.fs - - - InternalCollections.fsi - - - InternalCollections.fs - - - ilread.fsi - - - ilread.fs - - - ilwrite.fsi - - - ilwritepdb.fsi - - - ilwritepdb.fs - - - ilwrite.fs - - - ilreflect.fs - - - CompilerLocationUtils.fs - - - PrettyNaming.fs - - - ilxsettings.fs - - - EraseClosures.fsi - - - EraseClosures.fs - - - EraseUnions.fsi - - - EraseUnions.fs - - - UnicodeLexing.fsi - - - UnicodeLexing.fs - - - layout.fsi - - - layout.fs - - - ast.fs - - - - - lexhelp.fsi - - - lexhelp.fs - - - - - QuotationPickler.fsi - - - QuotationPickler.fs - - - QueueList.fs - - - tast.fs - - - TcGlobals.fs - - - TastOps.fsi - - - TastOps.fs - - - TastPickle.fsi - - - TastPickle.fs - - - LexFilter.fs - - - import.fsi - - - import.fs - - - infos.fs - - - Logic\AccessibilityLogic.fs - - - Logic\AttributeChecking.fs - - - Logic\InfoReader.fs - - - NicePrint.fs - - - AugmentWithHashCompare.fsi - - - AugmentWithHashCompare.fs - - - NameResolution.fsi - - - NameResolution.fs - - - TypeRelations.fs - - - Logic\SignatureConformance.fs - - - Logic\MethodOverrides.fs - - - MethodCalls.fs - - - PatternMatchCompilation.fsi - - - PatternMatchCompilation.fs - - - ConstraintSolver.fsi - - - ConstraintSolver.fs - - - CheckFormatStrings.fsi - - - CheckFormatStrings.fs - - - FindUnsolved.fs - - - QuotationTranslator.fsi - - - QuotationTranslator.fs - - - PostInferenceChecks.fsi - - - PostInferenceChecks.fs - - - TypeChecker.fsi - - - TypeChecker.fs - - - Optimizer.fsi - - - Optimizer.fs - - - autobox.fs - - - DetupleArgs.fsi - - - DetupleArgs.fs - - - InnerLambdasToTopLevelFuncs.fsi - - - InnerLambdasToTopLevelFuncs.fs - - - LowerCallsAndSeqs.fs - - - IlxGen.fsi - - - IlxGen.fs - - - CompileOps.fsi - - - CompileOps.fs - - - CompileOptions.fsi - - - CompileOptions.fs - - - fsc.fsi - - - fsc.fs - - - Service/SimulatedMSBuildReferenceResolver.fs - - - MSBuildReferenceResolver.fs - - - fscmain.fs - - - - - - - - - - - - $(FSharpSourcesRoot)\..\packages\System.Reflection.Metadata.$(SystemReflectionMetadataPackageVersion)\lib\portable-net45+win8\System.Reflection.Metadata.dll - - - $(FSharpSourcesRoot)\..\packages\System.Collections.Immutable.$(SystemCollectionsImmutablePackageVersion)\lib\portable-net45+win8+wp8+wpa81\System.Collections.Immutable.dll - - - $(FSharpSourcesRoot)\..\packages\System.ValueTuple.$(SystemValueTuplePackageVersion)\lib\netstandard1.0\System.ValueTuple.dll - - - {DED3BBD7-53F4-428A-8C9F-27968E768605} - FSharp.Core - - - - - $(FSharpSourcesRoot)\..\packages\Microsoft.Build.Framework.$(MicrosoftBuildFrameworkPackageVersion)\lib\net46\Microsoft.Build.Framework.dll - - - $(FSharpSourcesRoot)\..\packages\Microsoft.Build.$(MicrosoftBuildPackageVersion)\lib\net46\Microsoft.Build.dll - - - $(FSharpSourcesRoot)\..\packages\Microsoft.Build.Utilities.Core.$(MicrosoftBuildUtilitiesCorePackageVersion)\lib\net46\Microsoft.Build.Utilities.Core.dll - - - $(FSharpSourcesRoot)\..\packages\Microsoft.Build.Tasks.Core.$(MicrosoftBuildTasksCorePackageVersion)\lib\net46\Microsoft.Build.Tasks.Core.dll - - - $(FSharpSourcesRoot)\..\packages\Microsoft.Build.Tasks.Core.$(MicrosoftBuildTasksCorePackageVersion)\lib\net46\Microsoft.Build.Tasks.Core.dll - - - $(FSharpSourcesRoot)\..\packages\System.IO.Compression.$(SystemIoCompressionPackageVersion)\lib\net46\System.IO.Compression.dll - - - - - diff --git a/src/fsharp/Fsc-proto/app.config b/src/fsharp/Fsc-proto/app.config deleted file mode 100644 index be4549ea2d2..00000000000 --- a/src/fsharp/Fsc-proto/app.config +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/src/fsharp/Fsc/Fsc.fsproj b/src/fsharp/Fsc/Fsc.fsproj index aa6c8eed8fb..4bc9770e9e0 100644 --- a/src/fsharp/Fsc/Fsc.fsproj +++ b/src/fsharp/Fsc/Fsc.fsproj @@ -1,35 +1,19 @@ - + - $(MSBuildProjectDirectory)\..\.. - FSharp - true - true - - - - Debug - - x86 - AnyCPU - {C94C257C-3C0A-4858-B5D8-D746498D1F08} Exe - $(NoWarn);62 + net46;netcoreapp2.1 + .exe fsc + $(NoWarn);45;55;62;75;1204 true - true - $(OtherFlags) --warnon:1182 + $(OtherFlags) --maxerrors:20 --extraoptimizationloops:1 + true + true - - - - fscmain.fs @@ -41,25 +25,18 @@ - - - - - - + + + + - - - - {2E4D67B4-522D-4CF7-97E4-BA940F0B18F3} - FSharp.Compiler.Private - - - {DED3BBD7-53F4-428A-8C9F-27968E768605} - FSharp.Core - + + + + + diff --git a/src/fsharp/Fsc/project.json b/src/fsharp/Fsc/project.json deleted file mode 100644 index 09458a531ee..00000000000 --- a/src/fsharp/Fsc/project.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "NETStandard.Library": "1.6.1", - "System.Linq.Expressions": "4.3.0", - "System.Reflection.Metadata": "1.6.0", - "System.Runtime.Loader": "4.3.0" - }, - "runtimes": { - "win7-x86": { }, - "win7-x64": { }, - "osx.10.11-x64": { }, - "ubuntu.14.04-x64": { } - }, - "frameworks": { - "netcoreapp1.0": { - "dependencies": { - "Microsoft.NETCore.App": { - "type": "platform", - "version": "1.1.0" - } - }, - "imports": [ "netstandard1.6", "portable-net45+win8+wp8+wpa81" ] - } - } -} diff --git a/src/fsharp/fsi/Fsi.fsproj b/src/fsharp/fsi/Fsi.fsproj index ad16d0c0017..9fbc4dc1331 100644 --- a/src/fsharp/fsi/Fsi.fsproj +++ b/src/fsharp/fsi/Fsi.fsproj @@ -1,73 +1,59 @@  - - - $(MSBuildProjectDirectory)\..\.. - FSharp - true - true - - + + - Debug - - x86 - AnyCPU - {d0e98c0d-490b-4c61-9329-0862f6e87645} Exe - $(NoWarn);62 + net46;netcoreapp2.0 + .exe fsi - 0x0A000000 - FSI_SHADOW_COPY_REFERENCES;$(DefineConstants) - FSI_SERVER;$(DefineConstants) + $(NoWarn);45;55;62;75;1204 true - $(OtherFlags) --warnon:1182 + $(OtherFlags) --warnon:1182 --maxerrors:20 --extraoptimizationloops:1 fsi.res - v4.6 + true + true + + + + $(DefineConstants);FSI_SHADOW_COPY_REFERENCES;FSI_SERVER + - - console.fs - - - fsimain.fs - - - + + + - - + + + + + + + + + + + - - - - - + - - - {2E4D67B4-522D-4CF7-97E4-BA940F0B18F3} - FSharp.Compiler.Private - - - {DED3BBD7-53F4-428A-8C9F-27968E768605} - FSharp.Core - - - - - FSharp.Compiler.Server.Shared - {d5870cf0-ed51-4cbc-b3d7-6f56da84ac06} - True - + + + + + + + + + + - \ No newline at end of file + + diff --git a/src/fsharp/fsi/project.json b/src/fsharp/fsi/project.json deleted file mode 100644 index 8fdb41c7a8e..00000000000 --- a/src/fsharp/fsi/project.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "NETStandard.Library": "1.6.1", - "System.Diagnostics.Process": "4.3.0", - "System.Linq.Expressions": "4.3.0", - "System.Reflection.Emit": "4.3.0", - "System.Reflection.TypeExtensions": "4.3.0", - "System.Runtime.Loader": "4.3.0", - "System.Threading.Thread": "4.3.0", - "System.Reflection.Metadata": "1.6.0" - }, - "runtimes": { - "win7-x86": { }, - "win7-x64": { }, - "osx.10.11-x64": { }, - "ubuntu.14.04-x64": { } - }, - "frameworks": { - "netcoreapp1.0": { - "dependencies": { - "Microsoft.NETCore.App": { - "type": "platform", - "version": "1.1.0" - } - }, - "imports": [ "netstandard1.6", "portable-net45+win8+wp8+wpa81" ] - } - } -} diff --git a/src/fsharp/fsiAnyCpu/FsiAnyCPU.fsproj b/src/fsharp/fsiAnyCpu/FsiAnyCPU.fsproj index 894178d18bd..cd767c1dfe2 100644 --- a/src/fsharp/fsiAnyCpu/FsiAnyCPU.fsproj +++ b/src/fsharp/fsiAnyCpu/FsiAnyCPU.fsproj @@ -1,58 +1,43 @@ - + + - $(MSBuildProjectDirectory)\..\.. - FSharp - true - true - - - - Debug - AnyCPU - {8b3e283d-b5fe-4055-9d80-7e3a32f3967b} Exe - $(NoWarn);62 + net46 + AnyCPU + .exe fsiAnyCpu - 0x0A000000 - FSI_SHADOW_COPY_REFERENCES;$(DefineConstants) - FSI_SERVER;$(DefineConstants) + $(NoWarn);45;55;62;75;1204 true - $(OtherFlags) --warnon:1182 + $(OtherFlags) --warnon:1182 --maxerrors:20 --extraoptimizationloops:1 ..\fsi\fsi.res - v4.6 + true + true + + + + $(DefineConstants);FSI_SHADOW_COPY_REFERENCES;FSI_SERVER + + + + + + + - - console.fs - - - fsimain.fs - - + + + - + - - - - FSharp.Compiler.Server.Shared - {d5870cf0-ed51-4cbc-b3d7-6f56da84ac06} - True - - - {2E4D67B4-522D-4CF7-97E4-BA940F0B18F3} - FSharp.Compiler.Private - - - {DED3BBD7-53F4-428A-8C9F-27968E768605} - FSharp.Core - - \ No newline at end of file + + diff --git a/src/fsharp/service/ServiceDeclarationLists.fs b/src/fsharp/service/ServiceDeclarationLists.fs index 6c4cf32ed75..22b851a5b88 100644 --- a/src/fsharp/service/ServiceDeclarationLists.fs +++ b/src/fsharp/service/ServiceDeclarationLists.fs @@ -28,7 +28,7 @@ open Microsoft.FSharp.Compiler.InfoReader module EnvMisc3 = /// dataTipSpinWaitTime limits how long we block the UI thread while a tooltip pops up next to a selected item in an IntelliSense completion list. /// This time appears to be somewhat amortized by the time it takes the VS completion UI to actually bring up the tooltip after selecting an item in the first place. - let dataTipSpinWaitTime = GetEnvInteger "FCS_ToolTipSpinWaitTime" 300 + let dataTipSpinWaitTime = GetEnvInteger "FCS_ToolTipSpinWaitTime" 5000 [] diff --git a/src/scripts/scriptlib.fsx b/src/scripts/scriptlib.fsx index 2b0da79350c..df3c548cbc4 100644 --- a/src/scripts/scriptlib.fsx +++ b/src/scripts/scriptlib.fsx @@ -60,12 +60,12 @@ module Scripting = let (++) a b = Path.Combine(a,b) - let getBasename (a: string) = Path.GetFileNameWithoutExtension(a) - let getFullPath a = Path.GetFullPath(a) - let getFilename (a: string) = Path.GetFileName(a) - let getDirectoryName (a: string) = Path.GetDirectoryName(a) + let getBasename (a:string) = Path.GetFileNameWithoutExtension a + let getFullPath (a:string) = Path.GetFullPath a + let getFilename (a:string) = Path.GetFileName a + let getDirectoryName (a:string) = Path.GetDirectoryName a - let copyFile source dir = + let copyFile (source:string) dir = let dest = if not (Directory.Exists dir) then Directory.CreateDirectory dir |>ignore let result = Path.Combine(dir, getFilename source) @@ -93,7 +93,7 @@ module Scripting = module Process = - let processExePath baseDir exe = + let processExePath baseDir (exe:string) = if Path.IsPathRooted(exe) then exe else match getDirectoryName exe with @@ -108,7 +108,7 @@ module Scripting = processInfo.UseShellExecute <- false processInfo.WorkingDirectory <- workDir -#if NETSTANDARD1_6 +#if !NET46 ignore envs // work out what to do about this #else envs diff --git a/src/scripts/subst.fsx b/src/scripts/subst.fsx deleted file mode 100644 index 4e8199e0abb..00000000000 --- a/src/scripts/subst.fsx +++ /dev/null @@ -1,25 +0,0 @@ -// Copyright (c) Microsoft Corporation. All Rights Reserved. See License.txt in the project root for license information. -// -//========================================================================================= - -#load "scriptlib.fsx" - -open System.IO -open System.Text.RegularExpressions - -try - let input = getCmdLineArgReqd "--in:" - let output = getCmdLineArgReqd "--out:" - let pattern1 = getCmdLineArgReqd "--pattern1:" - let replacement1 = getCmdLineArgReqd "--replacement1:" - let pattern2 = getCmdLineArgOptional "--pattern2:" - let replacement2 = getCmdLineArgOptional "--replacement2:" - - let inp0 = File.ReadAllText(input) - let inp1 = Regex.Replace(inp0, pattern1, replacement1) - let inp2 = match pattern2, replacement2 with Some p2, Some r2 -> Regex.Replace(inp1, p2, r2) | None, None -> inp1 | _ -> failwith "if pattern2 is given, replacement2 must also be given" - File.WriteAllText(output,inp2) - exit 0 -with e -> - eprintfn "%A" e - exit 1 diff --git a/tests/FSharp.Build.UnitTests/Directory.Build.props b/tests/FSharp.Build.UnitTests/Directory.Build.props new file mode 100644 index 00000000000..bb8eac309b1 --- /dev/null +++ b/tests/FSharp.Build.UnitTests/Directory.Build.props @@ -0,0 +1,3 @@ + + + diff --git a/tests/FSharp.Build.UnitTests/Directory.Build.targets b/tests/FSharp.Build.UnitTests/Directory.Build.targets new file mode 100644 index 00000000000..ccd47cc0a9a --- /dev/null +++ b/tests/FSharp.Build.UnitTests/Directory.Build.targets @@ -0,0 +1,3 @@ + + + diff --git a/tests/FSharp.Build.UnitTests/FSharp.Build.UnitTests.fsproj b/tests/FSharp.Build.UnitTests/FSharp.Build.UnitTests.fsproj index 93cf3dfa3b6..9e04e6e5845 100644 --- a/tests/FSharp.Build.UnitTests/FSharp.Build.UnitTests.fsproj +++ b/tests/FSharp.Build.UnitTests/FSharp.Build.UnitTests.fsproj @@ -1,102 +1,33 @@ - + + - $(MSBuildProjectDirectory)\..\..\src - {400FAB03-786E-40CC-85A8-04B0C2869B14} - true - false - - - - Debug - AnyCPU - 2.0 - true - true + net46;netcoreapp2.0 Library - false - FSharp.Build.UnitTests - netcore - - - $(DefineConstants);$(TargetDotnetProfile.ToLower()) - - - true - false - $(DefineConstants);DEBUG;TRACE - prompt - 3 - - - true - $(DefineConstants);TRACE - prompt - 3 + true + nunit - - - true - True - $(NUnitLibDir)\nunit.framework.dll - - - - - $(FSharpSourcesRoot)\..\packages\Microsoft.Build.Framework.$(MicrosoftBuildFrameworkPackageVersion)\lib\net46\Microsoft.Build.Framework.dll - - - $(FSharpSourcesRoot)\..\packages\Microsoft.Build.$(MicrosoftBuildPackageVersion)\lib\net46\Microsoft.Build.dll - - - $(FSharpSourcesRoot)\..\packages\Microsoft.Build.Utilities.Core.$(MicrosoftBuildUtilitiesCorePackageVersion)\lib\net46\Microsoft.Build.Utilities.Core.dll - - - $(FSharpSourcesRoot)\..\packages\Microsoft.Build.Tasks.Core.$(MicrosoftBuildTasksCorePackageVersion)\lib\net46\Microsoft.Build.Tasks.Core.dll - - - $(FSharpSourcesRoot)\..\packages\Microsoft.Build.Tasks.Core.$(MicrosoftBuildTasksCorePackageVersion)\lib\net46\Microsoft.Build.Tasks.Core.dll - - - $(FSharpSourcesRoot)\..\packages\System.IO.Compression.$(SystemIoCompressionPackageVersion)\lib\net46\System.IO.Compression.dll - - - $(FSharpSourcesRoot)\..\packages\Microsoft.VisualFSharp.Type.Providers.Redist.$(MicrosoftVisualFSharpTypeProvidersRedistPackageVersion)\content\4.3.0.0\FSharp.Data.TypeProviders.dll - - - - - $(FSharpSourcesRoot)\..\packages\Microsoft.Build.Framework.14.3.0\lib\net45\Microsoft.Build.Framework.dll - - - $(FSharpSourcesRoot)\..\packages\Microsoft.Build.14.3.0\lib\net45\Microsoft.Build.dll - - - $(FSharpSourcesRoot)\..\packages\Microsoft.Build.Utilities.Core.14.3.0\lib\net45\Microsoft.Build.Utilities.Core.dll - - - $(FSharpSourcesRoot)\..\packages\Microsoft.Build.Tasks.Core.14.3.0\lib\net45\Microsoft.Build.Tasks.Core.dll - - + - - {702A7979-BCF9-4C41-853E-3ADFC9897890} - FSharp.Build - - - {DED3BBD7-53F4-428A-8C9F-27968E768605} - FSharp.Core - + + - - - + + + + + + + - - + + + + + - + diff --git a/tests/FSharp.Build.UnitTests/NuGet.Config b/tests/FSharp.Build.UnitTests/NuGet.Config index 0a86752fee0..3f63fa01d30 100644 --- a/tests/FSharp.Build.UnitTests/NuGet.Config +++ b/tests/FSharp.Build.UnitTests/NuGet.Config @@ -4,7 +4,7 @@ - + diff --git a/tests/FSharp.Build.UnitTests/Program.fs b/tests/FSharp.Build.UnitTests/Program.fs deleted file mode 100644 index d0397a7de09..00000000000 --- a/tests/FSharp.Build.UnitTests/Program.fs +++ /dev/null @@ -1,14 +0,0 @@ -// Copyright (c) Microsoft Corporation. All Rights Reserved. See License.txt in the project root for license information. - -module Program - -open System -open System.Reflection -open NUnitLite -open NUnit.Common - -type HelperType() = inherit System.Object() - -[] -let main argv = - AutoRun(typeof.GetTypeInfo().Assembly).Execute(argv, new ExtendedTextWrapper(Console.Out), Console.In) diff --git a/tests/FSharp.Build.UnitTests/project.json b/tests/FSharp.Build.UnitTests/project.json deleted file mode 100644 index 91e95a04872..00000000000 --- a/tests/FSharp.Build.UnitTests/project.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "version": "1.0.0-*", - "name": "FSharp.Build.UnitTests", - "buildOptions": { - "debugType": "portable", - "emitEntryPoint": true - }, - "dependencies": { - "nunit": "3.5.0", - "nunitlite": "3.5.0", - "Microsoft.Build": "15.1.548", - "Microsoft.Build.Framework": "15.1.548", - "Microsoft.Build.Tasks.Core": "15.1.548", - "Testing.FSharp.Core": "4.2.4", - "Microsoft.Build.Utilities.Core": "15.1.548" - }, - "runtimes": { - "win7-x86": {}, - "win7-x64": {}, - "osx.10.11-x64": {}, - "ubuntu.14.04-x64": {} - }, - "frameworks": { - "netcoreapp1.0": { - "dependencies": { - "Microsoft.NETCore.App": { - "type": "platform", - "version": "1.0.1" - } - }, - "imports": [ "netstandard1.1", "netstandard1.6", "portable-net45+win8+wp8+wpa81" ] - } - } -} diff --git a/tests/FSharp.Compiler.UnitTests/Directory.Build.props b/tests/FSharp.Compiler.UnitTests/Directory.Build.props new file mode 100644 index 00000000000..bb8eac309b1 --- /dev/null +++ b/tests/FSharp.Compiler.UnitTests/Directory.Build.props @@ -0,0 +1,3 @@ + + + diff --git a/tests/FSharp.Compiler.UnitTests/Directory.Build.targets b/tests/FSharp.Compiler.UnitTests/Directory.Build.targets new file mode 100644 index 00000000000..ccd47cc0a9a --- /dev/null +++ b/tests/FSharp.Compiler.UnitTests/Directory.Build.targets @@ -0,0 +1,3 @@ + + + diff --git a/tests/FSharp.Compiler.UnitTests/FSharp.Compiler.UnitTests.fsproj b/tests/FSharp.Compiler.UnitTests/FSharp.Compiler.UnitTests.fsproj index da3db8e565f..4b9f4d21a30 100644 --- a/tests/FSharp.Compiler.UnitTests/FSharp.Compiler.UnitTests.fsproj +++ b/tests/FSharp.Compiler.UnitTests/FSharp.Compiler.UnitTests.fsproj @@ -1,52 +1,14 @@  - + + - $(MSBuildProjectDirectory)\..\..\src - {a8d9641a-9170-4cf4-8fe0-6db8c134e1b5} - - - - AnyCPU - 2.0 - true - true + net46;netcoreapp2.0 Library - FSharp.Compiler.UnitTests - - false - false - - - true - false - bin\Debug\ - DEBUG;TRACE - prompt - 3 - - - true - bin\Release\ - TRACE - prompt - 3 + true + nunit - - - True - $(NUnitLibDir)\nunit.framework.dll - - - - - - - - - ..\..\..\packages\System.ValueTuple.$(SystemValueTuplePackageVersion)\lib\netstandard1.0\System.ValueTuple.dll - - + @@ -57,15 +19,10 @@ + - - FSharp.Compiler.Private - {2e4d67b4-522d-4cf7-97e4-ba940f0b18f3} - - - {DED3BBD7-53F4-428A-8C9F-27968E768605} - FSharp.Core - + + - - \ No newline at end of file + + diff --git a/tests/FSharp.Compiler.UnitTests/ILHelpers.fs b/tests/FSharp.Compiler.UnitTests/ILHelpers.fs index 32c4e209d8b..372e11d0702 100644 --- a/tests/FSharp.Compiler.UnitTests/ILHelpers.fs +++ b/tests/FSharp.Compiler.UnitTests/ILHelpers.fs @@ -39,12 +39,11 @@ module ILChecker = /// Compile the source and check to see if the expected IL exists. /// The first line of each expected IL string is found first. let check source expectedIL = - let SCRIPT_ROOT = __SOURCE_DIRECTORY__ - let packagesDir = SCRIPT_ROOT ++ ".." ++ ".." ++ "packages" + let packagesDir = Environment.GetEnvironmentVariable("USERPROFILE") ++ ".nuget" ++ "packages" let Is64BitOperatingSystem = sizeof = 8 let architectureMoniker = if Is64BitOperatingSystem then "x64" else "x86" - let ildasmExe = requireFile (packagesDir ++ ("runtime.win-" + architectureMoniker + ".Microsoft.NETCore.ILDAsm.2.0.3") ++ "runtimes" ++ ("win-" + architectureMoniker) ++ "native" ++ "ildasm.exe") - let coreclrDll = requireFile (packagesDir ++ ("runtime.win-" + architectureMoniker + ".Microsoft.NETCore.Runtime.CoreCLR.2.0.3") ++ "runtimes" ++ ("win-" + architectureMoniker) ++ "native" ++ "coreclr.dll") + let ildasmExe = requireFile (packagesDir ++ ("runtime.win-" + architectureMoniker + ".Microsoft.NETCore.ILDAsm") ++ "2.0.3" ++ "runtimes" ++ ("win-" + architectureMoniker) ++ "native" ++ "ildasm.exe") + let coreclrDll = requireFile (packagesDir ++ ("runtime.win-" + architectureMoniker + ".Microsoft.NETCore.Runtime.CoreCLR") ++ "2.0.3" ++ "runtimes" ++ ("win-" + architectureMoniker) ++ "native" ++ "coreclr.dll") let tmp = Path.GetTempFileName() let tmpFs = Path.ChangeExtension(tmp, ".fs") diff --git a/tests/FSharp.Compiler.UnitTests/ProductVersion.fs b/tests/FSharp.Compiler.UnitTests/ProductVersion.fs index 6395d2e39ac..f0c6862a3f7 100644 --- a/tests/FSharp.Compiler.UnitTests/ProductVersion.fs +++ b/tests/FSharp.Compiler.UnitTests/ProductVersion.fs @@ -91,8 +91,10 @@ module TypeProviderDesignTimeComponentLoading = [] let ``check tooling paths for type provider design time component loading`` () = - let expected = - [ Path.Combine("typeproviders", "fsharp41", "net461") + let expected = + [ +#if NET46 // only available on net46 + Path.Combine("typeproviders", "fsharp41", "net461") Path.Combine("tools", "fsharp41", "net461") Path.Combine("typeproviders", "fsharp41", "net452") Path.Combine("tools", "fsharp41", "net452") @@ -100,9 +102,13 @@ module TypeProviderDesignTimeComponentLoading = Path.Combine("tools", "fsharp41", "net451") Path.Combine("typeproviders", "fsharp41", "net45") Path.Combine("tools", "fsharp41", "net45") +#else // only available on netcoreapp2.0 + Path.Combine("typeproviders", "fsharp41", "netcoreapp2.0") + Path.Combine("tools", "fsharp41", "netcoreapp2.0") +#endif // available in both Path.Combine("typeproviders", "fsharp41", "netstandard2.0") Path.Combine("tools", "fsharp41", "netstandard2.0") - ] + ] let actual = Microsoft.FSharp.Compiler.ExtensionTyping.toolingCompatiblePaths() printfn "actual = %A" actual printfn "expected = %A" expected diff --git a/tests/FSharp.Core.UnitTests/.gitignore b/tests/FSharp.Core.UnitTests/.gitignore new file mode 100644 index 00000000000..3345def5b31 --- /dev/null +++ b/tests/FSharp.Core.UnitTests/.gitignore @@ -0,0 +1 @@ +FSharp.Core.Unittests.nuget.props diff --git a/tests/FSharp.Core.UnitTests/Directory.Build.props b/tests/FSharp.Core.UnitTests/Directory.Build.props new file mode 100644 index 00000000000..bb8eac309b1 --- /dev/null +++ b/tests/FSharp.Core.UnitTests/Directory.Build.props @@ -0,0 +1,3 @@ + + + diff --git a/tests/FSharp.Core.UnitTests/Directory.Build.targets b/tests/FSharp.Core.UnitTests/Directory.Build.targets new file mode 100644 index 00000000000..ccd47cc0a9a --- /dev/null +++ b/tests/FSharp.Core.UnitTests/Directory.Build.targets @@ -0,0 +1,3 @@ + + + diff --git a/tests/FSharp.Core.UnitTests/FSharp.Core.UnitTests.dll.config b/tests/FSharp.Core.UnitTests/FSharp.Core.UnitTests.dll.config index e400a559411..ce6637101bb 100644 --- a/tests/FSharp.Core.UnitTests/FSharp.Core.UnitTests.dll.config +++ b/tests/FSharp.Core.UnitTests/FSharp.Core.UnitTests.dll.config @@ -4,9 +4,9 @@ - - + + - \ No newline at end of file + diff --git a/tests/FSharp.Core.UnitTests/FSharp.Core.UnitTests.fsproj b/tests/FSharp.Core.UnitTests/FSharp.Core.UnitTests.fsproj index 9a20813ee13..5e56fd9d395 100644 --- a/tests/FSharp.Core.UnitTests/FSharp.Core.UnitTests.fsproj +++ b/tests/FSharp.Core.UnitTests/FSharp.Core.UnitTests.fsproj @@ -1,73 +1,17 @@  - + + - $(MSBuildProjectDirectory)\..\..\src - {88e2d422-6852-46e3-a740-83e391dc7973} - true - false - - - - Debug - AnyCPU - 2.0 - true - true + net46;netcoreapp2.0 Library - false - FSharp.Core.UnitTests - - false - false - netcore - $(NoWarn);217 - - - $(DefineConstants);$(TargetDotnetProfile.ToLower()) + true + nunit + + + false - - true - false - $(DefineConstants);DEBUG;TRACE - prompt - 3 - - - true - $(DefineConstants);TRACE - prompt - 3 - - - - - true - True - $(NUnitLibDir)\nunit.framework.dll - - - true - True - $(FsCheckLibDir)\net452\FsCheck.dll - - - ..\..\packages\System.ValueTuple.$(SystemValueTuplePackageVersion)\lib\portable-net40+sl4+win8+wp8\System.ValueTuple.dll - True - - - - - {DED3BBD7-53F4-428A-8C9F-27968E768605} - FSharp.Core - - - - - - - - + @@ -118,13 +62,21 @@ - - + + FSharp.Core.UnitTests.dll.config FSCoreVersion $(FSCoreVersion) - - \ No newline at end of file + + + + + + + + + + diff --git a/tests/FSharp.Core.UnitTests/FSharp.Core/Microsoft.FSharp.Collections/ArrayModule.fs b/tests/FSharp.Core.UnitTests/FSharp.Core/Microsoft.FSharp.Collections/ArrayModule.fs index 2718948cab1..ef82fde2761 100644 --- a/tests/FSharp.Core.UnitTests/FSharp.Core/Microsoft.FSharp.Collections/ArrayModule.fs +++ b/tests/FSharp.Core.UnitTests/FSharp.Core/Microsoft.FSharp.Collections/ArrayModule.fs @@ -125,44 +125,41 @@ type ArrayModule() = CheckThrowsArgumentNullException (fun () -> Array.average nullArr |> ignore) () - + [] - member this.AverageBy() = - - // empty double array + member this.AverageBy() = + + // empty double array let emptyDouArray = Array.empty - let funcd x = x + 6.7 - CheckThrowsArgumentException(fun () -> Array.averageBy funcd emptyDouArray |> ignore) - + CheckThrowsArgumentException(fun () -> Array.averageBy (fun x -> x + 6.7) emptyDouArray |> ignore) + // empty float32 array let emptyFloat32Array: float32[] = [||] - let funcf x = x + 9.8f - CheckThrowsArgumentException(fun () -> Array.averageBy funcf emptyFloat32Array |> ignore) - + CheckThrowsArgumentException(fun () -> Array.averageBy (fun x -> x + 9.8f) emptyFloat32Array |> ignore) + // empty decimal array let emptyDecimalArray = Array.empty - let funcDecimal x = x + 9.8M - CheckThrowsArgumentException(fun () -> Array.averageBy funcDecimal emptyDecimalArray |> ignore) - + CheckThrowsArgumentException(fun () -> Array.averageBy (fun x -> x + 9.8M) emptyDecimalArray |> ignore) + // float32 array - let floatArray: float32[] = [| 1.2f;3.5f;6.7f |] - let averageOfFloat = Array.averageBy funcf floatArray - if averageOfFloat <> 13.5999994f then Assert.Fail() - + let floatArray: float32[] = [| 1.5f; 2.5f; 3.5f; 4.5f |] // using values that behave nicely with IEEE floats + let averageOfFloat = Array.averageBy (fun x -> x + 1.0f) floatArray + Assert.AreEqual(4.0f, averageOfFloat) + // double array - let doubleArray: System.Double[] = [| 1.0;8.0 |] - let averageOfDouble = Array.averageBy funcd doubleArray - if averageOfDouble <> 11.2 then Assert.Fail() - + let doubleArray: System.Double[] = [| 1.0; 8.0 |] // using values that behave nicely with IEEE doubles + let averageOfDouble = Array.averageBy (fun x -> x + 1.0) doubleArray + Assert.AreEqual(5.5, averageOfDouble) + // decimal array let decimalArray: decimal[] = [| 0M;19M;19.03M |] - let averageOfDecimal = Array.averageBy funcDecimal decimalArray - if averageOfDecimal <> 22.476666666666666666666666667M then Assert.Fail() - + let averageOfDecimal = Array.averageBy (fun x -> x + 9.8M) decimalArray + Assert.AreEqual(22.476666666666666666666666667M, averageOfDecimal) + // null array let nullArr : double[] = null - CheckThrowsArgumentNullException (fun () -> Array.averageBy funcd nullArr |> ignore) - + CheckThrowsArgumentNullException (fun () -> Array.averageBy (fun x -> x + 6.7) nullArr |> ignore) + () [] diff --git a/tests/FSharp.Core.UnitTests/FSharp.Core/Microsoft.FSharp.Collections/ListModule.fs b/tests/FSharp.Core.UnitTests/FSharp.Core/Microsoft.FSharp.Collections/ListModule.fs index 538e5a0d155..188dadc3b93 100644 --- a/tests/FSharp.Core.UnitTests/FSharp.Core/Microsoft.FSharp.Collections/ListModule.fs +++ b/tests/FSharp.Core.UnitTests/FSharp.Core/Microsoft.FSharp.Collections/ListModule.fs @@ -98,36 +98,36 @@ type ListModule() = () - + [] - member this.AverageBy() = - // empty double List + member this.AverageBy() = + // empty double List let emptyDouList = List.empty - CheckThrowsArgumentException (fun () -> List.averageBy (fun x -> x + 6.7) emptyDouList |> ignore ) - + CheckThrowsArgumentException (fun () -> List.averageBy (fun x -> x + 6.7) emptyDouList |> ignore) + // empty float32 List let emptyFloat32List: float32 list = [] - CheckThrowsArgumentException (fun () -> List.averageBy (fun x -> x + 9.8f ) emptyFloat32List |> ignore) - + CheckThrowsArgumentException (fun () -> List.averageBy (fun x -> x + 9.8f) emptyFloat32List |> ignore) + // empty decimal List let emptyDecimalList = List.empty - CheckThrowsArgumentException (fun () -> List.averageBy (fun x -> x + 9.8M) emptyDecimalList |>ignore ) + CheckThrowsArgumentException (fun () -> List.averageBy (fun x -> x + 9.8M) emptyDecimalList |> ignore) // float32 List - let floatList: float32 list = [ 1.2f;3.5f;6.7f ] - let averageOfFloat = List.averageBy (fun x -> x + 9.8f ) floatList - Assert.AreEqual(averageOfFloat, 13.5999994f) - + let floatList: float32 list = [ 1.5f; 2.5f; 3.5f; 4.5f ] // using values that behave nicely with IEEE floats + let averageOfFloat = List.averageBy (fun x -> x + 1.0f) floatList + Assert.AreEqual(4.0f, averageOfFloat) + // double List - let doubleList: System.Double list = [ 1.0;8.0 ] - let averageOfDouble = List.averageBy (fun x -> x + 6.7) doubleList - Assert.AreEqual(11.2, averageOfDouble) - + let doubleList: System.Double list = [ 1.0; 8.0 ] // using values that behave nicely with IEEE doubles + let averageOfDouble = List.averageBy (fun x -> x + 1.0) doubleList + Assert.AreEqual(5.5, averageOfDouble) + // decimal List let decimalList: decimal list = [ 0M;19M;19.03M ] - let averageOfDecimal = List.averageBy (fun x -> x + 9.8M) decimalList + let averageOfDecimal = List.averageBy (fun x -> x + 9.8M) decimalList Assert.AreEqual(22.476666666666666666666666667M, averageOfDecimal) - + () [] diff --git a/tests/FSharp.Core.UnitTests/FSharp.Core/Microsoft.FSharp.Control/AsyncModule.fs b/tests/FSharp.Core.UnitTests/FSharp.Core/Microsoft.FSharp.Control/AsyncModule.fs index c2afaa88d5f..a08beb890e4 100644 --- a/tests/FSharp.Core.UnitTests/FSharp.Core/Microsoft.FSharp.Control/AsyncModule.fs +++ b/tests/FSharp.Core.UnitTests/FSharp.Core/Microsoft.FSharp.Control/AsyncModule.fs @@ -441,7 +441,7 @@ type AsyncModule() = member this.``RaceBetweenCancellationAndError.Sleep``() = testErrorAndCancelRace (Async.Sleep (-5)) -#if !coreclr +#if NET46 [] // takes 3 minutes! member this.``Async.Choice specification test``() = ThreadPool.SetMinThreads(100,100) |> ignore diff --git a/tests/FSharp.Core.UnitTests/FSharp.Core/Microsoft.FSharp.Control/AsyncType.fs b/tests/FSharp.Core.UnitTests/FSharp.Core/Microsoft.FSharp.Control/AsyncType.fs index d2fe26e0c00..701e8ff1575 100644 --- a/tests/FSharp.Core.UnitTests/FSharp.Core/Microsoft.FSharp.Control/AsyncType.fs +++ b/tests/FSharp.Core.UnitTests/FSharp.Core/Microsoft.FSharp.Control/AsyncType.fs @@ -134,7 +134,7 @@ type AsyncType() = member this.CreateTask () = let s = "Hello tasks!" let a = async { return s } -#if NETSTANDARD1_6 +#if !NET46 let t : Task = #else use t : Task = @@ -151,7 +151,7 @@ type AsyncType() = let a = async { cts.CancelAfter (100) do! tcs.Task |> Async.AwaitTask } -#if NETSTANDARD1_6 +#if !NET46 let t : Task = #else use t : Task = @@ -178,7 +178,7 @@ type AsyncType() = member this.StartTask () = let s = "Hello tasks!" let a = async { return s } -#if NETSTANDARD1_6 +#if !NET46 let t = #else use t = @@ -208,7 +208,7 @@ type AsyncType() = let a = async { do raise (Exception ()) } -#if NETSTANDARD1_6 +#if !NET46 let t = #else use t = @@ -227,7 +227,7 @@ type AsyncType() = let a = async { while true do () } -#if NETSTANDARD1_6 +#if !NET46 let t = #else use t = @@ -252,7 +252,7 @@ type AsyncType() = } let cts = new CancellationTokenSource() let token = cts.Token -#if NETSTANDARD1_6 +#if !NET46 let t = #else use t = @@ -274,7 +274,7 @@ type AsyncType() = member this.CreateImmediateAsTask () = let s = "Hello tasks!" let a = async { return s } -#if FSCORE_PORTABLE_NEW || coreclr +#if !NET46 let t : Task = #else use t : Task = @@ -288,7 +288,7 @@ type AsyncType() = member this.StartImmediateAsTask () = let s = "Hello tasks!" let a = async { return s } -#if FSCORE_PORTABLE_NEW || coreclr +#if !NET46 let t = #else use t = @@ -304,7 +304,7 @@ type AsyncType() = let a = async { do raise (Exception ()) } -#if FSCORE_PORTABLE_NEW || coreclr +#if !NET46 let t = #else use t = @@ -324,7 +324,7 @@ type AsyncType() = let a = async { while true do () } -#if FSCORE_PORTABLE_NEW || coreclr +#if !NET46 let t = #else use t = @@ -350,7 +350,7 @@ type AsyncType() = } let cts = new CancellationTokenSource() let token = cts.Token -#if FSCORE_PORTABLE_NEW || coreclr +#if !NET46 let t = #else use t = @@ -372,7 +372,7 @@ type AsyncType() = [] member this.TaskAsyncValue () = let s = "Test" -#if NETSTANDARD1_6 +#if !NET46 let t = #else use t = @@ -412,7 +412,7 @@ type AsyncType() = [] member this.TaskAsyncValueException () = -#if NETSTANDARD1_6 +#if !NET46 let t = #else use t = @@ -431,7 +431,7 @@ type AsyncType() = use ewh = new ManualResetEvent(false) let cts = new CancellationTokenSource() let token = cts.Token -#if NETSTANDARD1_6 +#if !NET46 let t : Task= #else use t : Task= @@ -450,7 +450,7 @@ type AsyncType() = [] member this.NonGenericTaskAsyncValue () = let hasBeenCalled = ref false -#if NETSTANDARD1_6 +#if !NET46 let t = #else use t = @@ -465,7 +465,7 @@ type AsyncType() = [] member this.NonGenericTaskAsyncValueException () = -#if NETSTANDARD1_6 +#if !NET46 let t = #else use t = @@ -484,7 +484,7 @@ type AsyncType() = use ewh = new ManualResetEvent(false) let cts = new CancellationTokenSource() let token = cts.Token -#if NETSTANDARD1_6 +#if !NET46 let t = #else use t = diff --git a/tests/FSharp.Core.UnitTests/FSharp.Core/Microsoft.FSharp.Control/MailboxProcessorType.fs b/tests/FSharp.Core.UnitTests/FSharp.Core/Microsoft.FSharp.Control/MailboxProcessorType.fs index de56a4b1455..5dfafab8770 100644 --- a/tests/FSharp.Core.UnitTests/FSharp.Core/Microsoft.FSharp.Control/MailboxProcessorType.fs +++ b/tests/FSharp.Core.UnitTests/FSharp.Core/Microsoft.FSharp.Control/MailboxProcessorType.fs @@ -292,7 +292,7 @@ type MailboxProcessorType() = test() - [] + //[] // need to re-visit this member this.PostAndAsyncReply_Cancellation() = use cancel = new CancellationTokenSource(500) @@ -329,6 +329,6 @@ type MailboxProcessorType() = |> Async.Parallel |> Async.Ignore |> fun x -> Async.Start(x, cancel.Token) - System.Threading.Thread.Sleep(1000) // cancellation after 500 + System.Threading.Thread.Sleep(5000) // cancellation after 500 pause for 5 seconds if not gotGood || not gotBad then - failwith "Exected both good and bad async's to be cancelled afteMailbox should not fail!" + failwith <| sprintf "Exected both good and bad async's to be cancelled afteMailbox should not fail! gotGood: %A, gotBad: %A" gotGood gotBad diff --git a/tests/FSharp.Core.UnitTests/LibraryTestFx.fs b/tests/FSharp.Core.UnitTests/LibraryTestFx.fs index b58653a1de1..c4d6e147fe0 100644 --- a/tests/FSharp.Core.UnitTests/LibraryTestFx.fs +++ b/tests/FSharp.Core.UnitTests/LibraryTestFx.fs @@ -143,7 +143,8 @@ module SurfaceArea = let logFile = let workDir = TestContext.CurrentContext.WorkDirectory - sprintf "%s\\CoreUnit_%s_Xml.xml" workDir platform + sprintf "%s\\FSharp.Core.SurfaceArea.%s.txt" workDir platform + System.IO.File.WriteAllText(logFile, String.Join("\r\n", actual)) // The surface areas don't match; prepare an easily-readable output message. let msg = diff --git a/tests/FSharp.Core.UnitTests/Program.fs b/tests/FSharp.Core.UnitTests/Program.fs deleted file mode 100644 index 28ff2aa8434..00000000000 --- a/tests/FSharp.Core.UnitTests/Program.fs +++ /dev/null @@ -1,12 +0,0 @@ -module Program - -open System -open System.Reflection -open NUnitLite -open NUnit.Common - -type HelperType() = inherit System.Object() - -[] -let main argv = - AutoRun(typeof.GetTypeInfo().Assembly).Execute(argv, new ExtendedTextWrapper(Console.Out), Console.In) diff --git a/tests/FSharp.Core.UnitTests/SurfaceArea.coreclr.fs b/tests/FSharp.Core.UnitTests/SurfaceArea.coreclr.fs index e3873c76b9c..9de6db290bd 100644 --- a/tests/FSharp.Core.UnitTests/SurfaceArea.coreclr.fs +++ b/tests/FSharp.Core.UnitTests/SurfaceArea.coreclr.fs @@ -102,7 +102,6 @@ Microsoft.FSharp.Collections.ArrayModule: System.Tuple`2[System.Int32,T][] Index Microsoft.FSharp.Collections.ArrayModule: System.Tuple`2[T,T][] Pairwise[T](T[]) Microsoft.FSharp.Collections.ArrayModule: System.Tuple`2[T1,T2][] AllPairs[T1,T2](T1[], T2[]) Microsoft.FSharp.Collections.ArrayModule: System.Tuple`2[T1,T2][] Zip[T1,T2](T1[], T2[]) -Microsoft.FSharp.Collections.ArrayModule: System.Tuple`2[T1,T2][] AllPairs[T1,T2](T1[], T2[]) Microsoft.FSharp.Collections.ArrayModule: System.Tuple`2[T1[],T2[]] Unzip[T1,T2](System.Tuple`2[T1,T2][]) Microsoft.FSharp.Collections.ArrayModule: System.Tuple`2[TKey,System.Int32][] CountBy[T,TKey](Microsoft.FSharp.Core.FSharpFunc`2[T,TKey], T[]) Microsoft.FSharp.Collections.ArrayModule: System.Tuple`2[TKey,T[]][] GroupBy[T,TKey](Microsoft.FSharp.Core.FSharpFunc`2[T,TKey], T[]) @@ -190,18 +189,6 @@ Microsoft.FSharp.Collections.ArrayModule: Void Set[T](T[], Int32, T) Microsoft.FSharp.Collections.ArrayModule: Void SortInPlaceBy[T,TKey](Microsoft.FSharp.Core.FSharpFunc`2[T,TKey], T[]) Microsoft.FSharp.Collections.ArrayModule: Void SortInPlaceWith[T](Microsoft.FSharp.Core.FSharpFunc`2[T,Microsoft.FSharp.Core.FSharpFunc`2[T,System.Int32]], T[]) Microsoft.FSharp.Collections.ArrayModule: Void SortInPlace[T](T[]) -Microsoft.FSharp.Collections.ArrayModule+Parallel: Boolean Equals(System.Object) -Microsoft.FSharp.Collections.ArrayModule+Parallel: Int32 GetHashCode() -Microsoft.FSharp.Collections.ArrayModule+Parallel: System.String ToString() -Microsoft.FSharp.Collections.ArrayModule+Parallel: System.Tuple`2[T[],T[]] Partition[T](Microsoft.FSharp.Core.FSharpFunc`2[T,System.Boolean], T[]) -Microsoft.FSharp.Collections.ArrayModule+Parallel: System.Type GetType() -Microsoft.FSharp.Collections.ArrayModule+Parallel: TResult[] Choose[T,TResult](Microsoft.FSharp.Core.FSharpFunc`2[T,Microsoft.FSharp.Core.FSharpOption`1[TResult]], T[]) -Microsoft.FSharp.Collections.ArrayModule+Parallel: TResult[] Collect[T,TResult](Microsoft.FSharp.Core.FSharpFunc`2[T,TResult[]], T[]) -Microsoft.FSharp.Collections.ArrayModule+Parallel: TResult[] MapIndexed[T,TResult](Microsoft.FSharp.Core.FSharpFunc`2[System.Int32,Microsoft.FSharp.Core.FSharpFunc`2[T,TResult]], T[]) -Microsoft.FSharp.Collections.ArrayModule+Parallel: TResult[] Map[T,TResult](Microsoft.FSharp.Core.FSharpFunc`2[T,TResult], T[]) -Microsoft.FSharp.Collections.ArrayModule+Parallel: T[] Initialize[T](Int32, Microsoft.FSharp.Core.FSharpFunc`2[System.Int32,T]) -Microsoft.FSharp.Collections.ArrayModule+Parallel: Void IterateIndexed[T](Microsoft.FSharp.Core.FSharpFunc`2[System.Int32,Microsoft.FSharp.Core.FSharpFunc`2[T,Microsoft.FSharp.Core.Unit]], T[]) -Microsoft.FSharp.Collections.ArrayModule+Parallel: Void Iterate[T](Microsoft.FSharp.Core.FSharpFunc`2[T,Microsoft.FSharp.Core.Unit], T[]) Microsoft.FSharp.Collections.ComparisonIdentity: Boolean Equals(System.Object) Microsoft.FSharp.Collections.ComparisonIdentity: Int32 GetHashCode() Microsoft.FSharp.Collections.ComparisonIdentity: System.Collections.Generic.IComparer`1[T] FromFunction[T](Microsoft.FSharp.Core.FSharpFunc`2[T,Microsoft.FSharp.Core.FSharpFunc`2[T,System.Int32]]) @@ -252,6 +239,7 @@ Microsoft.FSharp.Collections.FSharpList`1[T]: Void .ctor(T, Microsoft.FSharp.Col Microsoft.FSharp.Collections.FSharpMap`2[TKey,TValue]: Boolean ContainsKey(TKey) Microsoft.FSharp.Collections.FSharpMap`2[TKey,TValue]: Boolean Equals(System.Object) Microsoft.FSharp.Collections.FSharpMap`2[TKey,TValue]: Boolean IsEmpty +Microsoft.FSharp.Collections.FSharpMap`2[TKey,TValue]: Boolean TryGetValue(TKey, TValue ByRef) Microsoft.FSharp.Collections.FSharpMap`2[TKey,TValue]: Boolean get_IsEmpty() Microsoft.FSharp.Collections.FSharpMap`2[TKey,TValue]: Int32 Count Microsoft.FSharp.Collections.FSharpMap`2[TKey,TValue]: Int32 GetHashCode() @@ -259,7 +247,6 @@ Microsoft.FSharp.Collections.FSharpMap`2[TKey,TValue]: Int32 get_Count() Microsoft.FSharp.Collections.FSharpMap`2[TKey,TValue]: Microsoft.FSharp.Collections.FSharpMap`2[TKey,TValue] Add(TKey, TValue) Microsoft.FSharp.Collections.FSharpMap`2[TKey,TValue]: Microsoft.FSharp.Collections.FSharpMap`2[TKey,TValue] Remove(TKey) Microsoft.FSharp.Collections.FSharpMap`2[TKey,TValue]: Microsoft.FSharp.Core.FSharpOption`1[TValue] TryFind(TKey) -Microsoft.FSharp.Collections.FSharpMap`2[TKey,TValue]: Boolean TryGetValue(TKey, TValue ByRef) Microsoft.FSharp.Collections.FSharpMap`2[TKey,TValue]: System.String ToString() Microsoft.FSharp.Collections.FSharpMap`2[TKey,TValue]: System.Type GetType() Microsoft.FSharp.Collections.FSharpMap`2[TKey,TValue]: TValue Item [TKey] @@ -576,10 +563,10 @@ Microsoft.FSharp.Control.AsyncActivation`1[T]: Boolean IsCancellationRequested Microsoft.FSharp.Control.AsyncActivation`1[T]: Boolean get_IsCancellationRequested() Microsoft.FSharp.Control.AsyncActivation`1[T]: Int32 GetHashCode() Microsoft.FSharp.Control.AsyncActivation`1[T]: Microsoft.FSharp.Control.AsyncReturn OnCancellation() -Microsoft.FSharp.Control.AsyncActivation`1[T]: Void OnExceptionRaised() Microsoft.FSharp.Control.AsyncActivation`1[T]: Microsoft.FSharp.Control.AsyncReturn OnSuccess(T) Microsoft.FSharp.Control.AsyncActivation`1[T]: System.String ToString() Microsoft.FSharp.Control.AsyncActivation`1[T]: System.Type GetType() +Microsoft.FSharp.Control.AsyncActivation`1[T]: Void OnExceptionRaised() Microsoft.FSharp.Control.AsyncPrimitives: Boolean Equals(System.Object) Microsoft.FSharp.Control.AsyncPrimitives: Int32 GetHashCode() Microsoft.FSharp.Control.AsyncPrimitives: Microsoft.FSharp.Control.AsyncReturn Bind[T,TResult](Microsoft.FSharp.Control.AsyncActivation`1[T], Microsoft.FSharp.Control.FSharpAsync`1[TResult], Microsoft.FSharp.Core.FSharpFunc`2[TResult,Microsoft.FSharp.Control.FSharpAsync`1[T]]) @@ -706,6 +693,7 @@ Microsoft.FSharp.Control.FSharpHandler`1[T]: Boolean Equals(System.Object) Microsoft.FSharp.Control.FSharpHandler`1[T]: Int32 GetHashCode() Microsoft.FSharp.Control.FSharpHandler`1[T]: System.Delegate[] GetInvocationList() Microsoft.FSharp.Control.FSharpHandler`1[T]: System.IAsyncResult BeginInvoke(System.Object, T, System.AsyncCallback, System.Object) +Microsoft.FSharp.Control.FSharpHandler`1[T]: System.Object Clone() Microsoft.FSharp.Control.FSharpHandler`1[T]: System.Object DynamicInvoke(System.Object[]) Microsoft.FSharp.Control.FSharpHandler`1[T]: System.Object Target Microsoft.FSharp.Control.FSharpHandler`1[T]: System.Object get_Target() @@ -715,6 +703,7 @@ Microsoft.FSharp.Control.FSharpHandler`1[T]: System.String ToString() Microsoft.FSharp.Control.FSharpHandler`1[T]: System.Type GetType() Microsoft.FSharp.Control.FSharpHandler`1[T]: Void .ctor(System.Object, IntPtr) Microsoft.FSharp.Control.FSharpHandler`1[T]: Void EndInvoke(System.IAsyncResult) +Microsoft.FSharp.Control.FSharpHandler`1[T]: Void GetObjectData(System.Runtime.Serialization.SerializationInfo, System.Runtime.Serialization.StreamingContext) Microsoft.FSharp.Control.FSharpHandler`1[T]: Void Invoke(System.Object, T) Microsoft.FSharp.Control.FSharpMailboxProcessor`1[TMsg]: Boolean Equals(System.Object) Microsoft.FSharp.Control.FSharpMailboxProcessor`1[TMsg]: Int32 CurrentQueueLength @@ -769,23 +758,32 @@ Microsoft.FSharp.Control.WebExtensions: Microsoft.FSharp.Control.FSharpAsync`1[S Microsoft.FSharp.Control.WebExtensions: System.String ToString() Microsoft.FSharp.Control.WebExtensions: System.Type GetType() Microsoft.FSharp.Core.AbstractClassAttribute: Boolean Equals(System.Object) +Microsoft.FSharp.Core.AbstractClassAttribute: Boolean IsDefaultAttribute() Microsoft.FSharp.Core.AbstractClassAttribute: Boolean Match(System.Object) Microsoft.FSharp.Core.AbstractClassAttribute: Int32 GetHashCode() +Microsoft.FSharp.Core.AbstractClassAttribute: System.Object TypeId +Microsoft.FSharp.Core.AbstractClassAttribute: System.Object get_TypeId() Microsoft.FSharp.Core.AbstractClassAttribute: System.String ToString() Microsoft.FSharp.Core.AbstractClassAttribute: System.Type GetType() Microsoft.FSharp.Core.AbstractClassAttribute: Void .ctor() Microsoft.FSharp.Core.AllowNullLiteralAttribute: Boolean Equals(System.Object) +Microsoft.FSharp.Core.AllowNullLiteralAttribute: Boolean IsDefaultAttribute() Microsoft.FSharp.Core.AllowNullLiteralAttribute: Boolean Match(System.Object) Microsoft.FSharp.Core.AllowNullLiteralAttribute: Boolean Value Microsoft.FSharp.Core.AllowNullLiteralAttribute: Boolean get_Value() Microsoft.FSharp.Core.AllowNullLiteralAttribute: Int32 GetHashCode() +Microsoft.FSharp.Core.AllowNullLiteralAttribute: System.Object TypeId +Microsoft.FSharp.Core.AllowNullLiteralAttribute: System.Object get_TypeId() Microsoft.FSharp.Core.AllowNullLiteralAttribute: System.String ToString() Microsoft.FSharp.Core.AllowNullLiteralAttribute: System.Type GetType() Microsoft.FSharp.Core.AllowNullLiteralAttribute: Void .ctor() Microsoft.FSharp.Core.AllowNullLiteralAttribute: Void .ctor(Boolean) Microsoft.FSharp.Core.AutoOpenAttribute: Boolean Equals(System.Object) +Microsoft.FSharp.Core.AutoOpenAttribute: Boolean IsDefaultAttribute() Microsoft.FSharp.Core.AutoOpenAttribute: Boolean Match(System.Object) Microsoft.FSharp.Core.AutoOpenAttribute: Int32 GetHashCode() +Microsoft.FSharp.Core.AutoOpenAttribute: System.Object TypeId +Microsoft.FSharp.Core.AutoOpenAttribute: System.Object get_TypeId() Microsoft.FSharp.Core.AutoOpenAttribute: System.String Path Microsoft.FSharp.Core.AutoOpenAttribute: System.String ToString() Microsoft.FSharp.Core.AutoOpenAttribute: System.String get_Path() @@ -793,10 +791,13 @@ Microsoft.FSharp.Core.AutoOpenAttribute: System.Type GetType() Microsoft.FSharp.Core.AutoOpenAttribute: Void .ctor() Microsoft.FSharp.Core.AutoOpenAttribute: Void .ctor(System.String) Microsoft.FSharp.Core.AutoSerializableAttribute: Boolean Equals(System.Object) +Microsoft.FSharp.Core.AutoSerializableAttribute: Boolean IsDefaultAttribute() Microsoft.FSharp.Core.AutoSerializableAttribute: Boolean Match(System.Object) Microsoft.FSharp.Core.AutoSerializableAttribute: Boolean Value Microsoft.FSharp.Core.AutoSerializableAttribute: Boolean get_Value() Microsoft.FSharp.Core.AutoSerializableAttribute: Int32 GetHashCode() +Microsoft.FSharp.Core.AutoSerializableAttribute: System.Object TypeId +Microsoft.FSharp.Core.AutoSerializableAttribute: System.Object get_TypeId() Microsoft.FSharp.Core.AutoSerializableAttribute: System.String ToString() Microsoft.FSharp.Core.AutoSerializableAttribute: System.Type GetType() Microsoft.FSharp.Core.AutoSerializableAttribute: Void .ctor(Boolean) @@ -820,38 +821,54 @@ Microsoft.FSharp.Core.ByRefKinds: Microsoft.FSharp.Core.ByRefKinds+Out Microsoft.FSharp.Core.ByRefKinds: System.String ToString() Microsoft.FSharp.Core.ByRefKinds: System.Type GetType() Microsoft.FSharp.Core.CLIEventAttribute: Boolean Equals(System.Object) +Microsoft.FSharp.Core.CLIEventAttribute: Boolean IsDefaultAttribute() Microsoft.FSharp.Core.CLIEventAttribute: Boolean Match(System.Object) Microsoft.FSharp.Core.CLIEventAttribute: Int32 GetHashCode() +Microsoft.FSharp.Core.CLIEventAttribute: System.Object TypeId +Microsoft.FSharp.Core.CLIEventAttribute: System.Object get_TypeId() Microsoft.FSharp.Core.CLIEventAttribute: System.String ToString() Microsoft.FSharp.Core.CLIEventAttribute: System.Type GetType() Microsoft.FSharp.Core.CLIEventAttribute: Void .ctor() Microsoft.FSharp.Core.CLIMutableAttribute: Boolean Equals(System.Object) +Microsoft.FSharp.Core.CLIMutableAttribute: Boolean IsDefaultAttribute() Microsoft.FSharp.Core.CLIMutableAttribute: Boolean Match(System.Object) Microsoft.FSharp.Core.CLIMutableAttribute: Int32 GetHashCode() +Microsoft.FSharp.Core.CLIMutableAttribute: System.Object TypeId +Microsoft.FSharp.Core.CLIMutableAttribute: System.Object get_TypeId() Microsoft.FSharp.Core.CLIMutableAttribute: System.String ToString() Microsoft.FSharp.Core.CLIMutableAttribute: System.Type GetType() Microsoft.FSharp.Core.CLIMutableAttribute: Void .ctor() Microsoft.FSharp.Core.ClassAttribute: Boolean Equals(System.Object) +Microsoft.FSharp.Core.ClassAttribute: Boolean IsDefaultAttribute() Microsoft.FSharp.Core.ClassAttribute: Boolean Match(System.Object) Microsoft.FSharp.Core.ClassAttribute: Int32 GetHashCode() +Microsoft.FSharp.Core.ClassAttribute: System.Object TypeId +Microsoft.FSharp.Core.ClassAttribute: System.Object get_TypeId() Microsoft.FSharp.Core.ClassAttribute: System.String ToString() Microsoft.FSharp.Core.ClassAttribute: System.Type GetType() Microsoft.FSharp.Core.ClassAttribute: Void .ctor() Microsoft.FSharp.Core.ComparisonConditionalOnAttribute: Boolean Equals(System.Object) +Microsoft.FSharp.Core.ComparisonConditionalOnAttribute: Boolean IsDefaultAttribute() Microsoft.FSharp.Core.ComparisonConditionalOnAttribute: Boolean Match(System.Object) Microsoft.FSharp.Core.ComparisonConditionalOnAttribute: Int32 GetHashCode() +Microsoft.FSharp.Core.ComparisonConditionalOnAttribute: System.Object TypeId +Microsoft.FSharp.Core.ComparisonConditionalOnAttribute: System.Object get_TypeId() Microsoft.FSharp.Core.ComparisonConditionalOnAttribute: System.String ToString() Microsoft.FSharp.Core.ComparisonConditionalOnAttribute: System.Type GetType() Microsoft.FSharp.Core.ComparisonConditionalOnAttribute: Void .ctor() Microsoft.FSharp.Core.CompilationArgumentCountsAttribute: Boolean Equals(System.Object) +Microsoft.FSharp.Core.CompilationArgumentCountsAttribute: Boolean IsDefaultAttribute() Microsoft.FSharp.Core.CompilationArgumentCountsAttribute: Boolean Match(System.Object) Microsoft.FSharp.Core.CompilationArgumentCountsAttribute: Int32 GetHashCode() Microsoft.FSharp.Core.CompilationArgumentCountsAttribute: System.Collections.Generic.IEnumerable`1[System.Int32] Counts Microsoft.FSharp.Core.CompilationArgumentCountsAttribute: System.Collections.Generic.IEnumerable`1[System.Int32] get_Counts() +Microsoft.FSharp.Core.CompilationArgumentCountsAttribute: System.Object TypeId +Microsoft.FSharp.Core.CompilationArgumentCountsAttribute: System.Object get_TypeId() Microsoft.FSharp.Core.CompilationArgumentCountsAttribute: System.String ToString() Microsoft.FSharp.Core.CompilationArgumentCountsAttribute: System.Type GetType() Microsoft.FSharp.Core.CompilationArgumentCountsAttribute: Void .ctor(Int32[]) Microsoft.FSharp.Core.CompilationMappingAttribute: Boolean Equals(System.Object) +Microsoft.FSharp.Core.CompilationMappingAttribute: Boolean IsDefaultAttribute() Microsoft.FSharp.Core.CompilationMappingAttribute: Boolean Match(System.Object) Microsoft.FSharp.Core.CompilationMappingAttribute: Int32 GetHashCode() Microsoft.FSharp.Core.CompilationMappingAttribute: Int32 SequenceNumber @@ -860,6 +877,8 @@ Microsoft.FSharp.Core.CompilationMappingAttribute: Int32 get_SequenceNumber() Microsoft.FSharp.Core.CompilationMappingAttribute: Int32 get_VariantNumber() Microsoft.FSharp.Core.CompilationMappingAttribute: Microsoft.FSharp.Core.SourceConstructFlags SourceConstructFlags Microsoft.FSharp.Core.CompilationMappingAttribute: Microsoft.FSharp.Core.SourceConstructFlags get_SourceConstructFlags() +Microsoft.FSharp.Core.CompilationMappingAttribute: System.Object TypeId +Microsoft.FSharp.Core.CompilationMappingAttribute: System.Object get_TypeId() Microsoft.FSharp.Core.CompilationMappingAttribute: System.String ResourceName Microsoft.FSharp.Core.CompilationMappingAttribute: System.String ToString() Microsoft.FSharp.Core.CompilationMappingAttribute: System.String get_ResourceName() @@ -871,10 +890,13 @@ Microsoft.FSharp.Core.CompilationMappingAttribute: Void .ctor(Microsoft.FSharp.C Microsoft.FSharp.Core.CompilationMappingAttribute: Void .ctor(Microsoft.FSharp.Core.SourceConstructFlags, Int32, Int32) Microsoft.FSharp.Core.CompilationMappingAttribute: Void .ctor(System.String, System.Type[]) Microsoft.FSharp.Core.CompilationRepresentationAttribute: Boolean Equals(System.Object) +Microsoft.FSharp.Core.CompilationRepresentationAttribute: Boolean IsDefaultAttribute() Microsoft.FSharp.Core.CompilationRepresentationAttribute: Boolean Match(System.Object) Microsoft.FSharp.Core.CompilationRepresentationAttribute: Int32 GetHashCode() Microsoft.FSharp.Core.CompilationRepresentationAttribute: Microsoft.FSharp.Core.CompilationRepresentationFlags Flags Microsoft.FSharp.Core.CompilationRepresentationAttribute: Microsoft.FSharp.Core.CompilationRepresentationFlags get_Flags() +Microsoft.FSharp.Core.CompilationRepresentationAttribute: System.Object TypeId +Microsoft.FSharp.Core.CompilationRepresentationAttribute: System.Object get_TypeId() Microsoft.FSharp.Core.CompilationRepresentationAttribute: System.String ToString() Microsoft.FSharp.Core.CompilationRepresentationAttribute: System.Type GetType() Microsoft.FSharp.Core.CompilationRepresentationAttribute: Void .ctor(Microsoft.FSharp.Core.CompilationRepresentationFlags) @@ -896,22 +918,29 @@ Microsoft.FSharp.Core.CompilationRepresentationFlags: System.String ToString(Sys Microsoft.FSharp.Core.CompilationRepresentationFlags: System.Type GetType() Microsoft.FSharp.Core.CompilationRepresentationFlags: System.TypeCode GetTypeCode() Microsoft.FSharp.Core.CompilationSourceNameAttribute: Boolean Equals(System.Object) +Microsoft.FSharp.Core.CompilationSourceNameAttribute: Boolean IsDefaultAttribute() Microsoft.FSharp.Core.CompilationSourceNameAttribute: Boolean Match(System.Object) Microsoft.FSharp.Core.CompilationSourceNameAttribute: Int32 GetHashCode() +Microsoft.FSharp.Core.CompilationSourceNameAttribute: System.Object TypeId +Microsoft.FSharp.Core.CompilationSourceNameAttribute: System.Object get_TypeId() Microsoft.FSharp.Core.CompilationSourceNameAttribute: System.String SourceName Microsoft.FSharp.Core.CompilationSourceNameAttribute: System.String ToString() Microsoft.FSharp.Core.CompilationSourceNameAttribute: System.String get_SourceName() Microsoft.FSharp.Core.CompilationSourceNameAttribute: System.Type GetType() Microsoft.FSharp.Core.CompilationSourceNameAttribute: Void .ctor(System.String) Microsoft.FSharp.Core.CompiledNameAttribute: Boolean Equals(System.Object) +Microsoft.FSharp.Core.CompiledNameAttribute: Boolean IsDefaultAttribute() Microsoft.FSharp.Core.CompiledNameAttribute: Boolean Match(System.Object) Microsoft.FSharp.Core.CompiledNameAttribute: Int32 GetHashCode() +Microsoft.FSharp.Core.CompiledNameAttribute: System.Object TypeId +Microsoft.FSharp.Core.CompiledNameAttribute: System.Object get_TypeId() Microsoft.FSharp.Core.CompiledNameAttribute: System.String CompiledName Microsoft.FSharp.Core.CompiledNameAttribute: System.String ToString() Microsoft.FSharp.Core.CompiledNameAttribute: System.String get_CompiledName() Microsoft.FSharp.Core.CompiledNameAttribute: System.Type GetType() Microsoft.FSharp.Core.CompiledNameAttribute: Void .ctor(System.String) Microsoft.FSharp.Core.CompilerMessageAttribute: Boolean Equals(System.Object) +Microsoft.FSharp.Core.CompilerMessageAttribute: Boolean IsDefaultAttribute() Microsoft.FSharp.Core.CompilerMessageAttribute: Boolean IsError Microsoft.FSharp.Core.CompilerMessageAttribute: Boolean IsHidden Microsoft.FSharp.Core.CompilerMessageAttribute: Boolean Match(System.Object) @@ -920,6 +949,8 @@ Microsoft.FSharp.Core.CompilerMessageAttribute: Boolean get_IsHidden() Microsoft.FSharp.Core.CompilerMessageAttribute: Int32 GetHashCode() Microsoft.FSharp.Core.CompilerMessageAttribute: Int32 MessageNumber Microsoft.FSharp.Core.CompilerMessageAttribute: Int32 get_MessageNumber() +Microsoft.FSharp.Core.CompilerMessageAttribute: System.Object TypeId +Microsoft.FSharp.Core.CompilerMessageAttribute: System.Object get_TypeId() Microsoft.FSharp.Core.CompilerMessageAttribute: System.String Message Microsoft.FSharp.Core.CompilerMessageAttribute: System.String ToString() Microsoft.FSharp.Core.CompilerMessageAttribute: System.String get_Message() @@ -976,8 +1007,11 @@ Microsoft.FSharp.Core.CompilerServices.RuntimeHelpers: System.Collections.Generi Microsoft.FSharp.Core.CompilerServices.RuntimeHelpers: System.String ToString() Microsoft.FSharp.Core.CompilerServices.RuntimeHelpers: System.Type GetType() Microsoft.FSharp.Core.CompilerServices.TypeProviderAssemblyAttribute: Boolean Equals(System.Object) +Microsoft.FSharp.Core.CompilerServices.TypeProviderAssemblyAttribute: Boolean IsDefaultAttribute() Microsoft.FSharp.Core.CompilerServices.TypeProviderAssemblyAttribute: Boolean Match(System.Object) Microsoft.FSharp.Core.CompilerServices.TypeProviderAssemblyAttribute: Int32 GetHashCode() +Microsoft.FSharp.Core.CompilerServices.TypeProviderAssemblyAttribute: System.Object TypeId +Microsoft.FSharp.Core.CompilerServices.TypeProviderAssemblyAttribute: System.Object get_TypeId() Microsoft.FSharp.Core.CompilerServices.TypeProviderAssemblyAttribute: System.String AssemblyName Microsoft.FSharp.Core.CompilerServices.TypeProviderAssemblyAttribute: System.String ToString() Microsoft.FSharp.Core.CompilerServices.TypeProviderAssemblyAttribute: System.String get_AssemblyName() @@ -985,8 +1019,11 @@ Microsoft.FSharp.Core.CompilerServices.TypeProviderAssemblyAttribute: System.Typ Microsoft.FSharp.Core.CompilerServices.TypeProviderAssemblyAttribute: Void .ctor() Microsoft.FSharp.Core.CompilerServices.TypeProviderAssemblyAttribute: Void .ctor(System.String) Microsoft.FSharp.Core.CompilerServices.TypeProviderAttribute: Boolean Equals(System.Object) +Microsoft.FSharp.Core.CompilerServices.TypeProviderAttribute: Boolean IsDefaultAttribute() Microsoft.FSharp.Core.CompilerServices.TypeProviderAttribute: Boolean Match(System.Object) Microsoft.FSharp.Core.CompilerServices.TypeProviderAttribute: Int32 GetHashCode() +Microsoft.FSharp.Core.CompilerServices.TypeProviderAttribute: System.Object TypeId +Microsoft.FSharp.Core.CompilerServices.TypeProviderAttribute: System.Object get_TypeId() Microsoft.FSharp.Core.CompilerServices.TypeProviderAttribute: System.String ToString() Microsoft.FSharp.Core.CompilerServices.TypeProviderAttribute: System.Type GetType() Microsoft.FSharp.Core.CompilerServices.TypeProviderAttribute: Void .ctor() @@ -1018,12 +1055,15 @@ Microsoft.FSharp.Core.CompilerServices.TypeProviderConfig: Void set_RuntimeAssem Microsoft.FSharp.Core.CompilerServices.TypeProviderConfig: Void set_SystemRuntimeAssemblyVersion(System.Version) Microsoft.FSharp.Core.CompilerServices.TypeProviderConfig: Void set_TemporaryFolder(System.String) Microsoft.FSharp.Core.CompilerServices.TypeProviderDefinitionLocationAttribute: Boolean Equals(System.Object) +Microsoft.FSharp.Core.CompilerServices.TypeProviderDefinitionLocationAttribute: Boolean IsDefaultAttribute() Microsoft.FSharp.Core.CompilerServices.TypeProviderDefinitionLocationAttribute: Boolean Match(System.Object) Microsoft.FSharp.Core.CompilerServices.TypeProviderDefinitionLocationAttribute: Int32 Column Microsoft.FSharp.Core.CompilerServices.TypeProviderDefinitionLocationAttribute: Int32 GetHashCode() Microsoft.FSharp.Core.CompilerServices.TypeProviderDefinitionLocationAttribute: Int32 Line Microsoft.FSharp.Core.CompilerServices.TypeProviderDefinitionLocationAttribute: Int32 get_Column() Microsoft.FSharp.Core.CompilerServices.TypeProviderDefinitionLocationAttribute: Int32 get_Line() +Microsoft.FSharp.Core.CompilerServices.TypeProviderDefinitionLocationAttribute: System.Object TypeId +Microsoft.FSharp.Core.CompilerServices.TypeProviderDefinitionLocationAttribute: System.Object get_TypeId() Microsoft.FSharp.Core.CompilerServices.TypeProviderDefinitionLocationAttribute: System.String FilePath Microsoft.FSharp.Core.CompilerServices.TypeProviderDefinitionLocationAttribute: System.String ToString() Microsoft.FSharp.Core.CompilerServices.TypeProviderDefinitionLocationAttribute: System.String get_FilePath() @@ -1033,8 +1073,11 @@ Microsoft.FSharp.Core.CompilerServices.TypeProviderDefinitionLocationAttribute: Microsoft.FSharp.Core.CompilerServices.TypeProviderDefinitionLocationAttribute: Void set_FilePath(System.String) Microsoft.FSharp.Core.CompilerServices.TypeProviderDefinitionLocationAttribute: Void set_Line(Int32) Microsoft.FSharp.Core.CompilerServices.TypeProviderEditorHideMethodsAttribute: Boolean Equals(System.Object) +Microsoft.FSharp.Core.CompilerServices.TypeProviderEditorHideMethodsAttribute: Boolean IsDefaultAttribute() Microsoft.FSharp.Core.CompilerServices.TypeProviderEditorHideMethodsAttribute: Boolean Match(System.Object) Microsoft.FSharp.Core.CompilerServices.TypeProviderEditorHideMethodsAttribute: Int32 GetHashCode() +Microsoft.FSharp.Core.CompilerServices.TypeProviderEditorHideMethodsAttribute: System.Object TypeId +Microsoft.FSharp.Core.CompilerServices.TypeProviderEditorHideMethodsAttribute: System.Object get_TypeId() Microsoft.FSharp.Core.CompilerServices.TypeProviderEditorHideMethodsAttribute: System.String ToString() Microsoft.FSharp.Core.CompilerServices.TypeProviderEditorHideMethodsAttribute: System.Type GetType() Microsoft.FSharp.Core.CompilerServices.TypeProviderEditorHideMethodsAttribute: Void .ctor() @@ -1052,27 +1095,37 @@ Microsoft.FSharp.Core.CompilerServices.TypeProviderTypeAttributes: System.String Microsoft.FSharp.Core.CompilerServices.TypeProviderTypeAttributes: System.Type GetType() Microsoft.FSharp.Core.CompilerServices.TypeProviderTypeAttributes: System.TypeCode GetTypeCode() Microsoft.FSharp.Core.CompilerServices.TypeProviderXmlDocAttribute: Boolean Equals(System.Object) +Microsoft.FSharp.Core.CompilerServices.TypeProviderXmlDocAttribute: Boolean IsDefaultAttribute() Microsoft.FSharp.Core.CompilerServices.TypeProviderXmlDocAttribute: Boolean Match(System.Object) Microsoft.FSharp.Core.CompilerServices.TypeProviderXmlDocAttribute: Int32 GetHashCode() +Microsoft.FSharp.Core.CompilerServices.TypeProviderXmlDocAttribute: System.Object TypeId +Microsoft.FSharp.Core.CompilerServices.TypeProviderXmlDocAttribute: System.Object get_TypeId() Microsoft.FSharp.Core.CompilerServices.TypeProviderXmlDocAttribute: System.String CommentText Microsoft.FSharp.Core.CompilerServices.TypeProviderXmlDocAttribute: System.String ToString() Microsoft.FSharp.Core.CompilerServices.TypeProviderXmlDocAttribute: System.String get_CommentText() Microsoft.FSharp.Core.CompilerServices.TypeProviderXmlDocAttribute: System.Type GetType() Microsoft.FSharp.Core.CompilerServices.TypeProviderXmlDocAttribute: Void .ctor(System.String) Microsoft.FSharp.Core.CustomComparisonAttribute: Boolean Equals(System.Object) +Microsoft.FSharp.Core.CustomComparisonAttribute: Boolean IsDefaultAttribute() Microsoft.FSharp.Core.CustomComparisonAttribute: Boolean Match(System.Object) Microsoft.FSharp.Core.CustomComparisonAttribute: Int32 GetHashCode() +Microsoft.FSharp.Core.CustomComparisonAttribute: System.Object TypeId +Microsoft.FSharp.Core.CustomComparisonAttribute: System.Object get_TypeId() Microsoft.FSharp.Core.CustomComparisonAttribute: System.String ToString() Microsoft.FSharp.Core.CustomComparisonAttribute: System.Type GetType() Microsoft.FSharp.Core.CustomComparisonAttribute: Void .ctor() Microsoft.FSharp.Core.CustomEqualityAttribute: Boolean Equals(System.Object) +Microsoft.FSharp.Core.CustomEqualityAttribute: Boolean IsDefaultAttribute() Microsoft.FSharp.Core.CustomEqualityAttribute: Boolean Match(System.Object) Microsoft.FSharp.Core.CustomEqualityAttribute: Int32 GetHashCode() +Microsoft.FSharp.Core.CustomEqualityAttribute: System.Object TypeId +Microsoft.FSharp.Core.CustomEqualityAttribute: System.Object get_TypeId() Microsoft.FSharp.Core.CustomEqualityAttribute: System.String ToString() Microsoft.FSharp.Core.CustomEqualityAttribute: System.Type GetType() Microsoft.FSharp.Core.CustomEqualityAttribute: Void .ctor() Microsoft.FSharp.Core.CustomOperationAttribute: Boolean AllowIntoPattern Microsoft.FSharp.Core.CustomOperationAttribute: Boolean Equals(System.Object) +Microsoft.FSharp.Core.CustomOperationAttribute: Boolean IsDefaultAttribute() Microsoft.FSharp.Core.CustomOperationAttribute: Boolean IsLikeGroupJoin Microsoft.FSharp.Core.CustomOperationAttribute: Boolean IsLikeJoin Microsoft.FSharp.Core.CustomOperationAttribute: Boolean IsLikeZip @@ -1086,6 +1139,8 @@ Microsoft.FSharp.Core.CustomOperationAttribute: Boolean get_IsLikeZip() Microsoft.FSharp.Core.CustomOperationAttribute: Boolean get_MaintainsVariableSpace() Microsoft.FSharp.Core.CustomOperationAttribute: Boolean get_MaintainsVariableSpaceUsingBind() Microsoft.FSharp.Core.CustomOperationAttribute: Int32 GetHashCode() +Microsoft.FSharp.Core.CustomOperationAttribute: System.Object TypeId +Microsoft.FSharp.Core.CustomOperationAttribute: System.Object get_TypeId() Microsoft.FSharp.Core.CustomOperationAttribute: System.String JoinConditionWord Microsoft.FSharp.Core.CustomOperationAttribute: System.String Name Microsoft.FSharp.Core.CustomOperationAttribute: System.String ToString() @@ -1101,37 +1156,52 @@ Microsoft.FSharp.Core.CustomOperationAttribute: Void set_JoinConditionWord(Syste Microsoft.FSharp.Core.CustomOperationAttribute: Void set_MaintainsVariableSpace(Boolean) Microsoft.FSharp.Core.CustomOperationAttribute: Void set_MaintainsVariableSpaceUsingBind(Boolean) Microsoft.FSharp.Core.DefaultAugmentationAttribute: Boolean Equals(System.Object) +Microsoft.FSharp.Core.DefaultAugmentationAttribute: Boolean IsDefaultAttribute() Microsoft.FSharp.Core.DefaultAugmentationAttribute: Boolean Match(System.Object) Microsoft.FSharp.Core.DefaultAugmentationAttribute: Boolean Value Microsoft.FSharp.Core.DefaultAugmentationAttribute: Boolean get_Value() Microsoft.FSharp.Core.DefaultAugmentationAttribute: Int32 GetHashCode() +Microsoft.FSharp.Core.DefaultAugmentationAttribute: System.Object TypeId +Microsoft.FSharp.Core.DefaultAugmentationAttribute: System.Object get_TypeId() Microsoft.FSharp.Core.DefaultAugmentationAttribute: System.String ToString() Microsoft.FSharp.Core.DefaultAugmentationAttribute: System.Type GetType() Microsoft.FSharp.Core.DefaultAugmentationAttribute: Void .ctor(Boolean) Microsoft.FSharp.Core.DefaultValueAttribute: Boolean Check Microsoft.FSharp.Core.DefaultValueAttribute: Boolean Equals(System.Object) +Microsoft.FSharp.Core.DefaultValueAttribute: Boolean IsDefaultAttribute() Microsoft.FSharp.Core.DefaultValueAttribute: Boolean Match(System.Object) Microsoft.FSharp.Core.DefaultValueAttribute: Boolean get_Check() Microsoft.FSharp.Core.DefaultValueAttribute: Int32 GetHashCode() +Microsoft.FSharp.Core.DefaultValueAttribute: System.Object TypeId +Microsoft.FSharp.Core.DefaultValueAttribute: System.Object get_TypeId() Microsoft.FSharp.Core.DefaultValueAttribute: System.String ToString() Microsoft.FSharp.Core.DefaultValueAttribute: System.Type GetType() Microsoft.FSharp.Core.DefaultValueAttribute: Void .ctor() Microsoft.FSharp.Core.DefaultValueAttribute: Void .ctor(Boolean) Microsoft.FSharp.Core.EntryPointAttribute: Boolean Equals(System.Object) +Microsoft.FSharp.Core.EntryPointAttribute: Boolean IsDefaultAttribute() Microsoft.FSharp.Core.EntryPointAttribute: Boolean Match(System.Object) Microsoft.FSharp.Core.EntryPointAttribute: Int32 GetHashCode() +Microsoft.FSharp.Core.EntryPointAttribute: System.Object TypeId +Microsoft.FSharp.Core.EntryPointAttribute: System.Object get_TypeId() Microsoft.FSharp.Core.EntryPointAttribute: System.String ToString() Microsoft.FSharp.Core.EntryPointAttribute: System.Type GetType() Microsoft.FSharp.Core.EntryPointAttribute: Void .ctor() Microsoft.FSharp.Core.EqualityConditionalOnAttribute: Boolean Equals(System.Object) +Microsoft.FSharp.Core.EqualityConditionalOnAttribute: Boolean IsDefaultAttribute() Microsoft.FSharp.Core.EqualityConditionalOnAttribute: Boolean Match(System.Object) Microsoft.FSharp.Core.EqualityConditionalOnAttribute: Int32 GetHashCode() +Microsoft.FSharp.Core.EqualityConditionalOnAttribute: System.Object TypeId +Microsoft.FSharp.Core.EqualityConditionalOnAttribute: System.Object get_TypeId() Microsoft.FSharp.Core.EqualityConditionalOnAttribute: System.String ToString() Microsoft.FSharp.Core.EqualityConditionalOnAttribute: System.Type GetType() Microsoft.FSharp.Core.EqualityConditionalOnAttribute: Void .ctor() Microsoft.FSharp.Core.ExperimentalAttribute: Boolean Equals(System.Object) +Microsoft.FSharp.Core.ExperimentalAttribute: Boolean IsDefaultAttribute() Microsoft.FSharp.Core.ExperimentalAttribute: Boolean Match(System.Object) Microsoft.FSharp.Core.ExperimentalAttribute: Int32 GetHashCode() +Microsoft.FSharp.Core.ExperimentalAttribute: System.Object TypeId +Microsoft.FSharp.Core.ExperimentalAttribute: System.Object get_TypeId() Microsoft.FSharp.Core.ExperimentalAttribute: System.String Message Microsoft.FSharp.Core.ExperimentalAttribute: System.String ToString() Microsoft.FSharp.Core.ExperimentalAttribute: System.String get_Message() @@ -1160,14 +1230,14 @@ Microsoft.FSharp.Core.ExtraTopLevelOperators: System.Collections.Generic.IReadOn Microsoft.FSharp.Core.ExtraTopLevelOperators: System.String ToString() Microsoft.FSharp.Core.ExtraTopLevelOperators: System.Type GetType() Microsoft.FSharp.Core.ExtraTopLevelOperators: T LazyPattern[T](System.Lazy`1[T]) -Microsoft.FSharp.Core.ExtraTopLevelOperators: T PrintFormat[T](Microsoft.FSharp.Core.PrintfFormat`4[T,System.IO.TextWriter,Microsoft.FSharp.Core.Unit,Microsoft.FSharp.Core.Unit]) -Microsoft.FSharp.Core.ExtraTopLevelOperators: T PrintFormatLine[T](Microsoft.FSharp.Core.PrintfFormat`4[T,System.IO.TextWriter,Microsoft.FSharp.Core.Unit,Microsoft.FSharp.Core.Unit]) Microsoft.FSharp.Core.ExtraTopLevelOperators: T PrintFormatLineToError[T](Microsoft.FSharp.Core.PrintfFormat`4[T,System.IO.TextWriter,Microsoft.FSharp.Core.Unit,Microsoft.FSharp.Core.Unit]) Microsoft.FSharp.Core.ExtraTopLevelOperators: T PrintFormatLineToTextWriter[T](System.IO.TextWriter, Microsoft.FSharp.Core.PrintfFormat`4[T,System.IO.TextWriter,Microsoft.FSharp.Core.Unit,Microsoft.FSharp.Core.Unit]) +Microsoft.FSharp.Core.ExtraTopLevelOperators: T PrintFormatLine[T](Microsoft.FSharp.Core.PrintfFormat`4[T,System.IO.TextWriter,Microsoft.FSharp.Core.Unit,Microsoft.FSharp.Core.Unit]) Microsoft.FSharp.Core.ExtraTopLevelOperators: T PrintFormatToError[T](Microsoft.FSharp.Core.PrintfFormat`4[T,System.IO.TextWriter,Microsoft.FSharp.Core.Unit,Microsoft.FSharp.Core.Unit]) Microsoft.FSharp.Core.ExtraTopLevelOperators: T PrintFormatToStringThenFail[T,TResult](Microsoft.FSharp.Core.PrintfFormat`4[T,Microsoft.FSharp.Core.Unit,System.String,TResult]) Microsoft.FSharp.Core.ExtraTopLevelOperators: T PrintFormatToString[T](Microsoft.FSharp.Core.PrintfFormat`4[T,Microsoft.FSharp.Core.Unit,System.String,System.String]) Microsoft.FSharp.Core.ExtraTopLevelOperators: T PrintFormatToTextWriter[T](System.IO.TextWriter, Microsoft.FSharp.Core.PrintfFormat`4[T,System.IO.TextWriter,Microsoft.FSharp.Core.Unit,Microsoft.FSharp.Core.Unit]) +Microsoft.FSharp.Core.ExtraTopLevelOperators: T PrintFormat[T](Microsoft.FSharp.Core.PrintfFormat`4[T,System.IO.TextWriter,Microsoft.FSharp.Core.Unit,Microsoft.FSharp.Core.Unit]) Microsoft.FSharp.Core.ExtraTopLevelOperators: T SpliceExpression[T](Microsoft.FSharp.Quotations.FSharpExpr`1[T]) Microsoft.FSharp.Core.ExtraTopLevelOperators: T SpliceUntypedExpression[T](Microsoft.FSharp.Quotations.FSharpExpr) Microsoft.FSharp.Core.ExtraTopLevelOperators: T[,] CreateArray2D[?,T](System.Collections.Generic.IEnumerable`1[?]) @@ -2075,6 +2145,7 @@ Microsoft.FSharp.Core.FSharpFunc`2[T,TResult]: W InvokeFast[V,W](Microsoft.FShar Microsoft.FSharp.Core.FSharpFunc`2[T,TResult]: X InvokeFast[V,W,X](Microsoft.FSharp.Core.FSharpFunc`2[T,Microsoft.FSharp.Core.FSharpFunc`2[TResult,Microsoft.FSharp.Core.FSharpFunc`2[V,Microsoft.FSharp.Core.FSharpFunc`2[W,X]]]], T, TResult, V, W) Microsoft.FSharp.Core.FSharpFunc`2[T,TResult]: Y InvokeFast[V,W,X,Y](Microsoft.FSharp.Core.FSharpFunc`2[T,Microsoft.FSharp.Core.FSharpFunc`2[TResult,Microsoft.FSharp.Core.FSharpFunc`2[V,Microsoft.FSharp.Core.FSharpFunc`2[W,Microsoft.FSharp.Core.FSharpFunc`2[X,Y]]]]], T, TResult, V, W, X) Microsoft.FSharp.Core.FSharpInterfaceDataVersionAttribute: Boolean Equals(System.Object) +Microsoft.FSharp.Core.FSharpInterfaceDataVersionAttribute: Boolean IsDefaultAttribute() Microsoft.FSharp.Core.FSharpInterfaceDataVersionAttribute: Boolean Match(System.Object) Microsoft.FSharp.Core.FSharpInterfaceDataVersionAttribute: Int32 GetHashCode() Microsoft.FSharp.Core.FSharpInterfaceDataVersionAttribute: Int32 Major @@ -2083,6 +2154,8 @@ Microsoft.FSharp.Core.FSharpInterfaceDataVersionAttribute: Int32 Release Microsoft.FSharp.Core.FSharpInterfaceDataVersionAttribute: Int32 get_Major() Microsoft.FSharp.Core.FSharpInterfaceDataVersionAttribute: Int32 get_Minor() Microsoft.FSharp.Core.FSharpInterfaceDataVersionAttribute: Int32 get_Release() +Microsoft.FSharp.Core.FSharpInterfaceDataVersionAttribute: System.Object TypeId +Microsoft.FSharp.Core.FSharpInterfaceDataVersionAttribute: System.Object get_TypeId() Microsoft.FSharp.Core.FSharpInterfaceDataVersionAttribute: System.String ToString() Microsoft.FSharp.Core.FSharpInterfaceDataVersionAttribute: System.Type GetType() Microsoft.FSharp.Core.FSharpInterfaceDataVersionAttribute: Void .ctor(Int32, Int32, Int32) @@ -2162,6 +2235,12 @@ Microsoft.FSharp.Core.FSharpResult`2[T,TError]: T ResultValue Microsoft.FSharp.Core.FSharpResult`2[T,TError]: T get_ResultValue() Microsoft.FSharp.Core.FSharpResult`2[T,TError]: TError ErrorValue Microsoft.FSharp.Core.FSharpResult`2[T,TError]: TError get_ErrorValue() +Microsoft.FSharp.Core.FSharpTypeFunc: Boolean Equals(System.Object) +Microsoft.FSharp.Core.FSharpTypeFunc: Int32 GetHashCode() +Microsoft.FSharp.Core.FSharpTypeFunc: System.Object Specialize[T]() +Microsoft.FSharp.Core.FSharpTypeFunc: System.String ToString() +Microsoft.FSharp.Core.FSharpTypeFunc: System.Type GetType() +Microsoft.FSharp.Core.FSharpTypeFunc: Void .ctor() Microsoft.FSharp.Core.FSharpValueOption`1+Tags[T]: Boolean Equals(System.Object) Microsoft.FSharp.Core.FSharpValueOption`1+Tags[T]: Int32 GetHashCode() Microsoft.FSharp.Core.FSharpValueOption`1+Tags[T]: Int32 ValueNone @@ -2171,6 +2250,10 @@ Microsoft.FSharp.Core.FSharpValueOption`1+Tags[T]: System.Type GetType() Microsoft.FSharp.Core.FSharpValueOption`1[T]: Boolean Equals(Microsoft.FSharp.Core.FSharpValueOption`1[T]) Microsoft.FSharp.Core.FSharpValueOption`1[T]: Boolean Equals(System.Object) Microsoft.FSharp.Core.FSharpValueOption`1[T]: Boolean Equals(System.Object, System.Collections.IEqualityComparer) +Microsoft.FSharp.Core.FSharpValueOption`1[T]: Boolean IsValueNone +Microsoft.FSharp.Core.FSharpValueOption`1[T]: Boolean IsValueSome +Microsoft.FSharp.Core.FSharpValueOption`1[T]: Boolean get_IsValueNone() +Microsoft.FSharp.Core.FSharpValueOption`1[T]: Boolean get_IsValueSome() Microsoft.FSharp.Core.FSharpValueOption`1[T]: Int32 CompareTo(Microsoft.FSharp.Core.FSharpValueOption`1[T]) Microsoft.FSharp.Core.FSharpValueOption`1[T]: Int32 CompareTo(System.Object) Microsoft.FSharp.Core.FSharpValueOption`1[T]: Int32 CompareTo(System.Object, System.Collections.IComparer) @@ -2179,12 +2262,8 @@ Microsoft.FSharp.Core.FSharpValueOption`1[T]: Int32 GetHashCode(System.Collectio Microsoft.FSharp.Core.FSharpValueOption`1[T]: Int32 Tag Microsoft.FSharp.Core.FSharpValueOption`1[T]: Int32 get_Tag() Microsoft.FSharp.Core.FSharpValueOption`1[T]: Microsoft.FSharp.Core.FSharpValueOption`1+Tags[T] -Microsoft.FSharp.Core.FSharpValueOption`1[T]: Microsoft.FSharp.Core.FSharpValueOption`1[T] ValueNone -Microsoft.FSharp.Core.FSharpValueOption`1[T]: Boolean IsValueNone -Microsoft.FSharp.Core.FSharpValueOption`1[T]: Boolean IsValueSome -Microsoft.FSharp.Core.FSharpValueOption`1[T]: Boolean get_IsValueNone() -Microsoft.FSharp.Core.FSharpValueOption`1[T]: Boolean get_IsValueSome() Microsoft.FSharp.Core.FSharpValueOption`1[T]: Microsoft.FSharp.Core.FSharpValueOption`1[T] NewValueSome(T) +Microsoft.FSharp.Core.FSharpValueOption`1[T]: Microsoft.FSharp.Core.FSharpValueOption`1[T] ValueNone Microsoft.FSharp.Core.FSharpValueOption`1[T]: Microsoft.FSharp.Core.FSharpValueOption`1[T] get_ValueNone() Microsoft.FSharp.Core.FSharpValueOption`1[T]: System.String ToString() Microsoft.FSharp.Core.FSharpValueOption`1[T]: System.Type GetType() @@ -2206,35 +2285,41 @@ Microsoft.FSharp.Core.FSharpTypeFunc: System.String ToString() Microsoft.FSharp.Core.FSharpTypeFunc: System.Type GetType() Microsoft.FSharp.Core.FSharpTypeFunc: Void .ctor() Microsoft.FSharp.Core.FuncConvert: Boolean Equals(System.Object) +Microsoft.FSharp.Core.FuncConvert: Int32 GetHashCode() Microsoft.FSharp.Core.FuncConvert: Microsoft.FSharp.Core.FSharpFunc`2[Microsoft.FSharp.Core.Unit,Microsoft.FSharp.Core.Unit] FromAction(System.Action) -Microsoft.FSharp.Core.FuncConvert: Microsoft.FSharp.Core.FSharpFunc`2[T,Microsoft.FSharp.Core.Unit] FromAction[T](System.Action`1[T]) -Microsoft.FSharp.Core.FuncConvert: Microsoft.FSharp.Core.FSharpFunc`2[T1,Microsoft.FSharp.Core.FSharpFunc`2[T2,Microsoft.FSharp.Core.Unit]] FromAction[T1,T2](System.Action`2[T1,T2]) -Microsoft.FSharp.Core.FuncConvert: Microsoft.FSharp.Core.FSharpFunc`2[T1,Microsoft.FSharp.Core.FSharpFunc`2[T2,Microsoft.FSharp.Core.FSharpFunc`2[T3,Microsoft.FSharp.Core.Unit]]] FromAction[T1,T2,T3](System.Action`3[T1,T2,T3]) -Microsoft.FSharp.Core.FuncConvert: Microsoft.FSharp.Core.FSharpFunc`2[T1,Microsoft.FSharp.Core.FSharpFunc`2[T2,Microsoft.FSharp.Core.FSharpFunc`2[T3,Microsoft.FSharp.Core.FSharpFunc`2[T4,Microsoft.FSharp.Core.Unit]]]] FromAction[T1,T2,T3,T4](System.Action`4[T1,T2,T3,T4]) -Microsoft.FSharp.Core.FuncConvert: Microsoft.FSharp.Core.FSharpFunc`2[T1,Microsoft.FSharp.Core.FSharpFunc`2[T2,Microsoft.FSharp.Core.FSharpFunc`2[T3,Microsoft.FSharp.Core.FSharpFunc`2[T4,Microsoft.FSharp.Core.FSharpFunc`2[T5,Microsoft.FSharp.Core.Unit]]]]] FromAction[T1,T2,T3,T4,T5](System.Action`5[T1,T2,T3,T4,T5]) Microsoft.FSharp.Core.FuncConvert: Microsoft.FSharp.Core.FSharpFunc`2[Microsoft.FSharp.Core.Unit,T] FromFunc[T](System.Func`1[T]) +Microsoft.FSharp.Core.FuncConvert: Microsoft.FSharp.Core.FSharpFunc`2[T,Microsoft.FSharp.Core.Unit] FromAction[T](System.Action`1[T]) +Microsoft.FSharp.Core.FuncConvert: Microsoft.FSharp.Core.FSharpFunc`2[T,Microsoft.FSharp.Core.Unit] ToFSharpFunc[T](System.Action`1[T]) Microsoft.FSharp.Core.FuncConvert: Microsoft.FSharp.Core.FSharpFunc`2[T,TResult] FromFunc[T,TResult](System.Func`2[T,TResult]) -Microsoft.FSharp.Core.FuncConvert: Microsoft.FSharp.Core.FSharpFunc`2[T1,Microsoft.FSharp.Core.FSharpFunc`2[T2,TResult]] FromFunc[T1,T2,TResult](System.Func`3[T1,T2,TResult]) -Microsoft.FSharp.Core.FuncConvert: Microsoft.FSharp.Core.FSharpFunc`2[T1,Microsoft.FSharp.Core.FSharpFunc`2[T2,Microsoft.FSharp.Core.FSharpFunc`2[T3,TResult]]] FromFunc[T1,T2,T3,TResult](System.Func`4[T1,T2,T3,TResult]) -Microsoft.FSharp.Core.FuncConvert: Microsoft.FSharp.Core.FSharpFunc`2[T1,Microsoft.FSharp.Core.FSharpFunc`2[T2,Microsoft.FSharp.Core.FSharpFunc`2[T3,Microsoft.FSharp.Core.FSharpFunc`2[T4,TResult]]]] FromFunc[T1,T2,T3,T4,TResult](System.Func`5[T1,T2,T3,T4,TResult]) +Microsoft.FSharp.Core.FuncConvert: Microsoft.FSharp.Core.FSharpFunc`2[T1,Microsoft.FSharp.Core.FSharpFunc`2[T2,Microsoft.FSharp.Core.FSharpFunc`2[T3,Microsoft.FSharp.Core.FSharpFunc`2[T4,Microsoft.FSharp.Core.FSharpFunc`2[T5,Microsoft.FSharp.Core.Unit]]]]] FromAction[T1,T2,T3,T4,T5](System.Action`5[T1,T2,T3,T4,T5]) Microsoft.FSharp.Core.FuncConvert: Microsoft.FSharp.Core.FSharpFunc`2[T1,Microsoft.FSharp.Core.FSharpFunc`2[T2,Microsoft.FSharp.Core.FSharpFunc`2[T3,Microsoft.FSharp.Core.FSharpFunc`2[T4,Microsoft.FSharp.Core.FSharpFunc`2[T5,TResult]]]]] FromFunc[T1,T2,T3,T4,T5,TResult](System.Func`6[T1,T2,T3,T4,T5,TResult]) -Microsoft.FSharp.Core.FuncConvert: Int32 GetHashCode() -Microsoft.FSharp.Core.FuncConvert: Microsoft.FSharp.Core.FSharpFunc`2[T,Microsoft.FSharp.Core.Unit] ToFSharpFunc[T](System.Action`1[T]) Microsoft.FSharp.Core.FuncConvert: Microsoft.FSharp.Core.FSharpFunc`2[T1,Microsoft.FSharp.Core.FSharpFunc`2[T2,Microsoft.FSharp.Core.FSharpFunc`2[T3,Microsoft.FSharp.Core.FSharpFunc`2[T4,Microsoft.FSharp.Core.FSharpFunc`2[T5,TResult]]]]] FuncFromTupled[T1,T2,T3,T4,T5,TResult](Microsoft.FSharp.Core.FSharpFunc`2[System.Tuple`5[T1,T2,T3,T4,T5],TResult]) +Microsoft.FSharp.Core.FuncConvert: Microsoft.FSharp.Core.FSharpFunc`2[T1,Microsoft.FSharp.Core.FSharpFunc`2[T2,Microsoft.FSharp.Core.FSharpFunc`2[T3,Microsoft.FSharp.Core.FSharpFunc`2[T4,Microsoft.FSharp.Core.Unit]]]] FromAction[T1,T2,T3,T4](System.Action`4[T1,T2,T3,T4]) +Microsoft.FSharp.Core.FuncConvert: Microsoft.FSharp.Core.FSharpFunc`2[T1,Microsoft.FSharp.Core.FSharpFunc`2[T2,Microsoft.FSharp.Core.FSharpFunc`2[T3,Microsoft.FSharp.Core.FSharpFunc`2[T4,TResult]]]] FromFunc[T1,T2,T3,T4,TResult](System.Func`5[T1,T2,T3,T4,TResult]) Microsoft.FSharp.Core.FuncConvert: Microsoft.FSharp.Core.FSharpFunc`2[T1,Microsoft.FSharp.Core.FSharpFunc`2[T2,Microsoft.FSharp.Core.FSharpFunc`2[T3,Microsoft.FSharp.Core.FSharpFunc`2[T4,TResult]]]] FuncFromTupled[T1,T2,T3,T4,TResult](Microsoft.FSharp.Core.FSharpFunc`2[System.Tuple`4[T1,T2,T3,T4],TResult]) +Microsoft.FSharp.Core.FuncConvert: Microsoft.FSharp.Core.FSharpFunc`2[T1,Microsoft.FSharp.Core.FSharpFunc`2[T2,Microsoft.FSharp.Core.FSharpFunc`2[T3,Microsoft.FSharp.Core.Unit]]] FromAction[T1,T2,T3](System.Action`3[T1,T2,T3]) +Microsoft.FSharp.Core.FuncConvert: Microsoft.FSharp.Core.FSharpFunc`2[T1,Microsoft.FSharp.Core.FSharpFunc`2[T2,Microsoft.FSharp.Core.FSharpFunc`2[T3,TResult]]] FromFunc[T1,T2,T3,TResult](System.Func`4[T1,T2,T3,TResult]) Microsoft.FSharp.Core.FuncConvert: Microsoft.FSharp.Core.FSharpFunc`2[T1,Microsoft.FSharp.Core.FSharpFunc`2[T2,Microsoft.FSharp.Core.FSharpFunc`2[T3,TResult]]] FuncFromTupled[T1,T2,T3,TResult](Microsoft.FSharp.Core.FSharpFunc`2[System.Tuple`3[T1,T2,T3],TResult]) +Microsoft.FSharp.Core.FuncConvert: Microsoft.FSharp.Core.FSharpFunc`2[T1,Microsoft.FSharp.Core.FSharpFunc`2[T2,Microsoft.FSharp.Core.Unit]] FromAction[T1,T2](System.Action`2[T1,T2]) +Microsoft.FSharp.Core.FuncConvert: Microsoft.FSharp.Core.FSharpFunc`2[T1,Microsoft.FSharp.Core.FSharpFunc`2[T2,TResult]] FromFunc[T1,T2,TResult](System.Func`3[T1,T2,TResult]) Microsoft.FSharp.Core.FuncConvert: Microsoft.FSharp.Core.FSharpFunc`2[T1,Microsoft.FSharp.Core.FSharpFunc`2[T2,TResult]] FuncFromTupled[T1,T2,TResult](Microsoft.FSharp.Core.FSharpFunc`2[System.Tuple`2[T1,T2],TResult]) Microsoft.FSharp.Core.FuncConvert: System.String ToString() Microsoft.FSharp.Core.FuncConvert: System.Type GetType() Microsoft.FSharp.Core.GeneralizableValueAttribute: Boolean Equals(System.Object) +Microsoft.FSharp.Core.GeneralizableValueAttribute: Boolean IsDefaultAttribute() Microsoft.FSharp.Core.GeneralizableValueAttribute: Boolean Match(System.Object) Microsoft.FSharp.Core.GeneralizableValueAttribute: Int32 GetHashCode() +Microsoft.FSharp.Core.GeneralizableValueAttribute: System.Object TypeId +Microsoft.FSharp.Core.GeneralizableValueAttribute: System.Object get_TypeId() Microsoft.FSharp.Core.GeneralizableValueAttribute: System.String ToString() Microsoft.FSharp.Core.GeneralizableValueAttribute: System.Type GetType() Microsoft.FSharp.Core.GeneralizableValueAttribute: Void .ctor() Microsoft.FSharp.Core.InterfaceAttribute: Boolean Equals(System.Object) +Microsoft.FSharp.Core.InterfaceAttribute: Boolean IsDefaultAttribute() Microsoft.FSharp.Core.InterfaceAttribute: Boolean Match(System.Object) Microsoft.FSharp.Core.InterfaceAttribute: Int32 GetHashCode() +Microsoft.FSharp.Core.InterfaceAttribute: System.Object TypeId +Microsoft.FSharp.Core.InterfaceAttribute: System.Object get_TypeId() Microsoft.FSharp.Core.InterfaceAttribute: System.String ToString() Microsoft.FSharp.Core.InterfaceAttribute: System.Type GetType() Microsoft.FSharp.Core.InterfaceAttribute: Void .ctor() @@ -2374,8 +2459,11 @@ Microsoft.FSharp.Core.LanguagePrimitives: TResult MultiplyDynamic[T1,T2,TResult] Microsoft.FSharp.Core.LanguagePrimitives: UInt32 ParseUInt32(System.String) Microsoft.FSharp.Core.LanguagePrimitives: UInt64 ParseUInt64(System.String) Microsoft.FSharp.Core.LiteralAttribute: Boolean Equals(System.Object) +Microsoft.FSharp.Core.LiteralAttribute: Boolean IsDefaultAttribute() Microsoft.FSharp.Core.LiteralAttribute: Boolean Match(System.Object) Microsoft.FSharp.Core.LiteralAttribute: Int32 GetHashCode() +Microsoft.FSharp.Core.LiteralAttribute: System.Object TypeId +Microsoft.FSharp.Core.LiteralAttribute: System.Object get_TypeId() Microsoft.FSharp.Core.LiteralAttribute: System.String ToString() Microsoft.FSharp.Core.LiteralAttribute: System.Type GetType() Microsoft.FSharp.Core.LiteralAttribute: Void .ctor() @@ -2394,6 +2482,8 @@ Microsoft.FSharp.Core.MatchFailureException: System.Collections.IDictionary get_ Microsoft.FSharp.Core.MatchFailureException: System.Exception GetBaseException() Microsoft.FSharp.Core.MatchFailureException: System.Exception InnerException Microsoft.FSharp.Core.MatchFailureException: System.Exception get_InnerException() +Microsoft.FSharp.Core.MatchFailureException: System.Reflection.MethodBase TargetSite +Microsoft.FSharp.Core.MatchFailureException: System.Reflection.MethodBase get_TargetSite() Microsoft.FSharp.Core.MatchFailureException: System.String Data0 Microsoft.FSharp.Core.MatchFailureException: System.String HelpLink Microsoft.FSharp.Core.MatchFailureException: System.String Message @@ -2406,38 +2496,53 @@ Microsoft.FSharp.Core.MatchFailureException: System.String get_Message() Microsoft.FSharp.Core.MatchFailureException: System.String get_Source() Microsoft.FSharp.Core.MatchFailureException: System.String get_StackTrace() Microsoft.FSharp.Core.MatchFailureException: System.Type GetType() -Microsoft.FSharp.Core.MatchFailureException: System.Type GetType() Microsoft.FSharp.Core.MatchFailureException: Void .ctor() Microsoft.FSharp.Core.MatchFailureException: Void .ctor(System.String, Int32, Int32) +Microsoft.FSharp.Core.MatchFailureException: Void GetObjectData(System.Runtime.Serialization.SerializationInfo, System.Runtime.Serialization.StreamingContext) Microsoft.FSharp.Core.MatchFailureException: Void set_HelpLink(System.String) Microsoft.FSharp.Core.MatchFailureException: Void set_Source(System.String) Microsoft.FSharp.Core.MeasureAnnotatedAbbreviationAttribute: Boolean Equals(System.Object) +Microsoft.FSharp.Core.MeasureAnnotatedAbbreviationAttribute: Boolean IsDefaultAttribute() Microsoft.FSharp.Core.MeasureAnnotatedAbbreviationAttribute: Boolean Match(System.Object) Microsoft.FSharp.Core.MeasureAnnotatedAbbreviationAttribute: Int32 GetHashCode() +Microsoft.FSharp.Core.MeasureAnnotatedAbbreviationAttribute: System.Object TypeId +Microsoft.FSharp.Core.MeasureAnnotatedAbbreviationAttribute: System.Object get_TypeId() Microsoft.FSharp.Core.MeasureAnnotatedAbbreviationAttribute: System.String ToString() Microsoft.FSharp.Core.MeasureAnnotatedAbbreviationAttribute: System.Type GetType() Microsoft.FSharp.Core.MeasureAnnotatedAbbreviationAttribute: Void .ctor() Microsoft.FSharp.Core.MeasureAttribute: Boolean Equals(System.Object) +Microsoft.FSharp.Core.MeasureAttribute: Boolean IsDefaultAttribute() Microsoft.FSharp.Core.MeasureAttribute: Boolean Match(System.Object) Microsoft.FSharp.Core.MeasureAttribute: Int32 GetHashCode() +Microsoft.FSharp.Core.MeasureAttribute: System.Object TypeId +Microsoft.FSharp.Core.MeasureAttribute: System.Object get_TypeId() Microsoft.FSharp.Core.MeasureAttribute: System.String ToString() Microsoft.FSharp.Core.MeasureAttribute: System.Type GetType() Microsoft.FSharp.Core.MeasureAttribute: Void .ctor() Microsoft.FSharp.Core.NoComparisonAttribute: Boolean Equals(System.Object) +Microsoft.FSharp.Core.NoComparisonAttribute: Boolean IsDefaultAttribute() Microsoft.FSharp.Core.NoComparisonAttribute: Boolean Match(System.Object) Microsoft.FSharp.Core.NoComparisonAttribute: Int32 GetHashCode() +Microsoft.FSharp.Core.NoComparisonAttribute: System.Object TypeId +Microsoft.FSharp.Core.NoComparisonAttribute: System.Object get_TypeId() Microsoft.FSharp.Core.NoComparisonAttribute: System.String ToString() Microsoft.FSharp.Core.NoComparisonAttribute: System.Type GetType() Microsoft.FSharp.Core.NoComparisonAttribute: Void .ctor() Microsoft.FSharp.Core.NoDynamicInvocationAttribute: Boolean Equals(System.Object) +Microsoft.FSharp.Core.NoDynamicInvocationAttribute: Boolean IsDefaultAttribute() Microsoft.FSharp.Core.NoDynamicInvocationAttribute: Boolean Match(System.Object) Microsoft.FSharp.Core.NoDynamicInvocationAttribute: Int32 GetHashCode() +Microsoft.FSharp.Core.NoDynamicInvocationAttribute: System.Object TypeId +Microsoft.FSharp.Core.NoDynamicInvocationAttribute: System.Object get_TypeId() Microsoft.FSharp.Core.NoDynamicInvocationAttribute: System.String ToString() Microsoft.FSharp.Core.NoDynamicInvocationAttribute: System.Type GetType() Microsoft.FSharp.Core.NoDynamicInvocationAttribute: Void .ctor() Microsoft.FSharp.Core.NoEqualityAttribute: Boolean Equals(System.Object) +Microsoft.FSharp.Core.NoEqualityAttribute: Boolean IsDefaultAttribute() Microsoft.FSharp.Core.NoEqualityAttribute: Boolean Match(System.Object) Microsoft.FSharp.Core.NoEqualityAttribute: Int32 GetHashCode() +Microsoft.FSharp.Core.NoEqualityAttribute: System.Object TypeId +Microsoft.FSharp.Core.NoEqualityAttribute: System.Object get_TypeId() Microsoft.FSharp.Core.NoEqualityAttribute: System.String ToString() Microsoft.FSharp.Core.NoEqualityAttribute: System.Type GetType() Microsoft.FSharp.Core.NoEqualityAttribute: Void .ctor() @@ -2615,8 +2720,8 @@ Microsoft.FSharp.Core.Operators: System.Collections.Generic.IEnumerable`1[T] op_ Microsoft.FSharp.Core.Operators: System.Collections.Generic.IEnumerable`1[T] op_Range[T](T, T) Microsoft.FSharp.Core.Operators: System.Decimal ToDecimal[T](T) Microsoft.FSharp.Core.Operators: System.Exception Failure(System.String) -Microsoft.FSharp.Core.Operators: System.IO.TextWriter ConsoleError[T]() Microsoft.FSharp.Core.Operators: System.IO.TextReader ConsoleIn[T]() +Microsoft.FSharp.Core.Operators: System.IO.TextWriter ConsoleError[T]() Microsoft.FSharp.Core.Operators: System.IO.TextWriter ConsoleOut[T]() Microsoft.FSharp.Core.Operators: System.Object Box[T](T)" + #if DEBUG @@ -2800,8 +2905,11 @@ Microsoft.FSharp.Core.ValueOption: TState Fold[T,TState](Microsoft.FSharp.Core.F Microsoft.FSharp.Core.ValueOption: T[] ToArray[T](Microsoft.FSharp.Core.FSharpValueOption`1[T]) Microsoft.FSharp.Core.ValueOption: Void Iterate[T](Microsoft.FSharp.Core.FSharpFunc`2[T,Microsoft.FSharp.Core.Unit], Microsoft.FSharp.Core.FSharpValueOption`1[T]) Microsoft.FSharp.Core.OptionalArgumentAttribute: Boolean Equals(System.Object) +Microsoft.FSharp.Core.OptionalArgumentAttribute: Boolean IsDefaultAttribute() Microsoft.FSharp.Core.OptionalArgumentAttribute: Boolean Match(System.Object) Microsoft.FSharp.Core.OptionalArgumentAttribute: Int32 GetHashCode() +Microsoft.FSharp.Core.OptionalArgumentAttribute: System.Object TypeId +Microsoft.FSharp.Core.OptionalArgumentAttribute: System.Object get_TypeId() Microsoft.FSharp.Core.OptionalArgumentAttribute: System.String ToString() Microsoft.FSharp.Core.OptionalArgumentAttribute: System.Type GetType() Microsoft.FSharp.Core.OptionalArgumentAttribute: Void .ctor() @@ -2823,10 +2931,9 @@ Microsoft.FSharp.Core.PrintfModule: Boolean Equals(System.Object) Microsoft.FSharp.Core.PrintfModule: Int32 GetHashCode() Microsoft.FSharp.Core.PrintfModule: System.String ToString() Microsoft.FSharp.Core.PrintfModule: System.Type GetType() -Microsoft.FSharp.Core.PrintfModule: T PrintFormat[T](Microsoft.FSharp.Core.PrintfFormat`4[T,System.IO.TextWriter,Microsoft.FSharp.Core.Unit,Microsoft.FSharp.Core.Unit]) -Microsoft.FSharp.Core.PrintfModule: T PrintFormatLine[T](Microsoft.FSharp.Core.PrintfFormat`4[T,System.IO.TextWriter,Microsoft.FSharp.Core.Unit,Microsoft.FSharp.Core.Unit]) Microsoft.FSharp.Core.PrintfModule: T PrintFormatLineToError[T](Microsoft.FSharp.Core.PrintfFormat`4[T,System.IO.TextWriter,Microsoft.FSharp.Core.Unit,Microsoft.FSharp.Core.Unit]) Microsoft.FSharp.Core.PrintfModule: T PrintFormatLineToTextWriter[T](System.IO.TextWriter, Microsoft.FSharp.Core.PrintfFormat`4[T,System.IO.TextWriter,Microsoft.FSharp.Core.Unit,Microsoft.FSharp.Core.Unit]) +Microsoft.FSharp.Core.PrintfModule: T PrintFormatLine[T](Microsoft.FSharp.Core.PrintfFormat`4[T,System.IO.TextWriter,Microsoft.FSharp.Core.Unit,Microsoft.FSharp.Core.Unit]) Microsoft.FSharp.Core.PrintfModule: T PrintFormatThen[TResult,T](Microsoft.FSharp.Core.FSharpFunc`2[System.String,TResult], Microsoft.FSharp.Core.PrintfFormat`4[T,Microsoft.FSharp.Core.Unit,System.String,TResult]) Microsoft.FSharp.Core.PrintfModule: T PrintFormatToError[T](Microsoft.FSharp.Core.PrintfFormat`4[T,System.IO.TextWriter,Microsoft.FSharp.Core.Unit,Microsoft.FSharp.Core.Unit]) Microsoft.FSharp.Core.PrintfModule: T PrintFormatToStringBuilderThen[TResult,T](Microsoft.FSharp.Core.FSharpFunc`2[Microsoft.FSharp.Core.Unit,TResult], System.Text.StringBuilder, Microsoft.FSharp.Core.PrintfFormat`4[T,System.Text.StringBuilder,Microsoft.FSharp.Core.Unit,TResult]) @@ -2836,36 +2943,52 @@ Microsoft.FSharp.Core.PrintfModule: T PrintFormatToStringThen[TResult,T](Microso Microsoft.FSharp.Core.PrintfModule: T PrintFormatToStringThen[T](Microsoft.FSharp.Core.PrintfFormat`4[T,Microsoft.FSharp.Core.Unit,System.String,System.String]) Microsoft.FSharp.Core.PrintfModule: T PrintFormatToTextWriterThen[TResult,T](Microsoft.FSharp.Core.FSharpFunc`2[Microsoft.FSharp.Core.Unit,TResult], System.IO.TextWriter, Microsoft.FSharp.Core.PrintfFormat`4[T,System.IO.TextWriter,Microsoft.FSharp.Core.Unit,TResult]) Microsoft.FSharp.Core.PrintfModule: T PrintFormatToTextWriter[T](System.IO.TextWriter, Microsoft.FSharp.Core.PrintfFormat`4[T,System.IO.TextWriter,Microsoft.FSharp.Core.Unit,Microsoft.FSharp.Core.Unit]) +Microsoft.FSharp.Core.PrintfModule: T PrintFormat[T](Microsoft.FSharp.Core.PrintfFormat`4[T,System.IO.TextWriter,Microsoft.FSharp.Core.Unit,Microsoft.FSharp.Core.Unit]) Microsoft.FSharp.Core.ProjectionParameterAttribute: Boolean Equals(System.Object) +Microsoft.FSharp.Core.ProjectionParameterAttribute: Boolean IsDefaultAttribute() Microsoft.FSharp.Core.ProjectionParameterAttribute: Boolean Match(System.Object) Microsoft.FSharp.Core.ProjectionParameterAttribute: Int32 GetHashCode() +Microsoft.FSharp.Core.ProjectionParameterAttribute: System.Object TypeId +Microsoft.FSharp.Core.ProjectionParameterAttribute: System.Object get_TypeId() Microsoft.FSharp.Core.ProjectionParameterAttribute: System.String ToString() Microsoft.FSharp.Core.ProjectionParameterAttribute: System.Type GetType() Microsoft.FSharp.Core.ProjectionParameterAttribute: Void .ctor() Microsoft.FSharp.Core.ReferenceEqualityAttribute: Boolean Equals(System.Object) +Microsoft.FSharp.Core.ReferenceEqualityAttribute: Boolean IsDefaultAttribute() Microsoft.FSharp.Core.ReferenceEqualityAttribute: Boolean Match(System.Object) Microsoft.FSharp.Core.ReferenceEqualityAttribute: Int32 GetHashCode() +Microsoft.FSharp.Core.ReferenceEqualityAttribute: System.Object TypeId +Microsoft.FSharp.Core.ReferenceEqualityAttribute: System.Object get_TypeId() Microsoft.FSharp.Core.ReferenceEqualityAttribute: System.String ToString() Microsoft.FSharp.Core.ReferenceEqualityAttribute: System.Type GetType() Microsoft.FSharp.Core.ReferenceEqualityAttribute: Void .ctor() Microsoft.FSharp.Core.ReflectedDefinitionAttribute: Boolean Equals(System.Object) Microsoft.FSharp.Core.ReflectedDefinitionAttribute: Boolean IncludeValue +Microsoft.FSharp.Core.ReflectedDefinitionAttribute: Boolean IsDefaultAttribute() Microsoft.FSharp.Core.ReflectedDefinitionAttribute: Boolean Match(System.Object) Microsoft.FSharp.Core.ReflectedDefinitionAttribute: Boolean get_IncludeValue() Microsoft.FSharp.Core.ReflectedDefinitionAttribute: Int32 GetHashCode() +Microsoft.FSharp.Core.ReflectedDefinitionAttribute: System.Object TypeId +Microsoft.FSharp.Core.ReflectedDefinitionAttribute: System.Object get_TypeId() Microsoft.FSharp.Core.ReflectedDefinitionAttribute: System.String ToString() Microsoft.FSharp.Core.ReflectedDefinitionAttribute: System.Type GetType() Microsoft.FSharp.Core.ReflectedDefinitionAttribute: Void .ctor() Microsoft.FSharp.Core.ReflectedDefinitionAttribute: Void .ctor(Boolean) Microsoft.FSharp.Core.RequireQualifiedAccessAttribute: Boolean Equals(System.Object) +Microsoft.FSharp.Core.RequireQualifiedAccessAttribute: Boolean IsDefaultAttribute() Microsoft.FSharp.Core.RequireQualifiedAccessAttribute: Boolean Match(System.Object) Microsoft.FSharp.Core.RequireQualifiedAccessAttribute: Int32 GetHashCode() +Microsoft.FSharp.Core.RequireQualifiedAccessAttribute: System.Object TypeId +Microsoft.FSharp.Core.RequireQualifiedAccessAttribute: System.Object get_TypeId() Microsoft.FSharp.Core.RequireQualifiedAccessAttribute: System.String ToString() Microsoft.FSharp.Core.RequireQualifiedAccessAttribute: System.Type GetType() Microsoft.FSharp.Core.RequireQualifiedAccessAttribute: Void .ctor() Microsoft.FSharp.Core.RequiresExplicitTypeArgumentsAttribute: Boolean Equals(System.Object) +Microsoft.FSharp.Core.RequiresExplicitTypeArgumentsAttribute: Boolean IsDefaultAttribute() Microsoft.FSharp.Core.RequiresExplicitTypeArgumentsAttribute: Boolean Match(System.Object) Microsoft.FSharp.Core.RequiresExplicitTypeArgumentsAttribute: Int32 GetHashCode() +Microsoft.FSharp.Core.RequiresExplicitTypeArgumentsAttribute: System.Object TypeId +Microsoft.FSharp.Core.RequiresExplicitTypeArgumentsAttribute: System.Object get_TypeId() Microsoft.FSharp.Core.RequiresExplicitTypeArgumentsAttribute: System.String ToString() Microsoft.FSharp.Core.RequiresExplicitTypeArgumentsAttribute: System.Type GetType() Microsoft.FSharp.Core.RequiresExplicitTypeArgumentsAttribute: Void .ctor() @@ -2877,10 +3000,13 @@ Microsoft.FSharp.Core.ResultModule: Microsoft.FSharp.Core.FSharpResult`2[TResult Microsoft.FSharp.Core.ResultModule: System.String ToString() Microsoft.FSharp.Core.ResultModule: System.Type GetType() Microsoft.FSharp.Core.SealedAttribute: Boolean Equals(System.Object) +Microsoft.FSharp.Core.SealedAttribute: Boolean IsDefaultAttribute() Microsoft.FSharp.Core.SealedAttribute: Boolean Match(System.Object) Microsoft.FSharp.Core.SealedAttribute: Boolean Value Microsoft.FSharp.Core.SealedAttribute: Boolean get_Value() Microsoft.FSharp.Core.SealedAttribute: Int32 GetHashCode() +Microsoft.FSharp.Core.SealedAttribute: System.Object TypeId +Microsoft.FSharp.Core.SealedAttribute: System.Object get_TypeId() Microsoft.FSharp.Core.SealedAttribute: System.String ToString() Microsoft.FSharp.Core.SealedAttribute: System.Type GetType() Microsoft.FSharp.Core.SealedAttribute: Void .ctor() @@ -2925,26 +3051,38 @@ Microsoft.FSharp.Core.StringModule: System.Type GetType() Microsoft.FSharp.Core.StringModule: Void Iterate(Microsoft.FSharp.Core.FSharpFunc`2[System.Char,Microsoft.FSharp.Core.Unit], System.String) Microsoft.FSharp.Core.StringModule: Void IterateIndexed(Microsoft.FSharp.Core.FSharpFunc`2[System.Int32,Microsoft.FSharp.Core.FSharpFunc`2[System.Char,Microsoft.FSharp.Core.Unit]], System.String) Microsoft.FSharp.Core.StructAttribute: Boolean Equals(System.Object) +Microsoft.FSharp.Core.StructAttribute: Boolean IsDefaultAttribute() Microsoft.FSharp.Core.StructAttribute: Boolean Match(System.Object) Microsoft.FSharp.Core.StructAttribute: Int32 GetHashCode() +Microsoft.FSharp.Core.StructAttribute: System.Object TypeId +Microsoft.FSharp.Core.StructAttribute: System.Object get_TypeId() Microsoft.FSharp.Core.StructAttribute: System.String ToString() Microsoft.FSharp.Core.StructAttribute: System.Type GetType() Microsoft.FSharp.Core.StructAttribute: Void .ctor() Microsoft.FSharp.Core.StructuralComparisonAttribute: Boolean Equals(System.Object) +Microsoft.FSharp.Core.StructuralComparisonAttribute: Boolean IsDefaultAttribute() Microsoft.FSharp.Core.StructuralComparisonAttribute: Boolean Match(System.Object) Microsoft.FSharp.Core.StructuralComparisonAttribute: Int32 GetHashCode() +Microsoft.FSharp.Core.StructuralComparisonAttribute: System.Object TypeId +Microsoft.FSharp.Core.StructuralComparisonAttribute: System.Object get_TypeId() Microsoft.FSharp.Core.StructuralComparisonAttribute: System.String ToString() Microsoft.FSharp.Core.StructuralComparisonAttribute: System.Type GetType() Microsoft.FSharp.Core.StructuralComparisonAttribute: Void .ctor() Microsoft.FSharp.Core.StructuralEqualityAttribute: Boolean Equals(System.Object) +Microsoft.FSharp.Core.StructuralEqualityAttribute: Boolean IsDefaultAttribute() Microsoft.FSharp.Core.StructuralEqualityAttribute: Boolean Match(System.Object) Microsoft.FSharp.Core.StructuralEqualityAttribute: Int32 GetHashCode() +Microsoft.FSharp.Core.StructuralEqualityAttribute: System.Object TypeId +Microsoft.FSharp.Core.StructuralEqualityAttribute: System.Object get_TypeId() Microsoft.FSharp.Core.StructuralEqualityAttribute: System.String ToString() Microsoft.FSharp.Core.StructuralEqualityAttribute: System.Type GetType() Microsoft.FSharp.Core.StructuralEqualityAttribute: Void .ctor() Microsoft.FSharp.Core.StructuredFormatDisplayAttribute: Boolean Equals(System.Object) +Microsoft.FSharp.Core.StructuredFormatDisplayAttribute: Boolean IsDefaultAttribute() Microsoft.FSharp.Core.StructuredFormatDisplayAttribute: Boolean Match(System.Object) Microsoft.FSharp.Core.StructuredFormatDisplayAttribute: Int32 GetHashCode() +Microsoft.FSharp.Core.StructuredFormatDisplayAttribute: System.Object TypeId +Microsoft.FSharp.Core.StructuredFormatDisplayAttribute: System.Object get_TypeId() Microsoft.FSharp.Core.StructuredFormatDisplayAttribute: System.String ToString() Microsoft.FSharp.Core.StructuredFormatDisplayAttribute: System.String Value Microsoft.FSharp.Core.StructuredFormatDisplayAttribute: System.String get_Value() @@ -2955,14 +3093,20 @@ Microsoft.FSharp.Core.Unit: Int32 GetHashCode() Microsoft.FSharp.Core.Unit: System.String ToString() Microsoft.FSharp.Core.Unit: System.Type GetType() Microsoft.FSharp.Core.UnverifiableAttribute: Boolean Equals(System.Object) +Microsoft.FSharp.Core.UnverifiableAttribute: Boolean IsDefaultAttribute() Microsoft.FSharp.Core.UnverifiableAttribute: Boolean Match(System.Object) Microsoft.FSharp.Core.UnverifiableAttribute: Int32 GetHashCode() +Microsoft.FSharp.Core.UnverifiableAttribute: System.Object TypeId +Microsoft.FSharp.Core.UnverifiableAttribute: System.Object get_TypeId() Microsoft.FSharp.Core.UnverifiableAttribute: System.String ToString() Microsoft.FSharp.Core.UnverifiableAttribute: System.Type GetType() Microsoft.FSharp.Core.UnverifiableAttribute: Void .ctor() Microsoft.FSharp.Core.VolatileFieldAttribute: Boolean Equals(System.Object) +Microsoft.FSharp.Core.VolatileFieldAttribute: Boolean IsDefaultAttribute() Microsoft.FSharp.Core.VolatileFieldAttribute: Boolean Match(System.Object) Microsoft.FSharp.Core.VolatileFieldAttribute: Int32 GetHashCode() +Microsoft.FSharp.Core.VolatileFieldAttribute: System.Object TypeId +Microsoft.FSharp.Core.VolatileFieldAttribute: System.Object get_TypeId() Microsoft.FSharp.Core.VolatileFieldAttribute: System.String ToString() Microsoft.FSharp.Core.VolatileFieldAttribute: System.Type GetType() Microsoft.FSharp.Core.VolatileFieldAttribute: Void .ctor() @@ -3254,20 +3398,20 @@ Microsoft.FSharp.Linq.RuntimeHelpers.LeafExpressionConverter: System.String ToSt Microsoft.FSharp.Linq.RuntimeHelpers.LeafExpressionConverter: System.Type GetType() Microsoft.FSharp.Linq.RuntimeHelpers.LeafExpressionConverter: T MemberInitializationHelper[T](T) Microsoft.FSharp.Linq.RuntimeHelpers.LeafExpressionConverter: T NewAnonymousObjectHelper[T](T) -Microsoft.FSharp.NativeInterop.NativePtrModule: T& ToByRefInlined[T](IntPtr) Microsoft.FSharp.NativeInterop.NativePtrModule: Boolean Equals(System.Object) Microsoft.FSharp.NativeInterop.NativePtrModule: Int32 GetHashCode() Microsoft.FSharp.NativeInterop.NativePtrModule: IntPtr AddPointerInlined[T](IntPtr, Int32) Microsoft.FSharp.NativeInterop.NativePtrModule: IntPtr OfNativeIntInlined[T](IntPtr) +Microsoft.FSharp.NativeInterop.NativePtrModule: IntPtr OfVoidPtrInlined[T](Void*) Microsoft.FSharp.NativeInterop.NativePtrModule: IntPtr StackAllocate[T](Int32) Microsoft.FSharp.NativeInterop.NativePtrModule: IntPtr ToNativeIntInlined[T](IntPtr) Microsoft.FSharp.NativeInterop.NativePtrModule: System.String ToString() Microsoft.FSharp.NativeInterop.NativePtrModule: System.Type GetType() Microsoft.FSharp.NativeInterop.NativePtrModule: T GetPointerInlined[T](IntPtr, Int32) Microsoft.FSharp.NativeInterop.NativePtrModule: T ReadPointerInlined[T](IntPtr) +Microsoft.FSharp.NativeInterop.NativePtrModule: T& ToByRefInlined[T](IntPtr) Microsoft.FSharp.NativeInterop.NativePtrModule: Void SetPointerInlined[T](IntPtr, Int32, T) Microsoft.FSharp.NativeInterop.NativePtrModule: Void WritePointerInlined[T](IntPtr, T) -Microsoft.FSharp.NativeInterop.NativePtrModule: IntPtr OfVoidPtrInlined[T](Void*) Microsoft.FSharp.NativeInterop.NativePtrModule: Void* ToVoidPtrInlined[T](IntPtr) Microsoft.FSharp.Quotations.DerivedPatternsModule: Boolean Equals(System.Object) Microsoft.FSharp.Quotations.DerivedPatternsModule: Int32 GetHashCode() diff --git a/tests/FSharp.Core.UnitTests/TypeForwarding.fs b/tests/FSharp.Core.UnitTests/TypeForwarding.fs index b0ca6fa9044..28d53156a60 100644 --- a/tests/FSharp.Core.UnitTests/TypeForwarding.fs +++ b/tests/FSharp.Core.UnitTests/TypeForwarding.fs @@ -8,9 +8,7 @@ open System open FSharp.Core.UnitTests.LibraryTestFx open NUnit.Framework -#if NETSTANDARD1_6 -// TODO named #define ? -#else +#if NET46 [] type TypeForwardingModule() = [] @@ -30,5 +28,7 @@ type TypeForwardingModule() = | ("v4.0.30319", "v4.0.30319") -> Assert.AreEqual(tupleAssemblyName, mscorlib4AssemblyName) | _ -> failwith "Unknown scenario." - () + () +#else +// TODO named #define ? #endif \ No newline at end of file diff --git a/tests/FSharp.Core.UnitTests/project.json b/tests/FSharp.Core.UnitTests/project.json deleted file mode 100644 index 901129da26d..00000000000 --- a/tests/FSharp.Core.UnitTests/project.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "version": "1.0.0-*", - "name": "FSharp.Core.UnitTests", - "buildOptions": { - "debugType": "portable", - "emitEntryPoint": true - }, - "dependencies": { - "nunit": "3.5.0", - "nunitlite": "3.5.0", - "System.ValueTuple": "4.3.0", - "FsCheck": "3.0.0-alpha3", - "Testing.FSharp.Core": "4.2.4", - "Microsoft.FSharp.TupleSample": "1.0.0-alpha-161112" - }, - "runtimes": { - "win7-x86": {}, - "win7-x64": {}, - "osx.10.11-x64": {}, - "ubuntu.14.04-x64": {} - }, - "frameworks": { - "netcoreapp1.0": { - "dependencies": { - "Microsoft.NETCore.App": { - "type": "platform", - "version": "1.0.1" - } - }, - "imports": [ "netstandard1.1", "netstandard1.6", "portable-net45+win8+wp8+wpa81" ] - } - }, -} diff --git a/tests/FSharp.Directory.Build.props b/tests/FSharp.Directory.Build.props new file mode 100644 index 00000000000..19257808542 --- /dev/null +++ b/tests/FSharp.Directory.Build.props @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/tests/FSharp.Directory.Build.targets b/tests/FSharp.Directory.Build.targets new file mode 100644 index 00000000000..590214e9b00 --- /dev/null +++ b/tests/FSharp.Directory.Build.targets @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/tests/fsharp/Directory.Build.props b/tests/fsharp/Directory.Build.props new file mode 100644 index 00000000000..bb8eac309b1 --- /dev/null +++ b/tests/fsharp/Directory.Build.props @@ -0,0 +1,3 @@ + + + diff --git a/tests/fsharp/Directory.Build.targets b/tests/fsharp/Directory.Build.targets new file mode 100644 index 00000000000..ccd47cc0a9a --- /dev/null +++ b/tests/fsharp/Directory.Build.targets @@ -0,0 +1,3 @@ + + + diff --git a/tests/fsharp/FSharp.Tests.FSharpSuite.DrivingCoreCLR/DeployCompiler/fsc/NuGet.Config b/tests/fsharp/FSharp.Tests.FSharpSuite.DrivingCoreCLR/DeployCompiler/fsc/NuGet.Config deleted file mode 100644 index e64f65a1761..00000000000 --- a/tests/fsharp/FSharp.Tests.FSharpSuite.DrivingCoreCLR/DeployCompiler/fsc/NuGet.Config +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - diff --git a/tests/fsharp/FSharp.Tests.FSharpSuite.DrivingCoreCLR/DeployCompiler/fsc/project.json b/tests/fsharp/FSharp.Tests.FSharpSuite.DrivingCoreCLR/DeployCompiler/fsc/project.json deleted file mode 100644 index 1ef5b17e135..00000000000 --- a/tests/fsharp/FSharp.Tests.FSharpSuite.DrivingCoreCLR/DeployCompiler/fsc/project.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "version": "1.0.0-*", - "name": "fsc", - "buildOptions": { - "debugType": "portable", - "emitEntryPoint": true - }, - "dependencies": { - "Testing.FSharp.Compiler": "4.2.0-*" - }, - "runtimes": { - "win7-x86": { }, - "win7-x64": { }, - "osx.10.10-x64": { }, - "ubuntu.14.04-x64": { } - }, - "frameworks": { - "netcoreapp1.0": { - "dependencies": { - "Microsoft.NETCore.App": { - "type": "platform", - "version": "1.0.1" - } - }, - } - }, - "scripts": { - "postpublish": [ "cmd /c copy %publish:OutputPath%\\runtimes\\any\\native\\* %publish:OutputPath%" ] - } -} \ No newline at end of file diff --git a/tests/fsharp/FSharp.Tests.FSharpSuite.DrivingCoreCLR/DeployCompiler/fsi/NuGet.Config b/tests/fsharp/FSharp.Tests.FSharpSuite.DrivingCoreCLR/DeployCompiler/fsi/NuGet.Config deleted file mode 100644 index e64f65a1761..00000000000 --- a/tests/fsharp/FSharp.Tests.FSharpSuite.DrivingCoreCLR/DeployCompiler/fsi/NuGet.Config +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - diff --git a/tests/fsharp/FSharp.Tests.FSharpSuite.DrivingCoreCLR/DeployCompiler/fsi/project.json b/tests/fsharp/FSharp.Tests.FSharpSuite.DrivingCoreCLR/DeployCompiler/fsi/project.json deleted file mode 100644 index 8d7efcca46e..00000000000 --- a/tests/fsharp/FSharp.Tests.FSharpSuite.DrivingCoreCLR/DeployCompiler/fsi/project.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "version": "1.0.0-*", - "name": "fsi", - "buildOptions": { - "debugType": "portable", - "emitEntryPoint": true - }, - "dependencies": { - "Testing.FSharp.Compiler": "4.2.0-*" - }, - "runtimes": { - "win7-x86": { }, - "win7-x64": { }, - "osx.10.10-x64": { }, - "ubuntu.14.04-x64": { } - }, - "frameworks": { - "netcoreapp1.0": { - "dependencies": { - "Microsoft.NETCore.App": { - "type": "platform", - "version": "1.0.1" - } - }, - } - }, - "scripts": { - "postpublish": [ "cmd /c copy %publish:OutputPath%\\runtimes\\any\\native\\* %publish:OutputPath%" ] - } -} \ No newline at end of file diff --git a/tests/fsharp/FSharp.Tests.FSharpSuite.DrivingCoreCLR/FSharp.Tests.FSharpSuite.DrivingCoreCLR.fsproj b/tests/fsharp/FSharp.Tests.FSharpSuite.DrivingCoreCLR/FSharp.Tests.FSharpSuite.DrivingCoreCLR.fsproj deleted file mode 100644 index b236d1d93cb..00000000000 --- a/tests/fsharp/FSharp.Tests.FSharpSuite.DrivingCoreCLR/FSharp.Tests.FSharpSuite.DrivingCoreCLR.fsproj +++ /dev/null @@ -1,59 +0,0 @@ - - - - $(MSBuildProjectDirectory)\..\..\..\src - {bda4d411-6ad9-4b3e-a3b3-07bad6bef1ed} - true - true - - - - Debug - AnyCPU - 2.0 - true - true - Library - true - $(DefineConstants);FSHARP_SUITE_DRIVES_CORECLR_TESTS - FSharp.Tests.FSharpSuite.DrivingCoreCLR - FSharp.Tests.FSharpSuite.DrivingCoreCLR - - false - false - $(OtherFlags) --warnon:1182 - - - - - scriptlib.fsx - - - - NunitHelpers.fs - - - - - - - - - - - - ..\..\packages\NUnit.3.5.0\lib\net45\nunit.framework.dll - True - - - {2E4D67B4-522D-4CF7-97E4-BA940F0B18F3} - FSharp.Compiler.Private - - - - - {DED3BBD7-53F4-428A-8C9F-27968E768605} - FSharp.Core - - - \ No newline at end of file diff --git a/tests/fsharp/FSharp.Tests.FSharpSuite.DrivingCoreCLR/FSharp.Tests.FSharpSuite.DrivingCoreCLR.sln b/tests/fsharp/FSharp.Tests.FSharpSuite.DrivingCoreCLR/FSharp.Tests.FSharpSuite.DrivingCoreCLR.sln deleted file mode 100644 index 69d9198aba2..00000000000 --- a/tests/fsharp/FSharp.Tests.FSharpSuite.DrivingCoreCLR/FSharp.Tests.FSharpSuite.DrivingCoreCLR.sln +++ /dev/null @@ -1,25 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 15 -VisualStudioVersion = 15.0.25928.0 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "FSharp.Tests.FSharpSuite.DrivingCoreCLR", "FSharp.Tests.FSharpSuite.DrivingCoreCLR.fsproj", "{BDA4D411-6AD9-4B3E-A3B3-07BAD6BEF1ED}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Proto|Any CPU = Proto|Any CPU - Release|Any CPU = Release|Any CPU - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {BDA4D411-6AD9-4B3E-A3B3-07BAD6BEF1ED}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {BDA4D411-6AD9-4B3E-A3B3-07BAD6BEF1ED}.Debug|Any CPU.Build.0 = Debug|Any CPU - {BDA4D411-6AD9-4B3E-A3B3-07BAD6BEF1ED}.Proto|Any CPU.ActiveCfg = Proto|Any CPU - {BDA4D411-6AD9-4B3E-A3B3-07BAD6BEF1ED}.Proto|Any CPU.Build.0 = Proto|Any CPU - {BDA4D411-6AD9-4B3E-A3B3-07BAD6BEF1ED}.Release|Any CPU.ActiveCfg = Release|Any CPU - {BDA4D411-6AD9-4B3E-A3B3-07BAD6BEF1ED}.Release|Any CPU.Build.0 = Release|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/tests/fsharp/FSharp.Tests.FSharpSuite.DrivingCoreCLR/Program.cs b/tests/fsharp/FSharp.Tests.FSharpSuite.DrivingCoreCLR/Program.cs deleted file mode 100644 index 5183e98a293..00000000000 --- a/tests/fsharp/FSharp.Tests.FSharpSuite.DrivingCoreCLR/Program.cs +++ /dev/null @@ -1 +0,0 @@ -// This file is only required for dotnet publish ... and it's not even really used by that. diff --git a/tests/fsharp/FSharp.Tests.FSharpSuite.DrivingCoreCLR/Program.fs b/tests/fsharp/FSharp.Tests.FSharpSuite.DrivingCoreCLR/Program.fs deleted file mode 100644 index 28ff2aa8434..00000000000 --- a/tests/fsharp/FSharp.Tests.FSharpSuite.DrivingCoreCLR/Program.fs +++ /dev/null @@ -1,12 +0,0 @@ -module Program - -open System -open System.Reflection -open NUnitLite -open NUnit.Common - -type HelperType() = inherit System.Object() - -[] -let main argv = - AutoRun(typeof.GetTypeInfo().Assembly).Execute(argv, new ExtendedTextWrapper(Console.Out), Console.In) diff --git a/tests/fsharp/FSharp.Tests.FSharpSuite.DrivingCoreCLR/project.json b/tests/fsharp/FSharp.Tests.FSharpSuite.DrivingCoreCLR/project.json deleted file mode 100644 index 89c511665ae..00000000000 --- a/tests/fsharp/FSharp.Tests.FSharpSuite.DrivingCoreCLR/project.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "version": "1.0.0-*", - "name": "FSharp.Tests.FSharpSuite.DrivingCoreCLR", - "buildOptions": { - "debugType": "portable", - "emitEntryPoint": true - }, - "dependencies": { - "NETStandard.Library": "1.6.1", - "Testing.FSharp.Core": "4.2.*", - "nunit": "3.5.0", - "nunitlite": "3.5.0" - }, - "runtimes": { - "win7-x86": {}, - "win7-x64": {}, - "osx.10.11-x64": {}, - "ubuntu.14.04-x64": {} - }, - "frameworks": { - "netcoreapp1.0": { - "dependencies": { - "Microsoft.NETCore.App": { - "type": "platform", - "version": "1.0.1" - }, - "System.Reflection.Emit.Lightweight": "4.3.0" - }, - "imports": [ "netstandard1.6", "portable-net45+win8+wp8+wpa81" ] - } - }, - "scripts": { - "postpublish": [ "cmd /c copy %publish:OutputPath%\\runtimes\\any\\native\\* %publish:OutputPath%" ] - } -} diff --git a/tests/fsharp/FSharp.Tests.FSharpSuite.fsproj b/tests/fsharp/FSharp.Tests.FSharpSuite.fsproj index 2ec2840bc85..97aa63d88fb 100644 --- a/tests/fsharp/FSharp.Tests.FSharpSuite.fsproj +++ b/tests/fsharp/FSharp.Tests.FSharpSuite.fsproj @@ -1,30 +1,23 @@  - - - $(MSBuildProjectDirectory)\..\..\src - {C163E892-5BF7-4B59-AA99-B0E8079C67C4} - - + + - Debug - AnyCPU - 2.0 - true + net46;netcoreapp2.0 + win-x86;win-x64 + $(AssetTargetFallback);portable-net45+win8+wp8+wpa81 true Library - true - FSharp.Tests.FSharpSuite - FSharp.Tests.FSharpSuite - + true false false $(OtherFlags) --warnon:1182 + nunit - - - + + + $(DefineConstants);FSHARP_SUITE_DRIVES_CORECLR_TESTS - + scriptlib.fsx @@ -34,37 +27,28 @@ NunitHelpers.fs - + + + + + + + + + - - - - - - $(FSharpSourcesRoot)\..\packages\System.Collections.Immutable.$(SystemCollectionsImmutablePackageVersion)\lib\portable-net45+win8+wp8+wpa81\System.Collections.Immutable.dll - True - - - $(FSharpSourcesRoot)\..\packages\System.Reflection.Metadata.$(SystemReflectionMetadataPackageVersion)\lib\portable-net45+win8\System.Reflection.Metadata.dll - True - - - ..\..\packages\NUnit.3.5.0\lib\net45\nunit.framework.dll - True - - - {2E4D67B4-522D-4CF7-97E4-BA940F0B18F3} - FSharp.Compiler.Private - - - {DED3BBD7-53F4-428A-8C9F-27968E768605} - FSharp.Core - + + + + + + - \ No newline at end of file + + diff --git a/tests/fsharp/SDKTests/AllSdkTargetsTests.proj b/tests/fsharp/SDKTests/AllSdkTargetsTests.proj index 8aecfd0263e..857e3efd636 100644 --- a/tests/fsharp/SDKTests/AllSdkTargetsTests.proj +++ b/tests/fsharp/SDKTests/AllSdkTargetsTests.proj @@ -14,5 +14,6 @@ + diff --git a/tests/fsharp/SDKTests/Directory.Build.props b/tests/fsharp/SDKTests/Directory.Build.props new file mode 100644 index 00000000000..bb5b23d29d0 --- /dev/null +++ b/tests/fsharp/SDKTests/Directory.Build.props @@ -0,0 +1,3 @@ + + + diff --git a/tests/fsharp/SDKTests/Directory.Build.targets b/tests/fsharp/SDKTests/Directory.Build.targets new file mode 100644 index 00000000000..bb5b23d29d0 --- /dev/null +++ b/tests/fsharp/SDKTests/Directory.Build.targets @@ -0,0 +1,3 @@ + + + diff --git a/tests/fsharp/SDKTests/tests/Test.targets b/tests/fsharp/SDKTests/tests/Test.targets index 668f100f9e4..5526c118403 100644 --- a/tests/fsharp/SDKTests/tests/Test.targets +++ b/tests/fsharp/SDKTests/tests/Test.targets @@ -27,7 +27,6 @@ - diff --git a/tests/fsharp/Test.Directory.Build.props b/tests/fsharp/Test.Directory.Build.props new file mode 100644 index 00000000000..6603d10e659 --- /dev/null +++ b/tests/fsharp/Test.Directory.Build.props @@ -0,0 +1,8 @@ + + + $(CompilerTestPath)\Microsoft.FSharp.Targets + $(CompilerTestPath)\Microsoft.FSharp.NetSdk.props + $(CompilerTestPath)\Microsoft.FSharp.NetSdk.targets + $(CompilerTestPath)\Microsoft.FSharp.Overrides.NetSdk.targets + + diff --git a/tests/fsharp/TypeProviderTests.fs b/tests/fsharp/TypeProviderTests.fs index 08a39395ef9..f5d9f909450 100644 --- a/tests/fsharp/TypeProviderTests.fs +++ b/tests/fsharp/TypeProviderTests.fs @@ -27,7 +27,6 @@ let FSIANYCPU_BASIC = FSI_CORECLR #else let FSC_BASIC = FSC_OPT_PLUS_DEBUG let FSI_BASIC = FSI_FILE -let FSIANYCPU_BASIC = FSIANYCPU_FILE #endif (* @@ -272,7 +271,9 @@ let splitAssembly subdir project = SingleTest.singleTestBuildAndRunAux cfg FSI_BASIC +#if !FSHARP_SUITE_DRIVES_CORECLR_TESTS SingleTest.singleTestBuildAndRunAux cfg FSIANYCPU_BASIC +#endif // Do the same thing with different load locations for the type provider design-time component diff --git a/tests/fsharp/core/array/test.fsx b/tests/fsharp/core/array/test.fsx index 0e25ee5e966..b0c67ce8ab2 100644 --- a/tests/fsharp/core/array/test.fsx +++ b/tests/fsharp/core/array/test.fsx @@ -1407,7 +1407,7 @@ module bug872632 = module CheckUnionTypesAreSealed = open System -#if NETCOREAPP1_0 +#if NETSTANDARD open System.Reflection type System.Type with member this.IsSealed @@ -1469,7 +1469,7 @@ module manyIndexes = 0 -#if !NETCOREAPP1_0 +#if !NETSTANDARD module bug6447 = let a = System.Array.CreateInstance(typeof, [|1|], [|1|]) let a1 = System.Array.CreateInstance(typeof, [|1|], [|3|]) diff --git a/tests/fsharp/core/attributes/test.fsx b/tests/fsharp/core/attributes/test.fsx index 66d6a183934..6c367d0ee0f 100644 --- a/tests/fsharp/core/attributes/test.fsx +++ b/tests/fsharp/core/attributes/test.fsx @@ -7,11 +7,11 @@ module Core_attributes #endif #light -#if !TESTS_AS_APP && !NETCOREAPP1_0 +#if !TESTS_AS_APP && !NETSTANDARD #load "testlib.fsi" "testlib.fs" // a warning is expected here #endif -#if !TESTS_AS_APP && !NETCOREAPP1_0 +#if !TESTS_AS_APP && !NETSTANDARD #r "cslib.dll" #endif @@ -38,7 +38,7 @@ open System.Diagnostics (* ATTRIBUTES *) -#if !TESTS_AS_APP && !NETCOREAPP1_0 +#if !TESTS_AS_APP && !NETSTANDARD [] #endif @@ -58,7 +58,7 @@ let fx3 (x:x2) = fx2 x (* attribute on a method *) let [] myLoggingMethod x = stderr.WriteLine(x:string) -#if !NETCOREAPP1_0 +#if !NETSTANDARD let [] myLoggingMethod2 x = stderr.WriteLine(x:string) #endif @@ -228,7 +228,7 @@ let ca4 = typeof.GetCustomAttributes(typeof,false) do if Array.length ca4 <> 1 then failwith "could not find CA on type" -#if !NETCOREAPP1_0 +#if !NETSTANDARD open System.Runtime.InteropServices [] @@ -325,7 +325,7 @@ let ca7d = ty.Assembly.GetCustomAttributes(typeof,false) do if Array.length ca7d <> 1 then report_failure (sprintf "could not get parameterized CA on assembly, num CAs = %d" (Array.length ca7d)) -#if !NETCOREAPP1_0 +#if !NETSTANDARD #if COMPILED [<``module``: DontPressThisButton3(1, "", -2)>] do() @@ -376,7 +376,7 @@ module CheckGenericParameterAttibutesAndNames = if typeof.GetMethod("M2").GetGenericArguments().[1].Name <> "V" then report_failure "wrong name on generic parameter (C)" if typeof.GetMethod("M3").GetGenericArguments().[0].Name <> "a" then report_failure "unexpected inferred name on generic parameter (D)" -#if !TESTS_AS_APP && !NETCOREAPP1_0 +#if !TESTS_AS_APP && !NETSTANDARD module CheckAttributesOnElementsWithSignatures = let checkOneAttribute msg (cas: _ []) = @@ -432,7 +432,7 @@ end // -#if !NETCOREAPP1_0 +#if !NETSTANDARD #r "System.Security.dll";; #r "System.Configuration.dll";; @@ -511,7 +511,7 @@ module ThreadStaticTest = begin static val mutable private results : int list static member Results with get() = C.results and set v = C.results <- v -#if !MONO && !NETCOREAPP1_0 +#if !MONO && !NETSTANDARD let N = 1000 let main() = let t1 = @@ -561,7 +561,7 @@ end (*------------------------------------------------------------------------- !* System.Runtime.InteropServices.In/OUT attributes *------------------------------------------------------------------------- *) -#if !NETCOREAPP1_0 +#if !NETSTANDARD open System let g ( [] x : int byref) = 0 let g2 (( [] x : int byref), ([] y : int byref)) = 0 @@ -611,7 +611,7 @@ type C = end -#if !NETCOREAPP1_0 +#if !NETSTANDARD let test2179 = let ty = typeof in @@ -884,7 +884,7 @@ module Bug6161_PS_FSharp1_0_MoreAttributesWithArrayArguments = begin check "ce99pj32cweqT" (ca.[0].GetType()) (typeof) check "ce99pj32cweqY" (ca.[0] :?> AnyAttribute).Value (box [| 42 |]) -#if !TESTS_AS_APP && !NETCOREAPP1_0 +#if !TESTS_AS_APP && !NETSTANDARD let _ = let ty = typeof let ca = ty.GetCustomAttributes(typeof,false) @@ -1090,7 +1090,7 @@ module NullsInAttributes = test "TestProperty5" (null, null, null, Some null, Some null, Some null) test "TestProperty6" (box "1", "2", typeof, Some (box "3"), Some "4", Some typeof) -#if !NETCOREAPP1_0 +#if !NETSTANDARD module Bug5762 = open System open System.IO @@ -1333,7 +1333,7 @@ module BugWithOverloadedAttributes = [] type Bar = class end -#if !TESTS_AS_APP && !NETCOREAPP1_0 +#if !TESTS_AS_APP && !NETSTANDARD module Bug719b = open TestLibModule.Bug719 diff --git a/tests/fsharp/core/attributes/testlib.fsi b/tests/fsharp/core/attributes/testlib.fsi index e83aa9e4f11..785ee261f62 100644 --- a/tests/fsharp/core/attributes/testlib.fsi +++ b/tests/fsharp/core/attributes/testlib.fsi @@ -103,7 +103,7 @@ type ThisLibAssembly -#if !NETCOREAPP1_0 +#if !NETSTANDARD module Bug719 = open System.Runtime.InteropServices diff --git a/tests/fsharp/core/byrefs/.gitignore b/tests/fsharp/core/byrefs/.gitignore new file mode 100644 index 00000000000..6a7461313bb --- /dev/null +++ b/tests/fsharp/core/byrefs/.gitignore @@ -0,0 +1 @@ +*.dll diff --git a/tests/fsharp/core/comprehensions-hw/test.fsx b/tests/fsharp/core/comprehensions-hw/test.fsx index 19535574cd1..78391076798 100644 --- a/tests/fsharp/core/comprehensions-hw/test.fsx +++ b/tests/fsharp/core/comprehensions-hw/test.fsx @@ -447,7 +447,7 @@ test "coic23" -#if !NETCOREAPP1_0 +#if !NETSTANDARD let pickering() = let files = Directory.GetFiles(@"C:\Program Files\Microsoft Enterprise Library January 2006\", "*.csproj", SearchOption.AllDirectories) for file in files do @@ -557,7 +557,7 @@ module RandomSmallIfThenElseTest = do () return a } -#if !NETCOREAPP1_0 +#if !NETSTANDARD module MoreExtensions = open Microsoft.FSharp.Control diff --git a/tests/fsharp/core/comprehensions/test.fsx b/tests/fsharp/core/comprehensions/test.fsx index 3bf078fcc8d..b29714cdd5a 100644 --- a/tests/fsharp/core/comprehensions/test.fsx +++ b/tests/fsharp/core/comprehensions/test.fsx @@ -518,7 +518,7 @@ module MaxIntMinIntBOundaryCases = begin end -#if !NETCOREAPP1_0 +#if !NETSTANDARD open System.IO open System.Xml diff --git a/tests/fsharp/core/control/test.fsx b/tests/fsharp/core/control/test.fsx index ea2aafcd663..2155729db98 100644 --- a/tests/fsharp/core/control/test.fsx +++ b/tests/fsharp/core/control/test.fsx @@ -4,7 +4,7 @@ module Core_control #endif #light -#if NETCOREAPP1_0 +#if NETSTANDARD open System.Threading.Tasks #endif @@ -32,7 +32,7 @@ let report_failure s = log (sprintf "FAILURE: %s failed" s) ) -#if !NETCOREAPP1_0 +#if !NETSTANDARD System.AppDomain.CurrentDomain.UnhandledException.AddHandler( fun _ (args:System.UnhandledExceptionEventArgs) -> lock syncObj (fun () -> @@ -355,7 +355,7 @@ module SpawnTests = do result <- 1 }); while result = 0 do printf "." -#if NETCOREAPP1_0 +#if NETSTANDARD Task.Delay(10).Wait() #else System.Threading.Thread.Sleep(10) @@ -363,7 +363,7 @@ module SpawnTests = result) 1 -#if !NETCOREAPP1_0 +#if !NETSTANDARD module FromBeginEndTests = // FromBeginEnd let FromBeginEndTest() = @@ -395,7 +395,7 @@ module FromBeginEndTests = if (!savedCallback).IsNone then failwith "expected a callback (loc cwowen903)" (!savedCallback).Value.Invoke iar else -#if NETCOREAPP1_0 +#if NETSTANDARD Task.Run(fun _ -> Task.Delay(sleep).Wait() #else @@ -465,7 +465,7 @@ module Bug6078 = "foo" Test() -#if !MONO && !NETCOREAPP1_0 +#if !MONO && !NETSTANDARD module AwaitEventTests = let AwaitEventTest() = // AwaitEvent @@ -486,7 +486,7 @@ module AwaitEventTests = if completeSynchronously then ev.Trigger(r) else -#if NETCOREAPP1_0 +#if NETSTANDARD Task.Run(fun _ -> Task.Delay(sleep).Wait() #else @@ -773,7 +773,7 @@ module OnCancelTests = return () }, asyncGroup.Token); while count = 0 do do printfn "waiting to enter cancellation section" -#if NETCOREAPP1_0 +#if NETSTANDARD Task.Delay(10).Wait() #else System.Threading.Thread.Sleep(10) @@ -782,7 +782,7 @@ module OnCancelTests = res) 0 -#if !TESTS_AS_APP && !NETCOREAPP1_0 +#if !TESTS_AS_APP && !NETSTANDARD module SyncContextReturnTests = let p() = printfn "running on %A" System.Threading.SynchronizationContext.Current @@ -1082,7 +1082,7 @@ module ParallelTests = member x.Dispose() = // This gets run when the cancel happens // Sleep a bit to check we wait for the sleep after the cancel -#if NETCOREAPP1_0 +#if NETSTANDARD Task.Delay(10).Wait() #else System.Threading.Thread.Sleep(10) @@ -1134,7 +1134,7 @@ module ParallelTests = [| 0..n-1 |] -#if !NETCOREAPP1_0 +#if !NETSTANDARD module AsyncWaitOneTest1 = let Run() = @@ -1259,7 +1259,7 @@ Async.RunSynchronously (async { let! n = s.AsyncRead(buffer,0,9) in return n }) *) #endif -#if !NETCOREAPP1_0 +#if !NETSTANDARD module AsyncGenerateTests = let Run() = for length in 1 .. 10 do @@ -1315,7 +1315,7 @@ module AsyncGenerateTests = [| 0 .. length-1|];; #endif -#if !NETCOREAPP1_0 +#if !NETSTANDARD (* #This part of control suite disabled under bug#1809 module ThreadAbortTests = @@ -1401,7 +1401,7 @@ let catch a = let to_be_cancelled n flag1 flag2 = async { use! holder = Async.OnCancel(fun _ -> incr flag1) -#if NETCOREAPP1_0 +#if NETSTANDARD do Task.Delay(n/8).Wait() #else do System.Threading.Thread.Sleep (n / 8) @@ -1422,7 +1422,7 @@ let test2 () = test "test2 - OnCancel" (!flag1 >= 0 && !flag1 < n && !flag2 >= 0 && !flag2 < n) -#if !NETCOREAPP1_0 +#if !NETSTANDARD // SwitchToNewThread let test3 () = let ids = ref [] @@ -1484,7 +1484,7 @@ let test8() = let syncRoot = System.Object() let k = ref 0 let comp _ = async { return lock syncRoot (fun () -> incr k -#if NETCOREAPP1_0 +#if NETSTANDARD Task.Delay(1).Wait() #else System.Threading.Thread.Sleep(1) @@ -1628,7 +1628,7 @@ let test15() = Async.Parallel2(a, cancel) |> Async.RunSynchronously |> ignore with _ -> () -#if NETCOREAPP1_0 +#if NETSTANDARD Task.Delay(300).Wait() #else System.Threading.Thread.Sleep(300) @@ -1651,7 +1651,7 @@ let test15b() = let a = Async.TryCancelled(a, (fun _ -> p.Check -1)) a |> Async.RunSynchronously |> ignore with _ -> () -#if NETCOREAPP1_0 +#if NETSTANDARD Task.Delay(100).Wait() #else System.Threading.Thread.Sleep(100) @@ -1659,7 +1659,7 @@ let test15b() = test1() test2() -#if !NETCOREAPP1_0 +#if !NETSTANDARD test3() #endif test8() @@ -1685,7 +1685,7 @@ let test22() = let p = Path "test22" let a = async { do p.Check 1 -#if NETCOREAPP1_0 +#if NETSTANDARD do Task.Delay(200).Wait() #else do System.Threading.Thread.Sleep(200) @@ -1703,14 +1703,14 @@ let test22() = let run = Async.TryCancelled(run, fun _ -> p.Check 4) let group = new System.Threading.CancellationTokenSource() Async.Start(run,group.Token) -#if NETCOREAPP1_0 +#if NETSTANDARD Task.Delay(100).Wait() #else System.Threading.Thread.Sleep(100) #endif p.Check 2 group.Cancel() -#if NETCOREAPP1_0 +#if NETSTANDARD Task.Delay(200).Wait() #else System.Threading.Thread.Sleep(200) @@ -1748,7 +1748,7 @@ module ParallelTest = member x.Dispose() = // This gets run when the cancel happens if i=n-1 then // last guy waits a long time to ensure client is blocked -#if NETCOREAPP1_0 +#if NETSTANDARD Task.Delay(200).Wait() #else System.Threading.Thread.Sleep(2000) @@ -1780,7 +1780,7 @@ module ParallelTest = Test() -#if !TESTS_AS_APP && !NETCOREAPP1_0 +#if !TESTS_AS_APP && !NETSTANDARD // See bug 5570, check we do not switch threads module CheckNoPumpingOrThreadSwitchingBecauseWeTrampolineSynchronousCode = let checkOnThread msg expectedThreadId = @@ -2053,7 +2053,7 @@ module Bug391710 = Async.Start(a1, cancellationToken = cts.Token) Async.Start(a2) -#if NETCOREAPP1_0 +#if NETSTANDARD Task.Delay(500).Wait(); #else System.Threading.Thread.Sleep(500) @@ -2062,7 +2062,7 @@ module Bug391710 = try Bug391710() -#if NETCOREAPP1_0 +#if NETSTANDARD Task.Delay(500).Wait(); #else System.Threading.Thread.Sleep(2000) @@ -2079,13 +2079,13 @@ let RunAll() = StartChildOutsideOfAsync.Run() SpawnTests.Run() AsBeginEndTests.AsBeginEndTest() -#if !MONO && !NETCOREAPP1_0 +#if !MONO && !NETSTANDARD AwaitEventTests.AwaitEventTest() #endif OnCancelTests.Run() GenerateTests.Run() ParallelTests.Run() -#if !NETCOREAPP1_0 +#if !NETSTANDARD AsyncWaitOneTest1.Run() AsyncGenerateTests.Run() #endif diff --git a/tests/fsharp/core/controlChamenos/test.fsx b/tests/fsharp/core/controlChamenos/test.fsx index c4bc30f97a9..c7b494322da 100644 --- a/tests/fsharp/core/controlChamenos/test.fsx +++ b/tests/fsharp/core/controlChamenos/test.fsx @@ -27,7 +27,7 @@ let report_failure s = log (sprintf "FAILURE: %s failed" s) ) -#if !NETCOREAPP1_0 +#if !NETSTANDARD System.AppDomain.CurrentDomain.UnhandledException.AddHandler( fun _ (args:System.UnhandledExceptionEventArgs) -> lock syncObj (fun () -> diff --git a/tests/fsharp/core/controlMailbox/test.fsx b/tests/fsharp/core/controlMailbox/test.fsx index 61345f46db9..9807a5dea6d 100644 --- a/tests/fsharp/core/controlMailbox/test.fsx +++ b/tests/fsharp/core/controlMailbox/test.fsx @@ -6,7 +6,7 @@ module Core_controlMailBox #nowarn "40" // recursive references -#if NETCOREAPP1_0 +#if NETSTANDARD open System.Threading.Tasks #endif @@ -31,7 +31,7 @@ let report_failure s = log (sprintf "FAILURE: %s failed" s) ) -#if !NETCOREAPP1_0 +#if !NETSTANDARD System.AppDomain.CurrentDomain.UnhandledException.AddHandler( fun _ (args:System.UnhandledExceptionEventArgs) -> lock syncObj (fun () -> @@ -210,7 +210,7 @@ module MailboxProcessorBasicTests = while !received < n do if !received % 100 = 0 then printfn "received = %d" !received -#if NETCOREAPP1_0 +#if NETSTANDARD Task.Delay(1).Wait() #else System.Threading.Thread.Sleep(1) @@ -233,7 +233,7 @@ module MailboxProcessorBasicTests = | Some _ -> do incr received }) mb1.Start(); for i in 0 .. n-1 do -#if NETCOREAPP1_0 +#if NETSTANDARD Task.Delay(1).Wait(); #else System.Threading.Thread.Sleep(1) @@ -242,7 +242,7 @@ module MailboxProcessorBasicTests = while !received < n do if !received % 100 = 0 then printfn "main thread: received = %d" !received -#if NETCOREAPP1_0 +#if NETSTANDARD Task.Delay(1).Wait(); #else System.Threading.Thread.Sleep(1) @@ -275,7 +275,7 @@ module MailboxProcessorBasicTests = w.Start() while w.ElapsedMilliseconds < 1000L && (!timedOut).IsNone do mb.Post(-1) -#if NETCOREAPP1_0 +#if NETSTANDARD Task.Delay(1).Wait(); #else System.Threading.Thread.Sleep(1) @@ -298,7 +298,7 @@ module MailboxProcessorBasicTests = w.Start() while w.ElapsedMilliseconds < 100L do mb.Post(false) -#if NETCOREAPP1_0 +#if NETSTANDARD Task.Delay(0).Wait(); #else System.Threading.Thread.Sleep(0) @@ -318,7 +318,7 @@ module MailboxProcessorErrorEventTests = let res = ref 100 mb1.Error.Add(fun _ -> res := 0) mb1.Start(); -#if NETCOREAPP1_0 +#if NETSTANDARD Task.Delay(200).Wait(); #else System.Threading.Thread.Sleep(200) @@ -333,7 +333,7 @@ module MailboxProcessorErrorEventTests = let res = ref 0 mb1.Error.Add(fun _ -> res := 100) mb1.Start(); -#if NETCOREAPP1_0 +#if NETSTANDARD Task.Delay(200).Wait(); #else System.Threading.Thread.Sleep(200) @@ -351,7 +351,7 @@ module MailboxProcessorErrorEventTests = mb1.Error.Add(function Err n -> res := n | _ -> check "rwe90r - unexpected error" 0 1) mb1.Start(); mb1.Post 100 -#if NETCOREAPP1_0 +#if NETSTANDARD Task.Delay(200).Wait(); #else System.Threading.Thread.Sleep(200) @@ -473,7 +473,7 @@ let test7() = let timeoutboxes str = new MailboxProcessor<'b>(fun inbox -> async { for i in 1 .. 10 do -#if NETCOREAPP1_0 +#if NETSTANDARD Task.Delay(200).Wait() #else do System.Threading.Thread.Sleep 200 @@ -586,7 +586,7 @@ module LotsOfMessages = check "celrv09ervkn" (queueLength >= logger.CurrentQueueLength) true queueLength <- logger.CurrentQueueLength -#if NETCOREAPP1_0 +#if NETSTANDARD Task.Delay(10).Wait() #else System.Threading.Thread.Sleep(10) diff --git a/tests/fsharp/core/controlStackOverflow/test.fsx b/tests/fsharp/core/controlStackOverflow/test.fsx index 6bc557ef28d..b733e23508b 100644 --- a/tests/fsharp/core/controlStackOverflow/test.fsx +++ b/tests/fsharp/core/controlStackOverflow/test.fsx @@ -8,7 +8,7 @@ module Core_controlStackOverflow #nowarn "40" // recursive references -#if NETCOREAPP1_0 +#if NETSTANDARD open System.Threading.Tasks #endif @@ -36,7 +36,7 @@ let report_failure s = log (sprintf "FAILURE: %s failed" s) ) -#if !NETCOREAPP1_0 +#if !NETSTANDARD System.AppDomain.CurrentDomain.UnhandledException.AddHandler( fun _ (args:System.UnhandledExceptionEventArgs) -> lock syncObj (fun () -> @@ -231,7 +231,7 @@ module StackDiveTests = let quwiAsync x = Async.FromContinuations(fun (c,_,_) -> -#if NETCOREAPP1_0 +#if NETSTANDARD Task.Run( fun _ -> async { diff --git a/tests/fsharp/core/forexpression/test.fsx b/tests/fsharp/core/forexpression/test.fsx index 671d67f820d..9caa642f371 100644 --- a/tests/fsharp/core/forexpression/test.fsx +++ b/tests/fsharp/core/forexpression/test.fsx @@ -109,7 +109,7 @@ let sumOverRange () = let sumOverString () = let mutable sum = 0 for i in testString do -#if NETCOREAPP1_0 +#if NETSTANDARD sum <- sum + ((int (i :?> char)) - (int '0')) #else sum <- sum + ((int i) - (int '0')) diff --git a/tests/fsharp/core/lazy/test.fsx b/tests/fsharp/core/lazy/test.fsx index d16340be2a0..42b6771630b 100644 --- a/tests/fsharp/core/lazy/test.fsx +++ b/tests/fsharp/core/lazy/test.fsx @@ -43,7 +43,7 @@ do test "fedeoin" (let x = 3 in Lazy.force (Lazy.force (lazy (lazy (x+x)))) = 6) do test "fedeoin" (let x = ref 3 in let y = lazy (x := !x + 1; 6) in ignore (Lazy.force y); ignore (Lazy.force y); !x = 4) do test "fedeoin" (let x = ref 3 in let y = lazy (x := !x + 1; "abc") in ignore (Lazy.force y); ignore (Lazy.force y); !x = 4) -#if !NETCOREAPP1_0 +#if !NETSTANDARD module Bug5770 = open System.Threading do diff --git a/tests/fsharp/core/letrec/test.fsx b/tests/fsharp/core/letrec/test.fsx index 2c07ef1edee..5f9ac767bdf 100644 --- a/tests/fsharp/core/letrec/test.fsx +++ b/tests/fsharp/core/letrec/test.fsx @@ -127,7 +127,7 @@ let WouldFailAtRuntimeTest2 () = and a3 = (fun x -> a2 + 2) 1 in a2 + a3 -#if !TESTS_AS_APP && !NETCOREAPP1_0 +#if !TESTS_AS_APP && !NETSTANDARD open System open System.Windows.Forms @@ -300,10 +300,9 @@ module RecursiveInterfaceObjectExpressions = begin do if CosOp.Name <> "cos" then report_failure "RecursiveInterfaceObjectExpressions: test 1" do if CosOp2.Name <> "abc" then report_failure "RecursiveInterfaceObjectExpressions: test 2" - end -#if !TESTS_AS_APP && !NETCOREAPP1_0 +#if !TESTS_AS_APP && !NETSTANDARD module RecursiveInnerConstrainedGenerics = begin open System.Windows.Forms diff --git a/tests/fsharp/core/libtest/test.fsx b/tests/fsharp/core/libtest/test.fsx index f6c432f55dd..0c9ee40ed64 100644 --- a/tests/fsharp/core/libtest/test.fsx +++ b/tests/fsharp/core/libtest/test.fsx @@ -2227,7 +2227,7 @@ do check "generic format m" "-1y" (sprintf "%A" (-1y)) do check "generic format n" "-1s" (sprintf "%A" (-1s)) do check "generic format o" "-1" (sprintf "%A" (-1)) do check "generic format p" "-1L" (sprintf "%A" (-1L)) -#if !NETCOREAPP1_0 +#if !NETSTANDARD // See FSHARP1.0:4797 // On NetFx4.0 and above we do not emit the 'I' suffix let bigintsuffix = if (System.Environment.Version.Major, System.Environment.Version.Minor) > (2,0) then "" else "I" @@ -2716,7 +2716,7 @@ module SeqTestsOnEnumerableEnforcingDisposalAtEnd = begin do check "" numActiveEnumerators 0 do check "Seq.max" (Seq.max (countEnumeratorsAndCheckedDisposedAtMostOnce [1; 4; 2; 5; 8; 4; 0; 3])) 8 do check "" numActiveEnumerators 0 -#if !NETCOREAPP1_0 +#if !NETSTANDARD // strings don't have enumerators in portable do check "Seq.minBy" (Seq.minBy int (countEnumeratorsAndCheckedDisposedAtMostOnce "this is a test")) ' ' do check "" numActiveEnumerators 0 @@ -3694,7 +3694,7 @@ module MiscIEnumerableTests = begin open System.Net open System.IO -#if !NETCOREAPP1_0 +#if !NETSTANDARD /// generate the sequence of lines read off an internet connection let httpSeq (nm:string) = Seq.generate @@ -3866,7 +3866,7 @@ module FloatParseTests = begin do check "FloatParse.A" (to_bits (of_string "Infinity")) 0x7ff0000000000000L // 9218868437227405312L do check "FloatParse.B" (to_bits (of_string "-Infinity")) 0xfff0000000000000L // (-4503599627370496L) do check "FloatParse.C" (to_bits (of_string "NaN")) 0xfff8000000000000L // (-2251799813685248L) -#if !NETCOREAPP1_0 +#if !NETSTANDARD do check "FloatParse.D" (to_bits (of_string "-NaN")) ( // http://en.wikipedia.org/wiki/NaN let bit64 = System.IntPtr.Size = 8 in if bit64 && System.Environment.Version.Major < 4 then @@ -4078,9 +4078,6 @@ module SetTests = begin let unionTest n (nx,ny) = let check (xs:'a Set) = -#if DEBUG - test "vwnwer" (xs.CheckBalanceInvariant); -#endif xs in let xs = randomInts nx |> check in let ys = randomInts ny |> check in @@ -4271,7 +4268,7 @@ do check "clwnwe91" 10m 10m do check "clwnwe92" 10m 10.000m do check "clwnwe93" 1000000000m 1000000000m do check "clwnwe94" (4294967296000000000m.ToString()) "4294967296000000000" -#if !NETCOREAPP1_0 +#if !NETSTANDARD do check "clwnwe95" (10.000m.ToString(System.Globalization.CultureInfo.GetCultureInfo(1033).NumberFormat)) "10.000" // The actual output of a vanilla .ToString() depends on current culture UI. For this reason I am specifying the en-us culture. #endif do check "clwnwe96" (10m.ToString()) "10" @@ -4322,7 +4319,7 @@ do check "lkvcnwd09g" 2.0M (20.0M % 6.00M) do check "lkvcnwd09h" 20.0M (floor 20.300M) do check "lkvcnwd09j" 20.0 (floor 20.300) do check "lkvcnwd09k" 20.0f (floor 20.300f) -#if !NETCOREAPP1_0 +#if !NETSTANDARD do check "lkvcnwd09l" 20.0M (round 20.300M) do check "lkvcnwd09z" 20.0M (round 20.500M) do check "lkvcnwd09x" 22.0M (round 21.500M) @@ -5564,7 +5561,7 @@ module bug122495 = let c = C( P = a.[0..1]) -#if !NETCOREAPP1_0 +#if !NETSTANDARD (*--------------------------------------------------------------------------- !* Bug 33760: wrong codegen for params[] Action overload *--------------------------------------------------------------------------- *) diff --git a/tests/fsharp/core/longnames/test.fsx b/tests/fsharp/core/longnames/test.fsx index 780037a4896..d0fefa720a9 100644 --- a/tests/fsharp/core/longnames/test.fsx +++ b/tests/fsharp/core/longnames/test.fsx @@ -112,7 +112,7 @@ let v12 = let v13 = Microsoft.FSharp.Core.Some(1) -#if !NETCOREAPP1_0 +#if !NETSTANDARD (* check lid setting bug *) open System.Diagnostics diff --git a/tests/fsharp/core/math/numbers/test.fsx b/tests/fsharp/core/math/numbers/test.fsx index 3a198932cf3..51c6e938cc2 100644 --- a/tests/fsharp/core/math/numbers/test.fsx +++ b/tests/fsharp/core/math/numbers/test.fsx @@ -3,7 +3,7 @@ module Core_math_numbers #endif -#if NETCOREAPP1_0 +#if NETSTANDARD open CoreClrUtilities #endif diff --git a/tests/fsharp/core/math/numbersVS2008/test.fsx b/tests/fsharp/core/math/numbersVS2008/test.fsx index b7e288616d2..353d74ada2b 100644 --- a/tests/fsharp/core/math/numbersVS2008/test.fsx +++ b/tests/fsharp/core/math/numbersVS2008/test.fsx @@ -248,7 +248,7 @@ let negative64s = (-4611686018427387905L , -4611686018427387904L , -4611686018427387903L); (999L , -9223372036854775808L , -9223372036854775807L); (* MinValue is -2^63 *) (999L , 999L , 999L)] -#if !NETCOREAPP1_0 +#if !NETSTANDARD // Regression 3481: ToInt32 let triple k n project = let x = k * BigInteger.Pow(2I,n) in project (x - 1I),project x,project (x + 1I) diff --git a/tests/fsharp/core/measures/test.fsx b/tests/fsharp/core/measures/test.fsx index 9425bb52cdc..3f073bc08de 100644 --- a/tests/fsharp/core/measures/test.fsx +++ b/tests/fsharp/core/measures/test.fsx @@ -123,7 +123,7 @@ module FLOAT = let x23p = sinh (4.4<_>) let x23r = tan (4.4<_>) let x23s = tanh (4.4<_>) -#if !NETCOREAPP1_0 +#if !NETSTANDARD let x23t = truncate (4.5<_>) #endif // check the types and values! @@ -313,7 +313,7 @@ module DECIMAL = let x1d : decimal = ceil 4.4M let x1h : decimal = floor 4.4M let x1l : decimal = pown 4.4M 3 -#if !NETCOREAPP1_0 +#if !NETSTANDARD let x1m : decimal = round 4.4M #endif let x1n : int = sign 4.4M @@ -516,7 +516,7 @@ module MembersTest = let f1 = (f :> System.IFormattable) let f2 = (f :> System.IComparable) let f3 = (f :> System.IEquatable>) -#if !NETCOREAPP1_0 +#if !NETSTANDARD let f4 = (f :> System.IConvertible) #endif @@ -549,7 +549,7 @@ module WrappedFloatTypeTest = static member Sin (c1:C<1>) = C<1>(sin c1.V) static member Sinh (c1:C<1>) = C<1>(sinh c1.V) static member Tanh (c1:C<1>) = C<1>(tan c1.V) -#if !NETCOREAPP1_0 +#if !NETSTANDARD static member Truncate (c1:C<1>) = C<1>(truncate c1.V) #endif static member Pow (c1:C<1>,c2:C<1>) = C<1>( c1.V ** c2.V) @@ -597,7 +597,7 @@ module WrappedFloatTypeTest = let c26 = sin (C<1>(0.5)) let c27 = sinh (C<1>(0.5)) let c28 = tanh (C<1>(0.5)) -#if !NETCOREAPP1_0 +#if !NETSTANDARD let c29 = truncate (C<1>(0.5)) #endif let c30 = C<1>(0.5) ** C<1>(2.0) diff --git a/tests/fsharp/core/members/basics-hw/test.fsx b/tests/fsharp/core/members/basics-hw/test.fsx index 3bb6859f0d1..4fcf58c7c2a 100644 --- a/tests/fsharp/core/members/basics-hw/test.fsx +++ b/tests/fsharp/core/members/basics-hw/test.fsx @@ -58,7 +58,7 @@ test "fweoew093" ((f(1)).b = 2) open System open System.Collections -#if !NETCOREAPP1_0 +#if !NETSTANDARD open System.Windows.Forms #endif @@ -66,7 +66,7 @@ open System.Windows.Forms // Some simple object-expression tests let x0 = { new System.Object() with member __.GetHashCode() = 3 } -#if !NETCOREAPP1_0 +#if !NETSTANDARD let x1 = { new System.Windows.Forms.Form() with member __.GetHashCode() = 3 } #endif @@ -981,7 +981,7 @@ let [] button () = 1 // Test we can use base calls -#if !NETCOREAPP1_0 +#if !NETSTANDARD open System.Windows.Forms type MyCanvas2 = @@ -1781,14 +1781,14 @@ module DefaultConstructorConstraints = begin let x1 = (f1() : obj) let x2 = (f1() : int) let x3 = (f1() : DateTime) -#if !NETCOREAPP1_0 +#if !NETSTANDARD let x4 = (f1() : System.Windows.Forms.Form) #endif let f2 () = f1() let y1 = (f2() : obj) let y2 = (f2() : int) let y3 = (f2() : DateTime) -#if !NETCOREAPP1_0 +#if !NETSTANDARD let y4 = (f2() : System.Windows.Forms.Form) #endif @@ -2031,7 +2031,7 @@ module T1 = Vector2D(1.0,1.0) = Vector2D(1.0,1.0) -#if !NETCOREAPP1_0 +#if !NETSTANDARD module Ex5 = open System.Drawing type Label(?text,?font) = diff --git a/tests/fsharp/core/members/incremental-hw/test.fsx b/tests/fsharp/core/members/incremental-hw/test.fsx index 8454fd186a7..b3bd0f00e90 100644 --- a/tests/fsharp/core/members/incremental-hw/test.fsx +++ b/tests/fsharp/core/members/incremental-hw/test.fsx @@ -227,7 +227,7 @@ module WireVariations = //! Area variations -#if !NETCOREAPP1_0 +#if !NETSTANDARD module AreaVariations = (* Accepted *) open System.Drawing @@ -404,7 +404,7 @@ module ScalaPersonExample = //! Forms -#if !NETCOREAPP1_0 +#if !NETSTANDARD module Forms1 = open System.Drawing open System.Windows.Forms diff --git a/tests/fsharp/core/members/incremental/test.fsx b/tests/fsharp/core/members/incremental/test.fsx index 03076c34232..9459250c43e 100644 --- a/tests/fsharp/core/members/incremental/test.fsx +++ b/tests/fsharp/core/members/incremental/test.fsx @@ -225,7 +225,7 @@ end //! Area variations -#if !MONO && !NETCOREAPP1_0 +#if !MONO && !NETSTANDARD module AreaVariations = begin (* Accepted *) open System.Drawing @@ -402,7 +402,7 @@ end //! Forms -#if !MONO && !NETCOREAPP1_0 +#if !MONO && !NETSTANDARD module Forms1 = begin open System.Drawing open System.Windows.Forms diff --git a/tests/fsharp/core/patterns/test.fsx b/tests/fsharp/core/patterns/test.fsx index 4b72133ee02..9c3eb0ffd0d 100644 --- a/tests/fsharp/core/patterns/test.fsx +++ b/tests/fsharp/core/patterns/test.fsx @@ -685,7 +685,7 @@ module Combinator_Examples = begin end -#if !NETCOREAPP1_0 +#if !NETSTANDARD module XmlPattern_Examples = begin @@ -813,7 +813,7 @@ module RandomTEst = type IEvenCooler = inherit ICool -#if !NETCOREAPP1_0 +#if !NETCOREAPP module RandomCodeFragment = open System diff --git a/tests/fsharp/core/printing/testLoadFile2.fsx b/tests/fsharp/core/printing/testLoadFile2.fsx index f4b3ba260f4..9638102de92 100644 --- a/tests/fsharp/core/printing/testLoadFile2.fsx +++ b/tests/fsharp/core/printing/testLoadFile2.fsx @@ -1,4 +1,4 @@ -#if NETCOREAPP1_0 +#if NETSTANDARD open CoreClrUtilities #endif diff --git a/tests/fsharp/core/queriesLeafExpressionConvert/test.fsx b/tests/fsharp/core/queriesLeafExpressionConvert/test.fsx index 166d5255db3..61a045d9fe8 100644 --- a/tests/fsharp/core/queriesLeafExpressionConvert/test.fsx +++ b/tests/fsharp/core/queriesLeafExpressionConvert/test.fsx @@ -565,7 +565,7 @@ module LeafExpressionEvaluationTests = checkEval "vrewoinrv09c" (<@ ceil 2.0 @>) (ceil 2.0) checkEval "vrewoinrv09v" (<@ sqrt 2.0 @>) (sqrt 2.0) checkEval "vrewoinrv09b" (<@ sign 2.0 @>) (sign 2.0) -#if !NETCOREAPP1_0 +#if !NETSTANDARD checkEval "vrewoinrv09n" (<@ truncate 2.3 @>) (truncate 2.3) #endif checkEval "vrewoinrv09m" (<@ floor 2.3 @>) (floor 2.3) @@ -585,7 +585,7 @@ module LeafExpressionEvaluationTests = checkEval "vrewoinrv09D" (<@ ceil 2.0f @>) (ceil 2.0f) checkEval "vrewoinrv09F" (<@ sqrt 2.0f @>) (sqrt 2.0f) checkEval "vrewoinrv09G" (<@ sign 2.0f @>) (sign 2.0f) -#if !NETCOREAPP1_0 +#if !NETSTANDARD checkEval "vrewoinrv09H" (<@ truncate 2.3f @>) (truncate 2.3f) #endif checkEval "vrewoinrv09J" (<@ floor 2.3f @>) (floor 2.3f) @@ -597,7 +597,7 @@ module LeafExpressionEvaluationTests = checkEval "vrewoinrv09V" (<@ ceil 2.0M @>) (ceil 2.0M) checkEval "vrewoinrv09B" (<@ sign 2.0M @>) (sign 2.0M) -#if !NETCOREAPP1_0 +#if !NETSTANDARD checkEval "vrewoinrv09N" (<@ truncate 2.3M @>) (truncate 2.3M) #endif checkEval "vrewoinrv09M" (<@ floor 2.3M @>) (floor 2.3M) @@ -617,7 +617,7 @@ module LeafExpressionEvaluationTests = checkEval "vrewoinrv09SS" (<@ [ 0UL .. 10UL ] @>) [ 0UL .. 10UL ] //Comment this testcase under portable due to bug 500323:[FSharp] portable library can't run "round" function -#if !NETCOREAPP1_0 +#if !NETSTANDARD // Round dynamic dispatch on Decimal checkEval "vrewoinrv09FF" (<@ round 2.3M @>) (round 2.3M) #endif diff --git a/tests/fsharp/core/quotes/test.fsx b/tests/fsharp/core/quotes/test.fsx index 52ef066ea7e..f6f28489a08 100644 --- a/tests/fsharp/core/quotes/test.fsx +++ b/tests/fsharp/core/quotes/test.fsx @@ -4,7 +4,7 @@ module Core_quotes #endif #light -#if !TESTS_AS_APP && !NETCOREAPP1_0 +#if !TESTS_AS_APP && !NETSTANDARD #r "cslib.dll" #endif @@ -352,7 +352,7 @@ module TypedTest = begin test "check PropertyGet (static)" ((<@ System.DateTime.Now @> |> (function PropertyGet(None,_,[]) -> true | _ -> false))) test "check PropertyGet (instance)" ((<@ ("1").Length @> |> (function PropertyGet(Some(String("1")),_,[]) -> true | _ -> false))) -#if !NETCOREAPP1_0 +#if !NETSTANDARD test "check PropertySet (static)" ((<@ System.Environment.ExitCode <- 1 @> |> (function PropertySet(None,_,[],Int32(1)) -> true | _ -> false))) #endif test "check PropertySet (instance)" ((<@ ("1").Length @> |> (function PropertyGet(Some(String("1")),_,[]) -> true | _ -> false))) @@ -543,7 +543,7 @@ module TypedTest = begin | _ -> false end -#if !FSHARP_CORE_31 && !TESTS_AS_APP && !NETCOREAPP1_0 +#if !FSHARP_CORE_31 && !TESTS_AS_APP && !NETSTANDARD test "check accesses to readonly fields in ReflectedDefinitions" begin let c1 = Class1("a") @@ -1681,7 +1681,7 @@ module QuotationConstructionTests = check "vcknwwe066" (try let _ = Expr.PropertyGet(getof <@@ System.DateTime.Now @@>,[ <@@ 1 @@> ]) in false with :? ArgumentException -> true) true check "vcknwwe077" (Expr.PropertyGet(<@@ "3" @@>, getof <@@ "1".Length @@>)) <@@ "3".Length @@> check "vcknwwe088" (Expr.PropertyGet(<@@ "3" @@>, getof <@@ "1".Length @@>,[ ])) <@@ "3".Length @@> -#if !TESTS_AS_APP && !NETCOREAPP1_0 +#if !TESTS_AS_APP && !NETSTANDARD check "vcknwwe099" (Expr.PropertySet(<@@ (new System.Windows.Forms.Form()) @@>, setof <@@ (new System.Windows.Forms.Form()).Text <- "2" @@>, <@@ "3" @@> )) <@@ (new System.Windows.Forms.Form()).Text <- "3" @@> #endif check "vcknwwe099" (Expr.PropertySet(<@@ (new Foo()) @@>, setof <@@ (new Foo()).[3] <- 1 @@>, <@@ 2 @@> , [ <@@ 3 @@> ] )) <@@ (new Foo()).[3] <- 2 @@> @@ -2303,7 +2303,7 @@ module ReflectedDefinitionOnTypesWithImplicitCodeGen = module M = // This type has an implicit IComparable implementation, it is not accessible as a reflected definition type R = { x:int; y:string; z:System.DateTime } -#if NETCOREAPP1_0 +#if NETSTANDARD for m in typeof.GetMethods() do #else for m in typeof.GetMethods(System.Reflection.BindingFlags.DeclaredOnly) do @@ -2337,7 +2337,7 @@ module ReflectedDefinitionOnTypesWithImplicitCodeGen = #endif check "celnwer35" (Quotations.Expr.TryGetReflectedDefinition(m).IsNone) true -#if !NETCOREAPP1_0 +#if !NETSTANDARD module BasicUsingTEsts = let q1() = let a = ResizeArray<_>() diff --git a/tests/fsharp/core/reflect/test2.fs b/tests/fsharp/core/reflect/test2.fs index 9faf3bf07ca..5b4a58e5b8e 100644 --- a/tests/fsharp/core/reflect/test2.fs +++ b/tests/fsharp/core/reflect/test2.fs @@ -30,7 +30,7 @@ module NewTests = let (|String|_|) (v:obj) = match v with :? string as s -> Some(s) | _ -> None let (|Int|_|) (v:obj) = match v with :? int as s -> Some(s) | _ -> None let showAll = -#if NETCOREAPP1_0 +#if NETCOREAPP true #else System.Reflection.BindingFlags.Public ||| System.Reflection.BindingFlags.NonPublic diff --git a/tests/fsharp/core/span/.gitignore b/tests/fsharp/core/span/.gitignore new file mode 100644 index 00000000000..c7256c83585 --- /dev/null +++ b/tests/fsharp/core/span/.gitignore @@ -0,0 +1 @@ +*.generated.fsx diff --git a/tests/fsharp/core/span/common-pre.fsx b/tests/fsharp/core/span/common-pre.fsx new file mode 100644 index 00000000000..50c063af871 --- /dev/null +++ b/tests/fsharp/core/span/common-pre.fsx @@ -0,0 +1,4 @@ +open System +open System.IO + +File.WriteAllText("refs.generated.fsx", sprintf @"#r @""%s\.nuget\packages\System.Memory\4.5.0\lib\netstandard2.0\System.Memory.dll""" (Environment.GetEnvironmentVariable("USERPROFILE"))) diff --git a/tests/fsharp/core/span/test-pre.fsx b/tests/fsharp/core/span/test-pre.fsx new file mode 100644 index 00000000000..9db0f8cc9a7 --- /dev/null +++ b/tests/fsharp/core/span/test-pre.fsx @@ -0,0 +1 @@ +#load "common-pre.fsx" diff --git a/tests/fsharp/core/span/test.bsl b/tests/fsharp/core/span/test.bsl index 5e2d421653f..e57ec0e3662 100644 --- a/tests/fsharp/core/span/test.bsl +++ b/tests/fsharp/core/span/test.bsl @@ -1,16 +1,16 @@ -test.fsx(303,46,303,86): typecheck error FS3233: The function or method call cannot be used at this point, because one argument that is a byref of a non-stack-local Span or IsByRefLike type is used with another argument that is a stack-local Span or IsByRefLike type. This is to ensure the address of the local value does not escape its scope. +test.fsx(302,46,302,86): typecheck error FS3233: The function or method call cannot be used at this point, because one argument that is a byref of a non-stack-local Span or IsByRefLike type is used with another argument that is a stack-local Span or IsByRefLike type. This is to ensure the address of the local value does not escape its scope. -test.fsx(306,13,306,86): typecheck error FS3229: This value can't be assigned because the target 'param1' may refer to non-stack-local memory, while the expression being assigned is assessed to potentially refer to stack-local memory. This is to help prevent pointers to stack-bound memory escaping their scope. +test.fsx(305,13,305,86): typecheck error FS3229: This value can't be assigned because the target 'param1' may refer to non-stack-local memory, while the expression being assigned is assessed to potentially refer to stack-local memory. This is to help prevent pointers to stack-bound memory escaping their scope. -test.fsx(309,13,309,62): typecheck error FS3229: This value can't be assigned because the target 'param1' may refer to non-stack-local memory, while the expression being assigned is assessed to potentially refer to stack-local memory. This is to help prevent pointers to stack-bound memory escaping their scope. +test.fsx(308,13,308,62): typecheck error FS3229: This value can't be assigned because the target 'param1' may refer to non-stack-local memory, while the expression being assigned is assessed to potentially refer to stack-local memory. This is to help prevent pointers to stack-bound memory escaping their scope. -test.fsx(348,13,348,57): typecheck error FS3229: This value can't be assigned because the target 'addr' may refer to non-stack-local memory, while the expression being assigned is assessed to potentially refer to stack-local memory. This is to help prevent pointers to stack-bound memory escaping their scope. +test.fsx(347,13,347,57): typecheck error FS3229: This value can't be assigned because the target 'addr' may refer to non-stack-local memory, while the expression being assigned is assessed to potentially refer to stack-local memory. This is to help prevent pointers to stack-bound memory escaping their scope. -test.fsx(351,13,351,38): typecheck error FS3229: This value can't be assigned because the target 'param1' may refer to non-stack-local memory, while the expression being assigned is assessed to potentially refer to stack-local memory. This is to help prevent pointers to stack-bound memory escaping their scope. +test.fsx(350,13,350,38): typecheck error FS3229: This value can't be assigned because the target 'param1' may refer to non-stack-local memory, while the expression being assigned is assessed to potentially refer to stack-local memory. This is to help prevent pointers to stack-bound memory escaping their scope. -test.fsx(354,14,354,29): typecheck error FS3209: The address of the variable 'stackReferring3' or a related expression cannot be used at this point. This is to ensure the address of the local value does not escape its scope. +test.fsx(353,14,353,29): typecheck error FS3209: The address of the variable 'stackReferring3' or a related expression cannot be used at this point. This is to ensure the address of the local value does not escape its scope. -test.fsx(376,18,376,19): typecheck error FS3209: The address of the variable 'x' or a related expression cannot be used at this point. This is to ensure the address of the local value does not escape its scope. +test.fsx(375,18,375,19): typecheck error FS3209: The address of the variable 'x' or a related expression cannot be used at this point. This is to ensure the address of the local value does not escape its scope. -test.fsx(380,18,380,33): typecheck error FS3228: The address of a value returned from the expression cannot be used at this point. This is to ensure the address of the local value does not escape its scope. +test.fsx(379,18,379,33): typecheck error FS3228: The address of a value returned from the expression cannot be used at this point. This is to ensure the address of the local value does not escape its scope. diff --git a/tests/fsharp/core/span/test.fsx b/tests/fsharp/core/span/test.fsx index 81ac6b3c7a3..34d0da9775a 100644 --- a/tests/fsharp/core/span/test.fsx +++ b/tests/fsharp/core/span/test.fsx @@ -1,5 +1,4 @@ -#r @"..\..\..\..\packages\System.Memory.4.5.0-rc1\lib\netstandard2.0\System.Memory.dll" -#r @"..\..\..\..\packages\NETStandard.Library.NETFramework.2.0.0-preview2-25405-01\build\net461\ref\netstandard.dll" +#load "refs.generated.fsx" #nowarn "9" #nowarn "51" diff --git a/tests/fsharp/core/span/test2-pre.fsx b/tests/fsharp/core/span/test2-pre.fsx new file mode 100644 index 00000000000..9db0f8cc9a7 --- /dev/null +++ b/tests/fsharp/core/span/test2-pre.fsx @@ -0,0 +1 @@ +#load "common-pre.fsx" diff --git a/tests/fsharp/core/span/test2.bsl b/tests/fsharp/core/span/test2.bsl index 2a8ede5932b..314062df20f 100644 --- a/tests/fsharp/core/span/test2.bsl +++ b/tests/fsharp/core/span/test2.bsl @@ -1,88 +1,88 @@ -test2.fsx(79,17,79,18): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. +test2.fsx(78,17,78,18): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. -test2.fsx(79,21,79,35): typecheck error FS0406: The byref-typed variable 'test' is used in an invalid way. Byrefs cannot be captured by closures or passed to inner functions. +test2.fsx(78,21,78,35): typecheck error FS0406: The byref-typed variable 'test' is used in an invalid way. Byrefs cannot be captured by closures or passed to inner functions. -test2.fsx(79,21,79,35): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. +test2.fsx(78,21,78,35): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. -test2.fsx(79,21,79,35): typecheck error FS0406: The byref-typed variable 'test' is used in an invalid way. Byrefs cannot be captured by closures or passed to inner functions. +test2.fsx(78,21,78,35): typecheck error FS0406: The byref-typed variable 'test' is used in an invalid way. Byrefs cannot be captured by closures or passed to inner functions. -test2.fsx(79,31,79,35): typecheck error FS0418: The byref typed value 'test' cannot be used at this point +test2.fsx(78,31,78,35): typecheck error FS0418: The byref typed value 'test' cannot be used at this point -test2.fsx(79,21,79,35): typecheck error FS0425: The type of a first-class function cannot contain byrefs +test2.fsx(78,21,78,35): typecheck error FS0425: The type of a first-class function cannot contain byrefs -test2.fsx(79,21,79,35): typecheck error FS0425: The type of a first-class function cannot contain byrefs +test2.fsx(78,21,78,35): typecheck error FS0425: The type of a first-class function cannot contain byrefs -test2.fsx(84,14,84,15): typecheck error FS3209: The address of the variable 'x' or a related expression cannot be used at this point. This is to ensure the address of the local value does not escape its scope. +test2.fsx(83,14,83,15): typecheck error FS3209: The address of the variable 'x' or a related expression cannot be used at this point. This is to ensure the address of the local value does not escape its scope. -test2.fsx(91,14,91,15): typecheck error FS3209: The address of the variable 'y' or a related expression cannot be used at this point. This is to ensure the address of the local value does not escape its scope. +test2.fsx(90,14,90,15): typecheck error FS3209: The address of the variable 'y' or a related expression cannot be used at this point. This is to ensure the address of the local value does not escape its scope. -test2.fsx(100,14,100,15): typecheck error FS3209: The address of the variable 'y' or a related expression cannot be used at this point. This is to ensure the address of the local value does not escape its scope. +test2.fsx(99,14,99,15): typecheck error FS3209: The address of the variable 'y' or a related expression cannot be used at this point. This is to ensure the address of the local value does not escape its scope. -test2.fsx(106,14,106,15): typecheck error FS3209: The address of the variable 'y' or a related expression cannot be used at this point. This is to ensure the address of the local value does not escape its scope. +test2.fsx(105,14,105,15): typecheck error FS3209: The address of the variable 'y' or a related expression cannot be used at this point. This is to ensure the address of the local value does not escape its scope. -test2.fsx(111,14,111,15): typecheck error FS3209: The address of the variable 'y' or a related expression cannot be used at this point. This is to ensure the address of the local value does not escape its scope. +test2.fsx(110,14,110,15): typecheck error FS3209: The address of the variable 'y' or a related expression cannot be used at this point. This is to ensure the address of the local value does not escape its scope. -test2.fsx(115,14,115,30): typecheck error FS3228: The address of a value returned from the expression cannot be used at this point. This is to ensure the address of the local value does not escape its scope. +test2.fsx(114,14,114,30): typecheck error FS3228: The address of a value returned from the expression cannot be used at this point. This is to ensure the address of the local value does not escape its scope. -test2.fsx(119,14,119,37): typecheck error FS3228: The address of a value returned from the expression cannot be used at this point. This is to ensure the address of the local value does not escape its scope. +test2.fsx(118,14,118,37): typecheck error FS3228: The address of a value returned from the expression cannot be used at this point. This is to ensure the address of the local value does not escape its scope. -test2.fsx(124,14,124,15): typecheck error FS3209: The address of the variable 'y' or a related expression cannot be used at this point. This is to ensure the address of the local value does not escape its scope. +test2.fsx(123,14,123,15): typecheck error FS3209: The address of the variable 'y' or a related expression cannot be used at this point. This is to ensure the address of the local value does not escape its scope. -test2.fsx(128,13,128,42): typecheck error FS3235: A Span or IsByRefLike value returned from the expression cannot be used at ths point. This is to ensure the address of the local value does not escape its scope. +test2.fsx(127,13,127,42): typecheck error FS3235: A Span or IsByRefLike value returned from the expression cannot be used at ths point. This is to ensure the address of the local value does not escape its scope. -test2.fsx(132,14,132,41): typecheck error FS3228: The address of a value returned from the expression cannot be used at this point. This is to ensure the address of the local value does not escape its scope. +test2.fsx(131,14,131,41): typecheck error FS3228: The address of a value returned from the expression cannot be used at this point. This is to ensure the address of the local value does not escape its scope. -test2.fsx(136,14,136,71): typecheck error FS3228: The address of a value returned from the expression cannot be used at this point. This is to ensure the address of the local value does not escape its scope. +test2.fsx(135,14,135,71): typecheck error FS3228: The address of a value returned from the expression cannot be used at this point. This is to ensure the address of the local value does not escape its scope. -test2.fsx(140,13,140,52): typecheck error FS3235: A Span or IsByRefLike value returned from the expression cannot be used at ths point. This is to ensure the address of the local value does not escape its scope. +test2.fsx(139,13,139,52): typecheck error FS3235: A Span or IsByRefLike value returned from the expression cannot be used at ths point. This is to ensure the address of the local value does not escape its scope. -test2.fsx(144,13,144,14): typecheck error FS3234: The Span or IsByRefLike variable 's' cannot be used at this point. This is to ensure the address of the local value does not escape its scope. +test2.fsx(143,13,143,14): typecheck error FS3234: The Span or IsByRefLike variable 's' cannot be used at this point. This is to ensure the address of the local value does not escape its scope. -test2.fsx(149,13,149,52): typecheck error FS3235: A Span or IsByRefLike value returned from the expression cannot be used at ths point. This is to ensure the address of the local value does not escape its scope. +test2.fsx(148,13,148,52): typecheck error FS3235: A Span or IsByRefLike value returned from the expression cannot be used at ths point. This is to ensure the address of the local value does not escape its scope. -test2.fsx(153,21,153,84): typecheck error FS3233: The function or method call cannot be used at this point, because one argument that is a byref of a non-stack-local Span or IsByRefLike type is used with another argument that is a stack-local Span or IsByRefLike type. This is to ensure the address of the local value does not escape its scope. +test2.fsx(152,21,152,84): typecheck error FS3233: The function or method call cannot be used at this point, because one argument that is a byref of a non-stack-local Span or IsByRefLike type is used with another argument that is a stack-local Span or IsByRefLike type. This is to ensure the address of the local value does not escape its scope. -test2.fsx(154,13,154,14): typecheck error FS3234: The Span or IsByRefLike variable 'y' cannot be used at this point. This is to ensure the address of the local value does not escape its scope. +test2.fsx(153,13,153,14): typecheck error FS3234: The Span or IsByRefLike variable 'y' cannot be used at this point. This is to ensure the address of the local value does not escape its scope. -test2.fsx(158,13,158,83): typecheck error FS3235: A Span or IsByRefLike value returned from the expression cannot be used at ths point. This is to ensure the address of the local value does not escape its scope. +test2.fsx(157,13,157,83): typecheck error FS3235: A Span or IsByRefLike value returned from the expression cannot be used at ths point. This is to ensure the address of the local value does not escape its scope. -test2.fsx(163,13,163,14): typecheck error FS3234: The Span or IsByRefLike variable 'y' cannot be used at this point. This is to ensure the address of the local value does not escape its scope. +test2.fsx(162,13,162,14): typecheck error FS3234: The Span or IsByRefLike variable 'y' cannot be used at this point. This is to ensure the address of the local value does not escape its scope. -test2.fsx(167,14,167,71): typecheck error FS3228: The address of a value returned from the expression cannot be used at this point. This is to ensure the address of the local value does not escape its scope. +test2.fsx(166,14,166,71): typecheck error FS3228: The address of a value returned from the expression cannot be used at this point. This is to ensure the address of the local value does not escape its scope. -test2.fsx(191,43,191,44): typecheck error FS3209: The address of the variable 'x' or a related expression cannot be used at this point. This is to ensure the address of the local value does not escape its scope. +test2.fsx(190,43,190,44): typecheck error FS3209: The address of the variable 'x' or a related expression cannot be used at this point. This is to ensure the address of the local value does not escape its scope. -test2.fsx(195,14,195,15): typecheck error FS3209: The address of the variable 'y' or a related expression cannot be used at this point. This is to ensure the address of the local value does not escape its scope. +test2.fsx(194,14,194,15): typecheck error FS3209: The address of the variable 'y' or a related expression cannot be used at this point. This is to ensure the address of the local value does not escape its scope. -test2.fsx(199,13,199,19): typecheck error FS3229: This value can't be assigned because the target 'x' may refer to non-stack-local memory, while the expression being assigned is assessed to potentially refer to stack-local memory. This is to help prevent pointers to stack-bound memory escaping their scope. +test2.fsx(198,13,198,19): typecheck error FS3229: This value can't be assigned because the target 'x' may refer to non-stack-local memory, while the expression being assigned is assessed to potentially refer to stack-local memory. This is to help prevent pointers to stack-bound memory escaping their scope. -test2.fsx(204,26,204,27): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. +test2.fsx(203,26,203,27): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. -test2.fsx(204,26,204,27): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. +test2.fsx(203,26,203,27): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. -test2.fsx(204,26,204,27): typecheck error FS0406: The byref-typed variable 'inputSequence' is used in an invalid way. Byrefs cannot be captured by closures or passed to inner functions. +test2.fsx(203,26,203,27): typecheck error FS0406: The byref-typed variable 'inputSequence' is used in an invalid way. Byrefs cannot be captured by closures or passed to inner functions. -test2.fsx(204,26,204,27): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. +test2.fsx(203,26,203,27): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. -test2.fsx(204,26,204,27): typecheck error FS0425: The type of a first-class function cannot contain byrefs +test2.fsx(203,26,203,27): typecheck error FS0425: The type of a first-class function cannot contain byrefs -test2.fsx(204,26,204,27): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. +test2.fsx(203,26,203,27): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. -test2.fsx(204,26,204,27): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. +test2.fsx(203,26,203,27): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. -test2.fsx(204,26,204,27): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. +test2.fsx(203,26,203,27): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. -test2.fsx(204,26,204,27): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. +test2.fsx(203,26,203,27): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. -test2.fsx(209,13,209,18): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. +test2.fsx(208,13,208,18): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. -test2.fsx(208,14,208,18): typecheck error FS0437: A type would store a byref typed value. This is not permitted by Common IL. +test2.fsx(207,14,207,18): typecheck error FS0437: A type would store a byref typed value. This is not permitted by Common IL. -test2.fsx(214,13,214,18): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. +test2.fsx(213,13,213,18): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. -test2.fsx(213,14,213,19): typecheck error FS0437: A type would store a byref typed value. This is not permitted by Common IL. +test2.fsx(212,14,212,19): typecheck error FS0437: A type would store a byref typed value. This is not permitted by Common IL. -test2.fsx(222,18,222,23): typecheck error FS3228: The address of a value returned from the expression cannot be used at this point. This is to ensure the address of the local value does not escape its scope. +test2.fsx(221,18,221,23): typecheck error FS3228: The address of a value returned from the expression cannot be used at this point. This is to ensure the address of the local value does not escape its scope. -test2.fsx(231,17,231,18): typecheck error FS3234: The Span or IsByRefLike variable 's' cannot be used at this point. This is to ensure the address of the local value does not escape its scope. +test2.fsx(230,17,230,18): typecheck error FS3234: The Span or IsByRefLike variable 's' cannot be used at this point. This is to ensure the address of the local value does not escape its scope. diff --git a/tests/fsharp/core/span/test2.fsx b/tests/fsharp/core/span/test2.fsx index e3be6f78871..fc31f9511b7 100644 --- a/tests/fsharp/core/span/test2.fsx +++ b/tests/fsharp/core/span/test2.fsx @@ -1,5 +1,4 @@ -#r @"..\..\..\..\packages\System.Memory.4.5.0-rc1\lib\netstandard2.0\System.Memory.dll" -#r @"..\..\..\..\packages\NETStandard.Library.NETFramework.2.0.0-preview2-25405-01\build\net461\ref\netstandard.dll" +#load "refs.generated.fsx" #nowarn "9" #nowarn "51" diff --git a/tests/fsharp/core/span/test3-pre.fsx b/tests/fsharp/core/span/test3-pre.fsx new file mode 100644 index 00000000000..9db0f8cc9a7 --- /dev/null +++ b/tests/fsharp/core/span/test3-pre.fsx @@ -0,0 +1 @@ +#load "common-pre.fsx" diff --git a/tests/fsharp/core/span/test3.bsl b/tests/fsharp/core/span/test3.bsl index da0e0fa6f8a..cb284695276 100644 --- a/tests/fsharp/core/span/test3.bsl +++ b/tests/fsharp/core/span/test3.bsl @@ -1,13 +1,13 @@ -test3.fsx(31,17,31,23): typecheck error FS0027: This value is not mutable. Consider using the mutable keyword, e.g. 'let mutable x = expression'. +test3.fsx(30,17,30,23): typecheck error FS0027: This value is not mutable. Consider using the mutable keyword, e.g. 'let mutable x = expression'. -test3.fsx(39,21,39,27): typecheck error FS0027: This value is not mutable. Consider using the mutable keyword, e.g. 'let mutable x = expression'. +test3.fsx(38,21,38,27): typecheck error FS0027: This value is not mutable. Consider using the mutable keyword, e.g. 'let mutable x = expression'. -test3.fsx(47,26,47,27): typecheck error FS0001: The type 'Span' is not compatible with the type 'seq<'a>' +test3.fsx(46,26,46,27): typecheck error FS0001: The type 'Span' is not compatible with the type 'seq<'a>' -test3.fsx(48,21,48,27): typecheck error FS0027: This value is not mutable. Consider using the mutable keyword, e.g. 'let mutable x = expression'. +test3.fsx(47,21,47,27): typecheck error FS0027: This value is not mutable. Consider using the mutable keyword, e.g. 'let mutable x = expression'. -test3.fsx(47,26,47,27): typecheck error FS0193: Type constraint mismatch. The type +test3.fsx(46,26,46,27): typecheck error FS0193: Type constraint mismatch. The type 'Span' is not compatible with type 'seq<'a>' diff --git a/tests/fsharp/core/span/test3.fsx b/tests/fsharp/core/span/test3.fsx index dc9ff0b2993..641aab5609d 100644 --- a/tests/fsharp/core/span/test3.fsx +++ b/tests/fsharp/core/span/test3.fsx @@ -1,5 +1,4 @@ -#r @"..\..\..\..\packages\System.Memory.4.5.0-rc1\lib\netstandard2.0\System.Memory.dll" -#r @"..\..\..\..\packages\NETStandard.Library.NETFramework.2.0.0-preview2-25405-01\build\net461\ref\netstandard.dll" +#load "refs.generated.fsx" #nowarn "9" #nowarn "51" diff --git a/tests/fsharp/core/subtype/test.fsx b/tests/fsharp/core/subtype/test.fsx index b33a35e5f8a..f89380ad77e 100644 --- a/tests/fsharp/core/subtype/test.fsx +++ b/tests/fsharp/core/subtype/test.fsx @@ -31,7 +31,7 @@ open System.Collections.Generic let f1 (x: 'a[]) = (x :> ICollection<'a>) do let x = f1 [| 3;4; |] in test "test239809" (x.Contains(3)) -#if !NETCOREAPP1_0 +#if !NETSTANDARD (* 'a[] :> IReadOnlyCollection<'a> *) let f1ReadOnly (x: 'a[]) = (x :> IReadOnlyCollection<'a>) do let x = f1ReadOnly [| 3;4; |] in test "test239809ReadOnly" (x.Count = 2) @@ -41,7 +41,7 @@ do let x = f1ReadOnly [| 3;4; |] in test "test239809ReadOnly" (x.Count = 2) let f2 (x: 'a[]) = (x :> IList<'a>) do let x = f2 [| 3;4; |] in test "test239810" (x.Item(1) = 4) -#if !NETCOREAPP1_0 +#if !NETSTANDARD (* 'a[] :> IReadOnlyList<'a> *) let f2ReadOnly (x: 'a[]) = (x :> IReadOnlyList<'a>) do let x = f2ReadOnly [| 3;4; |] in test "test239810ReadOnly" (x.Item(1) = 4) @@ -55,7 +55,7 @@ do let x = f3 [| 3;4; |] in for x in x do (Printf.printf "val %d\n" x) done let f4 (x: 'a[]) = (x :> IList<'a>) do let x = f4 [| 31;42; |] in for x in x do (Printf.printf "val %d\n" x) done -#if !NETCOREAPP1_0 +#if !NETSTANDARD (* Call 'foreachG' using an IReadOnlyList (solved to IEnumerable) *) let f4ReadOnly (x: 'a[]) = (x :> IReadOnlyList<'a>) do let x = f4ReadOnly [| 31;42; |] in for x in x do (Printf.printf "val %d\n" x) done @@ -65,7 +65,7 @@ do let x = f4ReadOnly [| 31;42; |] in for x in x do (Printf.printf "val %d\n" x) let f5 (x: 'a[]) = (x :> ICollection<'a>) do let x = f5 [| 31;42; |] in for x in x do (Printf.printf "val %d\n" x) done -#if !NETCOREAPP1_0 +#if !NETSTANDARD (* Call 'foreachG' using an IReadOnlyCollection (solved to IEnumerable) *) let f5ReadOnly (x: 'a[]) = (x :> IReadOnlyCollection<'a>) do let x = f5ReadOnly [| 31;42; |] in for x in x do (Printf.printf "val %d\n" x) done @@ -106,7 +106,7 @@ let testUpcastToEnum1 (x: System.AttributeTargets) = (x :> System.Enum) let testUpcastToEnum6 (x: System.Enum) = (x :> System.Enum) // these delegates don't exist in portable -#if !UNIX && !NETCOREAPP1_0 +#if !UNIX && !NETSTANDARD let testUpcastToDelegate1 (x: System.Threading.ThreadStart) = (x :> System.Delegate) let testUpcastToMulticastDelegate1 (x: System.Threading.ThreadStart) = (x :> System.MulticastDelegate) @@ -244,7 +244,7 @@ module SomeRandomOperatorConstraints = begin let sum64 seq : int64 = Seq.reduce (+) seq let sum32 seq : int64 = Seq.reduce (+) seq -#if !NETCOREAPP1_0 +#if !NETSTANDARD let sumBigInt seq : BigInteger = Seq.reduce (+) seq #endif let sumDateTime (dt : DateTime) (seq : #seq) : DateTime = Seq.fold (+) dt seq @@ -1904,7 +1904,7 @@ module TestInheritFunc3 = check "cnwcki4" ((Foo() |> box |> unbox int -> int -> int> ) 5 6 7) 19 -#if !NETCOREAPP1_0 +#if !NETCOREAPP module TestConverter = open System diff --git a/tests/fsharp/core/syntax/test.fsx b/tests/fsharp/core/syntax/test.fsx index cc3123be09c..e26783d7f31 100644 --- a/tests/fsharp/core/syntax/test.fsx +++ b/tests/fsharp/core/syntax/test.fsx @@ -837,7 +837,7 @@ let testTryFinallySyntaxOnOneLine () = try () finally () -#if !TESTS_AS_APP && !NETCOREAPP1_0 +#if !TESTS_AS_APP && !NETCOREAPP type SampleForm = class inherit System.Windows.Forms.Form @@ -1035,7 +1035,7 @@ do test "vliwe94" (f -2L = - 2L) do test "vliwe95" (f -2n = - 2n) do test "vliwe96" (f -2.0 = - 2.0) do test "vliwe97" (f -2.0f = - 2.0f) -#if !NETCOREAPP1_0 +#if !NETCOREAPP do test "vliwe99" (f -2I = - 2I) #endif diff --git a/tests/fsharp/core/unicode/test.fsx b/tests/fsharp/core/unicode/test.fsx index 11add13debc..c9904336671 100644 --- a/tests/fsharp/core/unicode/test.fsx +++ b/tests/fsharp/core/unicode/test.fsx @@ -19,7 +19,7 @@ let test (s : string) b = (* TEST SUITE FOR UNICODE CHARS *) -#if !TESTS_AS_APP && !NETCOREAPP1_0 +#if !TESTS_AS_APP && !NETSTANDARD let input_byte (x : System.IO.FileStream) = let b = x.ReadByte() if b = -1 then raise (System.IO.EndOfStreamException()) else b diff --git a/tests/fsharp/packages.config b/tests/fsharp/packages.config deleted file mode 100644 index cf755012d51..00000000000 --- a/tests/fsharp/packages.config +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/tests/fsharp/single-test.fs b/tests/fsharp/single-test.fs index 89c7c44d838..06ca7f8044d 100644 --- a/tests/fsharp/single-test.fs +++ b/tests/fsharp/single-test.fs @@ -29,145 +29,249 @@ let cleanUpFSharpCore cfg = removeFSharpCore () { new System.IDisposable with member x.Dispose() = removeFSharpCore () } -let singleTestBuildAndRunCore cfg (copyFiles:string) p = - +// Generate a project files +let emitFile filename (body:string) = + try + // Create a file to write to + use sw = File.CreateText(filename) + sw.WriteLine(body) + with | _ -> () + +let copyFilesToDest sourceDir destDir compilerPath = + // copy existing files + let filenames = Directory.GetFiles(sourceDir, "*", SearchOption.TopDirectoryOnly) + for file in filenames do + let dest = Path.Combine(destDir, Path.GetFileName(file)) + File.Copy(file, dest) + // generate Directory.Build.props that points to the built compiler + let lines = + [ "" + " " + sprintf " %s" compilerPath + " " + sprintf " " __SOURCE_DIRECTORY__ + "" ] + let dest = Path.Combine(destDir, "Directory.Build.props") + File.WriteAllLines(dest, lines) + +let generateProjectArtifacts (framework:string) (sourceDirectory:string) (sourceItems:string list) (extraSourceItems:string list) (utilitySourceItems:string list) (referenceItems:string list) = + let computeSourceItems addDirectory addCondition isCompileItem sources = + let computeInclude src = + let fileName = if addDirectory then Path.Combine(sourceDirectory, src) else src + let condition = if addCondition then " Condition=\"Exists('" + fileName + "')\"" else "" + if isCompileItem then + "\n " + else + "\n " + sources + |> List.map(fun src -> computeInclude src) + |> List.fold (fun acc s -> acc + s) "" + + let replace tag items addDirectory addCondition isCompileItem (template:string) = template.Replace(tag, computeSourceItems addDirectory addCondition isCompileItem items) + + let generateProjBody = + let template = @" + + + Exe + $(TARGETFRAMEWORK) + false + true + portable + true + $(DefineConstants);FX_RESHAPED_REFLECTION;NETSTANDARD + + + + $(UTILITYSOURCEITEMS) + + + + $(SOURCEITEMS) + + + + $(EXTRASOURCEITEMS) + + + + $(REFERENCEITEMS) + + +" + template.Replace("$(TARGETFRAMEWORK)", framework) + |> replace "$(UTILITYSOURCEITEMS)" utilitySourceItems false false true + |> replace "$(SOURCEITEMS)" sourceItems true false true + |> replace "$(EXTRASOURCEITEMS)" extraSourceItems true true true + |> replace "$(REFERENCEITEMS)" referenceItems true true false + + generateProjBody + +let singleTestBuildAndRunCore cfg copyFiles p = + printfn "singleTestBuildAndRunCore: %A : %A" copyFiles p let sources = ["testlib.fsi";"testlib.fs";"test.mli";"test.ml";"test.fsi";"test.fs";"test2.fsi";"test2.fs";"test.fsx";"test2.fsx"] |> List.filter (fileExists cfg) - - match p with + let extraSources = [] + let utilitySources = + [__SOURCE_DIRECTORY__ ++ "coreclr_utilities.fs"] + |> List.filter (File.Exists) + let referenceItems = if String.IsNullOrEmpty(copyFiles) then [] else [copyFiles] + let framework = "netcoreapp2.1" + match p with | FSC_CORECLR -> - use cleanup = (cleanUpFSharpCore cfg) - use testOkFile = new FileGuard (getfullpath cfg "test.ok") - - let testName = getBasename cfg.Directory - let extraSource = (__SOURCE_DIRECTORY__ ++ "coreclr_utilities.fs") - let outDir = (__SOURCE_DIRECTORY__ ++ sprintf @"../testbin/%s/coreclr/fsharp/core/%s" cfg.BUILD_CONFIG testName) - let outFile = (__SOURCE_DIRECTORY__ ++ sprintf @"../testbin/%s/coreclr/fsharp/core/%s/test.exe" cfg.BUILD_CONFIG testName) - - makeDirectory (getDirectoryName outFile) - let fscArgs = - sprintf """--debug:portable --debug+ --out:%s --target:exe -g --define:FX_RESHAPED_REFLECTION --define:NETCOREAPP1_0 "%s" %s """ - outFile - extraSource - (String.concat " " sources) - - let fsccArgs = sprintf """--OutputDir:%s --CopyDlls:%s %s""" outDir copyFiles fscArgs - - fsi_script cfg "--exec %s %s %s" - cfg.fsi_flags - (__SOURCE_DIRECTORY__ ++ @"../scripts/fscc.fsx") - fsccArgs - [] - - exec cfg cfg.DotNetExe outFile - - testOkFile.CheckExists() - - | FSI_CORECLR -> - use cleanup = (cleanUpFSharpCore cfg) - use testOkFile = new FileGuard (getfullpath cfg "test.ok") - - let testName = getBasename cfg.Directory - let extraSource = (__SOURCE_DIRECTORY__ ++ "coreclr_utilities.fs") - let outDir = (__SOURCE_DIRECTORY__ ++ sprintf @"../testbin/%s/coreclr/fsharp/core/%s" cfg.BUILD_CONFIG testName) - let fsiArgs = - sprintf """ --define:NETCOREAPP1_0 --define:FX_RESHAPED_REFLECTION "%s" %s """ - extraSource - (String.concat " " sources) - - let fsciArgs = sprintf """--verbose:repro --OutputDir:%s --CopyDlls:%s %s""" outDir copyFiles fsiArgs - - fsi_script cfg "--exec %s %s %s" - cfg.fsi_flags - (__SOURCE_DIRECTORY__ ++ @"../scripts/fsci.fsx") - fsciArgs - [] - - testOkFile.CheckExists() + let mutable result = false + let directory = Path.Combine(Path.GetTempPath(), Path.GetRandomFileName() ) + let projectBody = generateProjectArtifacts framework cfg.Directory sources extraSources utilitySources referenceItems + let projectFileName = Path.Combine(directory, Path.GetRandomFileName() + ".fsproj") + try + use testOkFile = new FileGuard(Path.Combine(directory, "test.ok")) + printfn "Configuration: %s" cfg.Directory + printfn "Directory: %s" directory + printfn "Filename: %s" projectFileName + Directory.CreateDirectory(directory) |> ignore + copyFilesToDest cfg.Directory directory cfg.BinPath + emitFile projectFileName projectBody + exec { cfg with Directory = directory } cfg.DotNet20Exe "run" + testOkFile.CheckExists() + result <- true + finally + if result <> false then Directory.Delete(directory, true) + () + | _ -> + match p with + | FSC_CORECLR -> + use cleanup = (cleanUpFSharpCore cfg) + use testOkFile = new FileGuard (getfullpath cfg "test.ok") + + let testName = getBasename cfg.Directory + let extraSource = (__SOURCE_DIRECTORY__ ++ "coreclr_utilities.fs") + let outDir = (__SOURCE_DIRECTORY__ ++ sprintf @"../testbin/%s/coreclr/fsharp/core/%s" cfg.BUILD_CONFIG testName) + let outFile = (__SOURCE_DIRECTORY__ ++ sprintf @"../testbin/%s/coreclr/fsharp/core/%s/test.exe" cfg.BUILD_CONFIG testName) + + makeDirectory (getDirectoryName outFile) + let fscArgs = + sprintf """--debug:portable --debug+ --out:%s --target:exe -g --define:FX_RESHAPED_REFLECTION --define:NETCOREAPP1_0 "%s" %s """ + outFile + extraSource + (String.concat " " sources) + + let fsccArgs = sprintf """--OutputDir:%s --CopyDlls:%s %s""" outDir copyFiles fscArgs + + fsi_script cfg "--exec %s %s %s" + cfg.fsi_flags + (__SOURCE_DIRECTORY__ ++ @"../scripts/fscc.fsx") + fsccArgs + [] + + exec cfg cfg.DotNetExe outFile + + testOkFile.CheckExists() + + | FSI_CORECLR -> + use cleanup = (cleanUpFSharpCore cfg) + use testOkFile = new FileGuard (getfullpath cfg "test.ok") + + let testName = getBasename cfg.Directory + let extraSource = (__SOURCE_DIRECTORY__ ++ "coreclr_utilities.fs") + let outDir = (__SOURCE_DIRECTORY__ ++ sprintf @"../testbin/%s/coreclr/fsharp/core/%s" cfg.BUILD_CONFIG testName) + let fsiArgs = + sprintf """ --define:NETCOREAPP1_0 --define:FX_RESHAPED_REFLECTION "%s" %s """ + extraSource + (String.concat " " sources) + + let fsciArgs = sprintf """--verbose:repro --OutputDir:%s --CopyDlls:%s %s""" outDir copyFiles fsiArgs + + fsi_script cfg "--exec %s %s %s" + cfg.fsi_flags + (__SOURCE_DIRECTORY__ ++ @"../scripts/fsci.fsx") + fsciArgs + [] + + testOkFile.CheckExists() #if !FSHARP_SUITE_DRIVES_CORECLR_TESTS - | FSI_FILE -> - use cleanup = (cleanUpFSharpCore cfg) - use testOkFile = new FileGuard (getfullpath cfg "test.ok") + | FSI_FILE -> + use cleanup = (cleanUpFSharpCore cfg) + use testOkFile = new FileGuard (getfullpath cfg "test.ok") - fsi cfg "%s" cfg.fsi_flags sources + fsi cfg "%s" cfg.fsi_flags sources - testOkFile.CheckExists() + testOkFile.CheckExists() - | FSIANYCPU_FILE -> - use cleanup = (cleanUpFSharpCore cfg) - use testOkFile = new FileGuard (getfullpath cfg "test.ok") + | FSIANYCPU_FILE -> + use cleanup = (cleanUpFSharpCore cfg) + use testOkFile = new FileGuard (getfullpath cfg "test.ok") - fsiAnyCpu cfg "%s" cfg.fsi_flags sources + fsiAnyCpu cfg "%s" cfg.fsi_flags sources - testOkFile.CheckExists() + testOkFile.CheckExists() - | FSI_STDIN -> - use cleanup = (cleanUpFSharpCore cfg) - use testOkFile = new FileGuard (getfullpath cfg "test.ok") + | FSI_STDIN -> + use cleanup = (cleanUpFSharpCore cfg) + use testOkFile = new FileGuard (getfullpath cfg "test.ok") - fsiStdin cfg (sources |> List.rev |> List.head) "" [] //use last file, because `cmd < a.txt b.txt` redirect b.txt only + fsiStdin cfg (sources |> List.rev |> List.head) "" [] //use last file, because `cmd < a.txt b.txt` redirect b.txt only - testOkFile.CheckExists() + testOkFile.CheckExists() - | GENERATED_SIGNATURE -> - use cleanup = (cleanUpFSharpCore cfg) + | GENERATED_SIGNATURE -> + use cleanup = (cleanUpFSharpCore cfg) - let source1 = - ["test.ml"; "test.fs"; "test.fsx"] - |> List.rev - |> List.tryFind (fileExists cfg) + let source1 = + ["test.ml"; "test.fs"; "test.fsx"] + |> List.rev + |> List.tryFind (fileExists cfg) - source1 |> Option.iter (fun from -> copy_y cfg from "tmptest.fs") + source1 |> Option.iter (fun from -> copy_y cfg from "tmptest.fs") - log "Generated signature file..." - fsc cfg "%s --sig:tmptest.fsi --define:TESTS_AS_APP" cfg.fsc_flags ["tmptest.fs"] - (if File.Exists("FSharp.Core.dll") then log "found fsharp.core.dll after build" else log "found fsharp.core.dll after build") |> ignore + log "Generated signature file..." + fsc cfg "%s --sig:tmptest.fsi --define:TESTS_AS_APP" cfg.fsc_flags ["tmptest.fs"] + (if File.Exists("FSharp.Core.dll") then log "found fsharp.core.dll after build" else log "found fsharp.core.dll after build") |> ignore - log "Compiling against generated signature file..." - fsc cfg "%s -o:tmptest1.exe --define:TESTS_AS_APP" cfg.fsc_flags ["tmptest.fsi";"tmptest.fs"] - (if File.Exists("FSharp.Core.dll") then log "found fsharp.core.dll after build" else log "found fsharp.core.dll after build") |> ignore + log "Compiling against generated signature file..." + fsc cfg "%s -o:tmptest1.exe --define:TESTS_AS_APP" cfg.fsc_flags ["tmptest.fsi";"tmptest.fs"] + (if File.Exists("FSharp.Core.dll") then log "found fsharp.core.dll after build" else log "found fsharp.core.dll after build") |> ignore - log "Verifying built .exe..." - peverify cfg "tmptest1.exe" + log "Verifying built .exe..." + peverify cfg "tmptest1.exe" - | FSC_OPT_MINUS_DEBUG -> - use cleanup = (cleanUpFSharpCore cfg) - use testOkFile = new FileGuard (getfullpath cfg "test.ok") + | FSC_OPT_MINUS_DEBUG -> + use cleanup = (cleanUpFSharpCore cfg) + use testOkFile = new FileGuard (getfullpath cfg "test.ok") - fsc cfg "%s --optimize- --debug -o:test--optminus--debug.exe -g" cfg.fsc_flags sources - peverify cfg "test--optminus--debug.exe" - exec cfg ("." ++ "test--optminus--debug.exe") "" + fsc cfg "%s --optimize- --debug -o:test--optminus--debug.exe -g" cfg.fsc_flags sources + peverify cfg "test--optminus--debug.exe" + exec cfg ("." ++ "test--optminus--debug.exe") "" - testOkFile.CheckExists() + testOkFile.CheckExists() - | FSC_OPT_PLUS_DEBUG -> - use cleanup = (cleanUpFSharpCore cfg) - use testOkFile = new FileGuard (getfullpath cfg "test.ok") + | FSC_OPT_PLUS_DEBUG -> + use cleanup = (cleanUpFSharpCore cfg) + use testOkFile = new FileGuard (getfullpath cfg "test.ok") - fsc cfg "%s --optimize+ --debug -o:test--optplus--debug.exe -g" cfg.fsc_flags sources - peverify cfg "test--optplus--debug.exe" - exec cfg ("." ++ "test--optplus--debug.exe") "" + fsc cfg "%s --optimize+ --debug -o:test--optplus--debug.exe -g" cfg.fsc_flags sources + peverify cfg "test--optplus--debug.exe" + exec cfg ("." ++ "test--optplus--debug.exe") "" - testOkFile.CheckExists() + testOkFile.CheckExists() - | AS_DLL -> - // Compile as a DLL to exercise pickling of interface data, then recompile the original source file referencing this DLL - // THe second compilation will not utilize the information from the first in any meaningful way, but the - // compiler will unpickle the interface and optimization data, so we test unpickling as well. - use cleanup = (cleanUpFSharpCore cfg) - use testOkFile = new FileGuard (getfullpath cfg "test.ok") + | AS_DLL -> + // Compile as a DLL to exercise pickling of interface data, then recompile the original source file referencing this DLL + // THe second compilation will not utilize the information from the first in any meaningful way, but the + // compiler will unpickle the interface and optimization data, so we test unpickling as well. + use cleanup = (cleanUpFSharpCore cfg) + use testOkFile = new FileGuard (getfullpath cfg "test.ok") - fsc cfg "%s --optimize -a -o:test--optimize-lib.dll -g" cfg.fsc_flags sources - fsc cfg "%s --optimize -r:test--optimize-lib.dll -o:test--optimize-client-of-lib.exe -g" cfg.fsc_flags sources + fsc cfg "%s --optimize -a -o:test--optimize-lib.dll -g" cfg.fsc_flags sources + fsc cfg "%s --optimize -r:test--optimize-lib.dll -o:test--optimize-client-of-lib.exe -g" cfg.fsc_flags sources - peverify cfg "test--optimize-lib.dll" - peverify cfg "test--optimize-client-of-lib.exe" + peverify cfg "test--optimize-lib.dll" + peverify cfg "test--optimize-client-of-lib.exe" - exec cfg ("." ++ "test--optimize-client-of-lib.exe") "" + exec cfg ("." ++ "test--optimize-client-of-lib.exe") "" - testOkFile.CheckExists() + testOkFile.CheckExists() #endif let singleTestBuildAndRunAux cfg p = @@ -210,6 +314,13 @@ let singleNegTest (cfg: TestConfig) testname = then fsc cfg "%s -a -o:%s-pre.dll" cfg.fsc_flags testname [testname + "-pre.fs"] else () + if fileExists cfg (testname + "-pre.fsx") then + fsi_script cfg "--exec %s %s %s" + cfg.fsi_flags + (cfg.Directory ++ (testname + "-pre.fsx")) + "" + [] + log "Negative typechecker testing: %s" testname let warnaserror = diff --git a/tests/fsharp/test-framework.fs b/tests/fsharp/test-framework.fs index aeb90af5ae8..e00fc7111e7 100644 --- a/tests/fsharp/test-framework.fs +++ b/tests/fsharp/test-framework.fs @@ -11,7 +11,7 @@ open NUnit.Framework [] module Commands = - let getfullpath workDir path = + let getfullpath workDir (path:string) = let rooted = if Path.IsPathRooted(path) then path else Path.Combine(workDir, path) @@ -122,16 +122,19 @@ type TestConfig = BUILD_CONFIG : string FSC : string fsc_flags : string - FSCBinPath : string + BinPath : string FSCOREDLLPATH : string FSI : string +#if !FSHARP_SUITE_DRIVES_CORECLR_TESTS FSIANYCPU : string +#endif FSI_FOR_SCRIPTS : string fsi_flags : string ILDASM : string PEVERIFY : string Directory: string DotNetExe: string + DotNet20Exe: string DefaultPlatform: string} @@ -152,43 +155,35 @@ let requireFile nm = let config configurationName envVars = let SCRIPT_ROOT = __SOURCE_DIRECTORY__ - let packagesDir = SCRIPT_ROOT ++ ".." ++ ".." ++ "packages" - let FSCBinPath = SCRIPT_ROOT ++ ".." ++ ".." ++ configurationName ++ "net40" ++ "bin" + let packagesDir = Environment.GetEnvironmentVariable("USERPROFILE") ++ ".nuget" ++ "packages" +#if NET46 + let architecture = "net40" +#else + let architecture = "coreclr" +#endif + let BINPATH = SCRIPT_ROOT ++ ".." ++ ".." ++ configurationName ++ architecture ++ "bin" let csc_flags = "/nologo" let fsc_flags = "-r:System.Core.dll --nowarn:20 --define:COMPILED" let fsi_flags = "-r:System.Core.dll --nowarn:20 --define:INTERACTIVE --maxerrors:1 --abortonerror" let Is64BitOperatingSystem = WindowsPlatform.Is64BitOperatingSystem envVars let architectureMoniker = if Is64BitOperatingSystem then "x64" else "x86" - let CSC = requireFile (packagesDir ++ "Microsoft.Net.Compilers.2.7.0" ++ "tools" ++ "csc.exe") - let ILDASM = requireFile (packagesDir ++ ("runtime.win-" + architectureMoniker + ".Microsoft.NETCore.ILDAsm.2.0.3") ++ "runtimes" ++ ("win-" + architectureMoniker) ++ "native" ++ "ildasm.exe") - let coreclrdll = requireFile (packagesDir ++ ("runtime.win-" + architectureMoniker + ".Microsoft.NETCore.Runtime.CoreCLR.2.0.3") ++ "runtimes" ++ ("win-" + architectureMoniker) ++ "native" ++ "coreclr.dll") + let CSC = requireFile (packagesDir ++ "Microsoft.Net.Compilers" ++ "2.7.0" ++ "tools" ++ "csc.exe") + let ILDASM = requireFile (packagesDir ++ ("runtime.win-" + architectureMoniker + ".Microsoft.NETCore.ILDAsm") ++ "2.0.3" ++ "runtimes" ++ ("win-" + architectureMoniker) ++ "native" ++ "ildasm.exe") + let coreclrdll = requireFile (packagesDir ++ ("runtime.win-" + architectureMoniker + ".Microsoft.NETCore.Runtime.CoreCLR") ++ "2.0.3" ++ "runtimes" ++ ("win-" + architectureMoniker) ++ "native" ++ "coreclr.dll") let PEVERIFY = requireFile (SCRIPT_ROOT ++ ".." ++ "fsharpqa" ++ "testenv" ++ "src" ++ "PEVerify" ++ "bin" ++ configurationName ++ "net46" ++ "PEVerify.exe") - let FSI_FOR_SCRIPTS = - match envVars |> Map.tryFind "_fsiexe" with - | Some fsiexe when (not (String.IsNullOrWhiteSpace fsiexe)) -> requireFile (SCRIPT_ROOT ++ ".." ++ ".." ++ (fsiexe.Trim([| '\"' |]))) - | _ -> - // build.cmd sets that var, if it is not set, we are probably called directly from visual studio or the nunit console runner. - let fsharpCompilerTools = Directory.GetDirectories(packagesDir, "FSharp.Compiler.Tools.*") - match fsharpCompilerTools with - | [||] -> failwithf "Could not find any 'FSharp.Compiler.Tools' inside '%s'" packagesDir - | [| dir |] -> Path.Combine(dir, "tools", "fsi.exe") - | _ -> failwithf "Found more than one 'FSharp.Compiler.Tools' inside '%s', please clean up." packagesDir + let FSI_FOR_SCRIPTS = BINPATH ++ "fsi.exe" let toolsDir = SCRIPT_ROOT ++ ".." ++ ".." ++ "Tools" let dotNetExe = toolsDir ++ "dotnetcli" ++ "dotnet.exe" + let dotNet20Exe = toolsDir ++ "dotnet20" ++ "dotnet.exe" // ildasm requires coreclr.dll to run which has already been restored to the packages directory File.Copy(coreclrdll, Path.GetDirectoryName(ILDASM) ++ "coreclr.dll", overwrite=true) + let FSI = requireFile (BINPATH ++ "fsi.exe") #if !FSHARP_SUITE_DRIVES_CORECLR_TESTS - let FSI = requireFile (FSCBinPath ++ "fsi.exe") - let FSIANYCPU = requireFile (FSCBinPath ++ "fsiAnyCpu.exe") - let FSC = requireFile (FSCBinPath ++ "fsc.exe") - let FSCOREDLLPATH = requireFile (FSCBinPath ++ "FSharp.Core.dll") -#else - let FSI = SCRIPT_ROOT ++ ".." ++ ".." ++ "tests" ++ "testbin" ++ configurationName ++ "coreclr" ++ "FSC" ++ "fsi.exe" - let FSIANYCPU = SCRIPT_ROOT ++ ".." ++ ".." ++ "tests" ++ "testbin" ++ configurationName ++ "coreclr" ++ "FSC" ++ "fsiAnyCpu.exe" - let FSC = SCRIPT_ROOT ++ ".." ++ ".." ++ "tests" ++ "testbin" ++ configurationName ++ "coreclr" ++ "FSC" ++ "fsc.exe" - let FSCOREDLLPATH = "" + let FSIANYCPU = requireFile (BINPATH ++ "fsiAnyCpu.exe") #endif + let FSC = requireFile (BINPATH ++ "fsc.exe") + let FSCOREDLLPATH = requireFile (BINPATH ++ "FSharp.Core.dll") let defaultPlatform = match Is64BitOperatingSystem with @@ -198,7 +193,7 @@ let config configurationName envVars = | false -> "win7-x86" { EnvironmentVariables = envVars - FSCBinPath = FSCBinPath |> Commands.pathAddBackslash + BinPath = BINPATH |> Commands.pathAddBackslash FSCOREDLLPATH = FSCOREDLLPATH ILDASM = ILDASM PEVERIFY = PEVERIFY @@ -206,13 +201,16 @@ let config configurationName envVars = BUILD_CONFIG = configurationName FSC = FSC FSI = FSI +#if !FSHARP_SUITE_DRIVES_CORECLR_TESTS FSIANYCPU = FSIANYCPU +#endif FSI_FOR_SCRIPTS = FSI_FOR_SCRIPTS csc_flags = csc_flags fsc_flags = fsc_flags fsi_flags = fsi_flags Directory="" DotNetExe = dotNetExe + DotNet20Exe = dotNet20Exe DefaultPlatform = defaultPlatform } let logConfig (cfg: TestConfig) = @@ -224,10 +222,12 @@ let logConfig (cfg: TestConfig) = log "csc_flags =%s" cfg.csc_flags log "FSC =%s" cfg.FSC log "fsc_flags =%s" cfg.fsc_flags - log "FSCBINPATH =%s" cfg.FSCBinPath + log "BINPATH =%s" cfg.BinPath log "FSCOREDLLPATH =%s" cfg.FSCOREDLLPATH log "FSI =%s" cfg.FSI - log "FSIANYCPU =%s" cfg.FSIANYCPU +#if !FSHARP_SUITE_DRIVES_CORECLR_TESTS + log "FSIANYCPU =%s" cfg.FSIANYCPU +#endif log "fsi_flags =%s" cfg.fsi_flags log "ILDASM =%s" cfg.ILDASM log "PEVERIFY =%s" cfg.PEVERIFY @@ -437,7 +437,9 @@ let ildasm cfg arg = Printf.ksprintf (Commands.ildasm (exec cfg) cfg.ILDASM) arg let peverify cfg = Commands.peverify (exec cfg) cfg.PEVERIFY "/nologo" let peverifyWithArgs cfg args = Commands.peverify (exec cfg) cfg.PEVERIFY args let fsi cfg = Printf.ksprintf (Commands.fsi (exec cfg) cfg.FSI) +#if !FSHARP_SUITE_DRIVES_CORECLR_TESTS let fsiAnyCpu cfg = Printf.ksprintf (Commands.fsi (exec cfg) cfg.FSIANYCPU) +#endif let fsi_script cfg = Printf.ksprintf (Commands.fsi (exec cfg) cfg.FSI_FOR_SCRIPTS) let fsiExpectFail cfg = Printf.ksprintf (Commands.fsi (execExpectFail cfg) cfg.FSI) let fsiAppendIgnoreExitCode cfg stdoutPath stderrPath = Printf.ksprintf (Commands.fsi (execAppendIgnoreExitCode cfg stdoutPath stderrPath) cfg.FSI) diff --git a/tests/fsharp/tests.fs b/tests/fsharp/tests.fs index d487c6cae4a..8e64b19b5e1 100644 --- a/tests/fsharp/tests.fs +++ b/tests/fsharp/tests.fs @@ -32,43 +32,42 @@ module CoreTests = [] let ``access-FSC_BASIC``() = singleTestBuildAndRun "core/access" FSC_BASIC - // All tests below here are known to pass for .NET Core but not yet enabled due to CI problems - [] - let ``access-FSI_BASIC``() = singleTestBuildAndRun "core/access" FSI_BASIC - +//// [] +//// let ``access-FSI_BASIC``() = singleTestBuildAndRun "core/access" FSI_BASIC +//// [] let ``apporder-FSC_BASIC`` () = singleTestBuildAndRun "core/apporder" FSC_BASIC - [] - let ``apporder-FSI_BASIC`` () = singleTestBuildAndRun "core/apporder" FSI_BASIC +//// [] +//// let ``apporder-FSI_BASIC`` () = singleTestBuildAndRun "core/apporder" FSI_BASIC [] let ``array-FSC_BASIC`` () = singleTestBuildAndRun "core/array" FSC_BASIC - [] - let ``array-FSI_BASIC`` () = singleTestBuildAndRun "core/array" FSI_BASIC +//// [] +//// let ``array-FSI_BASIC`` () = singleTestBuildAndRun "core/array" FSI_BASIC [] let ``comprehensions-FSC_BASIC`` () = singleTestBuildAndRun "core/comprehensions" FSC_BASIC - [] - let ``comprehensions-FSI_BASIC`` () = singleTestBuildAndRun "core/comprehensions" FSI_BASIC +//// [] +//// let ``comprehensions-FSI_BASIC`` () = singleTestBuildAndRun "core/comprehensions" FSI_BASIC [] let ``comprehensionshw-FSC_BASIC`` () = singleTestBuildAndRun "core/comprehensions-hw" FSC_BASIC - [] - let ``comprehensionshw-FSI_BASIC`` () = singleTestBuildAndRun "core/comprehensions-hw" FSI_BASIC +//// [] +//// let ``comprehensionshw-FSI_BASIC`` () = singleTestBuildAndRun "core/comprehensions-hw" FSI_BASIC - [] - let ``genericmeasures-FSI_BASIC`` () = singleTestBuildAndRun "core/genericmeasures" FSI_BASIC +//// [] +//// let ``genericmeasures-FSI_BASIC`` () = singleTestBuildAndRun "core/genericmeasures" FSI_BASIC [] let ``genericmeasures-FSC_BASIC`` () = singleTestBuildAndRun "core/genericmeasures" FSC_BASIC - [] - let ``innerpoly-FSI_BASIC`` () = singleTestBuildAndRun "core/innerpoly" FSI_BASIC +//// [] +//// let ``innerpoly-FSI_BASIC`` () = singleTestBuildAndRun "core/innerpoly" FSI_BASIC [] let ``innerpoly-FSC_BASIC`` () = singleTestBuildAndRun "core/innerpoly" FSC_BASIC @@ -79,26 +78,26 @@ module CoreTests = [] let unicode2 () = singleTestBuildAndRun "core/unicode" FSC_BASIC - [] - let ``unicode2-FSI_BASIC`` () = singleTestBuildAndRun "core/unicode" FSI_BASIC +//// [] +//// let ``unicode2-FSI_BASIC`` () = singleTestBuildAndRun "core/unicode" FSI_BASIC [] let ``lazy test-FSC_BASIC`` () = singleTestBuildAndRun "core/lazy" FSC_BASIC - [] - let ``lazy test-FSI_BASIC`` () = singleTestBuildAndRun "core/lazy" FSI_BASIC +//// [] +//// let ``lazy test-FSI_BASIC`` () = singleTestBuildAndRun "core/lazy" FSI_BASIC [] let ``letrec-FSC_BASIC`` () = singleTestBuildAndRun "core/letrec" FSC_BASIC - [] - let ``letrec-FSI_BASIC`` () = singleTestBuildAndRun "core/letrec" FSI_BASIC +//// [] +//// let ``letrec-FSI_BASIC`` () = singleTestBuildAndRun "core/letrec" FSI_BASIC [] let ``letrec (mutrec variations part one) FSC_BASIC`` () = singleTestBuildAndRun "core/letrec-mutrec" FSC_BASIC - [] - let ``letrec (mutrec variations part one) FSI_BASIC`` () = singleTestBuildAndRun "core/letrec-mutrec" FSI_BASIC +//// [] +//// let ``letrec (mutrec variations part one) FSI_BASIC`` () = singleTestBuildAndRun "core/letrec-mutrec" FSI_BASIC [] let ``libtest-FSC_BASIC`` () = singleTestBuildAndRun "core/libtest" FSC_BASIC @@ -109,8 +108,8 @@ module CoreTests = [] let map () = singleTestBuildAndRun "core/map" FSC_BASIC - [] - let ``measures-FSI_BASIC`` () = singleTestBuildAndRun "core/measures" FSI_BASIC +//// [] +//// let ``measures-FSI_BASIC`` () = singleTestBuildAndRun "core/measures" FSI_BASIC [] let ``measures-FSC_BASIC`` () = singleTestBuildAndRun "core/measures" FSC_BASIC @@ -227,10 +226,10 @@ module CoreTests = begin use testOkFile = fileguard cfg "test.ok" - fsc cfg "%s -o:test.exe -g" cfg.fsc_flags ["test.fsx"] - singleNegTest cfg "test" + fsc cfg "%s -o:test.exe -g" cfg.fsc_flags ["test.fsx"] + // Execution is disabled until we can be sure .NET 4.7.2 is on the machine //exec cfg ("." ++ "test.exe") "" @@ -240,10 +239,10 @@ module CoreTests = begin use testOkFile = fileguard cfg "test2.ok" - fsc cfg "%s -o:test2.exe -g" cfg.fsc_flags ["test2.fsx"] - singleNegTest cfg "test2" + fsc cfg "%s -o:test2.exe -g" cfg.fsc_flags ["test2.fsx"] + // Execution is disabled until we can be sure .NET 4.7.2 is on the machine //exec cfg ("." ++ "test.exe") "" @@ -253,10 +252,10 @@ module CoreTests = begin use testOkFile = fileguard cfg "test3.ok" - fsc cfg "%s -o:test3.exe -g" cfg.fsc_flags ["test3.fsx"] - singleNegTest cfg "test3" + fsc cfg "%s -o:test3.exe -g" cfg.fsc_flags ["test3.fsx"] + // Execution is disabled until we can be sure .NET 4.7.2 is on the machine //exec cfg ("." ++ "test.exe") "" @@ -316,9 +315,8 @@ module CoreTests = [] let fscenum () = singleTestBuildAndRun "core/enum" FSC_BASIC - [] - let fsienum () = singleTestBuildAndRun "core/enum" FSI_BASIC - +// [] +// let fsienum () = singleTestBuildAndRun "core/enum" FSI_BASIC #if !FSHARP_SUITE_DRIVES_CORECLR_TESTS @@ -329,7 +327,7 @@ module CoreTests = fsc cfg "%s -a -o:lib.dll" cfg.fsc_flags ["lib.fs"] - copy_y cfg (cfg.FSCBinPath ++ "System.ValueTuple.dll") ("." ++ "System.ValueTuple.dll") + copy_y cfg (cfg.BinPath ++ "System.ValueTuple.dll") ("." ++ "System.ValueTuple.dll") peverify cfg "lib.dll" fsc cfg "%s -r:lib.dll" cfg.fsc_flags ["test.fsx"] @@ -482,7 +480,7 @@ module CoreTests = fsc cfg "%s -a -o:lib.dll -g" cfg.fsc_flags ["lib.fs"] - copy_y cfg (cfg.FSCBinPath ++ "System.ValueTuple.dll") ("." ++ "System.ValueTuple.dll") + copy_y cfg (cfg.BinPath ++ "System.ValueTuple.dll") ("." ++ "System.ValueTuple.dll") peverify cfg "lib.dll" @@ -792,7 +790,7 @@ module CoreTests = fsc cfg "%s -o:test.exe -r cslib.dll -g" cfg.fsc_flags ["test.fsx"] - copy_y cfg (cfg.FSCBinPath ++ "System.ValueTuple.dll") ("." ++ "System.ValueTuple.dll") + copy_y cfg (cfg.BinPath ++ "System.ValueTuple.dll") ("." ++ "System.ValueTuple.dll") peverify cfg "test.exe" @@ -1635,13 +1633,13 @@ module CoreTests = let verify () = let cfg = testConfig "core/verify" - peverifyWithArgs cfg "/nologo" (cfg.FSCBinPath ++ "FSharp.Build.dll") + peverifyWithArgs cfg "/nologo" (cfg.BinPath ++ "FSharp.Build.dll") - // peverifyWithArgs cfg "/nologo /MD" (cfg.FSCBinPath ++ "FSharp.Compiler.dll") + // peverifyWithArgs cfg "/nologo /MD" (cfg.BinPath ++ "FSharp.Compiler.dll") - peverifyWithArgs cfg "/nologo" (cfg.FSCBinPath ++ "fsi.exe") + peverifyWithArgs cfg "/nologo" (cfg.BinPath ++ "fsi.exe") - peverifyWithArgs cfg "/nologo" (cfg.FSCBinPath ++ "FSharp.Compiler.Interactive.Settings.dll") + peverifyWithArgs cfg "/nologo" (cfg.BinPath ++ "FSharp.Compiler.Interactive.Settings.dll") fsc cfg "%s -o:xmlverify.exe -g" cfg.fsc_flags ["xmlverify.fs"] @@ -1678,20 +1676,19 @@ module ToolsTests = let eval () = singleTestBuildAndRun "tools/eval" FSC_BASIC #endif - module RegressionTests = [] let ``literal-value-bug-2-FSC_BASIC`` () = singleTestBuildAndRun "regression/literal-value-bug-2" FSC_BASIC - [] - let ``literal-value-bug-2-FSI_BASIC`` () = singleTestBuildAndRun "regression/literal-value-bug-2" FSI_BASIC +//// [] +//// let ``literal-value-bug-2-FSI_BASIC`` () = singleTestBuildAndRun "regression/literal-value-bug-2" FSI_BASIC [] let ``OverloadResolution-bug-FSC_BASIC`` () = singleTestBuildAndRun "regression/OverloadResolution-bug" FSC_BASIC - [] - let ``OverloadResolution-bug-FSI_BASIC`` () = singleTestBuildAndRun "regression/OverloadResolution-bug" FSI_BASIC +//// [] +//// let ``OverloadResolution-bug-FSI_BASIC`` () = singleTestBuildAndRun "regression/OverloadResolution-bug" FSI_BASIC [] let ``struct-tuple-bug-1-FSC_BASIC`` () = singleTestBuildAndRun "regression/struct-tuple-bug-1" FSC_BASIC @@ -1739,7 +1736,7 @@ module RegressionTests = // Requires WinForms [] let ``83`` () = singleTestBuildAndRun "regression/83" FSC_BASIC -#endif + [] let ``84`` () = singleTestBuildAndRun "regression/84" FSC_BASIC @@ -1750,12 +1747,13 @@ module RegressionTests = fsc cfg "%s -r:Category.dll -a -o:petshop.dll" cfg.fsc_flags ["Category.ml"] peverify cfg "petshop.dll" +#endif [] let ``86`` () = singleTestBuildAndRun "regression/86" FSC_BASIC - [] - let ``struct-tuple-bug-1-FSI_BASIC`` () = singleTestBuildAndRun "regression/struct-tuple-bug-1" FSI_BASIC +//// [] +//// let ``struct-tuple-bug-1-FSI_BASIC`` () = singleTestBuildAndRun "regression/struct-tuple-bug-1" FSI_BASIC #if !FSHARP_SUITE_DRIVES_CORECLR_TESTS // This test is disabled in coreclr builds dependent on fixing : https://github.com/Microsoft/visualfsharp/issues/2600 @@ -1931,7 +1929,7 @@ module TypecheckTests = let ``sigs pos27`` () = let cfg = testConfig "typecheck/sigs" fsc cfg "%s --target:exe -o:pos27.exe" cfg.fsc_flags ["pos27.fs"] - copy_y cfg (cfg.FSCBinPath ++ "System.ValueTuple.dll") ("." ++ "System.ValueTuple.dll") + copy_y cfg (cfg.BinPath ++ "System.ValueTuple.dll") ("." ++ "System.ValueTuple.dll") peverify cfg "pos27.exe" [] @@ -2590,7 +2588,7 @@ open System.Runtime.InteropServices fv.LegalTrademarks |> Assert.areEqual "CST \u2122" #endif -#if !NETSTANDARD1_6 +#if NET46 module ProductVersionTest = let informationalVersionAttrName = typeof.FullName diff --git a/tests/fsharp/tools/eval/test.fsx b/tests/fsharp/tools/eval/test.fsx index 535a54799a4..b2cfedc68fa 100644 --- a/tests/fsharp/tools/eval/test.fsx +++ b/tests/fsharp/tools/eval/test.fsx @@ -1,6 +1,6 @@ #light -#if !NETCOREAPP1_0 +#if !NETSTANDARD #r @"System.Core.dll" #r @"System.Data.Linq.dll" #endif diff --git a/tests/fsharp/typecheck/sigs/.gitignore b/tests/fsharp/typecheck/sigs/.gitignore new file mode 100644 index 00000000000..c7256c83585 --- /dev/null +++ b/tests/fsharp/typecheck/sigs/.gitignore @@ -0,0 +1 @@ +*.generated.fsx diff --git a/tests/fsharp/typecheck/sigs/neg107-pre.fsx b/tests/fsharp/typecheck/sigs/neg107-pre.fsx new file mode 100644 index 00000000000..e64b1cb84da --- /dev/null +++ b/tests/fsharp/typecheck/sigs/neg107-pre.fsx @@ -0,0 +1,4 @@ +open System +open System.IO + +File.WriteAllText("neg107.generated.fsx", sprintf @"#r @""%s\.nuget\packages\System.Memory\4.5.0\lib\netstandard2.0\System.Memory.dll""" (Environment.GetEnvironmentVariable("USERPROFILE"))) diff --git a/tests/fsharp/typecheck/sigs/neg107.bsl b/tests/fsharp/typecheck/sigs/neg107.bsl index 718566256af..2fe7ea8251d 100644 --- a/tests/fsharp/typecheck/sigs/neg107.bsl +++ b/tests/fsharp/typecheck/sigs/neg107.bsl @@ -1,108 +1,108 @@ -neg107.fsx(26,48,26,59): typecheck error FS0406: The byref-typed variable 'a' is used in an invalid way. Byrefs cannot be captured by closures or passed to inner functions. +neg107.fsx(25,48,25,59): typecheck error FS0406: The byref-typed variable 'a' is used in an invalid way. Byrefs cannot be captured by closures or passed to inner functions. -neg107.fsx(27,69,27,80): typecheck error FS0406: The byref-typed variable 'a' is used in an invalid way. Byrefs cannot be captured by closures or passed to inner functions. +neg107.fsx(26,69,26,80): typecheck error FS0406: The byref-typed variable 'a' is used in an invalid way. Byrefs cannot be captured by closures or passed to inner functions. -neg107.fsx(28,13,28,25): typecheck error FS3301: The function or method has an invalid return type '(unit -> Span)'. This is not permitted by the rules of Common IL. +neg107.fsx(27,13,27,25): typecheck error FS3301: The function or method has an invalid return type '(unit -> Span)'. This is not permitted by the rules of Common IL. -neg107.fsx(28,43,28,59): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. +neg107.fsx(27,43,27,59): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. -neg107.fsx(28,43,28,59): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. +neg107.fsx(27,43,27,59): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. -neg107.fsx(28,47,28,58): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. +neg107.fsx(27,47,27,58): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. -neg107.fsx(28,47,28,58): typecheck error FS0406: The byref-typed variable 'a' is used in an invalid way. Byrefs cannot be captured by closures or passed to inner functions. +neg107.fsx(27,47,27,58): typecheck error FS0406: The byref-typed variable 'a' is used in an invalid way. Byrefs cannot be captured by closures or passed to inner functions. -neg107.fsx(28,57,28,58): typecheck error FS0418: The byref typed value 'a' cannot be used at this point +neg107.fsx(27,57,27,58): typecheck error FS0418: The byref typed value 'a' cannot be used at this point -neg107.fsx(28,47,28,58): typecheck error FS0425: The type of a first-class function cannot contain byrefs +neg107.fsx(27,47,27,58): typecheck error FS0425: The type of a first-class function cannot contain byrefs -neg107.fsx(29,13,29,25): typecheck error FS3301: The function or method has an invalid return type '(unit -> ReadOnlySpan)'. This is not permitted by the rules of Common IL. +neg107.fsx(28,13,28,25): typecheck error FS3301: The function or method has an invalid return type '(unit -> ReadOnlySpan)'. This is not permitted by the rules of Common IL. -neg107.fsx(29,51,29,67): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. +neg107.fsx(28,51,28,67): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. -neg107.fsx(29,51,29,67): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. +neg107.fsx(28,51,28,67): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. -neg107.fsx(29,55,29,66): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. +neg107.fsx(28,55,28,66): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. -neg107.fsx(29,55,29,66): typecheck error FS0406: The byref-typed variable 'a' is used in an invalid way. Byrefs cannot be captured by closures or passed to inner functions. +neg107.fsx(28,55,28,66): typecheck error FS0406: The byref-typed variable 'a' is used in an invalid way. Byrefs cannot be captured by closures or passed to inner functions. -neg107.fsx(29,65,29,66): typecheck error FS0418: The byref typed value 'a' cannot be used at this point +neg107.fsx(28,65,28,66): typecheck error FS0418: The byref typed value 'a' cannot be used at this point -neg107.fsx(29,55,29,66): typecheck error FS0425: The type of a first-class function cannot contain byrefs +neg107.fsx(28,55,28,66): typecheck error FS0425: The type of a first-class function cannot contain byrefs -neg107.fsx(31,49,31,54): typecheck error FS0406: The byref-typed variable 'a' is used in an invalid way. Byrefs cannot be captured by closures or passed to inner functions. +neg107.fsx(30,49,30,54): typecheck error FS0406: The byref-typed variable 'a' is used in an invalid way. Byrefs cannot be captured by closures or passed to inner functions. -neg107.fsx(31,57,31,65): typecheck error FS0406: The byref-typed variable 'a' is used in an invalid way. Byrefs cannot be captured by closures or passed to inner functions. +neg107.fsx(30,57,30,65): typecheck error FS0406: The byref-typed variable 'a' is used in an invalid way. Byrefs cannot be captured by closures or passed to inner functions. -neg107.fsx(32,70,32,75): typecheck error FS0406: The byref-typed variable 'a' is used in an invalid way. Byrefs cannot be captured by closures or passed to inner functions. +neg107.fsx(31,70,31,75): typecheck error FS0406: The byref-typed variable 'a' is used in an invalid way. Byrefs cannot be captured by closures or passed to inner functions. -neg107.fsx(32,78,32,86): typecheck error FS0406: The byref-typed variable 'a' is used in an invalid way. Byrefs cannot be captured by closures or passed to inner functions. +neg107.fsx(31,78,31,86): typecheck error FS0406: The byref-typed variable 'a' is used in an invalid way. Byrefs cannot be captured by closures or passed to inner functions. -neg107.fsx(33,13,33,30): typecheck error FS3301: The function or method has an invalid return type 'Async>'. This is not permitted by the rules of Common IL. +neg107.fsx(32,13,32,30): typecheck error FS3301: The function or method has an invalid return type 'Async>'. This is not permitted by the rules of Common IL. -neg107.fsx(33,48,33,53): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. +neg107.fsx(32,48,32,53): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. -neg107.fsx(33,48,33,53): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. +neg107.fsx(32,48,32,53): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. -neg107.fsx(33,48,33,53): typecheck error FS0406: The byref-typed variable 'a' is used in an invalid way. Byrefs cannot be captured by closures or passed to inner functions. +neg107.fsx(32,48,32,53): typecheck error FS0406: The byref-typed variable 'a' is used in an invalid way. Byrefs cannot be captured by closures or passed to inner functions. -neg107.fsx(33,48,33,53): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. +neg107.fsx(32,48,32,53): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. -neg107.fsx(33,56,33,64): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. +neg107.fsx(32,56,32,64): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. -neg107.fsx(33,56,33,64): typecheck error FS0406: The byref-typed variable 'a' is used in an invalid way. Byrefs cannot be captured by closures or passed to inner functions. +neg107.fsx(32,56,32,64): typecheck error FS0406: The byref-typed variable 'a' is used in an invalid way. Byrefs cannot be captured by closures or passed to inner functions. -neg107.fsx(33,56,33,64): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. +neg107.fsx(32,56,32,64): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. -neg107.fsx(33,56,33,64): typecheck error FS0425: The type of a first-class function cannot contain byrefs +neg107.fsx(32,56,32,64): typecheck error FS0425: The type of a first-class function cannot contain byrefs -neg107.fsx(33,48,33,53): typecheck error FS0425: The type of a first-class function cannot contain byrefs +neg107.fsx(32,48,32,53): typecheck error FS0425: The type of a first-class function cannot contain byrefs -neg107.fsx(34,13,34,30): typecheck error FS3301: The function or method has an invalid return type 'Async>'. This is not permitted by the rules of Common IL. +neg107.fsx(33,13,33,30): typecheck error FS3301: The function or method has an invalid return type 'Async>'. This is not permitted by the rules of Common IL. -neg107.fsx(34,56,34,61): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. +neg107.fsx(33,56,33,61): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. -neg107.fsx(34,56,34,61): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. +neg107.fsx(33,56,33,61): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. -neg107.fsx(34,56,34,61): typecheck error FS0406: The byref-typed variable 'a' is used in an invalid way. Byrefs cannot be captured by closures or passed to inner functions. +neg107.fsx(33,56,33,61): typecheck error FS0406: The byref-typed variable 'a' is used in an invalid way. Byrefs cannot be captured by closures or passed to inner functions. -neg107.fsx(34,56,34,61): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. +neg107.fsx(33,56,33,61): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. -neg107.fsx(34,64,34,72): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. +neg107.fsx(33,64,33,72): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. -neg107.fsx(34,64,34,72): typecheck error FS0406: The byref-typed variable 'a' is used in an invalid way. Byrefs cannot be captured by closures or passed to inner functions. +neg107.fsx(33,64,33,72): typecheck error FS0406: The byref-typed variable 'a' is used in an invalid way. Byrefs cannot be captured by closures or passed to inner functions. -neg107.fsx(34,64,34,72): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. +neg107.fsx(33,64,33,72): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. -neg107.fsx(34,64,34,72): typecheck error FS0425: The type of a first-class function cannot contain byrefs +neg107.fsx(33,64,33,72): typecheck error FS0425: The type of a first-class function cannot contain byrefs -neg107.fsx(34,56,34,61): typecheck error FS0425: The type of a first-class function cannot contain byrefs +neg107.fsx(33,56,33,61): typecheck error FS0425: The type of a first-class function cannot contain byrefs -neg107.fsx(37,33,37,34): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. +neg107.fsx(36,33,36,34): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. -neg107.fsx(37,33,37,34): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. +neg107.fsx(36,33,36,34): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. -neg107.fsx(37,33,37,34): typecheck error FS0425: The type of a first-class function cannot contain byrefs +neg107.fsx(36,33,36,34): typecheck error FS0425: The type of a first-class function cannot contain byrefs -neg107.fsx(37,33,37,34): typecheck error FS0425: The type of a first-class function cannot contain byrefs +neg107.fsx(36,33,36,34): typecheck error FS0425: The type of a first-class function cannot contain byrefs -neg107.fsx(45,34,45,40): typecheck error FS3232: Struct members cannot return the address of fields of the struct by reference +neg107.fsx(44,34,44,40): typecheck error FS3232: Struct members cannot return the address of fields of the struct by reference -neg107.fsx(45,34,45,38): typecheck error FS3232: Struct members cannot return the address of fields of the struct by reference +neg107.fsx(44,34,44,38): typecheck error FS3232: Struct members cannot return the address of fields of the struct by reference -neg107.fsx(53,34,53,38): typecheck error FS3232: Struct members cannot return the address of fields of the struct by reference +neg107.fsx(52,34,52,38): typecheck error FS3232: Struct members cannot return the address of fields of the struct by reference -neg107.fsx(67,34,67,40): typecheck error FS3232: Struct members cannot return the address of fields of the struct by reference +neg107.fsx(66,34,66,40): typecheck error FS3232: Struct members cannot return the address of fields of the struct by reference -neg107.fsx(67,34,67,38): typecheck error FS3232: Struct members cannot return the address of fields of the struct by reference +neg107.fsx(66,34,66,38): typecheck error FS3232: Struct members cannot return the address of fields of the struct by reference -neg107.fsx(71,19,71,20): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. +neg107.fsx(70,19,70,20): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. -neg107.fsx(71,14,71,18): typecheck error FS0437: A type would store a byref typed value. This is not permitted by Common IL. +neg107.fsx(70,14,70,18): typecheck error FS0437: A type would store a byref typed value. This is not permitted by Common IL. -neg107.fsx(71,19,71,20): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. +neg107.fsx(70,19,70,20): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. -neg107.fsx(71,19,71,20): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. +neg107.fsx(70,19,70,20): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. -neg107.fsx(71,19,71,20): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. +neg107.fsx(70,19,70,20): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. diff --git a/tests/fsharp/typecheck/sigs/neg107.fsx b/tests/fsharp/typecheck/sigs/neg107.fsx index 1df5dec5fd4..ac27e3b62c4 100644 --- a/tests/fsharp/typecheck/sigs/neg107.fsx +++ b/tests/fsharp/typecheck/sigs/neg107.fsx @@ -1,5 +1,4 @@ -#r @"..\..\..\..\packages\System.Memory.4.5.0-rc1\lib\netstandard2.0\System.Memory.dll" -#r @"..\..\..\..\packages\NETStandard.Library.NETFramework.2.0.0-preview2-25405-01\build\net461\ref\netstandard.dll" +#load "neg107.generated.fsx" namespace System.Runtime.CompilerServices diff --git a/tests/fsharp/typecheck/sigs/neg107.vsbsl b/tests/fsharp/typecheck/sigs/neg107.vsbsl index 718566256af..2fe7ea8251d 100644 --- a/tests/fsharp/typecheck/sigs/neg107.vsbsl +++ b/tests/fsharp/typecheck/sigs/neg107.vsbsl @@ -1,108 +1,108 @@ -neg107.fsx(26,48,26,59): typecheck error FS0406: The byref-typed variable 'a' is used in an invalid way. Byrefs cannot be captured by closures or passed to inner functions. +neg107.fsx(25,48,25,59): typecheck error FS0406: The byref-typed variable 'a' is used in an invalid way. Byrefs cannot be captured by closures or passed to inner functions. -neg107.fsx(27,69,27,80): typecheck error FS0406: The byref-typed variable 'a' is used in an invalid way. Byrefs cannot be captured by closures or passed to inner functions. +neg107.fsx(26,69,26,80): typecheck error FS0406: The byref-typed variable 'a' is used in an invalid way. Byrefs cannot be captured by closures or passed to inner functions. -neg107.fsx(28,13,28,25): typecheck error FS3301: The function or method has an invalid return type '(unit -> Span)'. This is not permitted by the rules of Common IL. +neg107.fsx(27,13,27,25): typecheck error FS3301: The function or method has an invalid return type '(unit -> Span)'. This is not permitted by the rules of Common IL. -neg107.fsx(28,43,28,59): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. +neg107.fsx(27,43,27,59): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. -neg107.fsx(28,43,28,59): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. +neg107.fsx(27,43,27,59): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. -neg107.fsx(28,47,28,58): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. +neg107.fsx(27,47,27,58): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. -neg107.fsx(28,47,28,58): typecheck error FS0406: The byref-typed variable 'a' is used in an invalid way. Byrefs cannot be captured by closures or passed to inner functions. +neg107.fsx(27,47,27,58): typecheck error FS0406: The byref-typed variable 'a' is used in an invalid way. Byrefs cannot be captured by closures or passed to inner functions. -neg107.fsx(28,57,28,58): typecheck error FS0418: The byref typed value 'a' cannot be used at this point +neg107.fsx(27,57,27,58): typecheck error FS0418: The byref typed value 'a' cannot be used at this point -neg107.fsx(28,47,28,58): typecheck error FS0425: The type of a first-class function cannot contain byrefs +neg107.fsx(27,47,27,58): typecheck error FS0425: The type of a first-class function cannot contain byrefs -neg107.fsx(29,13,29,25): typecheck error FS3301: The function or method has an invalid return type '(unit -> ReadOnlySpan)'. This is not permitted by the rules of Common IL. +neg107.fsx(28,13,28,25): typecheck error FS3301: The function or method has an invalid return type '(unit -> ReadOnlySpan)'. This is not permitted by the rules of Common IL. -neg107.fsx(29,51,29,67): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. +neg107.fsx(28,51,28,67): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. -neg107.fsx(29,51,29,67): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. +neg107.fsx(28,51,28,67): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. -neg107.fsx(29,55,29,66): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. +neg107.fsx(28,55,28,66): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. -neg107.fsx(29,55,29,66): typecheck error FS0406: The byref-typed variable 'a' is used in an invalid way. Byrefs cannot be captured by closures or passed to inner functions. +neg107.fsx(28,55,28,66): typecheck error FS0406: The byref-typed variable 'a' is used in an invalid way. Byrefs cannot be captured by closures or passed to inner functions. -neg107.fsx(29,65,29,66): typecheck error FS0418: The byref typed value 'a' cannot be used at this point +neg107.fsx(28,65,28,66): typecheck error FS0418: The byref typed value 'a' cannot be used at this point -neg107.fsx(29,55,29,66): typecheck error FS0425: The type of a first-class function cannot contain byrefs +neg107.fsx(28,55,28,66): typecheck error FS0425: The type of a first-class function cannot contain byrefs -neg107.fsx(31,49,31,54): typecheck error FS0406: The byref-typed variable 'a' is used in an invalid way. Byrefs cannot be captured by closures or passed to inner functions. +neg107.fsx(30,49,30,54): typecheck error FS0406: The byref-typed variable 'a' is used in an invalid way. Byrefs cannot be captured by closures or passed to inner functions. -neg107.fsx(31,57,31,65): typecheck error FS0406: The byref-typed variable 'a' is used in an invalid way. Byrefs cannot be captured by closures or passed to inner functions. +neg107.fsx(30,57,30,65): typecheck error FS0406: The byref-typed variable 'a' is used in an invalid way. Byrefs cannot be captured by closures or passed to inner functions. -neg107.fsx(32,70,32,75): typecheck error FS0406: The byref-typed variable 'a' is used in an invalid way. Byrefs cannot be captured by closures or passed to inner functions. +neg107.fsx(31,70,31,75): typecheck error FS0406: The byref-typed variable 'a' is used in an invalid way. Byrefs cannot be captured by closures or passed to inner functions. -neg107.fsx(32,78,32,86): typecheck error FS0406: The byref-typed variable 'a' is used in an invalid way. Byrefs cannot be captured by closures or passed to inner functions. +neg107.fsx(31,78,31,86): typecheck error FS0406: The byref-typed variable 'a' is used in an invalid way. Byrefs cannot be captured by closures or passed to inner functions. -neg107.fsx(33,13,33,30): typecheck error FS3301: The function or method has an invalid return type 'Async>'. This is not permitted by the rules of Common IL. +neg107.fsx(32,13,32,30): typecheck error FS3301: The function or method has an invalid return type 'Async>'. This is not permitted by the rules of Common IL. -neg107.fsx(33,48,33,53): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. +neg107.fsx(32,48,32,53): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. -neg107.fsx(33,48,33,53): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. +neg107.fsx(32,48,32,53): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. -neg107.fsx(33,48,33,53): typecheck error FS0406: The byref-typed variable 'a' is used in an invalid way. Byrefs cannot be captured by closures or passed to inner functions. +neg107.fsx(32,48,32,53): typecheck error FS0406: The byref-typed variable 'a' is used in an invalid way. Byrefs cannot be captured by closures or passed to inner functions. -neg107.fsx(33,48,33,53): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. +neg107.fsx(32,48,32,53): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. -neg107.fsx(33,56,33,64): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. +neg107.fsx(32,56,32,64): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. -neg107.fsx(33,56,33,64): typecheck error FS0406: The byref-typed variable 'a' is used in an invalid way. Byrefs cannot be captured by closures or passed to inner functions. +neg107.fsx(32,56,32,64): typecheck error FS0406: The byref-typed variable 'a' is used in an invalid way. Byrefs cannot be captured by closures or passed to inner functions. -neg107.fsx(33,56,33,64): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. +neg107.fsx(32,56,32,64): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. -neg107.fsx(33,56,33,64): typecheck error FS0425: The type of a first-class function cannot contain byrefs +neg107.fsx(32,56,32,64): typecheck error FS0425: The type of a first-class function cannot contain byrefs -neg107.fsx(33,48,33,53): typecheck error FS0425: The type of a first-class function cannot contain byrefs +neg107.fsx(32,48,32,53): typecheck error FS0425: The type of a first-class function cannot contain byrefs -neg107.fsx(34,13,34,30): typecheck error FS3301: The function or method has an invalid return type 'Async>'. This is not permitted by the rules of Common IL. +neg107.fsx(33,13,33,30): typecheck error FS3301: The function or method has an invalid return type 'Async>'. This is not permitted by the rules of Common IL. -neg107.fsx(34,56,34,61): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. +neg107.fsx(33,56,33,61): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. -neg107.fsx(34,56,34,61): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. +neg107.fsx(33,56,33,61): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. -neg107.fsx(34,56,34,61): typecheck error FS0406: The byref-typed variable 'a' is used in an invalid way. Byrefs cannot be captured by closures or passed to inner functions. +neg107.fsx(33,56,33,61): typecheck error FS0406: The byref-typed variable 'a' is used in an invalid way. Byrefs cannot be captured by closures or passed to inner functions. -neg107.fsx(34,56,34,61): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. +neg107.fsx(33,56,33,61): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. -neg107.fsx(34,64,34,72): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. +neg107.fsx(33,64,33,72): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. -neg107.fsx(34,64,34,72): typecheck error FS0406: The byref-typed variable 'a' is used in an invalid way. Byrefs cannot be captured by closures or passed to inner functions. +neg107.fsx(33,64,33,72): typecheck error FS0406: The byref-typed variable 'a' is used in an invalid way. Byrefs cannot be captured by closures or passed to inner functions. -neg107.fsx(34,64,34,72): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. +neg107.fsx(33,64,33,72): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. -neg107.fsx(34,64,34,72): typecheck error FS0425: The type of a first-class function cannot contain byrefs +neg107.fsx(33,64,33,72): typecheck error FS0425: The type of a first-class function cannot contain byrefs -neg107.fsx(34,56,34,61): typecheck error FS0425: The type of a first-class function cannot contain byrefs +neg107.fsx(33,56,33,61): typecheck error FS0425: The type of a first-class function cannot contain byrefs -neg107.fsx(37,33,37,34): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. +neg107.fsx(36,33,36,34): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. -neg107.fsx(37,33,37,34): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. +neg107.fsx(36,33,36,34): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. -neg107.fsx(37,33,37,34): typecheck error FS0425: The type of a first-class function cannot contain byrefs +neg107.fsx(36,33,36,34): typecheck error FS0425: The type of a first-class function cannot contain byrefs -neg107.fsx(37,33,37,34): typecheck error FS0425: The type of a first-class function cannot contain byrefs +neg107.fsx(36,33,36,34): typecheck error FS0425: The type of a first-class function cannot contain byrefs -neg107.fsx(45,34,45,40): typecheck error FS3232: Struct members cannot return the address of fields of the struct by reference +neg107.fsx(44,34,44,40): typecheck error FS3232: Struct members cannot return the address of fields of the struct by reference -neg107.fsx(45,34,45,38): typecheck error FS3232: Struct members cannot return the address of fields of the struct by reference +neg107.fsx(44,34,44,38): typecheck error FS3232: Struct members cannot return the address of fields of the struct by reference -neg107.fsx(53,34,53,38): typecheck error FS3232: Struct members cannot return the address of fields of the struct by reference +neg107.fsx(52,34,52,38): typecheck error FS3232: Struct members cannot return the address of fields of the struct by reference -neg107.fsx(67,34,67,40): typecheck error FS3232: Struct members cannot return the address of fields of the struct by reference +neg107.fsx(66,34,66,40): typecheck error FS3232: Struct members cannot return the address of fields of the struct by reference -neg107.fsx(67,34,67,38): typecheck error FS3232: Struct members cannot return the address of fields of the struct by reference +neg107.fsx(66,34,66,38): typecheck error FS3232: Struct members cannot return the address of fields of the struct by reference -neg107.fsx(71,19,71,20): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. +neg107.fsx(70,19,70,20): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. -neg107.fsx(71,14,71,18): typecheck error FS0437: A type would store a byref typed value. This is not permitted by Common IL. +neg107.fsx(70,14,70,18): typecheck error FS0437: A type would store a byref typed value. This is not permitted by Common IL. -neg107.fsx(71,19,71,20): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. +neg107.fsx(70,19,70,20): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. -neg107.fsx(71,19,71,20): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. +neg107.fsx(70,19,70,20): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. -neg107.fsx(71,19,71,20): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. +neg107.fsx(70,19,70,20): typecheck error FS0412: A type instantiation involves a byref type. This is not permitted by the rules of Common IL. diff --git a/tests/fsharpqa/Source/CompilerOptions/fsc/determinism/env.lst b/tests/fsharpqa/Source/CompilerOptions/fsc/determinism/env.lst index 5767e939fda..870f3a95619 100644 --- a/tests/fsharpqa/Source/CompilerOptions/fsc/determinism/env.lst +++ b/tests/fsharpqa/Source/CompilerOptions/fsc/determinism/env.lst @@ -21,7 +21,7 @@ SOURCE=dummy.fs SCFLAGS="--debug:embedded" PRECMD="\$FSC_PIPE --debug:embedded dummy.fs && \$FSI_PIPE copyArtifacts.fsx" POSTCMD="\$FSI_PIPE --nologo --quiet --exec binaryCompare.fsx false" # Confirm in determinstic mode, the same file compiled twice leads to exactly the same exe & pdbs - SOURCE=dummy.fs SCFLAGS="--deterministic" PRECMD="\$FSC_PIPE --deterministic dummy.fs && \$FSI_PIPE copyArtifacts.fsx" POSTCMD="\$FSI_PIPE --nologo --quiet --exec binaryCompare.fsx true" + SOURCE=dummy.fs SCFLAGS="--deterministic" PRECMD="\$FSC_PIPE --deterministic dummy.fs && \$FSI_PIPE copyArtifacts.fsx" POSTCMD="\$FSI_PIPE --nologo --quiet --exec binaryCompare.fsx true" SOURCE=dummy.fs SCFLAGS="--deterministic --debug:portable" PRECMD="\$FSC_PIPE --deterministic --debug:portable dummy.fs && \$FSI_PIPE copyArtifacts.fsx" POSTCMD="\$FSI_PIPE --nologo --quiet --exec binaryCompare.fsx true" SOURCE=dummy.fs SCFLAGS="--deterministic --debug:embedded" PRECMD="\$FSC_PIPE --deterministic --debug:embedded dummy.fs && \$FSI_PIPE copyArtifacts.fsx" POSTCMD="\$FSI_PIPE --nologo --quiet --exec binaryCompare.fsx true" diff --git a/tests/fsharpqa/Source/Conformance/BasicTypeAndModuleDefinitions/RecordTypes/env.lst b/tests/fsharpqa/Source/Conformance/BasicTypeAndModuleDefinitions/RecordTypes/env.lst index 7d4fa2dc06f..30f2f6611c3 100644 --- a/tests/fsharpqa/Source/Conformance/BasicTypeAndModuleDefinitions/RecordTypes/env.lst +++ b/tests/fsharpqa/Source/Conformance/BasicTypeAndModuleDefinitions/RecordTypes/env.lst @@ -65,5 +65,6 @@ NoMT SOURCE=Overload_ToString.fs COMPILE_ONLY=1 SCFLAGS=--warnaserror+ FSIMOD SOURCE=E_RecordsNotNull02.fs # E_RecordsNotNull02.fs SOURCE=E_InheritRecord01.fs SCFLAGS="--test:ErrorRanges" # E_InheritRecord01.fs -ReqNOCov SOURCE=BigRecord01.fs # BigRecord01.fs +# Fails due to stack overflow. +#ReqNOCov SOURCE=BigRecord01.fs # BigRecord01.fs SOURCE=DuckTypingRecords01.fs # DuckTypingRecords01.fs \ No newline at end of file diff --git a/tests/fsharpqa/testenv/src/AssemblyVersionCheck/.gitignore b/tests/fsharpqa/testenv/src/AssemblyVersionCheck/.gitignore new file mode 100644 index 00000000000..c0e717b21de --- /dev/null +++ b/tests/fsharpqa/testenv/src/AssemblyVersionCheck/.gitignore @@ -0,0 +1,2 @@ +# this file has to be dynamically written at build time +assemblies.fsx diff --git a/tests/fsharpqa/testenv/src/AssemblyVersionCheck/AssemblyVersionCheck.fsx b/tests/fsharpqa/testenv/src/AssemblyVersionCheck/AssemblyVersionCheck.fsx index 8554c7b46d2..727916d4986 100644 --- a/tests/fsharpqa/testenv/src/AssemblyVersionCheck/AssemblyVersionCheck.fsx +++ b/tests/fsharpqa/testenv/src/AssemblyVersionCheck/AssemblyVersionCheck.fsx @@ -1,7 +1,7 @@ // Copyright (c) Microsoft Corporation. All Rights Reserved. See License.txt in the project root for license information. -// this was restored by packages.config in the root -#r @"..\..\..\..\..\packages\Newtonsoft.Json.9.0.1\lib\net45\Newtonsoft.Json.dll" +// this points to assemblies that were restored by packages.config in the root +#load "assemblies.fsx" open System open System.Diagnostics diff --git a/tests/fsharpqa/testenv/src/Directory.Build.props b/tests/fsharpqa/testenv/src/Directory.Build.props new file mode 100644 index 00000000000..bb8eac309b1 --- /dev/null +++ b/tests/fsharpqa/testenv/src/Directory.Build.props @@ -0,0 +1,3 @@ + + + diff --git a/tests/fsharpqa/testenv/src/Directory.Build.targets b/tests/fsharpqa/testenv/src/Directory.Build.targets new file mode 100644 index 00000000000..ccd47cc0a9a --- /dev/null +++ b/tests/fsharpqa/testenv/src/Directory.Build.targets @@ -0,0 +1,3 @@ + + + diff --git a/tests/fsharpqa/testenv/src/HostedCompilerServer/HostedCompilerServer.fsproj b/tests/fsharpqa/testenv/src/HostedCompilerServer/HostedCompilerServer.fsproj index 1a79ff36d5b..994b9060c14 100644 --- a/tests/fsharpqa/testenv/src/HostedCompilerServer/HostedCompilerServer.fsproj +++ b/tests/fsharpqa/testenv/src/HostedCompilerServer/HostedCompilerServer.fsproj @@ -1,59 +1,27 @@  - - - $(MSBuildProjectDirectory)\..\..\..\..\..\src - - + + - Debug - AnyCPU - 2.0 - 4239efea-e746-446a-bf7a-51fcbab13946 + net46 Exe - HostedCompilerServer - HostedCompilerServer - v4.6 - true - ..\..\bin - true - HostedCompilerServer - 3 - AnyCPU - true - - - - false - false - DEBUG;TRACE - - - true - true - TRACE + true + true + false + $(RepoRoot)tests\fsharpqa\testenv\bin + + + + + + + - - - - - - {DED3BBD7-53F4-428A-8C9F-27968E768605} - FSharp.Core - - - {2E4D67B4-522D-4CF7-97E4-BA940F0B18F3} - FSharp.Compiler.Private - - - $(FSharpSourcesRoot)\..\packages\System.ValueTuple.$(SystemValueTuplePackageVersion)\lib\netstandard1.0\System.ValueTuple.dll - true - + - - \ No newline at end of file + diff --git a/tests/fsharpqa/testenv/src/ILComparer/ILComparer.fsproj b/tests/fsharpqa/testenv/src/ILComparer/ILComparer.fsproj index 968fc2e137f..c530b623a40 100644 --- a/tests/fsharpqa/testenv/src/ILComparer/ILComparer.fsproj +++ b/tests/fsharpqa/testenv/src/ILComparer/ILComparer.fsproj @@ -1,51 +1,22 @@  - + + - $(MSBuildProjectDirectory)\..\..\..\..\..\src - - - - Debug - AnyCPU - 2.0 - {2e60864a-e3ff-4bcc-810f-dc7c34e6b236} + net45 Exe - ILComparer - ILComparer - v4.5 - true - 4.4.1.0 - ILComparer - ..\..\bin\ - true - $(OutputPath)$(AssemblyName).xml - 3 - AnyCPU - true - - - false - false - DEBUG;TRACE - - - true - true - TRACE + true + true + false + $(RepoRoot)tests\fsharpqa\testenv\bin + + - - - - - - {DED3BBD7-53F4-428A-8C9F-27968E768605} - FSharp.Core - + - + \ No newline at end of file diff --git a/tests/fsharpqa/testenv/src/PEVerify/PEVerify.csproj b/tests/fsharpqa/testenv/src/PEVerify/PEVerify.csproj index 3af2b4d23db..9b2a2104693 100644 --- a/tests/fsharpqa/testenv/src/PEVerify/PEVerify.csproj +++ b/tests/fsharpqa/testenv/src/PEVerify/PEVerify.csproj @@ -3,6 +3,7 @@ Exe net46 + $(NoWarn);1591 diff --git a/tests/fsharpqa/testenv/src/nunit/nunit-console-x86.exe.config b/tests/fsharpqa/testenv/src/nunit/nunit-console-x86.exe.config deleted file mode 100644 index 5120c0dc91d..00000000000 --- a/tests/fsharpqa/testenv/src/nunit/nunit-console-x86.exe.config +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - diff --git a/tests/fsharpqa/testenv/src/nunit/nunit-console.exe.config b/tests/fsharpqa/testenv/src/nunit/nunit-console.exe.config deleted file mode 100644 index 22ef7d3b63d..00000000000 --- a/tests/fsharpqa/testenv/src/nunit/nunit-console.exe.config +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - diff --git a/tests/projects/Directory.Build.props b/tests/projects/Directory.Build.props new file mode 100644 index 00000000000..bb5b23d29d0 --- /dev/null +++ b/tests/projects/Directory.Build.props @@ -0,0 +1,3 @@ + + + diff --git a/tests/projects/Directory.Build.targets b/tests/projects/Directory.Build.targets new file mode 100644 index 00000000000..bb5b23d29d0 --- /dev/null +++ b/tests/projects/Directory.Build.targets @@ -0,0 +1,3 @@ + + + diff --git a/tests/projects/Sample_NETCoreSDK_FSharp_Library_netstandard2_0/Directory.Build.props b/tests/projects/Sample_NETCoreSDK_FSharp_Library_netstandard2_0/Directory.Build.props new file mode 100644 index 00000000000..bb8eac309b1 --- /dev/null +++ b/tests/projects/Sample_NETCoreSDK_FSharp_Library_netstandard2_0/Directory.Build.props @@ -0,0 +1,3 @@ + + + diff --git a/tests/projects/Sample_NETCoreSDK_FSharp_Library_netstandard2_0/Directory.Build.targets b/tests/projects/Sample_NETCoreSDK_FSharp_Library_netstandard2_0/Directory.Build.targets new file mode 100644 index 00000000000..ccd47cc0a9a --- /dev/null +++ b/tests/projects/Sample_NETCoreSDK_FSharp_Library_netstandard2_0/Directory.Build.targets @@ -0,0 +1,3 @@ + + + diff --git a/tests/projects/misc/Directory.Build.props b/tests/projects/misc/Directory.Build.props new file mode 100644 index 00000000000..056d3552497 --- /dev/null +++ b/tests/projects/misc/Directory.Build.props @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/tests/projects/misc/Directory.Build.targets b/tests/projects/misc/Directory.Build.targets new file mode 100644 index 00000000000..056d3552497 --- /dev/null +++ b/tests/projects/misc/Directory.Build.targets @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/tests/projects/misc/ProjectWithBuildErrors/ProjectWithBuildErrors/ProjectWithBuildErrors.fsproj b/tests/projects/misc/ProjectWithBuildErrors/ProjectWithBuildErrors/ProjectWithBuildErrors.fsproj index 43aa06b77c7..b1a44ceda79 100644 --- a/tests/projects/misc/ProjectWithBuildErrors/ProjectWithBuildErrors/ProjectWithBuildErrors.fsproj +++ b/tests/projects/misc/ProjectWithBuildErrors/ProjectWithBuildErrors/ProjectWithBuildErrors.fsproj @@ -1,83 +1,15 @@  - - + + - Debug - AnyCPU - 2.0 - 9eda4075-e1e5-4f51-8908-5d608c092254 - Exe - ProjectWithBuildErrors - ProjectWithBuildErrors - v4.5.2 - true + net452 4.4.1.0 - ProjectWithBuildErrors - - true - full - false - false - bin\$(Configuration)\ - DEBUG;TRACE - 3 - AnyCPU - bin\$(Configuration)\$(AssemblyName).XML - true - - - pdbonly - true - true - bin\$(Configuration)\ - TRACE - 3 - AnyCPU - bin\$(Configuration)\$(AssemblyName).XML - true - - - 11 - - - - - $(MSBuildExtensionsPath32)\..\Microsoft SDKs\F#\3.0\Framework\v4.0\Microsoft.FSharp.Targets - - - - - $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\FSharp\Microsoft.FSharp.Targets - - - - + - - - - - - FSharp.Core - FSharp.Core.dll - $(MSBuildProgramFiles32)\Reference Assemblies\Microsoft\FSharp\.NETFramework\v4.0\$(TargetFSharpCoreVersion)\FSharp.Core.dll - - - - - - ..\packages\System.ValueTuple.4.4.0\lib\netstandard1.0\System.ValueTuple.dll - - - \ No newline at end of file + + diff --git a/tests/projects/misc/ProjectWithBuildErrors/ProjectWithBuildErrors/packages.config b/tests/projects/misc/ProjectWithBuildErrors/ProjectWithBuildErrors/packages.config deleted file mode 100644 index 4db38eab9ce..00000000000 --- a/tests/projects/misc/ProjectWithBuildErrors/ProjectWithBuildErrors/packages.config +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/tests/projects/misc/SameFileBelongsToMultipleProjects/Library2/Library2.fsproj b/tests/projects/misc/SameFileBelongsToMultipleProjects/Library2/Library2.fsproj index 2bbd1c6f286..090a7331af6 100644 --- a/tests/projects/misc/SameFileBelongsToMultipleProjects/Library2/Library2.fsproj +++ b/tests/projects/misc/SameFileBelongsToMultipleProjects/Library2/Library2.fsproj @@ -1,81 +1,17 @@  - - + + - Debug - AnyCPU - 2.0 - e72ee9de-323e-4f99-8d7e-1a1ed8a3477c - Library - Library2 - Library2 - v4.5.2 + net452 4.4.1.0 - true - Library2 - - true - full - false - false - bin\$(Configuration)\ - DEBUG;TRACE - 3 - bin\$(Configuration)\$(AssemblyName).XML - - - pdbonly - true - true - bin\$(Configuration)\ - RELEASE;TRACE - 3 - bin\$(Configuration)\$(AssemblyName).XML - - - 11 - - - - - $(MSBuildExtensionsPath32)\..\Microsoft SDKs\F#\3.0\Framework\v4.0\Microsoft.FSharp.Targets - - - - - $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\FSharp\Microsoft.FSharp.Targets - - - - + Class.fs - - - - - - FSharp.Core - FSharp.Core.dll - $(MSBuildProgramFiles32)\Reference Assemblies\Microsoft\FSharp\.NETFramework\v4.0\$(TargetFSharpCoreVersion)\FSharp.Core.dll - - - - - - ..\packages\System.ValueTuple.4.4.0\lib\netstandard1.0\System.ValueTuple.dll - - - \ No newline at end of file + + diff --git a/tests/projects/misc/SameFileBelongsToMultipleProjects/Library2/packages.config b/tests/projects/misc/SameFileBelongsToMultipleProjects/Library2/packages.config deleted file mode 100644 index 4db38eab9ce..00000000000 --- a/tests/projects/misc/SameFileBelongsToMultipleProjects/Library2/packages.config +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/tests/projects/misc/SameFileBelongsToMultipleProjects/SameFileBelongsToMultipleProjects/SameFileBelongsToMultipleProjects.fsproj b/tests/projects/misc/SameFileBelongsToMultipleProjects/SameFileBelongsToMultipleProjects/SameFileBelongsToMultipleProjects.fsproj index 5215c45575c..f8ab90c7837 100644 --- a/tests/projects/misc/SameFileBelongsToMultipleProjects/SameFileBelongsToMultipleProjects/SameFileBelongsToMultipleProjects.fsproj +++ b/tests/projects/misc/SameFileBelongsToMultipleProjects/SameFileBelongsToMultipleProjects/SameFileBelongsToMultipleProjects.fsproj @@ -1,90 +1,19 @@  - - + + - Debug - AnyCPU - 2.0 - df29450f-abd7-49fb-96c5-c9cae9a54f40 - Exe - ConsoleApplication1 - ConsoleApplication1 - v4.5.2 - true + net452> 4.4.1.0 - SameFileBelongsToMultipleProjects - - true - full - false - false - bin\$(Configuration)\ - DEBUG;TRACE - 3 - AnyCPU - bin\$(Configuration)\$(AssemblyName).XML - true - - - pdbonly - true - true - bin\$(Configuration)\ - TRACE - 3 - AnyCPU - bin\$(Configuration)\$(AssemblyName).XML - true - - - - - FSharp.Core - FSharp.Core.dll - $(MSBuildProgramFiles32)\Reference Assemblies\Microsoft\FSharp\.NETFramework\v4.0\$(TargetFSharpCoreVersion)\FSharp.Core.dll - - - ..\packages\System.ValueTuple.4.4.0\lib\netstandard1.0\System.ValueTuple.dll - True - - - - - + + - - Library2 - {e72ee9de-323e-4f99-8d7e-1a1ed8a3477c} - True - + - - 11 - - - - - $(MSBuildExtensionsPath32)\..\Microsoft SDKs\F#\3.0\Framework\v4.0\Microsoft.FSharp.Targets - - - - - $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\FSharp\Microsoft.FSharp.Targets - - - - - - \ No newline at end of file + + diff --git a/tests/projects/misc/TestProjectChanges/Library1AlwaysInMatchingConfiguration/Library1AlwaysInMatchingConfiguration.fsproj b/tests/projects/misc/TestProjectChanges/Library1AlwaysInMatchingConfiguration/Library1AlwaysInMatchingConfiguration.fsproj index a69c8f4efe2..7b711f61660 100644 --- a/tests/projects/misc/TestProjectChanges/Library1AlwaysInMatchingConfiguration/Library1AlwaysInMatchingConfiguration.fsproj +++ b/tests/projects/misc/TestProjectChanges/Library1AlwaysInMatchingConfiguration/Library1AlwaysInMatchingConfiguration.fsproj @@ -1,77 +1,14 @@  - - + + - Debug - AnyCPU - 2.0 - 9f36577a-657b-4117-a118-f69ab182aa31 - Library - Library1AlwaysInMatchingConfiguration - Library1AlwaysInMatchingConfiguration - v4.5.2 + net452 4.4.1.0 - true - Library1AlwaysInMatchingConfiguration - - true - full - false - false - bin\$(Configuration)\ - DEBUG;TRACE - 3 - bin\$(Configuration)\$(AssemblyName).XML - - - pdbonly - true - true - bin\$(Configuration)\ - RELEASE;TRACE - 3 - bin\$(Configuration)\$(AssemblyName).XML - - - 11 - - - - - $(MSBuildExtensionsPath32)\..\Microsoft SDKs\F#\3.0\Framework\v4.0\Microsoft.FSharp.Targets - - - - - $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\FSharp\Microsoft.FSharp.Targets - - - - + - - - - FSharp.Core - FSharp.Core.dll - $(MSBuildProgramFiles32)\Reference Assemblies\Microsoft\FSharp\.NETFramework\v4.0\$(TargetFSharpCoreVersion)\FSharp.Core.dll - - - - - - ..\packages\System.ValueTuple.4.4.0\lib\netstandard1.0\System.ValueTuple.dll - - - - \ No newline at end of file + + diff --git a/tests/projects/misc/TestProjectChanges/Library2AlwaysInDebugConfiguration/Library2AlwaysInDebugConfiguration.fsproj b/tests/projects/misc/TestProjectChanges/Library2AlwaysInDebugConfiguration/Library2AlwaysInDebugConfiguration.fsproj index a39259e1911..7b711f61660 100644 --- a/tests/projects/misc/TestProjectChanges/Library2AlwaysInDebugConfiguration/Library2AlwaysInDebugConfiguration.fsproj +++ b/tests/projects/misc/TestProjectChanges/Library2AlwaysInDebugConfiguration/Library2AlwaysInDebugConfiguration.fsproj @@ -1,78 +1,14 @@  - - + + - Debug - AnyCPU - 2.0 - e72ee9de-323e-4f99-8d7e-1a1ed8a3477c - Library - Library2AlwaysInDebugConfiguration - Library2AlwaysInDebugConfiguration - v4.5.2 + net452 4.4.1.0 - true - Library2AlwaysInDebugConfiguration - - true - full - false - false - bin\$(Configuration)\ - DEBUG;TRACE - 3 - bin\$(Configuration)\$(AssemblyName).XML - - - pdbonly - true - true - bin\$(Configuration)\ - RELEASE;TRACE - 3 - bin\$(Configuration)\$(AssemblyName).XML - - - 11 - - - - - $(MSBuildExtensionsPath32)\..\Microsoft SDKs\F#\3.0\Framework\v4.0\Microsoft.FSharp.Targets - - - - - $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\FSharp\Microsoft.FSharp.Targets - - - - + - - - - - - FSharp.Core - FSharp.Core.dll - $(MSBuildProgramFiles32)\Reference Assemblies\Microsoft\FSharp\.NETFramework\v4.0\$(TargetFSharpCoreVersion)\FSharp.Core.dll - - - - - - ..\packages\System.ValueTuple.4.4.0\lib\netstandard1.0\System.ValueTuple.dll - - - \ No newline at end of file + + diff --git a/tests/projects/misc/TestProjectChanges/Library2AlwaysInDebugConfiguration/packages.config b/tests/projects/misc/TestProjectChanges/Library2AlwaysInDebugConfiguration/packages.config deleted file mode 100644 index 4db38eab9ce..00000000000 --- a/tests/projects/misc/TestProjectChanges/Library2AlwaysInDebugConfiguration/packages.config +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/tests/projects/misc/TestProjectChanges/TestProjectChanges/TestProjectChanges.fsproj b/tests/projects/misc/TestProjectChanges/TestProjectChanges/TestProjectChanges.fsproj index 1428be05684..3c5f9cd080f 100644 --- a/tests/projects/misc/TestProjectChanges/TestProjectChanges/TestProjectChanges.fsproj +++ b/tests/projects/misc/TestProjectChanges/TestProjectChanges/TestProjectChanges.fsproj @@ -1,96 +1,20 @@  - - + + - Debug - AnyCPU - 2.0 - df29450f-abd7-49fb-96c5-c9cae9a54f40 - Exe - ConsoleApplication1 - ConsoleApplication1 - v4.5.2 - true + net452 4.4.1.0 - TestProjectChanges - - - true - full - false - false - bin\$(Configuration)\ - DEBUG;TRACE - 3 - AnyCPU - bin\$(Configuration)\$(AssemblyName).XML - true - - - pdbonly - true - true - bin\$(Configuration)\ - TRACE - 3 - AnyCPU - bin\$(Configuration)\$(AssemblyName).XML - true - - - - FSharp.Core - FSharp.Core.dll - $(MSBuildProgramFiles32)\Reference Assemblies\Microsoft\FSharp\.NETFramework\v4.0\$(TargetFSharpCoreVersion)\FSharp.Core.dll - - - ..\packages\System.ValueTuple.4.4.0\lib\netstandard1.0\System.ValueTuple.dll - True - - - - - + + - - Library1AlwaysInMatchingConfiguration - {9f36577a-657b-4117-a118-f69ab182aa31} - True - - - Library2AlwaysInDebugConfiguration - {e72ee9de-323e-4f99-8d7e-1a1ed8a3477c} - True - + + - - 11 - - - - - $(MSBuildExtensionsPath32)\..\Microsoft SDKs\F#\3.0\Framework\v4.0\Microsoft.FSharp.Targets - - - - - $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\FSharp\Microsoft.FSharp.Targets - - - - - - + diff --git a/tests/service/EditorTests.fs b/tests/service/EditorTests.fs index 5edcd2da94c..6579a72cc1b 100644 --- a/tests/service/EditorTests.fs +++ b/tests/service/EditorTests.fs @@ -1092,7 +1092,7 @@ let _ = RegexTypedStatic.IsMatch<"ABC" >( (*$*) ) // TEST: no assert on Ctrl-sp File.WriteAllText(fileName1, fileSource1) let fileLines1 = File.ReadAllLines(fileName1) let fileNames = [fileName1] - let args = Array.append (mkProjectCommandLineArgs (dllName, fileNames)) [| "-r:" + PathRelativeToTestAssembly(@"UnitTests\MockTypeProviders\DummyProviderForLanguageServiceTesting.dll") |] + let args = Array.append (mkProjectCommandLineArgs (dllName, fileNames)) [| "-r:" + PathRelativeToTestAssembly(@"DummyProviderForLanguageServiceTesting.dll") |] let options = checker.GetProjectOptionsFromCommandLineArgs (projFileName, args) let cleanFileName a = if a = fileName1 then "file1" else "??" diff --git a/tests/service/data/CSharp_Analysis/CSharp_Analysis.csproj b/tests/service/data/CSharp_Analysis/CSharp_Analysis.csproj index 4f88e4a7873..4fc4184b23d 100644 --- a/tests/service/data/CSharp_Analysis/CSharp_Analysis.csproj +++ b/tests/service/data/CSharp_Analysis/CSharp_Analysis.csproj @@ -1,58 +1,11 @@  - - + + - Debug - AnyCPU - {887630A3-4B1D-40EA-B8B3-2D842E9C40DB} - Library - Properties - CSharp_Analysis - CSharp_Analysis - v4.5 - ..\..\..\..\ - ..\..\..\..\$(Configuration)\net40\bin - 512 - + net45 + 1.0.0.0 + nunit + $(NoWarn);0067;1591 - - true - full - false - DEBUG;TRACE - prompt - 4 - - - pdbonly - true - TRACE - prompt - 4 - - - - - - - - - - - - - - - - - - - - ..\..\..\..\packages\NUnit.3.5.0\lib\net45\nunit.framework.dll - True - True - - - - - \ No newline at end of file + + diff --git a/tests/service/data/CSharp_Analysis/Properties/AssemblyInfo.cs b/tests/service/data/CSharp_Analysis/Properties/AssemblyInfo.cs index 6c36814e769..641372fb96d 100644 --- a/tests/service/data/CSharp_Analysis/Properties/AssemblyInfo.cs +++ b/tests/service/data/CSharp_Analysis/Properties/AssemblyInfo.cs @@ -2,35 +2,7 @@ using System.Runtime.CompilerServices; using System.Runtime.InteropServices; -// Allgemeine Informationen über eine Assembly werden über die folgenden -// Attribute gesteuert. Ändern Sie diese Attributwerte, um die Informationen zu ändern, -// die mit einer Assembly verknüpft sind. -[assembly: AssemblyTitle("CSharp_Analysis")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("CSharp_Analysis")] -[assembly: AssemblyCopyright("Copyright © 2015")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - // Durch Festlegen von ComVisible auf "false" werden die Typen in dieser Assembly unsichtbar // für COM-Komponenten. Wenn Sie auf einen Typ in dieser Assembly von // COM zugreifen müssen, legen Sie das ComVisible-Attribut für diesen Typ auf "true" fest. [assembly: ComVisible(false)] - -// Die folgende GUID bestimmt die ID der Typbibliothek, wenn dieses Projekt für COM verfügbar gemacht wird -[assembly: Guid("e1b15939-475d-4134-a76c-20845e07be39")] - -// Versionsinformationen für eine Assembly bestehen aus den folgenden vier Werten: -// -// Hauptversion -// Nebenversion -// Buildnummer -// Revision -// -// Sie können alle Werte angeben oder die standardmäßigen Build- und Revisionsnummern -// übernehmen, indem Sie "*" eingeben: -// [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.0.0.0")] -[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/tests/service/data/Directory.Build.props b/tests/service/data/Directory.Build.props new file mode 100644 index 00000000000..bb8eac309b1 --- /dev/null +++ b/tests/service/data/Directory.Build.props @@ -0,0 +1,3 @@ + + + diff --git a/tests/service/data/Directory.Build.targets b/tests/service/data/Directory.Build.targets new file mode 100644 index 00000000000..ccd47cc0a9a --- /dev/null +++ b/tests/service/data/Directory.Build.targets @@ -0,0 +1,3 @@ + + + diff --git a/tests/service/data/TestTP/TestTP.fsproj b/tests/service/data/TestTP/TestTP.fsproj index 2e0ac9aa194..c56ec5f349b 100644 --- a/tests/service/data/TestTP/TestTP.fsproj +++ b/tests/service/data/TestTP/TestTP.fsproj @@ -1,76 +1,21 @@  - + + - $(MSBuildProjectDirectory)\..\..\..\..\src - - - - Debug - AnyCPU - 2.0 - ff76bd3c-5e0a-4752-b6c3-044f6e15719b - Library - TestTP - TestTP - v4.5 - true - TestTP - ..\..\..\..\$(Configuration)\net40\bin - - - - true - full - false - false - DEBUG;TRACE - 3 - AnyCPU - bin\Debug\TestTP.xml - true - - - pdbonly - true - true - TRACE - 3 - AnyCPU - bin\Release\TestTP.xml - true + net45 + true + nunit + + - - - ..\..\..\..\packages\Microsoft.Portable.FSharp.Core.10.1.0\lib\profiles\net40\FSharp.Core.dll - false - - - - - - - - CSharp_Analysis - {887630a3-4b1d-40ea-b8b3-2d842e9c40db} - True - + + - - - - - ..\..\..\..\packages\NUnit\lib\nunit.framework.dll - True - True - - - - - + diff --git a/vsintegration/Directory.Build.targets b/vsintegration/Directory.Build.targets index 8e55b927f97..0a555189d7e 100644 --- a/vsintegration/Directory.Build.targets +++ b/vsintegration/Directory.Build.targets @@ -2,24 +2,15 @@ - - - net462 - - - true + $(NuGetPackageRoot)Microsoft.VSSDK.BuildTools\$(MicrosoftVSSDKBuildToolsPackageVersion) - - - - + + + + diff --git a/vsintegration/Utils/LanguageServiceProfiling/LanguageServiceProfiling.fsproj b/vsintegration/Utils/LanguageServiceProfiling/LanguageServiceProfiling.fsproj index a61ba873ce9..dfe6034dfce 100644 --- a/vsintegration/Utils/LanguageServiceProfiling/LanguageServiceProfiling.fsproj +++ b/vsintegration/Utils/LanguageServiceProfiling/LanguageServiceProfiling.fsproj @@ -7,6 +7,7 @@ true $(SystemValueTuplePackageVersion) true + true diff --git a/vsintegration/Vsix/Directory.Build.props b/vsintegration/Vsix/Directory.Build.props index 9f5ffe146fe..2a730726842 100644 --- a/vsintegration/Vsix/Directory.Build.props +++ b/vsintegration/Vsix/Directory.Build.props @@ -4,7 +4,6 @@ RoslynDev - false false true $(VSRootSuffix) diff --git a/vsintegration/Vsix/VisualFSharpFull/VisualFSharpFull.csproj b/vsintegration/Vsix/VisualFSharpFull/VisualFSharpFull.csproj index 2b640de5112..54b61728a7f 100644 --- a/vsintegration/Vsix/VisualFSharpFull/VisualFSharpFull.csproj +++ b/vsintegration/Vsix/VisualFSharpFull/VisualFSharpFull.csproj @@ -22,7 +22,7 @@ License.txt true - + PreserveNewest FSharp.Data.TypeProviders.dll true @@ -39,6 +39,7 @@ All 2 True + TargetFramework=net46 {649FA588-F02E-457C-9FCF-87E46407481E} @@ -49,6 +50,7 @@ All 2 True + TargetFramework=net46 {D5870CF0-ED51-4CBC-B3D7-6F56DA84AC06} @@ -59,6 +61,7 @@ All 2 True + TargetFramework=net46 {2E4D67B4-522D-4CF7-97E4-BA940F0B18F3} @@ -69,6 +72,7 @@ All 2 True + TargetFramework=net46 {DED3BBD7-53F4-428A-8C9F-27968E768605} @@ -79,6 +83,7 @@ All 2 True + TargetFramework=net45 {8B3E283D-B5FE-4055-9D80-7E3A32F3967B} @@ -90,6 +95,7 @@ X64 2 True + TargetFramework=net46 {D0E98C0D-490B-4C61-9329-0862F6E87645} @@ -101,6 +107,7 @@ X86 2 True + TargetFramework=net46 {C94C257C-3C0A-4858-B5D8-D746498D1F08} @@ -112,6 +119,7 @@ All 2 True + TargetFramework=net46 {65e0e82a-eace-4787-8994-888674c2fe87} diff --git a/vsintegration/Vsix/VisualFSharpTemplates/VisualFSharpTemplates.csproj b/vsintegration/Vsix/VisualFSharpTemplates/VisualFSharpTemplates.csproj index 461fb062bfc..0267329af35 100644 --- a/vsintegration/Vsix/VisualFSharpTemplates/VisualFSharpTemplates.csproj +++ b/vsintegration/Vsix/VisualFSharpTemplates/VisualFSharpTemplates.csproj @@ -10,12 +10,12 @@ - + PreserveNewest packages\FSharp.Core.4.5.2.nupkg true - + PreserveNewest packages\System.ValueTuple.4.4.0.nupkg true diff --git a/vsintegration/fsharp-vsintegration-item-templates-build.proj b/vsintegration/fsharp-vsintegration-item-templates-build.proj index 7a463780dca..0a1fd670f91 100644 --- a/vsintegration/fsharp-vsintegration-item-templates-build.proj +++ b/vsintegration/fsharp-vsintegration-item-templates-build.proj @@ -5,13 +5,13 @@ - - - - - - - + + + + + + + diff --git a/vsintegration/fsharp-vsintegration-project-templates-build.proj b/vsintegration/fsharp-vsintegration-project-templates-build.proj index 59683fa3f98..da89b3a5d23 100644 --- a/vsintegration/fsharp-vsintegration-project-templates-build.proj +++ b/vsintegration/fsharp-vsintegration-project-templates-build.proj @@ -5,9 +5,9 @@ - - - + + + diff --git a/vsintegration/fsharp-vsintegration-src-build.proj b/vsintegration/fsharp-vsintegration-src-build.proj index 0b32bade2c2..93a8fbfd273 100644 --- a/vsintegration/fsharp-vsintegration-src-build.proj +++ b/vsintegration/fsharp-vsintegration-src-build.proj @@ -6,15 +6,15 @@ - - - - - - - - - + + + + + + + + + diff --git a/vsintegration/fsharp-vsintegration-unittests-build.proj b/vsintegration/fsharp-vsintegration-unittests-build.proj index 3ec0e0c1366..489e91ad2e9 100644 --- a/vsintegration/fsharp-vsintegration-unittests-build.proj +++ b/vsintegration/fsharp-vsintegration-unittests-build.proj @@ -1,39 +1,30 @@ - - net40 - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + - + diff --git a/vsintegration/fsharp-vsintegration-vsix-build.proj b/vsintegration/fsharp-vsintegration-vsix-build.proj index d7f6d10b430..c208129ec44 100644 --- a/vsintegration/fsharp-vsintegration-vsix-build.proj +++ b/vsintegration/fsharp-vsintegration-vsix-build.proj @@ -1,12 +1,9 @@ - - net40 - - - + + diff --git a/vsintegration/src/FSharp.Editor/FSharp.Editor.fsproj b/vsintegration/src/FSharp.Editor/FSharp.Editor.fsproj index 3e011cb5d08..98d8e28f771 100644 --- a/vsintegration/src/FSharp.Editor/FSharp.Editor.fsproj +++ b/vsintegration/src/FSharp.Editor/FSharp.Editor.fsproj @@ -11,7 +11,7 @@ true $(SystemValueTuplePackageVersion) $(OtherFlags) --warnon:1182 --subsystemversion:6.00 - true + true false diff --git a/vsintegration/src/FSharp.LanguageService.Base/FSharp.LanguageService.Base.csproj b/vsintegration/src/FSharp.LanguageService.Base/FSharp.LanguageService.Base.csproj index 4cdef16b685..ce5cfed08aa 100644 --- a/vsintegration/src/FSharp.LanguageService.Base/FSharp.LanguageService.Base.csproj +++ b/vsintegration/src/FSharp.LanguageService.Base/FSharp.LanguageService.Base.csproj @@ -4,12 +4,11 @@ Library - false true false $(NoWarn);1570;1574;1587;1591;3001,3002,3003 true - true + true false @@ -60,6 +59,7 @@ + diff --git a/vsintegration/src/FSharp.LanguageService/FSharp.LanguageService.fsproj b/vsintegration/src/FSharp.LanguageService/FSharp.LanguageService.fsproj index a93173f1693..ccd97fff422 100644 --- a/vsintegration/src/FSharp.LanguageService/FSharp.LanguageService.fsproj +++ b/vsintegration/src/FSharp.LanguageService/FSharp.LanguageService.fsproj @@ -12,7 +12,7 @@ true $(SystemValueTuplePackageVersion) $(OtherFlags) --warnon:1182 --subsystemversion:6.00 - true + true false diff --git a/vsintegration/src/FSharp.PatternMatcher/FSharp.PatternMatcher.csproj b/vsintegration/src/FSharp.PatternMatcher/FSharp.PatternMatcher.csproj index da6305fb62c..0ae980c7049 100644 --- a/vsintegration/src/FSharp.PatternMatcher/FSharp.PatternMatcher.csproj +++ b/vsintegration/src/FSharp.PatternMatcher/FSharp.PatternMatcher.csproj @@ -4,7 +4,6 @@ Library - false true diff --git a/vsintegration/src/FSharp.ProjectSystem.Base/Project/ProjectSystem.Base.csproj b/vsintegration/src/FSharp.ProjectSystem.Base/Project/ProjectSystem.Base.csproj index 5698b15ab62..b8634a9cdd7 100644 --- a/vsintegration/src/FSharp.ProjectSystem.Base/Project/ProjectSystem.Base.csproj +++ b/vsintegration/src/FSharp.ProjectSystem.Base/Project/ProjectSystem.Base.csproj @@ -5,14 +5,13 @@ Library FSharp.ProjectSystem.Base - false true false $(NoWarn),1570,1572,1573,1574,1591,3001,3002,3003,3005,3008,3009,3021,3024 $(DefineConstants);CODE_ANALYSIS Microsoft.VisualStudio.FSharp.ProjectSystem true - true + true false diff --git a/vsintegration/src/FSharp.ProjectSystem.FSharp/ProjectSystem.fsproj b/vsintegration/src/FSharp.ProjectSystem.FSharp/ProjectSystem.fsproj index 44cc567704d..264584077ef 100644 --- a/vsintegration/src/FSharp.ProjectSystem.FSharp/ProjectSystem.fsproj +++ b/vsintegration/src/FSharp.ProjectSystem.FSharp/ProjectSystem.fsproj @@ -12,7 +12,7 @@ true $(SystemValueTuplePackageVersion) $(OtherFlags) --warnon:1182 --subsystemversion:6.00 - true + true false @@ -91,6 +91,7 @@ + diff --git a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/FSharp.PropertiesPages.vbproj b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/FSharp.PropertiesPages.vbproj index 136f0b001df..8e8042c83a0 100644 --- a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/FSharp.PropertiesPages.vbproj +++ b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/FSharp.PropertiesPages.vbproj @@ -33,7 +33,7 @@ true true true - true + true true false diff --git a/vsintegration/src/FSharp.UIResources/FSharp.UIResources.csproj b/vsintegration/src/FSharp.UIResources/FSharp.UIResources.csproj index 0bc0e961369..dd0c543cb54 100644 --- a/vsintegration/src/FSharp.UIResources/FSharp.UIResources.csproj +++ b/vsintegration/src/FSharp.UIResources/FSharp.UIResources.csproj @@ -5,7 +5,6 @@ Library $(NoWarn);1591 - false Microsoft.VisualStudio.FSharp.UIResources $(NoWarn);1591 diff --git a/vsintegration/src/FSharp.VS.FSI/FSharp.VS.FSI.fsproj b/vsintegration/src/FSharp.VS.FSI/FSharp.VS.FSI.fsproj index c69f5d51005..659932a17ee 100644 --- a/vsintegration/src/FSharp.VS.FSI/FSharp.VS.FSI.fsproj +++ b/vsintegration/src/FSharp.VS.FSI/FSharp.VS.FSI.fsproj @@ -3,7 +3,6 @@ - net46 Library true false @@ -12,7 +11,7 @@ true $(SystemValueTuplePackageVersion) $(OtherFlags) --subsystemversion:6.00 - true + true false diff --git a/vsintegration/tests/MockTypeProviders/DefinitionLocationAttribute/DefinitionLocationAttribute.csproj b/vsintegration/tests/MockTypeProviders/DefinitionLocationAttribute/DefinitionLocationAttribute.csproj index 0b2fc8a750b..f5f0216e9f8 100644 --- a/vsintegration/tests/MockTypeProviders/DefinitionLocationAttribute/DefinitionLocationAttribute.csproj +++ b/vsintegration/tests/MockTypeProviders/DefinitionLocationAttribute/DefinitionLocationAttribute.csproj @@ -1,43 +1,17 @@  - - - $(MSBuildProjectDirectory)\..\..\..\..\src - CSharp - - + + - Debug - AnyCPU - 2.0 - {DA39AD38-4A58-47BF-9215-E49768295169} - Library - DefinitionLocationAttribute - DEBUG;TRACE;$(DefineConstants) - 4 - 0169;0067 - v4.5 - $(FSharpSourcesRoot)\..\$(Configuration)\$(TargetDotnetProfile)\bin\UnitTests\MockTypeProviders + net45 + - - - - {DED3BBD7-53F4-428A-8C9F-27968E768605} - FSharp.Core - + + - - - - - - - - - - \ No newline at end of file + diff --git a/vsintegration/tests/MockTypeProviders/DefinitionLocationAttributeFileDoesnotExist/DefinitionLocationAttributeFileDoesnotExist.csproj b/vsintegration/tests/MockTypeProviders/DefinitionLocationAttributeFileDoesnotExist/DefinitionLocationAttributeFileDoesnotExist.csproj index cf8838f72ce..f5f0216e9f8 100644 --- a/vsintegration/tests/MockTypeProviders/DefinitionLocationAttributeFileDoesnotExist/DefinitionLocationAttributeFileDoesnotExist.csproj +++ b/vsintegration/tests/MockTypeProviders/DefinitionLocationAttributeFileDoesnotExist/DefinitionLocationAttributeFileDoesnotExist.csproj @@ -1,41 +1,17 @@  - + + - $(MSBuildProjectDirectory)\..\..\..\..\src - CSharp - - - - Debug - AnyCPU - 2.0 - {8C2439BD-0E49-4929-A8B1-29CEE228191E} - Library - DefinitionLocationAttributeFileDoesnotExist - v4.5 - DEBUG;TRACE;$(DefineConstants) - 4 - 0169;0067 - $(FSharpSourcesRoot)\..\$(Configuration)\$(TargetDotnetProfile)\bin\UnitTests\MockTypeProviders + net45 + - - - - {DED3BBD7-53F4-428A-8C9F-27968E768605} - FSharp.Core - + + - - - - - - - - - \ No newline at end of file + + diff --git a/vsintegration/tests/MockTypeProviders/DefinitionLocationAttributeLineDoesnotExist/DefinitionLocationAttributeLineDoesnotExist.csproj b/vsintegration/tests/MockTypeProviders/DefinitionLocationAttributeLineDoesnotExist/DefinitionLocationAttributeLineDoesnotExist.csproj index c4c480ee525..f5f0216e9f8 100644 --- a/vsintegration/tests/MockTypeProviders/DefinitionLocationAttributeLineDoesnotExist/DefinitionLocationAttributeLineDoesnotExist.csproj +++ b/vsintegration/tests/MockTypeProviders/DefinitionLocationAttributeLineDoesnotExist/DefinitionLocationAttributeLineDoesnotExist.csproj @@ -1,41 +1,17 @@  - + + - $(MSBuildProjectDirectory)\..\..\..\..\src - CSharp - - - - Debug - AnyCPU - 2.0 - {F47196DC-186D-4055-BAF2-658282A12F33} - Library - DefinitionLocationAttributeLineDoesnotExist - 4 - 0169;0067 - DEBUG;TRACE;$(DefineConstants) - v4.5 - $(FSharpSourcesRoot)\..\$(Configuration)\$(TargetDotnetProfile)\bin\UnitTests\MockTypeProviders + net45 + - - - - {DED3BBD7-53F4-428A-8C9F-27968E768605} - FSharp.Core - + + - - - - - - - - + diff --git a/vsintegration/tests/MockTypeProviders/DefinitionLocationAttributeWithSpaceInTheType/DefinitionLocationAttributeWithSpaceInTheType.csproj b/vsintegration/tests/MockTypeProviders/DefinitionLocationAttributeWithSpaceInTheType/DefinitionLocationAttributeWithSpaceInTheType.csproj index a02e9e3bfa9..f5f0216e9f8 100644 --- a/vsintegration/tests/MockTypeProviders/DefinitionLocationAttributeWithSpaceInTheType/DefinitionLocationAttributeWithSpaceInTheType.csproj +++ b/vsintegration/tests/MockTypeProviders/DefinitionLocationAttributeWithSpaceInTheType/DefinitionLocationAttributeWithSpaceInTheType.csproj @@ -1,42 +1,17 @@  - - - $(MSBuildProjectDirectory)\..\..\..\..\src - CSharp - - + + - Debug - AnyCPU - 2.0 - {D4C88934-5893-467E-A55C-A11ECD6479FE} - Library - DefinitionLocationAttributeWithSpaceInTheType - 4 - 0169;0067 - DEBUG;TRACE;$(DefineConstants) - v4.5 - $(FSharpSourcesRoot)\..\$(Configuration)\$(TargetDotnetProfile)\bin\UnitTests\MockTypeProviders + net45 + - - - - {DED3BBD7-53F4-428A-8C9F-27968E768605} - FSharp.Core - + + - - - - - - - - - + diff --git a/vsintegration/tests/MockTypeProviders/Directory.Build.props b/vsintegration/tests/MockTypeProviders/Directory.Build.props index bb5b23d29d0..a1295702c08 100644 --- a/vsintegration/tests/MockTypeProviders/Directory.Build.props +++ b/vsintegration/tests/MockTypeProviders/Directory.Build.props @@ -1,3 +1,15 @@ - + + + + + + false + + + + + 0067;0169;1591 + + diff --git a/vsintegration/tests/MockTypeProviders/Directory.Build.targets b/vsintegration/tests/MockTypeProviders/Directory.Build.targets index bb5b23d29d0..4bc8389ec97 100644 --- a/vsintegration/tests/MockTypeProviders/Directory.Build.targets +++ b/vsintegration/tests/MockTypeProviders/Directory.Build.targets @@ -1,3 +1,4 @@ - + + diff --git a/vsintegration/tests/MockTypeProviders/DummyProviderForLanguageServiceTesting/DummyProviderForLanguageServiceTesting.fsproj b/vsintegration/tests/MockTypeProviders/DummyProviderForLanguageServiceTesting/DummyProviderForLanguageServiceTesting.fsproj index 05c38f1a8ae..0fb60c539a1 100644 --- a/vsintegration/tests/MockTypeProviders/DummyProviderForLanguageServiceTesting/DummyProviderForLanguageServiceTesting.fsproj +++ b/vsintegration/tests/MockTypeProviders/DummyProviderForLanguageServiceTesting/DummyProviderForLanguageServiceTesting.fsproj @@ -1,41 +1,21 @@  - + + - $(MSBuildProjectDirectory)\..\..\..\..\src - FSharp - true - - - - Debug - AnyCPU - 2.0 - {6AFF752D-E991-4A08-9ED2-5BF46B0E0F8B} - Library - DummyProviderForLanguageServiceTesting - LIBRARY - 58;75 - false - DEBUG;TRACE;$(DefineConstants) - v4.5 - true - $(FSharpSourcesRoot)\..\$(Configuration)\$(TargetDotnetProfile)\bin\UnitTests\MockTypeProviders + net45 + true + - - - - - {DED3BBD7-53F4-428A-8C9F-27968E768605} - FSharp.Core - + + - + \ No newline at end of file diff --git a/vsintegration/tests/MockTypeProviders/EditorHideMethodsAttribute/EditorHideMethodsAttribute.csproj b/vsintegration/tests/MockTypeProviders/EditorHideMethodsAttribute/EditorHideMethodsAttribute.csproj index 66baa3dfe19..f5f0216e9f8 100644 --- a/vsintegration/tests/MockTypeProviders/EditorHideMethodsAttribute/EditorHideMethodsAttribute.csproj +++ b/vsintegration/tests/MockTypeProviders/EditorHideMethodsAttribute/EditorHideMethodsAttribute.csproj @@ -1,41 +1,17 @@  - + + - $(MSBuildProjectDirectory)\..\..\..\..\src - CSharp - - - - Debug - AnyCPU - 2.0 - {0B9CDEAF-EE8F-45E0-A4E0-34A8ED6DD09E} - Library - EditorHideMethodsAttribute - 4 - 0169;0067 - DEBUG;TRACE;$(DefineConstants) - v4.5 - $(FSharpSourcesRoot)\..\$(Configuration)\$(TargetDotnetProfile)\bin\UnitTests\MockTypeProviders + net45 + - - - - {DED3BBD7-53F4-428A-8C9F-27968E768605} - FSharp.Core - + + - - - - - - - - + diff --git a/vsintegration/tests/MockTypeProviders/EmptyAssembly/EmptyAssembly.fsproj b/vsintegration/tests/MockTypeProviders/EmptyAssembly/EmptyAssembly.fsproj index be555283db8..5f0e7a69b63 100644 --- a/vsintegration/tests/MockTypeProviders/EmptyAssembly/EmptyAssembly.fsproj +++ b/vsintegration/tests/MockTypeProviders/EmptyAssembly/EmptyAssembly.fsproj @@ -1,38 +1,18 @@  - + + - $(MSBuildProjectDirectory)\..\..\..\..\src - FSharp - - - - Debug - AnyCPU - 2.0 - {004982c6-93ea-4e70-b4f0-be7d7219926a} - Library - EmptyAssembly - LIBRARY - False - 58;75 - false - DEBUG;TRACE;$(DefineConstants) - v4.5 - true - $(FSharpSourcesRoot)\..\$(Configuration)\$(TargetDotnetProfile)\bin\UnitTests\MockTypeProviders + net45 + true + - - - - - {DED3BBD7-53F4-428A-8C9F-27968E768605} - FSharp.Core - + + - - \ No newline at end of file + + diff --git a/vsintegration/tests/MockTypeProviders/XmlDocAttributeWithAdequateComment/XmlDocAttributeWithAdequateComment.csproj b/vsintegration/tests/MockTypeProviders/XmlDocAttributeWithAdequateComment/XmlDocAttributeWithAdequateComment.csproj index 865547fb515..f5f0216e9f8 100644 --- a/vsintegration/tests/MockTypeProviders/XmlDocAttributeWithAdequateComment/XmlDocAttributeWithAdequateComment.csproj +++ b/vsintegration/tests/MockTypeProviders/XmlDocAttributeWithAdequateComment/XmlDocAttributeWithAdequateComment.csproj @@ -1,41 +1,17 @@  - + + - $(MSBuildProjectDirectory)\..\..\..\..\src - CSharp - - - - Debug - AnyCPU - 2.0 - {243A81AC-A954-4601-833A-60EEEFB00FCD} - Library - XmlDocAttributeWithAdequateComment - 4 - 0169;0067 - DEBUG;TRACE;$(DefineConstants) - v4.5 - $(FSharpSourcesRoot)\..\$(Configuration)\$(TargetDotnetProfile)\bin\UnitTests\MockTypeProviders + net45 + - - - - {DED3BBD7-53F4-428A-8C9F-27968E768605} - FSharp.Core - + + - - - - - - - - + diff --git a/vsintegration/tests/MockTypeProviders/XmlDocAttributeWithEmptyComment/XmlDocAttributeWithEmptyComment.csproj b/vsintegration/tests/MockTypeProviders/XmlDocAttributeWithEmptyComment/XmlDocAttributeWithEmptyComment.csproj index 6c71fe60010..f5f0216e9f8 100644 --- a/vsintegration/tests/MockTypeProviders/XmlDocAttributeWithEmptyComment/XmlDocAttributeWithEmptyComment.csproj +++ b/vsintegration/tests/MockTypeProviders/XmlDocAttributeWithEmptyComment/XmlDocAttributeWithEmptyComment.csproj @@ -1,41 +1,17 @@  - + + - $(MSBuildProjectDirectory)\..\..\..\..\src - CSharp - - - - Debug - AnyCPU - 2.0 - {B4595EB6-053A-400E-AA1B-7727F1BC900F} - Library - XmlDocAttributeWithEmptyComment - 4 - 0169;0067 - DEBUG;TRACE;$(DefineConstants) - v4.5 - $(FSharpSourcesRoot)\..\$(Configuration)\$(TargetDotnetProfile)\bin\UnitTests\MockTypeProviders + net45 + - - - - {DED3BBD7-53F4-428A-8C9F-27968E768605} - FSharp.Core - + + - - - - - - - - + diff --git a/vsintegration/tests/MockTypeProviders/XmlDocAttributeWithLocalizedComment/XmlDocAttributeWithLocalizedComment.csproj b/vsintegration/tests/MockTypeProviders/XmlDocAttributeWithLocalizedComment/XmlDocAttributeWithLocalizedComment.csproj index 694fcd781e9..f5f0216e9f8 100644 --- a/vsintegration/tests/MockTypeProviders/XmlDocAttributeWithLocalizedComment/XmlDocAttributeWithLocalizedComment.csproj +++ b/vsintegration/tests/MockTypeProviders/XmlDocAttributeWithLocalizedComment/XmlDocAttributeWithLocalizedComment.csproj @@ -1,41 +1,17 @@  - + + - $(MSBuildProjectDirectory)\..\..\..\..\src - CSharp - - - - Debug - AnyCPU - 2.0 - {A559D7E8-7EFD-473A-B618-A10B41AB523B} - Library - XmlDocAttributeWithLocalizedComment - 4 - 0169;0067 - DEBUG;TRACE;$(DefineConstants) - v4.5 - $(FSharpSourcesRoot)\..\$(Configuration)\$(TargetDotnetProfile)\bin\UnitTests\MockTypeProviders + net45 + - - - - {DED3BBD7-53F4-428A-8C9F-27968E768605} - FSharp.Core - + + - - - - - - - - + diff --git a/vsintegration/tests/MockTypeProviders/XmlDocAttributeWithLongComment/XmlDocAttributeWithLongComment.csproj b/vsintegration/tests/MockTypeProviders/XmlDocAttributeWithLongComment/XmlDocAttributeWithLongComment.csproj index 90f90e87985..f5f0216e9f8 100644 --- a/vsintegration/tests/MockTypeProviders/XmlDocAttributeWithLongComment/XmlDocAttributeWithLongComment.csproj +++ b/vsintegration/tests/MockTypeProviders/XmlDocAttributeWithLongComment/XmlDocAttributeWithLongComment.csproj @@ -1,41 +1,17 @@  - + + - $(MSBuildProjectDirectory)\..\..\..\..\src - CSharp - - - - Debug - AnyCPU - 2.0 - {AC85EE6D-033C-45F9-B8BA-884BC22EC6D9} - Library - XmlDocAttributeWithLongComment - 4 - 0169;0067 - DEBUG;TRACE;$(DefineConstants) - v4.5 - $(FSharpSourcesRoot)\..\$(Configuration)\$(TargetDotnetProfile)\bin\UnitTests\MockTypeProviders + net45 + - - - - {DED3BBD7-53F4-428A-8C9F-27968E768605} - FSharp.Core - + + - - - - - - - - + diff --git a/vsintegration/tests/MockTypeProviders/XmlDocAttributeWithNullComment/XmlDocAttributeWithNullComment.csproj b/vsintegration/tests/MockTypeProviders/XmlDocAttributeWithNullComment/XmlDocAttributeWithNullComment.csproj index 525153bff63..f5f0216e9f8 100644 --- a/vsintegration/tests/MockTypeProviders/XmlDocAttributeWithNullComment/XmlDocAttributeWithNullComment.csproj +++ b/vsintegration/tests/MockTypeProviders/XmlDocAttributeWithNullComment/XmlDocAttributeWithNullComment.csproj @@ -1,41 +1,17 @@  - + + - $(MSBuildProjectDirectory)\..\..\..\..\src - CSharp - - - - Debug - AnyCPU - 2.0 - {956BBE41-ABD1-4DBA-9F3B-BA1C9821C98C} - Library - XmlDocAttributeWithNullComment - 4 - 0169;0067 - DEBUG;TRACE;$(DefineConstants) - v4.5 - $(FSharpSourcesRoot)\..\$(Configuration)\$(TargetDotnetProfile)\bin\UnitTests\MockTypeProviders + net45 + - - - - {DED3BBD7-53F4-428A-8C9F-27968E768605} - FSharp.Core - + + - - - - - - - - + diff --git a/vsintegration/tests/Salsa/salsa.fs b/vsintegration/tests/Salsa/salsa.fs index 1dc47629103..8a86f834180 100644 --- a/vsintegration/tests/Salsa/salsa.fs +++ b/vsintegration/tests/Salsa/salsa.fs @@ -633,9 +633,11 @@ module internal Salsa = Append " bin\Debug\" if versionFile<>null then Append (sprintf " %s" versionFile) if otherFlags<>null then Append (sprintf " %s --resolutions" otherFlags) - if targetFrameworkVersion<>null then - Append(sprintf " true") - Append(sprintf " %s" targetFrameworkVersion) +// if targetFrameworkVersion<>null then +// Append(sprintf " true") +// Append(sprintf " %s" targetFrameworkVersion) +// else + Append(sprintf " %s" "4.6.1") Append " " for disabledWarning in disabledWarnings do Append (sprintf " %s;" disabledWarning) diff --git a/vsintegration/tests/UnitTests/.gitignore b/vsintegration/tests/UnitTests/.gitignore new file mode 100644 index 00000000000..eabace925a5 --- /dev/null +++ b/vsintegration/tests/UnitTests/.gitignore @@ -0,0 +1 @@ +watson-test.exe diff --git a/vsintegration/tests/UnitTests/App.config b/vsintegration/tests/UnitTests/App.config index edefefae9c9..34d853e9f43 100644 --- a/vsintegration/tests/UnitTests/App.config +++ b/vsintegration/tests/UnitTests/App.config @@ -6,7 +6,7 @@ - + @@ -33,6 +33,12 @@ + + + + + + diff --git a/vsintegration/tests/UnitTests/HelpContextServiceTests.fs b/vsintegration/tests/UnitTests/HelpContextServiceTests.fs index da005db0d09..76b918d0fad 100644 --- a/vsintegration/tests/UnitTests/HelpContextServiceTests.fs +++ b/vsintegration/tests/UnitTests/HelpContextServiceTests.fs @@ -234,7 +234,7 @@ type HelpContextServiceTests() = Some "N1" ] this.TestF1Keywords(keywords, file, - addtlRefAssy = [PathRelativeToTestAssembly(@"UnitTests\MockTypeProviders\DummyProviderForLanguageServiceTesting.dll")]) + addtlRefAssy = [PathRelativeToTestAssembly(@"DummyProviderForLanguageServiceTesting.dll")]) [] [] @@ -252,7 +252,7 @@ type HelpContextServiceTests() = Some "N1.T" ] this.TestF1Keywords(keywords, file, - addtlRefAssy = [PathRelativeToTestAssembly(@"UnitTests\MockTypeProviders\DummyProviderForLanguageServiceTesting.dll")]) + addtlRefAssy = [PathRelativeToTestAssembly(@"DummyProviderForLanguageServiceTesting.dll")]) [] member public this.``EndOfLine``() = diff --git a/vsintegration/tests/UnitTests/LegacyLanguageService/Tests.LanguageService.Completion.fs b/vsintegration/tests/UnitTests/LegacyLanguageService/Tests.LanguageService.Completion.fs index a16adb7450f..c72825d1ee4 100644 --- a/vsintegration/tests/UnitTests/LegacyLanguageService/Tests.LanguageService.Completion.fs +++ b/vsintegration/tests/UnitTests/LegacyLanguageService/Tests.LanguageService.Completion.fs @@ -225,7 +225,7 @@ type UsingMSBuild() as this = member public this.TestCompletionNotShowingWhenFastUpdate (firstSrc : list) secondSrc marker = let (_, _, file) = this.CreateSingleFileProject(firstSrc) MoveCursorToEndOfMarker(file,marker) - + // Now delete the property and leave only dot at the end // - user is typing fast so replac the content without background compilation ReplaceFileInMemoryWithoutCoffeeBreak file secondSrc @@ -243,21 +243,20 @@ type UsingMSBuild() as this = let (solution, project, file) = this.CreateSingleFileProject(fileContents) let completions = DotCompletionAtEndOfMarker file marker AssertCompListContainsAll(completions, list) - + //DoesNotContainAny At Start Of Marker Helper Function member private this.VerifyDotCompListDoesNotContainAnyAtStartOfMarker(fileContents : string, marker : string, list : string list, ?addtlRefAssy : list) = let (solution, project, file) = this.CreateSingleFileProject(fileContents, ?references = addtlRefAssy) let completions = DotCompletionAtStartOfMarker file marker AssertCompListDoesNotContainAny(completions, list) - + //DotCompList Is Empty At Start Of Marker Helper Function member private this.VerifyDotCompListIsEmptyAtStartOfMarker(fileContents : string, marker : string, ?addtlRefAssy : list) = let (solution, project, file) = this.CreateSingleFileProject(fileContents, ?references = addtlRefAssy) let completions = DotCompletionAtStartOfMarker file marker - AssertCompListIsEmpty(completions) - + AssertCompListIsEmpty(completions) [] member this.``AutoCompletion.ObjectMethods``() = @@ -365,7 +364,7 @@ a. [] [] member this.``TypeProvider.VisibilityChecksForGeneratedTypes``() = - let extraRefs = [PathRelativeToTestAssembly(@"UnitTests\MockTypeProviders\DummyProviderForLanguageServiceTesting.dll")] + let extraRefs = [PathRelativeToTestAssembly(@"DummyProviderForLanguageServiceTesting.dll")] let check = DoWithAutoCompleteUsingExtraRefs extraRefs true SourceFileKind.FS Microsoft.VisualStudio.FSharp.LanguageService.BackgroundRequestReason.MemberSelect let code = @@ -2200,7 +2199,7 @@ let x = new MyClass2(0) t.I"""], marker = "t.I", expected = "IM1", - addtlRefAssy = [PathRelativeToTestAssembly(@"UnitTests\MockTypeProviders\DummyProviderForLanguageServiceTesting.dll")]) + addtlRefAssy = [PathRelativeToTestAssembly(@"DummyProviderForLanguageServiceTesting.dll")]) [] [] @@ -2213,7 +2212,7 @@ let x = new MyClass2(0) t.Eve"""], marker = "t.Eve", expected = "Event1", - addtlRefAssy = [PathRelativeToTestAssembly(@"UnitTests\MockTypeProviders\EditorHideMethodsAttribute.dll")]) + addtlRefAssy = [PathRelativeToTestAssembly(@"EditorHideMethodsAttribute.dll")]) [] [] @@ -2225,7 +2224,7 @@ let x = new MyClass2(0) type boo = N1.T() let successes = ResizeArray<_>() let failures = ResizeArray<_>() printfn "Running %d systematic tests.... Failure will be printed if it occurs..." tests.Length for (lineName, suffixName, suffixText, builderName, fileContents, check, expectedToFail) in tests do - if successes.Count % 50 = 0 then + if successes.Count % 50 = 0 then printfn "Making progress, run %d so far..." successes.Count let fileContents = prefix + fileContents + suffixText - try - match check with - | QuickInfoExpected(where,expected) -> + try + match check with + | QuickInfoExpected(where,expected) -> let where = where.[0..where.Length-2] // chop a character off to get in the middle of the text this.AssertQuickInfoContainsAtEndOfMarker(fileContents,where,expected,addtlRefAssy=standard40AssemblyRefs ) - | AutoCompleteExpected(where,expected) -> + | AutoCompleteExpected(where,expected) -> this.VerifyCtrlSpaceListContainAllAtStartOfMarker(fileContents,where,[expected],addtlRefAssy=standard40AssemblyRefs ) - | DotCompleteExpected(where,expected) -> + | DotCompleteExpected(where,expected) -> this.VerifyDotCompListContainAllAtStartOfMarker(fileContents,where,[expected], addtlRefAssy=standard40AssemblyRefs) if not expectedToFail then successes.Add(lineName,suffixName,builderName,check) else unexpectedSuccesses.Add(lineName,suffixName,builderName,check) - with _ -> + with e -> + printfn "Exception thrown: (\"%s\", \"%s\", \"%s\", %A) " lineName suffixName builderName check if not expectedToFail then printfn " FAILURE on systematic test: (\"%s\", \"%s\", \"%s\", %A) " lineName suffixName builderName check printfn "\n\nfileContents = <<<%s>>>" fileContents @@ -2491,8 +2491,6 @@ let x = new MyClass2(0) if failures.Count <> 0 || unexpectedSuccesses.Count <> 0 then raise <| new Exception("there were unexpected results, see console output for details") - - [] [] [] @@ -2510,50 +2508,48 @@ let aaaaaa = [| "1" |] "NoClosingBrace,NextTypeDefinition", " \ntype NextDefinition() = member x.P = 1\n" ] let lines b = - [ "L1", "let v = " + b + " { " , [] - "L2", "let v = " + b + " { for " , [] - "L3", "let v = " + b + " { for bbbb " , [QI "for bbbb" "val bbbb"] - "L4", "let v = " + b + " { for bbbb in (*C*)" , [QI "for bbbb" "val bbbb"; AC "(*C*)" "aaaaaa" ] - "L5", "let v = " + b + " { for bbbb in [ (*C*) " , [QI "for bbbb" "val bbbb"; AC "(*C*)" "aaaaaa" ] - "L6", "let v = " + b + " { for bbbb in [ aaa(*C*) " , [QI "for bbbb" "val bbbb"; AC "(*C*)" "aaaaaa" ] - "L7", "let v = " + b + " { for bbbb in [ aaaaaa(*D1*)" , [QI "for bbbb" "val bbbb"; QI "aaaaaa" "val aaaaaa"; DC "(*D1*)" "Length" ] - "L8", "let v = " + b + " { for bbbb in [ aaaaaa(*D1*) ] " , [QI "for bbbb" "val bbbb"; QI "aaaaaa" "val aaaaaa"; DC "(*D1*)" "Length" ] - "L9", "let v = " + b + " { for bbbb in [ aaaaaa(*D1*) ] do (*C*)" , [QI "for bbbb" "val bbbb"; QI "aaaaaa" "val aaaaaa"; AC "(*C*)" (if b = "query" then "select" else "sin"); DC "(*D1*)" "Length" ] - "L10", "let v = " + b + " { for bbbb in [ aaaaaa(*D1*) ] do yield (*C*) " , [QI "for bbbb" "val bbbb"; QI "aaaaaa" "val aaaaaa"; AC "(*C*)" "aaaaaa"; AC "(*C*)" "bbbb" ; DC "(*D1*)" "Length" ] - "L11", "let v = " + b + " { for bbbb in [ aaaaaa(*D1*) ] do yield bb(*C*) " , [QI "for bbbb" "val bbbb"; QI "aaaaaa" "val aaaaaa"; AC "(*C*)" "bbbb" ; DC "(*D1*)" "Length" ] - "L12", "let v = " + b + " { for bbbb in [ aaaaaa(*D1*) ] do yield bbbb(*D2*) " , [QI "for bbbb" "val bbbb"; QI "aaaaaa" "val aaaaaa"; QI "yield bbbb" "val bbbb"; DC "(*D1*)" "Length" ; DC "(*D2*)" "Length" ] - "L13", "let v = " + b + " { for bbbb in [ aaaaaa(*D1*) ] do yield bbbb(*D2*) + (*C*)" , [QI "for bbbb" "val bbbb"; QI "aaaaaa" "val aaaaaa"; QI "yield bbbb" "val bbbb"; AC "(*C*)" "aaaaaa"; AC "(*C*)" "bbbb" ; DC "(*D1*)" "Length" ; DC "(*D2*)" "Length" ] - "L14", "let v = " + b + " { for bbbb in [ aaaaaa(*D1*) ] do yield bbbb(*D2*) + bb(*C*)" , [QI "for bbbb" "val bbbb"; QI "aaaaaa" "val aaaaaa"; QI "yield bbbb" "val bbbb"; AC "(*C*)" "bbbb" ; DC "(*D1*)" "Length" ; DC "(*D2*)" "Length" ] - "L15", "let v = " + b + " { for bbbb in [ aaaaaa(*D1*) ] do yield bbbb(*D2*) + bbbb(*D3*)" , [QI "for bbbb" "val bbbb"; QI "aaaaaa" "val aaaaaa"; QI "yield bbbb" "val bbbb"; QI "+ bbbb" "val bbbb"; DC "(*D3*)" "Length" ] ] + [ "AL1", "let v = " + b + " { " , [] + "AL2", "let v = " + b + " { for " , [] + "AL3", "let v = " + b + " { for bbbb " , [QI "for bbbb" "val bbbb"] + "AL4", "let v = " + b + " { for bbbb in (*C*)" , [QI "for bbbb" "val bbbb"; AC "(*C*)" "aaaaaa" ] + "AL5", "let v = " + b + " { for bbbb in [ (*C*) " , [QI "for bbbb" "val bbbb"; AC "(*C*)" "aaaaaa" ] + "AL6", "let v = " + b + " { for bbbb in [ aaa(*C*) " , [QI "for bbbb" "val bbbb"; AC "(*C*)" "aaaaaa" ] + "AL7", "let v = " + b + " { for bbbb in [ aaaaaa(*D1*)" , [QI "for bbbb" "val bbbb"; QI "aaaaaa" "val aaaaaa"; DC "(*D1*)" "Length" ] + "AL8", "let v = " + b + " { for bbbb in [ aaaaaa(*D1*) ] " , [QI "for bbbb" "val bbbb"; QI "aaaaaa" "val aaaaaa"; DC "(*D1*)" "Length" ] + "AL9", "let v = " + b + " { for bbbb in [ aaaaaa(*D1*) ] do (*C*)" , [QI "for bbbb" "val bbbb"; QI "aaaaaa" "val aaaaaa"; AC "(*C*)" (if b = "query" then "select" else "sin"); DC "(*D1*)" "Length" ] + "AL10", "let v = " + b + " { for bbbb in [ aaaaaa(*D1*) ] do yield (*C*) " , [QI "for bbbb" "val bbbb"; QI "aaaaaa" "val aaaaaa"; AC "(*C*)" "aaaaaa"; AC "(*C*)" "bbbb" ; DC "(*D1*)" "Length" ] + "AL11", "let v = " + b + " { for bbbb in [ aaaaaa(*D1*) ] do yield bb(*C*) " , [QI "for bbbb" "val bbbb"; QI "aaaaaa" "val aaaaaa"; AC "(*C*)" "bbbb" ; DC "(*D1*)" "Length" ] + "AL12", "let v = " + b + " { for bbbb in [ aaaaaa(*D1*) ] do yield bbbb(*D2*) " , [QI "for bbbb" "val bbbb"; QI "aaaaaa" "val aaaaaa"; QI "yield bbbb" "val bbbb"; DC "(*D1*)" "Length" ; DC "(*D2*)" "Length" ] + "AL13", "let v = " + b + " { for bbbb in [ aaaaaa(*D1*) ] do yield bbbb(*D2*) + (*C*)" , [QI "for bbbb" "val bbbb"; QI "aaaaaa" "val aaaaaa"; QI "yield bbbb" "val bbbb"; AC "(*C*)" "aaaaaa"; AC "(*C*)" "bbbb" ; DC "(*D1*)" "Length" ; DC "(*D2*)" "Length" ] + "AL14", "let v = " + b + " { for bbbb in [ aaaaaa(*D1*) ] do yield bbbb(*D2*) + bb(*C*)" , [QI "for bbbb" "val bbbb"; QI "aaaaaa" "val aaaaaa"; QI "yield bbbb" "val bbbb"; AC "(*C*)" "bbbb" ; DC "(*D1*)" "Length" ; DC "(*D2*)" "Length" ] + "AL15", "let v = " + b + " { for bbbb in [ aaaaaa(*D1*) ] do yield bbbb(*D2*) + bbbb(*D3*)" , [QI "for bbbb" "val bbbb"; QI "aaaaaa" "val aaaaaa"; QI "yield bbbb" "val bbbb"; QI "+ bbbb" "val bbbb"; DC "(*D3*)" "Length" ] ] let knownFailures = - [ - ("L10", "Empty", "seq", AutoCompleteExpected ("(*C*)","bbbb")) - ("L10", "Empty", "query", AutoCompleteExpected ("(*C*)","bbbb")) - ("L10", "ClosingBrace", "query", AutoCompleteExpected ("(*C*)","bbbb")) - ("L10", "ClosingBrace,NextDefinition", "query", AutoCompleteExpected ("(*C*)","bbbb")) - ("L3", "NoClosingBrace,NextDefinition", "seq", QuickInfoExpected ("for bbbb","val bbbb")) - ("L6", "NoClosingBrace,NextDefinition", "seq", QuickInfoExpected ("for bbbb","val bbbb")) - ("L6", "NoClosingBrace,NextDefinition", "seq", AutoCompleteExpected ("(*C*)","aaaaaa")) - ("L7", "NoClosingBrace,NextDefinition", "seq", QuickInfoExpected ("for bbbb","val bbbb")) - ("L7", "NoClosingBrace,NextDefinition", "seq", QuickInfoExpected ("aaaaaa","val aaaaaa")) - ("L7", "NoClosingBrace,NextDefinition", "seq", DotCompleteExpected ("(*D1*)","Length")) - ("L3", "NoClosingBrace,NextDefinition", "query", QuickInfoExpected ("for bbbb","val bbbb")) - ("L6", "NoClosingBrace,NextDefinition", "query", QuickInfoExpected ("for bbbb","val bbbb")) - ("L6", "NoClosingBrace,NextDefinition", "query", AutoCompleteExpected ("(*C*)","aaaaaa")) - ("L7", "NoClosingBrace,NextDefinition", "query", QuickInfoExpected ("for bbbb","val bbbb")) - ("L7", "NoClosingBrace,NextDefinition", "query", QuickInfoExpected ("aaaaaa","val aaaaaa")) - ("L7", "NoClosingBrace,NextDefinition", "query", DotCompleteExpected ("(*D1*)","Length")) - ("L10", "NoClosingBrace,NextDefinition", "seq", AutoCompleteExpected ("(*C*)","bbbb")) - ("L10", "NoClosingBrace,NextTypeDefinition", "seq", AutoCompleteExpected ("(*C*)","bbbb")) - ("L10", "NoClosingBrace,NextDefinition", "query", AutoCompleteExpected ("(*C*)","bbbb")) - ("L10", "NoClosingBrace,NextTypeDefinition", "query", AutoCompleteExpected ("(*C*)","bbbb")) + ("AL3", "NoClosingBrace,NextDefinition", "query", QuickInfoExpected ("for bbbb","val bbbb")) + ("AL3", "NoClosingBrace,NextDefinition", "seq", QuickInfoExpected ("for bbbb","val bbbb")) + ("AL6", "NoClosingBrace,NextDefinition", "query", AutoCompleteExpected ("(*C*)","aaaaaa")) + ("AL6", "NoClosingBrace,NextDefinition", "query", QuickInfoExpected ("for bbbb","val bbbb")) + ("AL6", "NoClosingBrace,NextDefinition", "seq", AutoCompleteExpected ("(*C*)","aaaaaa")) + ("AL6", "NoClosingBrace,NextDefinition", "seq", QuickInfoExpected ("for bbbb","val bbbb")) + ("AL7", "NoClosingBrace,NextDefinition", "query", DotCompleteExpected ("(*D1*)","Length")) + ("AL7", "NoClosingBrace,NextDefinition", "query", QuickInfoExpected ("aaaaaa","val aaaaaa")) + ("AL7", "NoClosingBrace,NextDefinition", "query", QuickInfoExpected ("for bbbb","val bbbb")) + ("AL7", "NoClosingBrace,NextDefinition", "seq", DotCompleteExpected ("(*D1*)","Length")) + ("AL7", "NoClosingBrace,NextDefinition", "seq", QuickInfoExpected ("aaaaaa","val aaaaaa")) + ("AL7", "NoClosingBrace,NextDefinition", "seq", QuickInfoExpected ("for bbbb","val bbbb")) + ("AL10", "ClosingBrace", "query", AutoCompleteExpected ("(*C*)","bbbb")) + ("AL10", "ClosingBrace,NextDefinition", "query", AutoCompleteExpected ("(*C*)","bbbb")) + ("AL10", "Empty", "query", AutoCompleteExpected ("(*C*)","bbbb")) + ("AL10", "Empty", "seq", AutoCompleteExpected ("(*C*)","bbbb")) + ("AL10", "NoClosingBrace,NextDefinition", "query", AutoCompleteExpected ("(*C*)","bbbb")) + ("AL10", "NoClosingBrace,NextDefinition", "seq", AutoCompleteExpected ("(*C*)","bbbb")) + ("AL10", "NoClosingBrace,NextTypeDefinition", "query", AutoCompleteExpected ("(*C*)","bbbb")) + ("AL10", "NoClosingBrace,NextTypeDefinition", "seq", AutoCompleteExpected ("(*C*)","bbbb")) ] this.WordByWordSystematicTestWithSpecificExpectations(prefix, suffixes, lines, ["seq";"query"], knownFailures) - [] [] @@ -2574,20 +2570,20 @@ let aaaaaa = 0 "NoClosingBrace,NextTypeDefinition", " \ntype NextDefinition() = member x.P = 1\n" ] let lines b = - [ "L1", "let f() = seq { while abb(*C*)" , [AC "(*C*)" "abbbbc"] - "L2", "let f() = seq { while abbbbc(*D1*)" , [QI "while abbbbc" "val abbbbc"; DC "(*D1*)" "Length"] - "L3", "let f() = seq { while abbbbc(*D1*) do (*C*)" , [QI "while abbbbc" "val abbbbc"; DC "(*D1*)" "Length"; AC "(*C*)" "abbbbc"] - "L4", "let f() = seq { while abbbbc(*D1*) do abb(*C*)" , [QI "while abbbbc" "val abbbbc"; DC "(*D1*)" "Length"; AC "(*C*)" "abbbbc"] - "L5", "let f() = seq { while abbbbc(*D1*) do abbbbc(*D2*)" , [QI "while abbbbc" "val abbbbc"; DC "(*D1*)" "Length"; QI "do abbbbc" "val abbbbc"; DC "(*D2*)" "Length"; ] - "L6", "let f() = seq { while abbbbc(*D1*) do abbbbc.[(*C*)" , [QI "while abbbbc" "val abbbbc"; DC "(*D1*)" "Length"; QI "do abbbbc" "val abbbbc"; AC "(*C*)" "abbbbc"; AC "(*C*)" "aaaaaa"; ] - "L7", "let f() = seq { while abbbbc(*D1*) do abbbbc.[aaa(*C*)" , [QI "while abbbbc" "val abbbbc"; DC "(*D1*)" "Length"; QI "do abbbbc" "val abbbbc"; AC "(*C*)" "aaaaaa"; ] - "L7a", "let f() = seq { while abbbbc(*D1*) do abbbbc.[aaa(*C*)]" , [QI "while abbbbc" "val abbbbc"; DC "(*D1*)" "Length"; QI "do abbbbc" "val abbbbc"; AC "(*C*)" "aaaaaa"; ] - "L7b", "let f() = seq { while abbbbc(*D1*) do abbbbc.[aaa(*C*)] <- " , [QI "while abbbbc" "val abbbbc"; DC "(*D1*)" "Length"; QI "do abbbbc" "val abbbbc"; AC "(*C*)" "aaaaaa"; ] - "L7c", "let f() = seq { while abbbbc(*D1*) do abbbbc.[aaa(*C*)] <- 1" , [QI "while abbbbc" "val abbbbc"; DC "(*D1*)" "Length"; QI "do abbbbc" "val abbbbc"; AC "(*C*)" "aaaaaa"; ] - "L7d", "let f() = seq { while abbbbc(*D1*) do abbbbc.[ (*C*) ] <- 1" , [QI "while abbbbc" "val abbbbc"; DC "(*D1*)" "Length"; QI "do abbbbc" "val abbbbc"; AC "(*C*)" "aaaaaa"; ] - "L8", "let f() = seq { while abbbbc(*D1*) do abbbbc.[aaaaaa]" , [QI "while abbbbc" "val abbbbc"; DC "(*D1*)" "Length"; QI "do abbbbc" "val abbbbc"; ] - "L9", "let f() = seq { while abbbbc(*D1*) do abbbbc.[aaaaaa] <- (*C*)" , [QI "while abbbbc" "val abbbbc"; DC "(*D1*)" "Length"; QI "do abbbbc" "val abbbbc"; AC "(*C*)" "abbbbc"; AC "(*C*)" "aaaaaa"; ] - "L10", "let f() = seq { while abbbbc(*D1*) do abbbbc.[aaaaaa] <- aaa(*C*)" , [QI "while abbbbc" "val abbbbc"; DC "(*D1*)" "Length"; QI "do abbbbc" "val abbbbc"; AC "(*C*)" "aaaaaa"; ] ] + [ "BL1", "let f() = seq { while abb(*C*)" , [AC "(*C*)" "abbbbc"] + "BL2", "let f() = seq { while abbbbc(*D1*)" , [QI "while abbbbc" "val abbbbc"; DC "(*D1*)" "Length"] + "BL3", "let f() = seq { while abbbbc(*D1*) do (*C*)" , [QI "while abbbbc" "val abbbbc"; DC "(*D1*)" "Length"; AC "(*C*)" "abbbbc"] + "BL4", "let f() = seq { while abbbbc(*D1*) do abb(*C*)" , [QI "while abbbbc" "val abbbbc"; DC "(*D1*)" "Length"; AC "(*C*)" "abbbbc"] + "BL5", "let f() = seq { while abbbbc(*D1*) do abbbbc(*D2*)" , [QI "while abbbbc" "val abbbbc"; DC "(*D1*)" "Length"; QI "do abbbbc" "val abbbbc"; DC "(*D2*)" "Length"; ] + "BL6", "let f() = seq { while abbbbc(*D1*) do abbbbc.[(*C*)" , [QI "while abbbbc" "val abbbbc"; DC "(*D1*)" "Length"; QI "do abbbbc" "val abbbbc"; AC "(*C*)" "abbbbc"; AC "(*C*)" "aaaaaa"; ] + "BL7", "let f() = seq { while abbbbc(*D1*) do abbbbc.[aaa(*C*)" , [QI "while abbbbc" "val abbbbc"; DC "(*D1*)" "Length"; QI "do abbbbc" "val abbbbc"; AC "(*C*)" "aaaaaa"; ] + "BL7a", "let f() = seq { while abbbbc(*D1*) do abbbbc.[aaa(*C*)]" , [QI "while abbbbc" "val abbbbc"; DC "(*D1*)" "Length"; QI "do abbbbc" "val abbbbc"; AC "(*C*)" "aaaaaa"; ] + "BL7b", "let f() = seq { while abbbbc(*D1*) do abbbbc.[aaa(*C*)] <- " , [QI "while abbbbc" "val abbbbc"; DC "(*D1*)" "Length"; QI "do abbbbc" "val abbbbc"; AC "(*C*)" "aaaaaa"; ] + "BL7c", "let f() = seq { while abbbbc(*D1*) do abbbbc.[aaa(*C*)] <- 1" , [QI "while abbbbc" "val abbbbc"; DC "(*D1*)" "Length"; QI "do abbbbc" "val abbbbc"; AC "(*C*)" "aaaaaa"; ] + "BL7d", "let f() = seq { while abbbbc(*D1*) do abbbbc.[ (*C*) ] <- 1" , [QI "while abbbbc" "val abbbbc"; DC "(*D1*)" "Length"; QI "do abbbbc" "val abbbbc"; AC "(*C*)" "aaaaaa"; ] + "BL8", "let f() = seq { while abbbbc(*D1*) do abbbbc.[aaaaaa]" , [QI "while abbbbc" "val abbbbc"; DC "(*D1*)" "Length"; QI "do abbbbc" "val abbbbc"; ] + "BL9", "let f() = seq { while abbbbc(*D1*) do abbbbc.[aaaaaa] <- (*C*)" , [QI "while abbbbc" "val abbbbc"; DC "(*D1*)" "Length"; QI "do abbbbc" "val abbbbc"; AC "(*C*)" "abbbbc"; AC "(*C*)" "aaaaaa"; ] + "BL10", "let f() = seq { while abbbbc(*D1*) do abbbbc.[aaaaaa] <- aaa(*C*)" , [QI "while abbbbc" "val abbbbc"; DC "(*D1*)" "Length"; QI "do abbbbc" "val abbbbc"; AC "(*C*)" "aaaaaa"; ] ] let knownFailures = [ @@ -2615,44 +2611,39 @@ let aaaaaa = 0 "NoClosingBrace,NextTypeDefinition", " \ntype NextDefinition() = member x.P = 1\n" ] let lines b = - [ "L1", "let x = query { for bbbb in abbbbc(*D0*) do join " , [QI "for bbbb" "val bbbb"; QI "in abbbbc" "val abbbbc"; DC "(*D0*)" "Length"; QI "join" "join"] - "L2", "let x = query { for bbbb in abbbbc(*D0*) do join cccc " , [QI "for bbbb" "val bbbb"; QI "in abbbbc" "val abbbbc"; DC "(*D0*)" "Length"; QI "join" "join"] - "L2a", "let x = query { for bbbb in abbbbc(*D0*) do join cccc )" , [QI "for bbbb" "val bbbb"; QI "in abbbbc" "val abbbbc"; DC "(*D0*)" "Length"; QI "join" "join"] - "L3", "let x = query { for bbbb in abbbbc(*D0*) do join cccc in " , [QI "for bbbb" "val bbbb"; QI "in abbbbc" "val abbbbc"; DC "(*D0*)" "Length"; QI "join" "join"] - "L3a", "let x = query { for bbbb in abbbbc(*D0*) do join cccc in )" , [QI "for bbbb" "val bbbb"; QI "in abbbbc" "val abbbbc"; DC "(*D0*)" "Length"; QI "join" "join"] - "L4", "let x = query { for bbbb in abbbbc(*D0*) do join cccc in abbb(*C*)" , [QI "for bbbb" "val bbbb"; QI "in abbbbc" "val abbbbc"; DC "(*D0*)" "Length";QI "join" "join"; AC "(*C*)" "abbbbc"] - "L4a", "let x = query { for bbbb in abbbbc(*D0*) do join cccc in abbb(*C*) )" , [QI "for bbbb" "val bbbb"; QI "in abbbbc" "val abbbbc"; DC "(*D0*)" "Length";QI "join" "join"; AC "(*C*)" "abbbbc"] - "L5", "let x = query { for bbbb in abbbbc(*D0*) do join cccc in abbbbc(*D1*)" , [QI "for bbbb" "val bbbb"; QI "in abbbbc" "val abbbbc"; DC "(*D0*)" "Length"; QI "join" "join"; DC "(*D1*)" "Length"] - "L5a", "let x = query { for bbbb in abbbbc(*D0*) do join cccc in abbbbc(*D1*) )" , [QI "for bbbb" "val bbbb"; QI "in abbbbc" "val abbbbc"; DC "(*D0*)" "Length"; QI "join" "join"; DC "(*D1*)" "Length"] - "L6", "let x = query { for bbbb in abbbbc(*D0*) do join cccc in abbbbc(*D1*) on " , [QI "for bbbb" "val bbbb"; QI "in abbbbc" "val abbbbc"; DC "(*D0*)" "Length"; QI "join" "join"; DC "(*D1*)" "Length"] - "L6a", "let x = query { for bbbb in abbbbc(*D0*) do join cccc in abbbbc(*D1*) on )" , [QI "for bbbb" "val bbbb"; QI "in abbbbc" "val abbbbc"; DC "(*D0*)" "Length"; QI "join" "join"; DC "(*D1*)" "Length"] - "L6b", "let x = query { for bbbb in abbbbc(*D0*) do join cccc in abbbbc(*D1*) on (bb(*C*)" , [QI "for bbbb" "val bbbb"; QI "in abbbbc" "val abbbbc"; DC "(*D0*)" "Length"; QI "join" "join"; DC "(*D1*)" "Length"; AC "(*C*)" "bbbb"] - "L7", "let x = query { for bbbb in abbbbc(*D0*) do join cccc in abbbbc(*D1*) on (bbbb" , [QI "for bbbb" "val bbbb"; QI "in abbbbc" "val abbbbc"; DC "(*D0*)" "Length"; QI "join" "join"; DC "(*D1*)" "Length"] - "L7a", "let x = query { for bbbb in abbbbc(*D0*) do join cccc in abbbbc(*D1*) on (bbbb )" , [QI "for bbbb" "val bbbb"; QI "in abbbbc" "val abbbbc"; DC "(*D0*)" "Length"; QI "join" "join"; DC "(*D1*)" "Length"] - "L8", "let x = query { for bbbb in abbbbc(*D0*) do join cccc in abbbbc(*D1*) on (bbbb = " , [QI "for bbbb" "val bbbb"; QI "in abbbbc" "val abbbbc"; DC "(*D0*)" "Length"; QI "join" "join"; DC "(*D1*)" "Length"] - "L8a", "let x = query { for bbbb in abbbbc(*D0*) do join cccc in abbbbc(*D1*) on (bbbb = )" , [QI "for bbbb" "val bbbb"; QI "in abbbbc" "val abbbbc"; DC "(*D0*)" "Length"; QI "join" "join"; DC "(*D1*)" "Length"] - "L8b", "let x = query { for bbbb in abbbbc(*D0*) do join cccc in abbbbc(*D1*) on (bbbb = cc(*C*)" , [QI "for bbbb" "val bbbb"; QI "in abbbbc" "val abbbbc"; DC "(*D0*)" "Length"; QI "join" "join"; DC "(*D1*)" "Length"; AC "(*C*)" "cccc"] - "L9", "let x = query { for bbbb in abbbbc(*D0*) do join cccc in abbbbc(*D1*) on (bbbb(*D11*) = cccc(*D12*)" , [QI "for bbbb" "val bbbb"; QI "in abbbbc" "val abbbbc"; DC "(*D0*)" "Length"; QI "join" "join"; DC "(*D1*)" "Length"; DC "(*D11*)" "CompareTo"; DC "(*D12*)" "CompareTo"] - "L10", "let x = query { for bbbb in abbbbc(*D0*) do join cccc in abbbbc(*D1*) on (bbbb(*D11*) = cccc(*D12*))" , [QI "for bbbb" "val bbbb"; QI "in abbbbc" "val abbbbc"; DC "(*D0*)" "Length"; QI "join" "join"; DC "(*D1*)" "Length"; DC "(*D11*)" "CompareTo"; DC "(*D12*)" "CompareTo"] - "L11", "let x = query { for bbbb in abbbbc(*D0*) do join cccc in abbbbc(*D1*) on (bbbb(*D11*) = cccc(*D12*)); " , [QI "for bbbb" "val bbbb"; QI "in abbbbc" "val abbbbc"; DC "(*D0*)" "Length"; QI "join" "join"; DC "(*D1*)" "Length"; DC "(*D11*)" "CompareTo"; DC "(*D12*)" "CompareTo"] - "L12", "let x = query { for bbbb in abbbbc(*D0*) do join cccc in abbbbc(*D1*) on (bbbb(*D11*) = cccc(*D12*)); select" , [QI "for bbbb" "val bbbb"; QI "in abbbbc" "val abbbbc"; DC "(*D0*)" "Length"; QI "join" "join"; DC "(*D1*)" "Length"; DC "(*D11*)" "CompareTo"; DC "(*D12*)" "CompareTo"] - "L13", "let x = query { for bbbb in abbbbc(*D0*) do join cccc in abbbbc(*D1*) on (bbbb(*D11*) = cccc(*D12*)); select (bb(*C*)" , [QI "for bbbb" "val bbbb"; QI "in abbbbc" "val abbbbc"; DC "(*D0*)" "Length"; QI "join" "join"; DC "(*D1*)" "Length"; DC "(*D11*)" "CompareTo"; DC "(*D12*)" "CompareTo"] - "L14", "let x = query { for bbbb in abbbbc(*D0*) do join cccc in abbbbc(*D1*) on (bbbb(*D11*) = cccc(*D12*)); select (bbbb(*D2*)" , [QI "for bbbb" "val bbbb"; QI "in abbbbc" "val abbbbc"; DC "(*D0*)" "Length"; QI "join" "join"; DC "(*D1*)" "Length"; DC "(*D2*)" "CompareTo"; DC "(*D11*)" "CompareTo"; DC "(*D12*)" "CompareTo"] - "L15", "let x = query { for bbbb in abbbbc(*D0*) do join cccc in abbbbc(*D1*) on (bbbb(*D11*) = cccc(*D12*)); select (bbbb(*D2*), " , [QI "for bbbb" "val bbbb"; QI "in abbbbc" "val abbbbc"; DC "(*D0*)" "Length"; QI "join" "join"; DC "(*D1*)" "Length"; DC "(*D2*)" "CompareTo"; DC "(*D11*)" "CompareTo"; DC "(*D12*)" "CompareTo"] - "L16", "let x = query { for bbbb in abbbbc(*D0*) do join cccc in abbbbc(*D1*) on (bbbb(*D11*) = cccc(*D12*)); select (bbbb(*D2*), cc(*C*)" , [QI "for bbbb" "val bbbb"; QI "in abbbbc" "val abbbbc"; DC "(*D0*)" "Length"; QI "join" "join"; DC "(*D1*)" "Length"; DC "(*D2*)" "CompareTo"; AC "(*C*)" "cccc"; DC "(*D11*)" "CompareTo"; DC "(*D12*)" "CompareTo"] - "L17", "let x = query { for bbbb in abbbbc(*D0*) do join cccc in abbbbc(*D1*) on (bbbb(*D11*) = cccc(*D12*)); select (bbbb(*D2*), cccc(*D3*)" , [QI "for bbbb" "val bbbb"; QI "in abbbbc" "val abbbbc"; DC "(*D0*)" "Length"; QI "join" "join"; DC "(*D1*)" "Length"; DC "(*D2*)" "CompareTo"; DC "(*D3*)" "CompareTo"; QI "(bbbb" "val bbbb"; QI ", cccc" "val cccc"; DC "(*D11*)" "CompareTo"; DC "(*D12*)" "CompareTo" ] - "L18", "let x = query { for bbbb in abbbbc(*D0*) do join cccc in abbbbc(*D1*) on (bbbb(*D11*) = cccc(*D12*)); select (bbbb(*D2*), cccc(*D3*))" , [QI "for bbbb" "val bbbb"; QI "in abbbbc" "val abbbbc"; DC "(*D0*)" "Length"; QI "join" "join"; DC "(*D1*)" "Length"; DC "(*D2*)" "CompareTo"; DC "(*D3*)" "CompareTo"; QI "(bbbb" "val bbbb"; QI ", cccc" "val cccc"; DC "(*D11*)" "CompareTo"; DC "(*D12*)" "CompareTo" ] ] + [ "CL1", "let x = query { for bbbb in abbbbc(*D0*) do join " , [QI "for bbbb" "val bbbb"; QI "in abbbbc" "val abbbbc"; DC "(*D0*)" "Length"; QI "join" "join"] + "CL2", "let x = query { for bbbb in abbbbc(*D0*) do join cccc " , [QI "for bbbb" "val bbbb"; QI "in abbbbc" "val abbbbc"; DC "(*D0*)" "Length"; QI "join" "join"] + "CL2a", "let x = query { for bbbb in abbbbc(*D0*) do join cccc )" , [QI "for bbbb" "val bbbb"; QI "in abbbbc" "val abbbbc"; DC "(*D0*)" "Length"; QI "join" "join"] + "CL3", "let x = query { for bbbb in abbbbc(*D0*) do join cccc in " , [QI "for bbbb" "val bbbb"; QI "in abbbbc" "val abbbbc"; DC "(*D0*)" "Length"; QI "join" "join"] + "CL3a", "let x = query { for bbbb in abbbbc(*D0*) do join cccc in )" , [QI "for bbbb" "val bbbb"; QI "in abbbbc" "val abbbbc"; DC "(*D0*)" "Length"; QI "join" "join"] + "CL4", "let x = query { for bbbb in abbbbc(*D0*) do join cccc in abbb(*C*)" , [QI "for bbbb" "val bbbb"; QI "in abbbbc" "val abbbbc"; DC "(*D0*)" "Length";QI "join" "join"; AC "(*C*)" "abbbbc"] + "CL4a", "let x = query { for bbbb in abbbbc(*D0*) do join cccc in abbb(*C*) )" , [QI "for bbbb" "val bbbb"; QI "in abbbbc" "val abbbbc"; DC "(*D0*)" "Length";QI "join" "join"; AC "(*C*)" "abbbbc"] + "CL5", "let x = query { for bbbb in abbbbc(*D0*) do join cccc in abbbbc(*D1*)" , [QI "for bbbb" "val bbbb"; QI "in abbbbc" "val abbbbc"; DC "(*D0*)" "Length"; QI "join" "join"; DC "(*D1*)" "Length"] + "CL5a", "let x = query { for bbbb in abbbbc(*D0*) do join cccc in abbbbc(*D1*) )" , [QI "for bbbb" "val bbbb"; QI "in abbbbc" "val abbbbc"; DC "(*D0*)" "Length"; QI "join" "join"; DC "(*D1*)" "Length"] + "CL6", "let x = query { for bbbb in abbbbc(*D0*) do join cccc in abbbbc(*D1*) on " , [QI "for bbbb" "val bbbb"; QI "in abbbbc" "val abbbbc"; DC "(*D0*)" "Length"; QI "join" "join"; DC "(*D1*)" "Length"] + "CL6a", "let x = query { for bbbb in abbbbc(*D0*) do join cccc in abbbbc(*D1*) on )" , [QI "for bbbb" "val bbbb"; QI "in abbbbc" "val abbbbc"; DC "(*D0*)" "Length"; QI "join" "join"; DC "(*D1*)" "Length"] + "CL6b", "let x = query { for bbbb in abbbbc(*D0*) do join cccc in abbbbc(*D1*) on (bb(*C*)" , [QI "for bbbb" "val bbbb"; QI "in abbbbc" "val abbbbc"; DC "(*D0*)" "Length"; QI "join" "join"; DC "(*D1*)" "Length"; AC "(*C*)" "bbbb"] + "CL7", "let x = query { for bbbb in abbbbc(*D0*) do join cccc in abbbbc(*D1*) on (bbbb" , [QI "for bbbb" "val bbbb"; QI "in abbbbc" "val abbbbc"; DC "(*D0*)" "Length"; QI "join" "join"; DC "(*D1*)" "Length"] + "CL7a", "let x = query { for bbbb in abbbbc(*D0*) do join cccc in abbbbc(*D1*) on (bbbb )" , [QI "for bbbb" "val bbbb"; QI "in abbbbc" "val abbbbc"; DC "(*D0*)" "Length"; QI "join" "join"; DC "(*D1*)" "Length"] + "CL8", "let x = query { for bbbb in abbbbc(*D0*) do join cccc in abbbbc(*D1*) on (bbbb = " , [QI "for bbbb" "val bbbb"; QI "in abbbbc" "val abbbbc"; DC "(*D0*)" "Length"; QI "join" "join"; DC "(*D1*)" "Length"] + "CL8a", "let x = query { for bbbb in abbbbc(*D0*) do join cccc in abbbbc(*D1*) on (bbbb = )" , [QI "for bbbb" "val bbbb"; QI "in abbbbc" "val abbbbc"; DC "(*D0*)" "Length"; QI "join" "join"; DC "(*D1*)" "Length"] + "CL8b", "let x = query { for bbbb in abbbbc(*D0*) do join cccc in abbbbc(*D1*) on (bbbb = cc(*C*)" , [QI "for bbbb" "val bbbb"; QI "in abbbbc" "val abbbbc"; DC "(*D0*)" "Length"; QI "join" "join"; DC "(*D1*)" "Length"; AC "(*C*)" "cccc"] + "CL9", "let x = query { for bbbb in abbbbc(*D0*) do join cccc in abbbbc(*D1*) on (bbbb(*D11*) = cccc(*D12*)" , [QI "for bbbb" "val bbbb"; QI "in abbbbc" "val abbbbc"; DC "(*D0*)" "Length"; QI "join" "join"; DC "(*D1*)" "Length"; DC "(*D11*)" "CompareTo"; DC "(*D12*)" "CompareTo"] + "CL10", "let x = query { for bbbb in abbbbc(*D0*) do join cccc in abbbbc(*D1*) on (bbbb(*D11*) = cccc(*D12*))" , [QI "for bbbb" "val bbbb"; QI "in abbbbc" "val abbbbc"; DC "(*D0*)" "Length"; QI "join" "join"; DC "(*D1*)" "Length"; DC "(*D11*)" "CompareTo"; DC "(*D12*)" "CompareTo"] + "CL11", "let x = query { for bbbb in abbbbc(*D0*) do join cccc in abbbbc(*D1*) on (bbbb(*D11*) = cccc(*D12*)); " , [QI "for bbbb" "val bbbb"; QI "in abbbbc" "val abbbbc"; DC "(*D0*)" "Length"; QI "join" "join"; DC "(*D1*)" "Length"; DC "(*D11*)" "CompareTo"; DC "(*D12*)" "CompareTo"] + "CL12", "let x = query { for bbbb in abbbbc(*D0*) do join cccc in abbbbc(*D1*) on (bbbb(*D11*) = cccc(*D12*)); select" , [QI "for bbbb" "val bbbb"; QI "in abbbbc" "val abbbbc"; DC "(*D0*)" "Length"; QI "join" "join"; DC "(*D1*)" "Length"; DC "(*D11*)" "CompareTo"; DC "(*D12*)" "CompareTo"] + "CL13", "let x = query { for bbbb in abbbbc(*D0*) do join cccc in abbbbc(*D1*) on (bbbb(*D11*) = cccc(*D12*)); select (bb(*C*)" , [QI "for bbbb" "val bbbb"; QI "in abbbbc" "val abbbbc"; DC "(*D0*)" "Length"; QI "join" "join"; DC "(*D1*)" "Length"; DC "(*D11*)" "CompareTo"; DC "(*D12*)" "CompareTo"] + "CL14", "let x = query { for bbbb in abbbbc(*D0*) do join cccc in abbbbc(*D1*) on (bbbb(*D11*) = cccc(*D12*)); select (bbbb(*D2*)" , [QI "for bbbb" "val bbbb"; QI "in abbbbc" "val abbbbc"; DC "(*D0*)" "Length"; QI "join" "join"; DC "(*D1*)" "Length"; DC "(*D2*)" "CompareTo"; DC "(*D11*)" "CompareTo"; DC "(*D12*)" "CompareTo"] + "CL15", "let x = query { for bbbb in abbbbc(*D0*) do join cccc in abbbbc(*D1*) on (bbbb(*D11*) = cccc(*D12*)); select (bbbb(*D2*), " , [QI "for bbbb" "val bbbb"; QI "in abbbbc" "val abbbbc"; DC "(*D0*)" "Length"; QI "join" "join"; DC "(*D1*)" "Length"; DC "(*D2*)" "CompareTo"; DC "(*D11*)" "CompareTo"; DC "(*D12*)" "CompareTo"] + "CL16", "let x = query { for bbbb in abbbbc(*D0*) do join cccc in abbbbc(*D1*) on (bbbb(*D11*) = cccc(*D12*)); select (bbbb(*D2*), cc(*C*)" , [QI "for bbbb" "val bbbb"; QI "in abbbbc" "val abbbbc"; DC "(*D0*)" "Length"; QI "join" "join"; DC "(*D1*)" "Length"; DC "(*D2*)" "CompareTo"; AC "(*C*)" "cccc"; DC "(*D11*)" "CompareTo"; DC "(*D12*)" "CompareTo"] + "CL17", "let x = query { for bbbb in abbbbc(*D0*) do join cccc in abbbbc(*D1*) on (bbbb(*D11*) = cccc(*D12*)); select (bbbb(*D2*), cccc(*D3*)" , [QI "for bbbb" "val bbbb"; QI "in abbbbc" "val abbbbc"; DC "(*D0*)" "Length"; QI "join" "join"; DC "(*D1*)" "Length"; DC "(*D2*)" "CompareTo"; DC "(*D3*)" "CompareTo"; QI "(bbbb" "val bbbb"; QI ", cccc" "val cccc"; DC "(*D11*)" "CompareTo"; DC "(*D12*)" "CompareTo" ] + "CL18", "let x = query { for bbbb in abbbbc(*D0*) do join cccc in abbbbc(*D1*) on (bbbb(*D11*) = cccc(*D12*)); select (bbbb(*D2*), cccc(*D3*))" , [QI "for bbbb" "val bbbb"; QI "in abbbbc" "val abbbbc"; DC "(*D0*)" "Length"; QI "join" "join"; DC "(*D1*)" "Length"; DC "(*D2*)" "CompareTo"; DC "(*D3*)" "CompareTo"; QI "(bbbb" "val bbbb"; QI ", cccc" "val cccc"; DC "(*D11*)" "CompareTo"; DC "(*D12*)" "CompareTo" ] ] let knownFailures = [ - //("L2", "NoClosingBrace,NextDefinition", "", QuickInfoExpected ("for bbbb","val bbbb")) - //("L2", "NoClosingBrace,NextDefinition", "", QuickInfoExpected ("in abbbbc","val abbbbc")) - //("L2", "NoClosingBrace,NextDefinition", "", DotCompleteExpected ("(*D0*)","Length")) - //("L2", "NoClosingBrace,NextDefinition", "", QuickInfoExpected ("join","join")) - ] + ] this.WordByWordSystematicTestWithSpecificExpectations(prefix, suffixes, lines, [""], knownFailures) - [] /// This is a sanity check that the multiple-line case is much the same as the single-line cae @@ -2673,51 +2664,51 @@ let aaaaaa = 0 "NoClosingBrace,NextTypeDefinition", " \ntype NextDefinition() = member x.P = 1\n" ] let lines b = - [ "L1", """ + [ "DL1", """ let x = query { for bbbb in abbbbc(*D0*) do join """ , [QI "for bbbb" "val bbbb"; QI "in abbbbc" "val abbbbc"; DC "(*D0*)" "Length"; QI "join" "join"] - "L2", """ + "DL2", """ let x = query { for bbbb in abbbbc(*D0*) do join cccc """ , [QI "for bbbb" "val bbbb"; QI "in abbbbc" "val abbbbc"; DC "(*D0*)" "Length"; QI "join" "join"] - "L2a", """ + "DL2a", """ let x = query { for bbbb in abbbbc(*D0*) do join cccc ) """ , [QI "for bbbb" "val bbbb"; QI "in abbbbc" "val abbbbc"; DC "(*D0*)" "Length"; QI "join" "join"] - "L3", """ + "DL3", """ let x = query { for bbbb in abbbbc(*D0*) do join cccc in """ , [QI "for bbbb" "val bbbb"; QI "in abbbbc" "val abbbbc"; DC "(*D0*)" "Length"; QI "join" "join"] - "L3a", """ + "DL3a", """ let x = query { for bbbb in abbbbc(*D0*) do join cccc in ) """ , [QI "for bbbb" "val bbbb"; QI "in abbbbc" "val abbbbc"; DC "(*D0*)" "Length"; QI "join" "join"] - "L4", """ + "DL4", """ let x = query { for bbbb in abbbbc(*D0*) do join cccc in abbb(*C*) """ , [QI "for bbbb" "val bbbb"; QI "in abbbbc" "val abbbbc"; DC "(*D0*)" "Length";QI "join" "join"; AC "(*C*)" "abbbbc"] - "L4a", """ + "DL4a", """ let x = query { for bbbb in abbbbc(*D0*) do join cccc in abbb(*C*) ) """ , [QI "for bbbb" "val bbbb"; QI "in abbbbc" "val abbbbc"; DC "(*D0*)" "Length";QI "join" "join"; AC "(*C*)" "abbbbc"] - "L5", """ + "DL5", """ let x = query { for bbbb in abbbbc(*D0*) do join cccc in abbbbc(*D1*) """ , [QI "for bbbb" "val bbbb"; QI "in abbbbc" "val abbbbc"; DC "(*D0*)" "Length"; QI "join" "join"; DC "(*D1*)" "Length"] - "L5a", """ + "DL5a", """ let x = query { for bbbb in abbbbc(*D0*) do join cccc in abbbbc(*D1*) ) """ , [QI "for bbbb" "val bbbb"; QI "in abbbbc" "val abbbbc"; DC "(*D0*)" "Length"; QI "join" "join"; DC "(*D1*)" "Length"] - "L6", """ + "DL6", """ let x = query { for bbbb in abbbbc(*D0*) do join cccc in abbbbc(*D1*) on """ , [QI "for bbbb" "val bbbb"; QI "in abbbbc" "val abbbbc"; DC "(*D0*)" "Length"; QI "join" "join"; DC "(*D1*)" "Length"] @@ -2730,63 +2721,63 @@ let x = query { for bbbb in abbbbc(*D0*) do let x = query { for bbbb in abbbbc(*D0*) do join cccc in abbbbc(*D1*) on (bb(*C*) """ , [QI "for bbbb" "val bbbb"; QI "in abbbbc" "val abbbbc"; DC "(*D0*)" "Length"; QI "join" "join"; DC "(*D1*)" "Length"; AC "(*C*)" "bbbb"] - "L7", """ + "DL7", """ let x = query { for bbbb in abbbbc(*D0*) do join cccc in abbbbc(*D1*) on (bbbb """ , [QI "for bbbb" "val bbbb"; QI "in abbbbc" "val abbbbc"; DC "(*D0*)" "Length"; QI "join" "join"; DC "(*D1*)" "Length"] - "L7a", """ + "DL7a", """ let x = query { for bbbb in abbbbc(*D0*) do join cccc in abbbbc(*D1*) on (bbbb ) """ , [QI "for bbbb" "val bbbb"; QI "in abbbbc" "val abbbbc"; DC "(*D0*)" "Length"; QI "join" "join"; DC "(*D1*)" "Length"] - "L8", """ + "DL8", """ let x = query { for bbbb in abbbbc(*D0*) do join cccc in abbbbc(*D1*) on (bbbb = """ , [QI "for bbbb" "val bbbb"; QI "in abbbbc" "val abbbbc"; DC "(*D0*)" "Length"; QI "join" "join"; DC "(*D1*)" "Length"] - "L8a", """ + "DL8a", """ let x = query { for bbbb in abbbbc(*D0*) do join cccc in abbbbc(*D1*) on (bbbb = ) """ , [QI "for bbbb" "val bbbb"; QI "in abbbbc" "val abbbbc"; DC "(*D0*)" "Length"; QI "join" "join"; DC "(*D1*)" "Length"] - "L8b", """ + "DL8b", """ let x = query { for bbbb in abbbbc(*D0*) do join cccc in abbbbc(*D1*) on (bbbb = cc(*C*) """ , [QI "for bbbb" "val bbbb"; QI "in abbbbc" "val abbbbc"; DC "(*D0*)" "Length"; QI "join" "join"; DC "(*D1*)" "Length"; AC "(*C*)" "cccc"] - "L9", """ + "DL9", """ let x = query { for bbbb in abbbbc(*D0*) do join cccc in abbbbc(*D1*) on (bbbb(*D11*) = cccc(*D12*) """ , [QI "for bbbb" "val bbbb"; QI "in abbbbc" "val abbbbc"; DC "(*D0*)" "Length"; QI "join" "join"; DC "(*D1*)" "Length"; DC "(*D11*)" "CompareTo"; DC "(*D12*)" "CompareTo"] - "L10", """ + "DL10", """ let x = query { for bbbb in abbbbc(*D0*) do join cccc in abbbbc(*D1*) on (bbbb(*D11*) = cccc(*D12*)) """ , [QI "for bbbb" "val bbbb"; QI "in abbbbc" "val abbbbc"; DC "(*D0*)" "Length"; QI "join" "join"; DC "(*D1*)" "Length"; DC "(*D11*)" "CompareTo"; DC "(*D12*)" "CompareTo"] - "L11", """ + "DL11", """ let x = query { for bbbb in abbbbc(*D0*) do join cccc in abbbbc(*D1*) on (bbbb(*D11*) = cccc(*D12*)); """ , [QI "for bbbb" "val bbbb"; QI "in abbbbc" "val abbbbc"; DC "(*D0*)" "Length"; QI "join" "join"; DC "(*D1*)" "Length"; DC "(*D11*)" "CompareTo"; DC "(*D12*)" "CompareTo"] - "L12", """ + "DL12", """ let x = query { for bbbb in abbbbc(*D0*) do join cccc in abbbbc(*D1*) on (bbbb(*D11*) = cccc(*D12*)); select """ , [QI "for bbbb" "val bbbb"; QI "in abbbbc" "val abbbbc"; DC "(*D0*)" "Length"; QI "join" "join"; DC "(*D1*)" "Length"; DC "(*D11*)" "CompareTo"; DC "(*D12*)" "CompareTo"] - "L13", """ + "DL13", """ let x = query { for bbbb in abbbbc(*D0*) do join cccc in abbbbc(*D1*) on (bbbb(*D11*) = cccc(*D12*)); select (bb(*C*) """ , [QI "for bbbb" "val bbbb"; QI "in abbbbc" "val abbbbc"; DC "(*D0*)" "Length"; QI "join" "join"; DC "(*D1*)" "Length"; DC "(*D11*)" "CompareTo"; DC "(*D12*)" "CompareTo"] - "L14", """ + "DL14", """ let x = query { for bbbb in abbbbc(*D0*) do join cccc in abbbbc(*D1*) on (bbbb(*D11*) = cccc(*D12*)); select (bbbb(*D2*) """ , [QI "for bbbb" "val bbbb"; QI "in abbbbc" "val abbbbc"; DC "(*D0*)" "Length"; QI "join" "join"; DC "(*D1*)" "Length"; DC "(*D2*)" "CompareTo"; DC "(*D11*)" "CompareTo"; DC "(*D12*)" "CompareTo"] - "L15", """ + "DL15", """ let x = query { for bbbb in abbbbc(*D0*) do join cccc in abbbbc(*D1*) on (bbbb(*D11*) = cccc(*D12*)); select (bbbb(*D2*), """ , [QI "for bbbb" "val bbbb"; QI "in abbbbc" "val abbbbc"; DC "(*D0*)" "Length"; QI "join" "join"; DC "(*D1*)" "Length"; DC "(*D2*)" "CompareTo"; DC "(*D11*)" "CompareTo"; DC "(*D12*)" "CompareTo"] - "L16", """ + "DL16", """ let x = query { for bbbb in abbbbc(*D0*) do join cccc in abbbbc(*D1*) on (bbbb(*D11*) = cccc(*D12*)); select (bbbb(*D2*), cc(*C*) """ , [QI "for bbbb" "val bbbb"; QI "in abbbbc" "val abbbbc"; DC "(*D0*)" "Length"; QI "join" "join"; DC "(*D1*)" "Length"; DC "(*D2*)" "CompareTo"; AC "(*C*)" "cccc"; DC "(*D11*)" "CompareTo"; DC "(*D12*)" "CompareTo"] - "L17", """ + "DL17", """ let x = query { for bbbb in abbbbc(*D0*) do join cccc in abbbbc(*D1*) on (bbbb(*D11*) = cccc(*D12*)); select (bbbb(*D2*), cccc(*D3*) """ , [QI "for bbbb" "val bbbb"; QI "in abbbbc" "val abbbbc"; DC "(*D0*)" "Length"; QI "join" "join"; DC "(*D1*)" "Length"; DC "(*D2*)" "CompareTo"; DC "(*D3*)" "CompareTo"; QI "(bbbb" "val bbbb"; QI ", cccc" "val cccc"; DC "(*D11*)" "CompareTo"; DC "(*D12*)" "CompareTo" ] - "L18", """ + "DL18", """ let x = query { for bbbb in abbbbc(*D0*) do join cccc in abbbbc(*D1*) on (bbbb(*D11*) = cccc(*D12*)); select (bbbb(*D2*), cccc(*D3*)) """ , [QI "for bbbb" "val bbbb"; QI "in abbbbc" "val abbbbc"; DC "(*D0*)" "Length"; QI "join" "join"; DC "(*D1*)" "Length"; DC "(*D2*)" "CompareTo"; DC "(*D3*)" "CompareTo"; QI "(bbbb" "val bbbb"; QI ", cccc" "val cccc"; DC "(*D11*)" "CompareTo"; DC "(*D12*)" "CompareTo" ] ] @@ -2794,10 +2785,10 @@ let x = query { for bbbb in abbbbc(*D0*) do let knownFailures = [ - //("L2", "NoClosingBrace,NextDefinition", "", QuickInfoExpected ("for bbbb","val bbbb")) - //("L2", "NoClosingBrace,NextDefinition", "", QuickInfoExpected ("in abbbbc","val abbbbc")) - //("L2", "NoClosingBrace,NextDefinition", "", DotCompleteExpected ("(*D0*)","Length")) - //("L2", "NoClosingBrace,NextDefinition", "", QuickInfoExpected ("join","join")) + //("DL2", "NoClosingBrace,NextDefinition", "", QuickInfoExpected ("for bbbb","val bbbb")) + //("DL2", "NoClosingBrace,NextDefinition", "", QuickInfoExpected ("in abbbbc","val abbbbc")) + //("DL2", "NoClosingBrace,NextDefinition", "", DotCompleteExpected ("(*D0*)","Length")) + //("DL2", "NoClosingBrace,NextDefinition", "", QuickInfoExpected ("join","join")) ] @@ -4207,7 +4198,7 @@ let x = query { for bbbb in abbbbc(*D0*) do AssertEqualWithMessage(3, occurrences, "Found wrong number of overloads for 'File.Open'.") [] - member public this.``Duplicates.Bug2094``() = + member public this.``Duplicates.Bug2094``() = let code = [ "open Microsoft.FSharp.Control" @@ -4218,8 +4209,8 @@ let x = query { for bbbb in abbbbc(*D0*) do // Get description for Expr.Var let (CompletionItem(_, _, _, descrFunc, _)) = completions |> Array.find (fun (CompletionItem(name, _, _, _, _)) -> name = "Start") - let occurrences = this.CountMethodOccurrences(descrFunc(), "Start") - AssertEqualWithMessage(1, occurrences, "Found wrong number of overloads for 'MailboxProcessor.Start'.") + let occurrences = this.CountMethodOccurrences(descrFunc(), "Start") + AssertEqualWithMessage(1, occurrences, sprintf "Found wrong number of overloads for 'MailboxProcessor.Start'. Found %A." completions) [] member public this.``WithinMatchClause.Bug1603``() = @@ -5448,7 +5439,7 @@ let x = query { for bbbb in abbbbc(*D0*) do t(*Marker*)""", marker = "(*Marker*)", list = ["Equals";"GetHashCode"], - addtlRefAssy = [PathRelativeToTestAssembly(@"UnitTests\MockTypeProviders\EditorHideMethodsAttribute.dll")]) + addtlRefAssy = [PathRelativeToTestAssembly(@"EditorHideMethodsAttribute.dll")]) [] [] @@ -5461,7 +5452,7 @@ let x = query { for bbbb in abbbbc(*D0*) do t(*Marker*)""", marker = "(*Marker*)", list = ["Event1"], - addtlRefAssy = [PathRelativeToTestAssembly(@"UnitTests\MockTypeProviders\EditorHideMethodsAttribute.dll")]) + addtlRefAssy = [PathRelativeToTestAssembly(@"EditorHideMethodsAttribute.dll")]) [] [] @@ -5474,7 +5465,7 @@ let x = query { for bbbb in abbbbc(*D0*) do t(*Marker*)""", marker = "(*Marker*)", list = ["IM1"], - addtlRefAssy = [PathRelativeToTestAssembly(@"UnitTests\MockTypeProviders\DummyProviderForLanguageServiceTesting.dll")]) + addtlRefAssy = [PathRelativeToTestAssembly(@"DummyProviderForLanguageServiceTesting.dll")]) [] [] @@ -5486,7 +5477,7 @@ let x = query { for bbbb in abbbbc(*D0*) do type XXX = N1.T1(*Marker*)""", marker = "(*Marker*)", list = ["SomeNestedType"], - addtlRefAssy = [PathRelativeToTestAssembly(@"UnitTests\MockTypeProviders\DummyProviderForLanguageServiceTesting.dll")]) + addtlRefAssy = [PathRelativeToTestAssembly(@"DummyProviderForLanguageServiceTesting.dll")]) // should _not_ have it here this.VerifyDotCompListDoesNotContainAnyAtStartOfMarker( fileContents = """ @@ -5494,7 +5485,7 @@ let x = query { for bbbb in abbbbc(*D0*) do t(*Marker*)""", marker = "(*Marker*)", list = ["SomeNestedType"], - addtlRefAssy = [PathRelativeToTestAssembly(@"UnitTests\MockTypeProviders\DummyProviderForLanguageServiceTesting.dll")]) + addtlRefAssy = [PathRelativeToTestAssembly(@"DummyProviderForLanguageServiceTesting.dll")]) [] [] @@ -5507,7 +5498,7 @@ let x = query { for bbbb in abbbbc(*D0*) do t.Event1(*Marker*)""", marker = "(*Marker*)", list = ["AddHandler";"RemoveHandler"], - addtlRefAssy = [PathRelativeToTestAssembly(@"UnitTests\MockTypeProviders\EditorHideMethodsAttribute.dll")]) + addtlRefAssy = [PathRelativeToTestAssembly(@"EditorHideMethodsAttribute.dll")]) [] [] @@ -5519,7 +5510,7 @@ let x = query { for bbbb in abbbbc(*D0*) do fileContents = """ let t = N.T.M(*Marker*)()""", marker = "(*Marker*)", - addtlRefAssy = [PathRelativeToTestAssembly(@"UnitTests\MockTypeProviders\EditorHideMethodsAttribute.dll")]) + addtlRefAssy = [PathRelativeToTestAssembly(@"EditorHideMethodsAttribute.dll")]) [] [] @@ -5533,7 +5524,7 @@ let x = query { for bbbb in abbbbc(*D0*) do let t = N.T.StaticProp(*Marker*)""", marker = "(*Marker*)", list = ["GetType"; "Equals"], // just a couple of System.Object methods: we expect them to be there! - addtlRefAssy = [PathRelativeToTestAssembly(@"UnitTests\MockTypeProviders\EditorHideMethodsAttribute.dll")]) + addtlRefAssy = [PathRelativeToTestAssembly(@"EditorHideMethodsAttribute.dll")]) [] member this.CompListInDiffFileTypes() = diff --git a/vsintegration/tests/UnitTests/LegacyLanguageService/Tests.LanguageService.ErrorList.fs b/vsintegration/tests/UnitTests/LegacyLanguageService/Tests.LanguageService.ErrorList.fs index d72c2c4032f..95ade7d3af7 100644 --- a/vsintegration/tests/UnitTests/LegacyLanguageService/Tests.LanguageService.ErrorList.fs +++ b/vsintegration/tests/UnitTests/LegacyLanguageService/Tests.LanguageService.ErrorList.fs @@ -5,6 +5,7 @@ namespace Tests.LanguageService.ErrorList open System open System.IO open NUnit.Framework +open Microsoft.VisualStudio.FSharp open Salsa.Salsa open Salsa.VsOpsUtils open UnitTests.TestLib.Salsa @@ -12,6 +13,12 @@ open UnitTests.TestLib.Utils open UnitTests.TestLib.LanguageService open UnitTests.TestLib.ProjectSystem +[] +type public AssemblyResolverTestFixture () = + + [] + member public __.Init () = AssemblyResolver.addResolver () + [] [] type UsingMSBuild() as this = @@ -365,7 +372,7 @@ type staticInInterface = [] [] member public this.``TypeProvider.MultipleErrors`` () = - let tpRef = PathRelativeToTestAssembly(@"UnitTests\MockTypeProviders\DummyProviderForLanguageServiceTesting.dll") + let tpRef = PathRelativeToTestAssembly(@"DummyProviderForLanguageServiceTesting.dll") let checkList n = printfn "===TypeProvider.MultipleErrors: %d===" n let content = sprintf "type Err = TPErrors.TP<%d>" n @@ -437,7 +444,7 @@ type staticInInterface = but here has type 'int' """ this.VerifyErrorListContainedExpectedString(fileContent,expectedStr, - addtlRefAssy = [PathRelativeToTestAssembly(@"UnitTests\MockTypeProviders\DummyProviderForLanguageServiceTesting.dll")]) + addtlRefAssy = [PathRelativeToTestAssembly(@"DummyProviderForLanguageServiceTesting.dll")]) [] [] @@ -451,7 +458,7 @@ but here has type let expectedStr = "An error occurred applying the static arguments to a provided type" this.VerifyErrorListContainedExpectedString(fileContent,expectedStr, - addtlRefAssy = [PathRelativeToTestAssembly(@"UnitTests\MockTypeProviders\DummyProviderForLanguageServiceTesting.dll")]) + addtlRefAssy = [PathRelativeToTestAssembly(@"DummyProviderForLanguageServiceTesting.dll")]) [] [] @@ -465,7 +472,7 @@ but here has type let expectedStr = "The static parameter 'ParamIgnored' of the provided type or method 'T' requires a value. Static parameters to type providers may be optionally specified using named arguments, e.g. 'T'." this.VerifyErrorListContainedExpectedString(fileContent,expectedStr, - addtlRefAssy = [PathRelativeToTestAssembly(@"UnitTests\MockTypeProviders\DummyProviderForLanguageServiceTesting.dll")]) + addtlRefAssy = [PathRelativeToTestAssembly(@"DummyProviderForLanguageServiceTesting.dll")]) [] [] member public this.``TypeProvider.ProhibitedMethods`` () = @@ -480,7 +487,7 @@ but here has type ( code, sprintf "Array method '%s' is supplied by the runtime and cannot be directly used in code." str, - addtlRefAssy = [PathRelativeToTestAssembly(@"UnitTests\MockTypeProviders\DummyProviderForLanguageServiceTesting.dll")] + addtlRefAssy = [PathRelativeToTestAssembly(@"DummyProviderForLanguageServiceTesting.dll")] ) [] @@ -505,7 +512,7 @@ but here has type type foo = N1.T< const "Hello World",2>""", expectedNum = 1, - addtlRefAssy = [PathRelativeToTestAssembly(@"UnitTests\MockTypeProviders\DummyProviderForLanguageServiceTesting.dll")]) + addtlRefAssy = [PathRelativeToTestAssembly(@"DummyProviderForLanguageServiceTesting.dll")]) [] [] @@ -516,7 +523,7 @@ but here has type this.VerifyNoErrorListAtOpenProject( fileContents = """ type foo = N1.T< const "Hello World",2>""", - addtlRefAssy = [PathRelativeToTestAssembly(@"UnitTests\MockTypeProviders\DummyProviderForLanguageServiceTesting.dll")]) + addtlRefAssy = [PathRelativeToTestAssembly(@"DummyProviderForLanguageServiceTesting.dll")]) [] diff --git a/vsintegration/tests/UnitTests/LegacyLanguageService/Tests.LanguageService.GotoDefinition.fs b/vsintegration/tests/UnitTests/LegacyLanguageService/Tests.LanguageService.GotoDefinition.fs index 0fad94e8e46..ff5af668d1b 100644 --- a/vsintegration/tests/UnitTests/LegacyLanguageService/Tests.LanguageService.GotoDefinition.fs +++ b/vsintegration/tests/UnitTests/LegacyLanguageService/Tests.LanguageService.GotoDefinition.fs @@ -216,7 +216,7 @@ type UsingMSBuild() = // C01234567890 """, "T(*GotoValDef*)", "// A0(*ColumnMarker*)1234567890", - PathRelativeToTestAssembly(@"UnitTests\MockTypeProviders\DefinitionLocationAttribute.dll"), + PathRelativeToTestAssembly(@"DefinitionLocationAttribute.dll"), "(*ColumnMarker*)") // This test case checks the type with space in between like N.``T T`` for GotoDefinition @@ -228,7 +228,7 @@ type UsingMSBuild() = // C01234567890 """, "T``", "// A0(*ColumnMarker*)1234567890", - PathRelativeToTestAssembly(@"UnitTests\MockTypeProviders\DefinitionLocationAttributeWithSpaceInTheType.dll"), + PathRelativeToTestAssembly(@"DefinitionLocationAttributeWithSpaceInTheType.dll"), "(*ColumnMarker*)") // Basic scenario on a provided Constructor @@ -241,7 +241,7 @@ type UsingMSBuild() = // C01234567890 """, "T(*GotoValDef*)", "// A0(*ColumnMarker*)1234567890", - PathRelativeToTestAssembly(@"UnitTests\MockTypeProviders\DefinitionLocationAttribute.dll"), + PathRelativeToTestAssembly(@"DefinitionLocationAttribute.dll"), "(*ColumnMarker*)") // Basic scenario on a provided Method @@ -253,7 +253,7 @@ type UsingMSBuild() = // C01234567890 """, "M(*GotoValDef*)", "// A0(*ColumnMarker*)1234567890", - PathRelativeToTestAssembly(@"UnitTests\MockTypeProviders\DefinitionLocationAttribute.dll"), + PathRelativeToTestAssembly(@"DefinitionLocationAttribute.dll"), "(*ColumnMarker*)") // Basic scenario on a provided Property @@ -265,7 +265,7 @@ type UsingMSBuild() = // C01234567890 """, "StaticProp(*GotoValDef*)", "// A0(*ColumnMarker*)1234567890", - PathRelativeToTestAssembly(@"UnitTests\MockTypeProviders\DefinitionLocationAttribute.dll"), + PathRelativeToTestAssembly(@"DefinitionLocationAttribute.dll"), "(*ColumnMarker*)") // Basic scenario on a provided Event @@ -278,7 +278,7 @@ type UsingMSBuild() = // C01234567890 """, "Event1(*GotoValDef*)", "// A0(*ColumnMarker*)1234567890", - PathRelativeToTestAssembly(@"UnitTests\MockTypeProviders\DefinitionLocationAttribute.dll"), + PathRelativeToTestAssembly(@"DefinitionLocationAttribute.dll"), "(*ColumnMarker*)") // Actually execute all the scenarios... @@ -331,7 +331,7 @@ type UsingMSBuild() = """, marker = "T<", f = (fun (_, result) -> Assert.IsFalse(result.Success) ), - addtlRefAssy = [PathRelativeToTestAssembly(@"UnitTests\MockTypeProviders\DummyProviderForLanguageServiceTesting.dll")] + addtlRefAssy = [PathRelativeToTestAssembly(@"DummyProviderForLanguageServiceTesting.dll")] ) [] @@ -359,7 +359,7 @@ type UsingMSBuild() = let expectedText = sprintf "provided member '%s'" name Assert.IsTrue(result.ErrorDescription.Contains(expectedText)) ), - addtlRefAssy = [PathRelativeToTestAssembly(@"UnitTests\MockTypeProviders\DummyProviderForLanguageServiceTesting.dll")] + addtlRefAssy = [PathRelativeToTestAssembly(@"DummyProviderForLanguageServiceTesting.dll")] ) [] [] @@ -373,7 +373,7 @@ type UsingMSBuild() = // B01234567890 // C01234567890 """, marker = "T(*GotoValDef*)", - addtlRefAssy = [PathRelativeToTestAssembly(@"UnitTests\MockTypeProviders\DefinitionLocationAttributeFileDoesnotExist.dll")]) + addtlRefAssy = [PathRelativeToTestAssembly(@"DefinitionLocationAttributeFileDoesnotExist.dll")]) [] [] @@ -388,7 +388,7 @@ type UsingMSBuild() = // B01234567890 // C01234567890 """, marker = "T(*GotoValDef*)", - addtlRefAssy = [PathRelativeToTestAssembly(@"UnitTests\MockTypeProviders\DefinitionLocationAttributeLineDoesnotExist.dll")]) + addtlRefAssy = [PathRelativeToTestAssembly(@"DefinitionLocationAttributeLineDoesnotExist.dll")]) [] [] @@ -402,7 +402,7 @@ type UsingMSBuild() = // B01234567890 // C01234567890 """, marker = "T(*GotoValDef*)", - addtlRefAssy = [PathRelativeToTestAssembly(@"UnitTests\MockTypeProviders\DefinitionLocationAttributeFileDoesnotExist.dll")]) + addtlRefAssy = [PathRelativeToTestAssembly(@"DefinitionLocationAttributeFileDoesnotExist.dll")]) @@ -418,7 +418,7 @@ type UsingMSBuild() = // B01234567890 // C01234567890 """, marker = "M(*GotoValDef*)", - addtlRefAssy = [PathRelativeToTestAssembly(@"UnitTests\MockTypeProviders\DefinitionLocationAttributeFileDoesnotExist.dll")]) + addtlRefAssy = [PathRelativeToTestAssembly(@"DefinitionLocationAttributeFileDoesnotExist.dll")]) [] [] @@ -432,7 +432,7 @@ type UsingMSBuild() = // B01234567890 // C01234567890 """, marker = "StaticProp(*GotoValDef*)", - addtlRefAssy = [PathRelativeToTestAssembly(@"UnitTests\MockTypeProviders\DefinitionLocationAttributeFileDoesnotExist.dll")]) + addtlRefAssy = [PathRelativeToTestAssembly(@"DefinitionLocationAttributeFileDoesnotExist.dll")]) [] [] @@ -447,7 +447,7 @@ type UsingMSBuild() = // B01234567890 // C01234567890 """, marker = "Event1(*GotoValDef*)", - addtlRefAssy = [PathRelativeToTestAssembly(@"UnitTests\MockTypeProviders\DefinitionLocationAttributeFileDoesnotExist.dll")]) + addtlRefAssy = [PathRelativeToTestAssembly(@"DefinitionLocationAttributeFileDoesnotExist.dll")]) [] member public this.``ModuleDefintion``() = diff --git a/vsintegration/tests/UnitTests/LegacyLanguageService/Tests.LanguageService.ParameterInfo.fs b/vsintegration/tests/UnitTests/LegacyLanguageService/Tests.LanguageService.ParameterInfo.fs index 8fe4486f160..9339aaa02a8 100644 --- a/vsintegration/tests/UnitTests/LegacyLanguageService/Tests.LanguageService.ParameterInfo.fs +++ b/vsintegration/tests/UnitTests/LegacyLanguageService/Tests.LanguageService.ParameterInfo.fs @@ -329,7 +329,7 @@ type UsingMSBuild() = let foo = N1.T1.M1((*Marker*) """ this.VerifyParameterInfoAtStartOfMarker(fileContent,"(*Marker*)",[["arg1"]], - addtlRefAssy = [PathRelativeToTestAssembly(@"UnitTests\MockTypeProviders\DummyProviderForLanguageServiceTesting.dll")]) + addtlRefAssy = [PathRelativeToTestAssembly(@"DummyProviderForLanguageServiceTesting.dll")]) [] [] @@ -340,7 +340,7 @@ type UsingMSBuild() = let foo = N1.T1.M2((*Marker*) """ this.VerifyParameterInfoAtStartOfMarker(fileContent,"(*Marker*)",[["arg1";"arg2"]], - addtlRefAssy = [PathRelativeToTestAssembly(@"UnitTests\MockTypeProviders\DummyProviderForLanguageServiceTesting.dll")]) + addtlRefAssy = [PathRelativeToTestAssembly(@"DummyProviderForLanguageServiceTesting.dll")]) [] [] @@ -353,7 +353,7 @@ type UsingMSBuild() = let foo = N1.T1.M2((*Marker*) """ this.VerifyFirstParameterInfoColonContent(fileContent,"(*Marker*)",": int", - addtlRefAssy = [PathRelativeToTestAssembly(@"UnitTests\MockTypeProviders\DummyProviderForLanguageServiceTesting.dll")]) + addtlRefAssy = [PathRelativeToTestAssembly(@"DummyProviderForLanguageServiceTesting.dll")]) [] @@ -365,7 +365,7 @@ type UsingMSBuild() = let foo = new N1.T1((*Marker*) """ this.VerifyParameterInfoOverloadMethodIndex(fileContent,"(*Marker*)",0,[], - addtlRefAssy = [PathRelativeToTestAssembly(@"UnitTests\MockTypeProviders\DummyProviderForLanguageServiceTesting.dll")]) + addtlRefAssy = [PathRelativeToTestAssembly(@"DummyProviderForLanguageServiceTesting.dll")]) [] [] @@ -376,7 +376,7 @@ type UsingMSBuild() = let foo = new N1.T1((*Marker*) """ this.VerifyParameterInfoOverloadMethodIndex(fileContent,"(*Marker*)",1,["arg1"], - addtlRefAssy = [PathRelativeToTestAssembly(@"UnitTests\MockTypeProviders\DummyProviderForLanguageServiceTesting.dll")]) + addtlRefAssy = [PathRelativeToTestAssembly(@"DummyProviderForLanguageServiceTesting.dll")]) [] [] @@ -387,7 +387,7 @@ type UsingMSBuild() = let foo = new N1.T1((*Marker*) """ this.VerifyParameterInfoOverloadMethodIndex(fileContent,"(*Marker*)",2,["arg1";"arg2"], - addtlRefAssy = [PathRelativeToTestAssembly(@"UnitTests\MockTypeProviders\DummyProviderForLanguageServiceTesting.dll")]) + addtlRefAssy = [PathRelativeToTestAssembly(@"DummyProviderForLanguageServiceTesting.dll")]) [] [] @@ -398,7 +398,7 @@ type UsingMSBuild() = type foo = N1.T<(*Marker*) """ this.VerifyParameterInfoAtStartOfMarker(fileContent,"(*Marker*)",[["Param1";"ParamIgnored"]], - addtlRefAssy = [PathRelativeToTestAssembly(@"UnitTests\MockTypeProviders\DummyProviderForLanguageServiceTesting.dll")]) + addtlRefAssy = [PathRelativeToTestAssembly(@"DummyProviderForLanguageServiceTesting.dll")]) [] [] @@ -410,7 +410,7 @@ type UsingMSBuild() = type foo = N1.T< "Hello", 2>(*Marker*) """ this.VerifyNoParameterInfoAtStartOfMarker(fileContent,"(*Marker*)", - addtlRefAssy = [PathRelativeToTestAssembly(@"UnitTests\MockTypeProviders\DummyProviderForLanguageServiceTesting.dll")]) + addtlRefAssy = [PathRelativeToTestAssembly(@"DummyProviderForLanguageServiceTesting.dll")]) [] [] @@ -421,26 +421,33 @@ type UsingMSBuild() = type foo = N1.T<"Hello",(*Marker*) """ this.VerifyParameterInfoContainedAtStartOfMarker(fileContent,"(*Marker*)",["Param1";"ParamIgnored"], - [PathRelativeToTestAssembly(@"UnitTests\MockTypeProviders\DummyProviderForLanguageServiceTesting.dll")]) + [PathRelativeToTestAssembly(@"DummyProviderForLanguageServiceTesting.dll")]) [] member public this.``Single.InMatchClause``() = + let v461 = Version(4,6,1) let fileContent = """ let rec f l = match l with | [] -> System.String.Format((*Mark*) | x :: xs -> f xs""" // Note, 3 of these 8 are only available on .NET 4.6.1. On .NET 4.5 only 5 overloads are returned. - this.VerifyParameterInfoAtStartOfMarker(fileContent,"(*Mark*)",[["format"; "arg0"]; - ["format"; "args"]; - ["provider"; "format"; "args"]; - ["provider"; "format"; "arg0"]; - ["format"; "arg0"; "arg1"]; - ["provider"; "format"; "arg0"; "arg1"]; - ["format"; "arg0"; "arg1"; "arg2"]; - ["provider"; "format"; "arg0"; "arg1"; "arg2"]]) - + let expected45 = [["format"; "arg0"]; //Net4.5 + ["format"; "args"]; //Net4.5 + ["provider"; "format"; "args"]; //Net4.5 + ["format"; "arg0"; "arg1"]; //Net4.5 + ["format"; "arg0"; "arg1"; "arg2"]] //Net4.5 + let expected461 = [["provider"; "format"; "arg0"]; //Net4.6.1 + ["provider"; "format"; "arg0"; "arg1"]; //Net4.6.1 + ["provider"; "format"; "arg0"; "arg1"; "arg2"]] //Net4.6.1 + + let expected = + if Environment.Version.CompareTo(v461) >= 0 then + List.concat [expected45;expected461] + else expected45 + this.VerifyParameterInfoAtStartOfMarker(fileContent,"(*Mark*)", expected) + (* --- Parameter Info Systematic Tests ------------------------------------------------- *) member public this.TestSystematicParameterInfo (marker, methReq, ?startOfMarker) = @@ -765,7 +772,7 @@ type UsingMSBuild() = //This test verifies that ParamInfo location on a provided type with namespace that exposes static parameter that takes >1 argument works normally. member public this.``TypeProvider.Type.ParameterInfoLocation.WithNamespace`` () = this.TestParameterInfoLocation("type boo = N1.T<$",11, - addtlRefAssy = [PathRelativeToTestAssembly(@"UnitTests\MockTypeProviders\DummyProviderForLanguageServiceTesting.dll")]) + addtlRefAssy = [PathRelativeToTestAssembly(@"DummyProviderForLanguageServiceTesting.dll")]) [] [] @@ -774,7 +781,7 @@ type UsingMSBuild() = member public this.``TypeProvider.Type.ParameterInfoLocation.WithOutNamespace`` () = this.TestParameterInfoLocation("open N1 \n"+"type boo = T<$", expectedPos = 11, - addtlRefAssy = [PathRelativeToTestAssembly(@"UnitTests\MockTypeProviders\DummyProviderForLanguageServiceTesting.dll")]) + addtlRefAssy = [PathRelativeToTestAssembly(@"DummyProviderForLanguageServiceTesting.dll")]) [] [] @@ -783,7 +790,7 @@ type UsingMSBuild() = //The intent here to make sure the ParamInfo is not shown when inside a string member public this.``TypeProvider.Type.Negative.InString`` () = this.TestParameterInfoNegative("type boo = \"N1.T<$\"", - addtlRefAssy = [PathRelativeToTestAssembly(@"UnitTests\MockTypeProviders\DummyProviderForLanguageServiceTesting.dll")]) + addtlRefAssy = [PathRelativeToTestAssembly(@"DummyProviderForLanguageServiceTesting.dll")]) [] [] @@ -792,7 +799,7 @@ type UsingMSBuild() = //The intent here to make sure the ParamInfo is not shown when inside a comment member public this.``TypeProvider.Type.Negative.InComment`` () = this.TestParameterInfoNegative("// type boo = N1.T<$", - addtlRefAssy = [PathRelativeToTestAssembly(@"UnitTests\MockTypeProviders\DummyProviderForLanguageServiceTesting.dll")]) + addtlRefAssy = [PathRelativeToTestAssembly(@"DummyProviderForLanguageServiceTesting.dll")]) // Following are tricky: @@ -1524,13 +1531,13 @@ We really need to rewrite some code paths here to use the real parse tree rather member public this.``LocationOfParams.TypeProviders.Basic``() = this.TestParameterInfoLocationOfParamsWithVariousSurroundingContexts(""" type U = ^N1.T^<^ "fo$o",^ 42 ^>""", - additionalReferenceAssemblies = [PathRelativeToTestAssembly(@"UnitTests\MockTypeProviders\DummyProviderForLanguageServiceTesting.dll")]) + additionalReferenceAssemblies = [PathRelativeToTestAssembly(@"DummyProviderForLanguageServiceTesting.dll")]) [] member public this.``LocationOfParams.TypeProviders.BasicNamed``() = this.TestParameterInfoLocationOfParamsWithVariousSurroundingContexts(""" type U = ^N1.T^<^ "fo$o",^ ParamIgnored=42 ^>""", - additionalReferenceAssemblies = [PathRelativeToTestAssembly(@"UnitTests\MockTypeProviders\DummyProviderForLanguageServiceTesting.dll")]) + additionalReferenceAssemblies = [PathRelativeToTestAssembly(@"DummyProviderForLanguageServiceTesting.dll")]) [] @@ -1538,42 +1545,42 @@ We really need to rewrite some code paths here to use the real parse tree rather this.TestParameterInfoLocationOfParamsWithVariousSurroundingContexts(""" type U = ^N1.T^<^ $ """, // missing all params, just have < markAtEnd = true, - additionalReferenceAssemblies = [PathRelativeToTestAssembly(@"UnitTests\MockTypeProviders\DummyProviderForLanguageServiceTesting.dll")]) + additionalReferenceAssemblies = [PathRelativeToTestAssembly(@"DummyProviderForLanguageServiceTesting.dll")]) [] member public this.``LocationOfParams.TypeProviders.Prefix1``() = this.TestParameterInfoLocationOfParamsWithVariousSurroundingContexts(""" type U = ^N1.T^<^ "fo$o",^ 42 """, // missing > markAtEnd = true, - additionalReferenceAssemblies = [PathRelativeToTestAssembly(@"UnitTests\MockTypeProviders\DummyProviderForLanguageServiceTesting.dll")]) + additionalReferenceAssemblies = [PathRelativeToTestAssembly(@"DummyProviderForLanguageServiceTesting.dll")]) [] member public this.``LocationOfParams.TypeProviders.Prefix1Named``() = this.TestParameterInfoLocationOfParamsWithVariousSurroundingContexts(""" type U = ^N1.T^<^ "fo$o",^ ParamIgnored=42 """, // missing > markAtEnd = true, - additionalReferenceAssemblies = [PathRelativeToTestAssembly(@"UnitTests\MockTypeProviders\DummyProviderForLanguageServiceTesting.dll")]) + additionalReferenceAssemblies = [PathRelativeToTestAssembly(@"DummyProviderForLanguageServiceTesting.dll")]) [] member public this.``LocationOfParams.TypeProviders.Prefix2``() = this.TestParameterInfoLocationOfParamsWithVariousSurroundingContexts(""" type U = ^N1.T^<^ "fo$o",^ """, // missing last param markAtEnd = true, - additionalReferenceAssemblies = [PathRelativeToTestAssembly(@"UnitTests\MockTypeProviders\DummyProviderForLanguageServiceTesting.dll")]) + additionalReferenceAssemblies = [PathRelativeToTestAssembly(@"DummyProviderForLanguageServiceTesting.dll")]) [] member public this.``LocationOfParams.TypeProviders.Prefix2Named1``() = this.TestParameterInfoLocationOfParamsWithVariousSurroundingContexts(""" type U = ^N1.T^<^ "fo$o",^ ParamIgnored= """, // missing last param after name with equals markAtEnd = true, - additionalReferenceAssemblies = [PathRelativeToTestAssembly(@"UnitTests\MockTypeProviders\DummyProviderForLanguageServiceTesting.dll")]) + additionalReferenceAssemblies = [PathRelativeToTestAssembly(@"DummyProviderForLanguageServiceTesting.dll")]) [] member public this.``LocationOfParams.TypeProviders.Prefix2Named2``() = this.TestParameterInfoLocationOfParamsWithVariousSurroundingContexts(""" type U = ^N1.T^<^ "fo$o",^ ParamIgnored """, // missing last param after name sans equals markAtEnd = true, - additionalReferenceAssemblies = [PathRelativeToTestAssembly(@"UnitTests\MockTypeProviders\DummyProviderForLanguageServiceTesting.dll")]) + additionalReferenceAssemblies = [PathRelativeToTestAssembly(@"DummyProviderForLanguageServiceTesting.dll")]) [] member public this.``LocationOfParams.TypeProviders.Negative1``() = @@ -1595,7 +1602,7 @@ We really need to rewrite some code paths here to use the real parse tree rather member public this.``LocationOfParams.TypeProviders.Negative4.Bug181000``() = this.TestNoParameterInfo(""" type U = ^N1.T^<^ "foo",^ 42 ^>$ """, // when the caret is right of the '>', we should not report any param info - additionalReferenceAssemblies = [PathRelativeToTestAssembly(@"UnitTests\MockTypeProviders\DummyProviderForLanguageServiceTesting.dll")]) + additionalReferenceAssemblies = [PathRelativeToTestAssembly(@"DummyProviderForLanguageServiceTesting.dll")]) [] member public this.``LocationOfParams.TypeProviders.BasicWithinExpr``() = @@ -1603,7 +1610,7 @@ We really need to rewrite some code paths here to use the real parse tree rather let f() = let r = id( ^N1.T^<^ "fo$o",^ ParamIgnored=42 ^> ) r """, - additionalReferenceAssemblies = [PathRelativeToTestAssembly(@"UnitTests\MockTypeProviders\DummyProviderForLanguageServiceTesting.dll")]) + additionalReferenceAssemblies = [PathRelativeToTestAssembly(@"DummyProviderForLanguageServiceTesting.dll")]) [] member public this.``LocationOfParams.TypeProviders.BasicWithinExpr.DoesNotInterfereWithOuterFunction``() = @@ -1611,37 +1618,37 @@ We really need to rewrite some code paths here to use the real parse tree rather let f() = let r = ^id^(^ N1.$T< "foo", ParamIgnored=42 > ^) r """, - additionalReferenceAssemblies = [PathRelativeToTestAssembly(@"UnitTests\MockTypeProviders\DummyProviderForLanguageServiceTesting.dll")]) + additionalReferenceAssemblies = [PathRelativeToTestAssembly(@"DummyProviderForLanguageServiceTesting.dll")]) [] member public this.``LocationOfParams.TypeProviders.Bug199744.ExcessCommasShouldNotAssertAndShouldGiveInfo.Case1``() = this.TestParameterInfoLocationOfParamsWithVariousSurroundingContexts(""" type U = ^N1.T^<^ "fo$o",^ 42,^ ,^ ^>""", - additionalReferenceAssemblies = [PathRelativeToTestAssembly(@"UnitTests\MockTypeProviders\DummyProviderForLanguageServiceTesting.dll")]) + additionalReferenceAssemblies = [PathRelativeToTestAssembly(@"DummyProviderForLanguageServiceTesting.dll")]) [] member public this.``LocationOfParams.TypeProviders.Bug199744.ExcessCommasShouldNotAssertAndShouldGiveInfo.Case2``() = this.TestParameterInfoLocationOfParamsWithVariousSurroundingContexts(""" type U = ^N1.T^<^ "fo$o",^ ,^ ^>""", - additionalReferenceAssemblies = [PathRelativeToTestAssembly(@"UnitTests\MockTypeProviders\DummyProviderForLanguageServiceTesting.dll")]) + additionalReferenceAssemblies = [PathRelativeToTestAssembly(@"DummyProviderForLanguageServiceTesting.dll")]) [] member public this.``LocationOfParams.TypeProviders.Bug199744.ExcessCommasShouldNotAssertAndShouldGiveInfo.Case3``() = this.TestParameterInfoLocationOfParamsWithVariousSurroundingContexts(""" type U = ^N1.T^<^ ,^$ ^>""", - additionalReferenceAssemblies = [PathRelativeToTestAssembly(@"UnitTests\MockTypeProviders\DummyProviderForLanguageServiceTesting.dll")]) + additionalReferenceAssemblies = [PathRelativeToTestAssembly(@"DummyProviderForLanguageServiceTesting.dll")]) [] [] member public this.``LocationOfParams.TypeProviders.StaticParametersAtConstructorCallSite``() = this.TestParameterInfoLocationOfParamsWithVariousSurroundingContexts(""" let x = new ^N1.T^<^ "fo$o",^ 42 ^>()""", - additionalReferenceAssemblies = [PathRelativeToTestAssembly(@"UnitTests\MockTypeProviders\DummyProviderForLanguageServiceTesting.dll")]) + additionalReferenceAssemblies = [PathRelativeToTestAssembly(@"DummyProviderForLanguageServiceTesting.dll")]) [] member public this.``TypeProvider.FormatOfNamesOfSystemTypes``() = let code = ["""type TTT = N1.T< "foo", ParamIgnored=42 > """] - let references = [PathRelativeToTestAssembly(@"UnitTests\MockTypeProviders\DummyProviderForLanguageServiceTesting.dll")] + let references = [PathRelativeToTestAssembly(@"DummyProviderForLanguageServiceTesting.dll")] let (_, _, file) = this.CreateSingleFileProject(code, references = references) let gpatcc = GlobalParseAndTypeCheckCounter.StartNew(this.VS) MoveCursorToEndOfMarker(file,"foo") diff --git a/vsintegration/tests/UnitTests/LegacyLanguageService/Tests.LanguageService.QuickInfo.fs b/vsintegration/tests/UnitTests/LegacyLanguageService/Tests.LanguageService.QuickInfo.fs index 683f239faa5..267943da1d3 100644 --- a/vsintegration/tests/UnitTests/LegacyLanguageService/Tests.LanguageService.QuickInfo.fs +++ b/vsintegration/tests/UnitTests/LegacyLanguageService/Tests.LanguageService.QuickInfo.fs @@ -217,7 +217,7 @@ type UsingMSBuild() = fileContents, marker = "MembersTP(*Marker*)", expected = "type HiddenBaseMembersTP =\n inherit TPBaseTy\n member ShowThisProp : unit", - addtlRefAssy = [PathRelativeToTestAssembly(@"UnitTests\MockTypeProviders\DummyProviderForLanguageServiceTesting.dll")]) + addtlRefAssy = [PathRelativeToTestAssembly(@"DummyProviderForLanguageServiceTesting.dll")]) [] member public this.``QuickInfo.OverriddenMethods``() = @@ -293,7 +293,7 @@ Full name: Microsoft.FSharp.Control.Async""".TrimStart().Replace("\r\n", "\n") [] member public this.``TypeProviders.NestedTypesOrder``() = let code = "type t = N1.TypeWithNestedTypes(*M*)" - let tpReference = PathRelativeToTestAssembly( @"UnitTests\MockTypeProviders\DummyProviderForLanguageServiceTesting.dll") + let tpReference = PathRelativeToTestAssembly( @"DummyProviderForLanguageServiceTesting.dll") this.VerifyOrderOfNestedTypesInQuickInfo( source = code, marker = "(*M*)", @@ -347,7 +347,7 @@ Full name: Microsoft.FSharp.Control.Async""".TrimStart().Replace("\r\n", "\n") let a = typeof """ this.AssertQuickInfoContainsAtStartOfMarker (fileContents, "T(*Marker*)", "This is a synthetic type created by me!", - addtlRefAssy = [PathRelativeToTestAssembly( @"UnitTests\MockTypeProviders\XmlDocAttributeWithAdequateComment.dll")]) + addtlRefAssy = [PathRelativeToTestAssembly( @"XmlDocAttributeWithAdequateComment.dll")]) [] [] @@ -360,7 +360,7 @@ Full name: Microsoft.FSharp.Control.Async""".TrimStart().Replace("\r\n", "\n") this.AssertQuickInfoContainsAtStartOfMarker (fileContents, "T(*Marker*)", "This is a synthetic type created by me!. Which is used to test the tool tip of the typeprovider type to check if it shows the right message or not.", - addtlRefAssy = [PathRelativeToTestAssembly( @"UnitTests\MockTypeProviders\XmlDocAttributeWithLongComment.dll")]) + addtlRefAssy = [PathRelativeToTestAssembly( @"XmlDocAttributeWithLongComment.dll")]) [] [] @@ -373,7 +373,7 @@ Full name: Microsoft.FSharp.Control.Async""".TrimStart().Replace("\r\n", "\n") this.AssertQuickInfoContainsAtStartOfMarker (fileContents, "T(*Marker*)", "type T =\n new : unit -> T\n event Event1 : EventHandler\n static member M : unit -> int []\n static member StaticProp : decimal", - addtlRefAssy = [PathRelativeToTestAssembly( @"UnitTests\MockTypeProviders\XmlDocAttributeWithNullComment.dll")]) + addtlRefAssy = [PathRelativeToTestAssembly( @"XmlDocAttributeWithNullComment.dll")]) [] [] @@ -386,7 +386,7 @@ Full name: Microsoft.FSharp.Control.Async""".TrimStart().Replace("\r\n", "\n") this.AssertQuickInfoContainsAtStartOfMarker (fileContents, "T(*Marker*)", "type T =\n new : unit -> T\n event Event1 : EventHandler\n static member M : unit -> int []\n static member StaticProp : decimal\nFull name: N.T", - addtlRefAssy = [PathRelativeToTestAssembly( @"UnitTests\MockTypeProviders\XmlDocAttributeWithEmptyComment.dll")]) + addtlRefAssy = [PathRelativeToTestAssembly( @"XmlDocAttributeWithEmptyComment.dll")]) [] @@ -400,7 +400,7 @@ Full name: Microsoft.FSharp.Control.Async""".TrimStart().Replace("\r\n", "\n") this.AssertQuickInfoContainsAtStartOfMarker (fileContents, "T(*Marker*)", "This is a synthetic type Localized! ኤፍ ሻርፕ", - addtlRefAssy = [PathRelativeToTestAssembly( @"UnitTests\MockTypeProviders\XmlDocAttributeWithLocalizedComment.dll")]) + addtlRefAssy = [PathRelativeToTestAssembly( @"XmlDocAttributeWithLocalizedComment.dll")]) [] [] @@ -412,7 +412,7 @@ Full name: Microsoft.FSharp.Control.Async""".TrimStart().Replace("\r\n", "\n") let foo = new N.T(*Marker*)() """ this.AssertQuickInfoContainsAtStartOfMarker (fileContents, "T(*Marker*)", "This is a synthetic .ctor created by me for N.T", - addtlRefAssy = [PathRelativeToTestAssembly( @"UnitTests\MockTypeProviders\XmlDocAttributeWithAdequateComment.dll")]) + addtlRefAssy = [PathRelativeToTestAssembly( @"XmlDocAttributeWithAdequateComment.dll")]) [] [] @@ -425,7 +425,7 @@ Full name: Microsoft.FSharp.Control.Async""".TrimStart().Replace("\r\n", "\n") this.AssertQuickInfoContainsAtStartOfMarker (fileContents, "T(*Marker*)", "This is a synthetic .ctor created by me for N.T. Which is used to test the tool tip of the typeprovider Constructor to check if it shows the right message or not.", - addtlRefAssy = [PathRelativeToTestAssembly( @"UnitTests\MockTypeProviders\XmlDocAttributeWithLongComment.dll")]) + addtlRefAssy = [PathRelativeToTestAssembly( @"XmlDocAttributeWithLongComment.dll")]) [] [] @@ -438,7 +438,7 @@ Full name: Microsoft.FSharp.Control.Async""".TrimStart().Replace("\r\n", "\n") this.AssertQuickInfoContainsAtStartOfMarker (fileContents, "T(*Marker*)", "N.T() : N.T", - addtlRefAssy = [PathRelativeToTestAssembly( @"UnitTests\MockTypeProviders\XmlDocAttributeWithNullComment.dll")]) + addtlRefAssy = [PathRelativeToTestAssembly( @"XmlDocAttributeWithNullComment.dll")]) [] [] @@ -451,7 +451,7 @@ Full name: Microsoft.FSharp.Control.Async""".TrimStart().Replace("\r\n", "\n") this.AssertQuickInfoContainsAtStartOfMarker (fileContents, "T(*Marker*)", "N.T() : N.T", - addtlRefAssy = [PathRelativeToTestAssembly( @"UnitTests\MockTypeProviders\XmlDocAttributeWithEmptyComment.dll")]) + addtlRefAssy = [PathRelativeToTestAssembly( @"XmlDocAttributeWithEmptyComment.dll")]) [] [] @@ -464,7 +464,7 @@ Full name: Microsoft.FSharp.Control.Async""".TrimStart().Replace("\r\n", "\n") this.AssertQuickInfoContainsAtStartOfMarker (fileContents, "T(*Marker*)", "This is a synthetic .ctor Localized! ኤፍ ሻርፕ for N.T", - addtlRefAssy = [PathRelativeToTestAssembly( @"UnitTests\MockTypeProviders\XmlDocAttributeWithLocalizedComment.dll")]) + addtlRefAssy = [PathRelativeToTestAssembly( @"XmlDocAttributeWithLocalizedComment.dll")]) [] @@ -479,7 +479,7 @@ Full name: Microsoft.FSharp.Control.Async""".TrimStart().Replace("\r\n", "\n") this.AssertQuickInfoContainsAtStartOfMarker (fileContents, "Event1(*Marker*)", "This is a synthetic *event* created by me for N.T", - addtlRefAssy = [PathRelativeToTestAssembly( @"UnitTests\MockTypeProviders\XmlDocAttributeWithAdequateComment.dll")]) + addtlRefAssy = [PathRelativeToTestAssembly( @"XmlDocAttributeWithAdequateComment.dll")]) [] [] @@ -493,7 +493,7 @@ Full name: Microsoft.FSharp.Control.Async""".TrimStart().Replace("\r\n", "\n") this.AssertQuickInfoContainsAtStartOfMarker (fileContents, "Event1(*Marker*)", "This is a synthetic *event* Localized! ኤፍ ሻርፕ for N.T", - addtlRefAssy = [PathRelativeToTestAssembly( @"UnitTests\MockTypeProviders\XmlDocAttributeWithLocalizedComment.dll")]) + addtlRefAssy = [PathRelativeToTestAssembly( @"XmlDocAttributeWithLocalizedComment.dll")]) [] [] @@ -517,7 +517,7 @@ Full name: Microsoft.FSharp.Control.Async""".TrimStart().Replace("\r\n", "\n") this.AssertQuickInfoContainsAtStartOfMarker (fileContents, "Event1(*Marker*)", "This is a synthetic *event* created by me for N.T. Which is used to test the tool tip of the typeprovider Event to check if it shows the right message or not.!", - addtlRefAssy = [PathRelativeToTestAssembly( @"UnitTests\MockTypeProviders\XmlDocAttributeWithLongComment.dll")]) + addtlRefAssy = [PathRelativeToTestAssembly( @"XmlDocAttributeWithLongComment.dll")]) [] [] @@ -531,7 +531,7 @@ Full name: Microsoft.FSharp.Control.Async""".TrimStart().Replace("\r\n", "\n") this.AssertQuickInfoContainsAtStartOfMarker (fileContents, "Event1(*Marker*)", "event N.T.Event1: IEvent", - addtlRefAssy = [PathRelativeToTestAssembly( @"UnitTests\MockTypeProviders\XmlDocAttributeWithNullComment.dll")]) + addtlRefAssy = [PathRelativeToTestAssembly( @"XmlDocAttributeWithNullComment.dll")]) [] [] @@ -545,7 +545,7 @@ Full name: Microsoft.FSharp.Control.Async""".TrimStart().Replace("\r\n", "\n") this.AssertQuickInfoContainsAtStartOfMarker (fileContents, "Event1(*Marker*)", "event N.T.Event1: IEvent", - addtlRefAssy = [PathRelativeToTestAssembly( @"UnitTests\MockTypeProviders\XmlDocAttributeWithEmptyComment.dll")]) + addtlRefAssy = [PathRelativeToTestAssembly( @"XmlDocAttributeWithEmptyComment.dll")]) [] @@ -559,7 +559,7 @@ Full name: Microsoft.FSharp.Control.Async""".TrimStart().Replace("\r\n", "\n") this.AssertQuickInfoContainsAtStartOfMarker (fileContents, "M(*Marker*)", "This is a synthetic *method* created by me!!", - addtlRefAssy = [PathRelativeToTestAssembly( @"UnitTests\MockTypeProviders\XmlDocAttributeWithAdequateComment.dll")]) + addtlRefAssy = [PathRelativeToTestAssembly( @"XmlDocAttributeWithAdequateComment.dll")]) [] [] @@ -572,7 +572,7 @@ Full name: Microsoft.FSharp.Control.Async""".TrimStart().Replace("\r\n", "\n") this.AssertQuickInfoContainsAtStartOfMarker (fileContents, "M(*Marker*)", "This is a synthetic *method* Localized! ኤፍ ሻርፕ", - addtlRefAssy = [PathRelativeToTestAssembly( @"UnitTests\MockTypeProviders\XmlDocAttributeWithLocalizedComment.dll")]) + addtlRefAssy = [PathRelativeToTestAssembly( @"XmlDocAttributeWithLocalizedComment.dll")]) [] [] @@ -585,7 +585,7 @@ Full name: Microsoft.FSharp.Control.Async""".TrimStart().Replace("\r\n", "\n") this.AssertQuickInfoContainsAtStartOfMarker (fileContents, "M(*Marker*)", "This is a synthetic *method* created by me!!. Which is used to test the tool tip of the typeprovider Method to check if it shows the right message or not.!", - addtlRefAssy = [PathRelativeToTestAssembly( @"UnitTests\MockTypeProviders\XmlDocAttributeWithLongComment.dll")]) + addtlRefAssy = [PathRelativeToTestAssembly( @"XmlDocAttributeWithLongComment.dll")]) [] [] @@ -598,7 +598,7 @@ Full name: Microsoft.FSharp.Control.Async""".TrimStart().Replace("\r\n", "\n") this.AssertQuickInfoContainsAtStartOfMarker (fileContents, "M(*Marker*)", "N.T.M() : int []", - addtlRefAssy = [PathRelativeToTestAssembly( @"UnitTests\MockTypeProviders\XmlDocAttributeWithNullComment.dll")]) + addtlRefAssy = [PathRelativeToTestAssembly( @"XmlDocAttributeWithNullComment.dll")]) [] [] @@ -611,7 +611,7 @@ Full name: Microsoft.FSharp.Control.Async""".TrimStart().Replace("\r\n", "\n") this.AssertQuickInfoContainsAtStartOfMarker (fileContents, "M(*Marker*)", "N.T.M() : int []", - addtlRefAssy = [PathRelativeToTestAssembly( @"UnitTests\MockTypeProviders\XmlDocAttributeWithEmptyComment.dll")]) + addtlRefAssy = [PathRelativeToTestAssembly( @"XmlDocAttributeWithEmptyComment.dll")]) [] @@ -625,7 +625,7 @@ Full name: Microsoft.FSharp.Control.Async""".TrimStart().Replace("\r\n", "\n") this.AssertQuickInfoContainsAtStartOfMarker (fileContents, "StaticProp(*Marker*)", "This is a synthetic *property* created by me for N.T", - addtlRefAssy = [PathRelativeToTestAssembly( @"UnitTests\MockTypeProviders\XmlDocAttributeWithAdequateComment.dll")]) + addtlRefAssy = [PathRelativeToTestAssembly( @"XmlDocAttributeWithAdequateComment.dll")]) [] [] @@ -638,7 +638,7 @@ Full name: Microsoft.FSharp.Control.Async""".TrimStart().Replace("\r\n", "\n") this.AssertQuickInfoContainsAtStartOfMarker (fileContents, "StaticProp(*Marker*)", "This is a synthetic *property* Localized! ኤፍ ሻርፕ for N.T", - addtlRefAssy = [PathRelativeToTestAssembly( @"UnitTests\MockTypeProviders\XmlDocAttributeWithLocalizedComment.dll")]) + addtlRefAssy = [PathRelativeToTestAssembly( @"XmlDocAttributeWithLocalizedComment.dll")]) [] [] @@ -651,7 +651,7 @@ Full name: Microsoft.FSharp.Control.Async""".TrimStart().Replace("\r\n", "\n") this.AssertQuickInfoContainsAtStartOfMarker (fileContents, "StaticProp(*Marker*)", "This is a synthetic *property* created by me for N.T. Which is used to test the tool tip of the typeprovider Property to check if it shows the right message or not.!", - addtlRefAssy = [PathRelativeToTestAssembly( @"UnitTests\MockTypeProviders\XmlDocAttributeWithLongComment.dll")]) + addtlRefAssy = [PathRelativeToTestAssembly( @"XmlDocAttributeWithLongComment.dll")]) [] [] @@ -664,7 +664,7 @@ Full name: Microsoft.FSharp.Control.Async""".TrimStart().Replace("\r\n", "\n") this.AssertQuickInfoContainsAtStartOfMarker (fileContents, "StaticProp(*Marker*)", "property N.T.StaticProp: decimal", - addtlRefAssy = [PathRelativeToTestAssembly( @"UnitTests\MockTypeProviders\XmlDocAttributeWithNullComment.dll")]) + addtlRefAssy = [PathRelativeToTestAssembly( @"XmlDocAttributeWithNullComment.dll")]) [] [] @@ -677,7 +677,7 @@ Full name: Microsoft.FSharp.Control.Async""".TrimStart().Replace("\r\n", "\n") this.AssertQuickInfoContainsAtStartOfMarker (fileContents, "StaticProp(*Marker*)", "property N.T.StaticProp: decimal", - addtlRefAssy = [PathRelativeToTestAssembly( @"UnitTests\MockTypeProviders\XmlDocAttributeWithEmptyComment.dll")]) + addtlRefAssy = [PathRelativeToTestAssembly( @"XmlDocAttributeWithEmptyComment.dll")]) [] @@ -694,7 +694,7 @@ Full name: Microsoft.FSharp.Control.Async""".TrimStart().Replace("\r\n", "\n") fileContents, marker = "foo(*Marker*)", expected = "type foo = N1.T", - addtlRefAssy = [PathRelativeToTestAssembly(@"UnitTests\MockTypeProviders\DummyProviderForLanguageServiceTesting.dll")]) + addtlRefAssy = [PathRelativeToTestAssembly(@"DummyProviderForLanguageServiceTesting.dll")]) [] [] @@ -711,7 +711,7 @@ Full name: Microsoft.FSharp.Control.Async""".TrimStart().Replace("\r\n", "\n") fileContents, marker = "foo(*Marker*)", expected = "type foo", - addtlRefAssy = [PathRelativeToTestAssembly(@"UnitTests\MockTypeProviders\DummyProviderForLanguageServiceTesting.dll")]) + addtlRefAssy = [PathRelativeToTestAssembly(@"DummyProviderForLanguageServiceTesting.dll")]) [] [] @@ -728,7 +728,7 @@ Full name: Microsoft.FSharp.Control.Async""".TrimStart().Replace("\r\n", "\n") fileContents, marker = "foo(*Marker*)", expected = "XMLComment", - addtlRefAssy = [PathRelativeToTestAssembly(@"UnitTests\MockTypeProviders\DummyProviderForLanguageServiceTesting.dll")]) + addtlRefAssy = [PathRelativeToTestAssembly(@"DummyProviderForLanguageServiceTesting.dll")]) [] [] @@ -739,7 +739,7 @@ Full name: Microsoft.FSharp.Control.Async""".TrimStart().Replace("\r\n", "\n") fileContents, marker = "TTT", expected = "type TTT = Samples.FSharp.RegexTypeProvider.RegexTyped<...>\nFull name: File1.TTT", - addtlRefAssy = ["System"; PathRelativeToTestAssembly(@"UnitTests\MockTypeProviders\DummyProviderForLanguageServiceTesting.dll")]) + addtlRefAssy = ["System"; PathRelativeToTestAssembly(@"DummyProviderForLanguageServiceTesting.dll")]) [] [] @@ -754,7 +754,7 @@ Full name: Microsoft.FSharp.Control.Async""".TrimStart().Replace("\r\n", "\n") fileContents, marker = "reaCode.Val", expected = """property Samples.FSharp.RegexTypeProvider.RegexTyped<...>.MatchType.AreaCode: System.Text.RegularExpressions.Group""", - addtlRefAssy = ["System"; PathRelativeToTestAssembly(@"UnitTests\MockTypeProviders\DummyProviderForLanguageServiceTesting.dll")]) + addtlRefAssy = ["System"; PathRelativeToTestAssembly(@"DummyProviderForLanguageServiceTesting.dll")]) // Regression for 2948 [] @@ -2118,15 +2118,13 @@ query." member public this.``GenericDotNetMethodShowsComment``() = this.AssertMemberDataTipContainsInOrder ((*code *) - ["System.Linq.ParallelEnumerable." - ] , + ["System.Linq.ParallelEnumerable."] , (* marker *) "ParallelEnumerable.", (* completed item *) "ElementAt", (* expect to see in order... *) [ - "System.Core"; "Signature:M:System.Linq.ParallelEnumerable.ElementAt``1(System.Linq.ParallelQuery{``0},System.Int32" ] ) @@ -2985,9 +2983,9 @@ query." this.AssertQuickInfoContainsAtStartOfMarker (fileContent, "(*Marker5*)", "value param") this.AssertQuickInfoContainsAtStartOfMarker (fileContent, "(*Marker6*)", "value param") this.AssertQuickInfoContainsAtStartOfMarker (fileContent, "(*Marker7*)", "Param1 of string", - addtlRefAssy = [PathRelativeToTestAssembly(@"UnitTests\MockTypeProviders\DummyProviderForLanguageServiceTesting.dll")]) + addtlRefAssy = [PathRelativeToTestAssembly(@"DummyProviderForLanguageServiceTesting.dll")]) this.AssertQuickInfoContainsAtStartOfMarker (fileContent, "(*Marker8*)", "Ignored", - addtlRefAssy = [PathRelativeToTestAssembly(@"UnitTests\MockTypeProviders\DummyProviderForLanguageServiceTesting.dll")]) + addtlRefAssy = [PathRelativeToTestAssembly(@"DummyProviderForLanguageServiceTesting.dll")]) member private this.VerifyUsingFsTestLib fileContent queries crossProject = use _guard = this.UsingNewVS() diff --git a/vsintegration/tests/UnitTests/LegacyLanguageService/Tests.LanguageService.Script.fs b/vsintegration/tests/UnitTests/LegacyLanguageService/Tests.LanguageService.Script.fs index 6a9f0637463..cbe55e9baf9 100644 --- a/vsintegration/tests/UnitTests/LegacyLanguageService/Tests.LanguageService.Script.fs +++ b/vsintegration/tests/UnitTests/LegacyLanguageService/Tests.LanguageService.Script.fs @@ -1558,7 +1558,7 @@ type UsingMSBuild() as this = ] let refs = [ - PathRelativeToTestAssembly(@"UnitTests\MockTypeProviders\DummyProviderForLanguageServiceTesting.dll") + PathRelativeToTestAssembly(@"DummyProviderForLanguageServiceTesting.dll") ] let (_, project, file) = this.CreateSingleFileProject(code, references = refs) TakeCoffeeBreak(this.VS) @@ -1566,7 +1566,7 @@ type UsingMSBuild() as this = member public this.TypeProviderDisposalSmokeTest(clearing) = use _guard = this.UsingNewVS() - let providerAssemblyName = PathRelativeToTestAssembly(@"UnitTests\MockTypeProviders\DummyProviderForLanguageServiceTesting.dll") + let providerAssemblyName = PathRelativeToTestAssembly(@"DummyProviderForLanguageServiceTesting.dll") let providerAssembly = System.Reflection.Assembly.LoadFrom providerAssemblyName Assert.IsNotNull(providerAssembly, "provider assembly should not be null") let providerCounters = providerAssembly.GetType("DummyProviderForLanguageServiceTesting.GlobalCounters") @@ -1606,7 +1606,7 @@ type UsingMSBuild() as this = for i in 1 .. 50 do let solution = this.CreateSolution() let project = CreateProject(solution,"testproject" + string (i % 20)) - this.AddAssemblyReference(project, PathRelativeToTestAssembly(@"UnitTests\MockTypeProviders\DummyProviderForLanguageServiceTesting.dll")) + this.AddAssemblyReference(project, PathRelativeToTestAssembly(@"DummyProviderForLanguageServiceTesting.dll")) let fileName = sprintf "File%d.fs" i let file1 = AddFileFromText(project,fileName, ["let x" + string i + " = N1.T1()" ]) let file = OpenFile(project,fileName) diff --git a/vsintegration/tests/UnitTests/SignatureHelpProviderTests.fs b/vsintegration/tests/UnitTests/SignatureHelpProviderTests.fs index ee651357715..b26f786fabb 100644 --- a/vsintegration/tests/UnitTests/SignatureHelpProviderTests.fs +++ b/vsintegration/tests/UnitTests/SignatureHelpProviderTests.fs @@ -39,7 +39,7 @@ let internal projectOptions = { ProjectId = None SourceFiles = [| filePath |] ReferencedProjects = [| |] - OtherOptions = [| "-r:" + PathRelativeToTestAssembly(@"UnitTests\MockTypeProviders\DummyProviderForLanguageServiceTesting.dll") |] + OtherOptions = [| "-r:" + PathRelativeToTestAssembly(@"DummyProviderForLanguageServiceTesting.dll") |] IsIncompleteTypeCheckEnvironment = true UseScriptResolutionRules = false LoadTime = DateTime.MaxValue diff --git a/vsintegration/tests/UnitTests/TestLib.LanguageService.fs b/vsintegration/tests/UnitTests/TestLib.LanguageService.fs index 35425ae98dc..002d47aad57 100644 --- a/vsintegration/tests/UnitTests/TestLib.LanguageService.fs +++ b/vsintegration/tests/UnitTests/TestLib.LanguageService.fs @@ -15,12 +15,15 @@ open UnitTests.TestLib.Utils open Microsoft.FSharp.Compiler open System.Text.RegularExpressions open Microsoft.FSharp.Compiler.SourceCodeServices +open Microsoft.VisualStudio.FSharp + #nowarn "52" // The value has been copied to ensure the original is not mutated [] -module internal Globals = +module internal Globals = let checker = FSharpChecker.Create(legacyReferenceResolver=Microsoft.FSharp.Compiler.MSBuildReferenceResolver.Resolver) + //open Internal.Utilities type internal TextSpan = Microsoft.VisualStudio.TextManager.Interop.TextSpan @@ -243,6 +246,8 @@ type internal GlobalParseAndTypeCheckCounter private(initialParseCount:int, init /// various functions that abstract actions over vs. type LanguageServiceBaseTests() = + let _resolver = AssemblyResolver.addResolver () + let mutable defaultSolution : OpenSolution = Unchecked.defaultof<_> let cache = System.Collections.Generic.Dictionary() diff --git a/vsintegration/tests/UnitTests/Tests.XmlDocComments.fs b/vsintegration/tests/UnitTests/Tests.XmlDocComments.fs index 63843436082..2506296bb6c 100644 --- a/vsintegration/tests/UnitTests/Tests.XmlDocComments.fs +++ b/vsintegration/tests/UnitTests/Tests.XmlDocComments.fs @@ -10,12 +10,13 @@ open UnitTests.TestLib.Salsa open UnitTests.TestLib.Utils [] -type XmlDocComments() = +type XmlDocComments() = inherit UnitTests.TestLib.LanguageService.LanguageServiceBaseTests(VsOpts = InstalledMSBuildTestFlavour()) - // Work around an innocuous 'feature' with how QuickInfo is displayed, lines which + + // Work around an innocuous 'feature' with how QuickInfo is displayed, lines which // should have a "\r\n" just have a "\r" - let trimnewlines (str : string) = - str.Replace("\r", "").Replace("\n", "") + let trimnewlines (str : string) = + str.Replace("\r", "").Replace("\n", "") member public this.AssertQuickInfoContainsAtStartOfMarker code marker expected = let (_solution, _project, file) = this.CreateSingleFileProject(code : string) From 4a9cc93208d41783cee05e6c05273fd256037800 Mon Sep 17 00:00:00 2001 From: "Brett V. Forsgren" Date: Tue, 4 Dec 2018 12:26:30 -0800 Subject: [PATCH 121/160] create compiler package during regular build (#5981) --- fsharp.proj | 7 ++++++- src/fsharp/Directory.Nuget.targets | 4 ++-- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/fsharp.proj b/fsharp.proj index 1cd572a408c..42d2f15b16f 100644 --- a/fsharp.proj +++ b/fsharp.proj @@ -49,7 +49,8 @@ - + + @@ -115,6 +116,10 @@ + + + + diff --git a/src/fsharp/Directory.Nuget.targets b/src/fsharp/Directory.Nuget.targets index 65ad4cb8fe7..f3ae171dc38 100644 --- a/src/fsharp/Directory.Nuget.targets +++ b/src/fsharp/Directory.Nuget.targets @@ -11,9 +11,9 @@ - + - + From 5a54ebd34682f7a57e3b6e5cace269b9d0eebe81 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Victor=20Peter=20Rouven=20M=C3=BCller?= Date: Wed, 5 Dec 2018 22:22:29 +0100 Subject: [PATCH 122/160] Fix #5531 (#5778) * Fix #5531 This is a working fix for the example of #5531. However there are still some points open before I think it's a good idea to merge this: - Discuss the change of this proposal, is it OK to prefer overrides of methods and so ignore base implementations? - Extend the check to the complete inheritance graph instead of a single "look-back" - Only ignore a methinfo if the signature of both match (so respect different overloads) @dsyme It would be great if you could have a look whether this check is allowed at this location or should appear earlier. * Fix left points. Signed-off-by: realvictorprm * another approach to fix * remove old approach * Remove approach again and apply different approach. Signed-off-by: realvictorprm * Adjusting predicate to reflect correct behaviour. * Revert to old List.merge strategy. * Apply review and add tests Signed-off-by: realvictorprm * Try fixing weird CI failure Signed-off-by: realvictorprm * Fix test. Signed-off-by: realvictorprm --- src/fsharp/ConstraintSolver.fs | 7 +++++ .../5531/compilation.output.test.bsl | 2 ++ .../5531/compilation.output.test.txt | 2 ++ tests/fsharp/regression/5531/output.test.bsl | 7 +++++ tests/fsharp/regression/5531/output.test.txt | 7 +++++ tests/fsharp/regression/5531/test.fs | 23 ++++++++++++++ tests/fsharp/tests.fs | 30 +++++++++++++++++++ 7 files changed, 78 insertions(+) create mode 100644 tests/fsharp/regression/5531/compilation.output.test.bsl create mode 100644 tests/fsharp/regression/5531/compilation.output.test.txt create mode 100644 tests/fsharp/regression/5531/output.test.bsl create mode 100644 tests/fsharp/regression/5531/output.test.txt create mode 100644 tests/fsharp/regression/5531/test.fs diff --git a/src/fsharp/ConstraintSolver.fs b/src/fsharp/ConstraintSolver.fs index 1eb5e69dc10..1cd69a223fa 100644 --- a/src/fsharp/ConstraintSolver.fs +++ b/src/fsharp/ConstraintSolver.fs @@ -1491,7 +1491,14 @@ and GetRelevantMethodsForTrait (csenv:ConstraintSolverEnv) permitWeakResolution /// to a generic instantiation for an operator based on the right hand type. let minfos = List.reduce (ListSet.unionFavourLeft MethInfo.MethInfosUseIdenticalDefinitions) minfos + + /// Check that the available members aren't hiding a member from the parent (depth 1 only) + let relevantMinfos = minfos |> List.filter(fun minfo -> not minfo.IsDispatchSlot && not minfo.IsVirtual && minfo.IsInstance) minfos + |> List.filter(fun minfo1 -> + not(minfo1.IsDispatchSlot && + relevantMinfos + |> List.exists (fun minfo2 -> MethInfosEquivByNameAndSig EraseAll true csenv.g csenv.amap m minfo2 minfo1))) else [] // The trait name "op_Explicit" also covers "op_Implicit", so look for that one too. diff --git a/tests/fsharp/regression/5531/compilation.output.test.bsl b/tests/fsharp/regression/5531/compilation.output.test.bsl new file mode 100644 index 00000000000..4154944d97d --- /dev/null +++ b/tests/fsharp/regression/5531/compilation.output.test.bsl @@ -0,0 +1,2 @@ + +test.fs(7,17): warning FS0864: This new member hides the abstract member 'abstract member Base.Foo : unit -> unit'. Rename the member or use 'override' instead. \ No newline at end of file diff --git a/tests/fsharp/regression/5531/compilation.output.test.txt b/tests/fsharp/regression/5531/compilation.output.test.txt new file mode 100644 index 00000000000..7c43a910eee --- /dev/null +++ b/tests/fsharp/regression/5531/compilation.output.test.txt @@ -0,0 +1,2 @@ + +test.fs(7,17): warning FS0864: This new member hides the abstract member 'abstract member Base.Foo : unit -> unit'. Rename the member or use 'override' instead. diff --git a/tests/fsharp/regression/5531/output.test.bsl b/tests/fsharp/regression/5531/output.test.bsl new file mode 100644 index 00000000000..ff9df4c542e --- /dev/null +++ b/tests/fsharp/regression/5531/output.test.bsl @@ -0,0 +1,7 @@ +Base +Base +Derived +Base +Base +Base +Derived \ No newline at end of file diff --git a/tests/fsharp/regression/5531/output.test.txt b/tests/fsharp/regression/5531/output.test.txt new file mode 100644 index 00000000000..d8b84b0deeb --- /dev/null +++ b/tests/fsharp/regression/5531/output.test.txt @@ -0,0 +1,7 @@ +Base +Base +Derived +Base +Base +Base +Derived diff --git a/tests/fsharp/regression/5531/test.fs b/tests/fsharp/regression/5531/test.fs new file mode 100644 index 00000000000..4059b772bfd --- /dev/null +++ b/tests/fsharp/regression/5531/test.fs @@ -0,0 +1,23 @@ +type Base() = + abstract member Foo : unit -> unit + default this.Foo() = printfn "Base" + +type Derived() = + inherit Base() + member this.Foo() = printfn "Derived" + +let inline callFoo< ^T when ^T : (member Foo: unit -> unit) > (t: ^T) = + (^T : (member Foo: unit -> unit) (t)) + +let b = Base() +let d = Derived() +let bd = d :> Base + +b.Foo() +bd.Foo() +d.Foo() + +callFoo b +callFoo bd +callFoo d +callFoo d \ No newline at end of file diff --git a/tests/fsharp/tests.fs b/tests/fsharp/tests.fs index 8e64b19b5e1..21d57d3e2f2 100644 --- a/tests/fsharp/tests.fs +++ b/tests/fsharp/tests.fs @@ -1755,6 +1755,36 @@ module RegressionTests = //// [] //// let ``struct-tuple-bug-1-FSI_BASIC`` () = singleTestBuildAndRun "regression/struct-tuple-bug-1" FSI_BASIC +#if !FSHARP_SUITE_DRIVES_CORECLR_TESTS + [] + let ``SRTP doesn't handle calling member hiding hinherited members`` () = + let cfg = testConfig "regression/5531" + + let outFile = "compilation.output.test.txt" + let expectedFile = "compilation.output.test.bsl" + + fscBothToOut cfg outFile "%s --nologo -O" cfg.fsc_flags ["test.fs"] + + let diff = fsdiff cfg outFile expectedFile + + match diff with + | "" -> () + | _ -> + Assert.Fail (sprintf "'%s' and '%s' differ; %A" (getfullpath cfg outFile) (getfullpath cfg expectedFile) diff) + + let outFile2 = "output.test.txt" + let expectedFile2 = "output.test.bsl" + + execBothToOut cfg (cfg.Directory) outFile2 (cfg.Directory ++ "test.exe") "" + + let diff2 = fsdiff cfg outFile2 expectedFile2 + + match diff2 with + | "" -> () + | _ -> + Assert.Fail (sprintf "'%s' and '%s' differ; %A" (getfullpath cfg outFile2) (getfullpath cfg expectedFile2) diff2) +#endif + #if !FSHARP_SUITE_DRIVES_CORECLR_TESTS // This test is disabled in coreclr builds dependent on fixing : https://github.com/Microsoft/visualfsharp/issues/2600 [] From e2d83009a83bc92c6518c2b4409f1e1a1417ce13 Mon Sep 17 00:00:00 2001 From: Phillip Carter Date: Wed, 5 Dec 2018 13:23:11 -0800 Subject: [PATCH 123/160] Remove some asses from the codebase (#5975) * Remove some asses from the codebase * Remove more asses --- fcs/docsrc/content/ja/symbols.fsx | 4 +-- fcs/docsrc/content/symbols.fsx | 4 +-- src/absil/il.fs | 12 ++++----- src/absil/il.fsi | 2 +- src/absil/ilprint.fs | 4 +-- src/fsharp/CompileOps.fs | 26 +++++++++---------- src/fsharp/DetupleArgs.fs | 10 +++---- src/fsharp/FSharp.Core/quotations.fs | 18 ++++++------- src/fsharp/LowerCallsAndSeqs.fs | 8 +++--- src/fsharp/QuotationPickler.fs | 6 ++--- src/fsharp/QuotationTranslator.fs | 4 +-- .../SimulatedMSBuildReferenceResolver.fs | 4 +-- src/fsharp/TcGlobals.fs | 2 +- src/fsharp/import.fs | 6 ++--- src/fsharp/service/IncrementalBuild.fs | 2 +- src/fsharp/service/service.fs | 26 +++++++++---------- src/ilx/ilxsettings.fs | 4 +-- .../ProvidedTypes/ProvidedTypes.fs | 4 +-- tests/fsharp/core/attributes/test.fsx | 8 +++--- tests/fsharp/core/libtest/test.fsx | 4 +-- tests/fsharp/core/members/absil.fsi | 12 ++++----- tests/fsharp/core/resources/test.fs | 4 +-- tests/service/CSharpProjectAnalysis.fs | 4 +-- .../Tests.ProjectSystem.References.fs | 4 +-- 24 files changed, 91 insertions(+), 91 deletions(-) diff --git a/fcs/docsrc/content/ja/symbols.fsx b/fcs/docsrc/content/ja/symbols.fsx index 2e3f53bdba4..d6abee12332 100644 --- a/fcs/docsrc/content/ja/symbols.fsx +++ b/fcs/docsrc/content/ja/symbols.fsx @@ -175,8 +175,8 @@ argTy1c.TypeDefinition.CompiledName // "Int32" *) let projectContext = checkFileResults.ProjectContext -for ass in projectContext.GetReferencedAssemblies() do - match ass.FileName with +for assembly in projectContext.GetReferencedAssemblies() do + match assembly.FileName with | None -> printfn "コンパイル時にファイルの存在しないアセンブリを参照しました" | Some s -> printfn "コンパイル時にアセンブリ '%s' を参照しました" s diff --git a/fcs/docsrc/content/symbols.fsx b/fcs/docsrc/content/symbols.fsx index fb6275fd37c..ac38053a1b8 100644 --- a/fcs/docsrc/content/symbols.fsx +++ b/fcs/docsrc/content/symbols.fsx @@ -168,8 +168,8 @@ used in the compilation, called the `ProjectContext`: *) let projectContext = checkFileResults.ProjectContext -for ass in projectContext.GetReferencedAssemblies() do - match ass.FileName with +for assembly in projectContext.GetReferencedAssemblies() do + match assembly.FileName with | None -> printfn "compilation referenced an assembly without a file" | Some s -> printfn "compilation references assembly '%s'" s diff --git a/src/absil/il.fs b/src/absil/il.fs index a7949a8e84e..61c5a33a845 100644 --- a/src/absil/il.fs +++ b/src/absil/il.fs @@ -2330,7 +2330,7 @@ let mkILNonGenericValueTy tref = mkILNamedTy AsValue tref [] let mkILNonGenericBoxedTy tref = mkILNamedTy AsObject tref [] -let mkSimpleAssRef n = +let mkSimpleAssemblyRef n = ILAssemblyRef.Create(n, None, None, false, None, None) let mkSimpleModRef n = @@ -3191,9 +3191,9 @@ let destTypeDefsWithGlobalFunctionsFirst ilg (tdefs: ILTypeDefs) = let top2 = if isNil top then [ mkILTypeDefForGlobalFunctions ilg (emptyILMethods, emptyILFields) ] else top top2@nontop -let mkILSimpleModule assname modname dll subsystemVersion useHighEntropyVA tdefs hashalg locale flags exportedTypes metadataVersion = +let mkILSimpleModule assemblyName modname dll subsystemVersion useHighEntropyVA tdefs hashalg locale flags exportedTypes metadataVersion = let manifest = - { Name=assname + { Name=assemblyName AuxModuleHashAlgorithm= match hashalg with | Some(alg) -> alg | _ -> 0x8004 // SHA1 SecurityDeclsStored=emptyILSecurityDeclsStored PublicKey= None @@ -3921,13 +3921,13 @@ let emptyILRefs = ModuleReferences = [] } (* Now find references. *) -let refs_of_assref (s:ILReferencesAccumulator) x = s.refsA.Add x |> ignore +let refs_of_assemblyRef (s:ILReferencesAccumulator) x = s.refsA.Add x |> ignore let refs_of_modref (s:ILReferencesAccumulator) x = s.refsM.Add x |> ignore let refs_of_scoref s x = match x with | ILScopeRef.Local -> () - | ILScopeRef.Assembly assref -> refs_of_assref s assref + | ILScopeRef.Assembly assemblyRef -> refs_of_assemblyRef s assemblyRef | ILScopeRef.Module modref -> refs_of_modref s modref let refs_of_tref s (x:ILTypeRef) = refs_of_scoref s x.Scope @@ -4099,7 +4099,7 @@ and refs_of_resource_where s x = | ILResourceLocation.LocalIn _ -> () | ILResourceLocation.LocalOut _ -> () | ILResourceLocation.File (mref, _) -> refs_of_modref s mref - | ILResourceLocation.Assembly aref -> refs_of_assref s aref + | ILResourceLocation.Assembly aref -> refs_of_assemblyRef s aref and refs_of_resource s x = refs_of_resource_where s x.Location diff --git a/src/absil/il.fsi b/src/absil/il.fsi index e518db2d467..668459088fd 100644 --- a/src/absil/il.fsi +++ b/src/absil/il.fsi @@ -1605,7 +1605,7 @@ val decodeILAttribData: ILAttributeNamedArg list (* named args: values and flags indicating if they are fields or properties *) /// Generate simple references to assemblies and modules. -val mkSimpleAssRef: string -> ILAssemblyRef +val mkSimpleAssemblyRef: string -> ILAssemblyRef val mkSimpleModRef: string -> ILModuleRef diff --git a/src/absil/ilprint.fs b/src/absil/ilprint.fs index 391b49ba349..58c13ba1482 100644 --- a/src/absil/ilprint.fs +++ b/src/absil/ilprint.fs @@ -986,7 +986,7 @@ let output_publickeyinfo os = function | PublicKey k -> output_publickey os k | PublicKeyToken k -> output_publickeytoken os k -let output_assref os (aref:ILAssemblyRef) = +let output_assemblyRef os (aref:ILAssemblyRef) = output_string os " .assembly extern "; output_sqstring os aref.Name; if aref.Retargetable then output_string os " retargetable "; @@ -1056,7 +1056,7 @@ let output_module_fragment os (ilg: ILGlobals) modul = refs let output_module_refs os refs = - List.iter (fun x -> output_assref os x; output_string os "\n") refs.AssemblyReferences; + List.iter (fun x -> output_assemblyRef os x; output_string os "\n") refs.AssemblyReferences; List.iter (fun x -> output_modref os x; output_string os "\n") refs.ModuleReferences let goutput_module_manifest env os modul = diff --git a/src/fsharp/CompileOps.fs b/src/fsharp/CompileOps.fs index 200d4f5a69e..080e3d1473d 100644 --- a/src/fsharp/CompileOps.fs +++ b/src/fsharp/CompileOps.fs @@ -2674,9 +2674,9 @@ type AssemblyResolution = member this.GetILAssemblyRef(ctok, reduceMemoryUsage, tryGetMetadataSnapshot) = cancellable { match !this.ilAssemblyRef with - | Some(assref) -> return assref + | Some(assemblyRef) -> return assemblyRef | None -> - let! assRefOpt = + let! assemblyRefOpt = cancellable { match this.ProjectReference with | Some r -> @@ -2689,8 +2689,8 @@ type AssemblyResolution = | _ -> return None | None -> return None } - let assRef = - match assRefOpt with + let assemblyRef = + match assemblyRefOpt with | Some aref -> aref | None -> let readerSettings : ILReaderOptions = @@ -2701,8 +2701,8 @@ type AssemblyResolution = tryGetMetadataSnapshot = tryGetMetadataSnapshot } use reader = OpenILModuleReader this.resolvedPath readerSettings mkRefToILAssembly reader.ILModuleDef.ManifestOfAssembly - this.ilAssemblyRef := Some(assRef) - return assRef + this.ilAssemblyRef := Some(assemblyRef) + return assemblyRef } //---------------------------------------------------------------------------- @@ -3655,10 +3655,10 @@ type TcAssemblyResolutions(tcConfig: TcConfig, results: AssemblyResolution list, member tcResolutions.TryFindByOriginalReference(assemblyReference:AssemblyReference) = originalReferenceToResolution.TryFind assemblyReference.Text /// This doesn't need to be cancellable, it is only used by F# Interactive - member tcResolution.TryFindByExactILAssemblyRef (ctok, assref) = + member tcResolution.TryFindByExactILAssemblyRef (ctok, assemblyRef) = results |> List.tryFind (fun ar-> let r = ar.GetILAssemblyRef(ctok, tcConfig.reduceMemoryUsage, tcConfig.tryGetMetadataSnapshot) |> Cancellable.runWithoutCancellation - r = assref) + r = assemblyRef) /// This doesn't need to be cancellable, it is only used by F# Interactive member tcResolution.TryFindBySimpleAssemblyName (ctok, simpleAssemName) = @@ -4026,11 +4026,11 @@ type TcImports(tcConfigP:TcConfigProvider, initialResolutions:TcAssemblyResoluti | ResolvedImportedAssembly(importedAssembly) -> ResolvedCcu(importedAssembly.FSharpViewOfMetadata) | UnresolvedImportedAssembly(assemblyName) -> UnresolvedCcu(assemblyName) - member tcImports.FindCcuFromAssemblyRef(ctok, m, assref:ILAssemblyRef) = + member tcImports.FindCcuFromAssemblyRef(ctok, m, assemblyRef:ILAssemblyRef) = CheckDisposed() - match tcImports.FindCcuInfo(ctok, m, assref.Name, lookupOnly=false) with + match tcImports.FindCcuInfo(ctok, m, assemblyRef.Name, lookupOnly=false) with | ResolvedImportedAssembly(importedAssembly) -> ResolvedCcu(importedAssembly.FSharpViewOfMetadata) - | UnresolvedImportedAssembly _ -> UnresolvedCcu(assref.QualifiedName) + | UnresolvedImportedAssembly _ -> UnresolvedCcu(assemblyRef.QualifiedName) #if !NO_EXTENSIONTYPING @@ -4641,8 +4641,8 @@ type TcImports(tcConfigP:TcConfigProvider, initialResolutions:TcAssemblyResoluti resolutions.TryFindBySimpleAssemblyName (ctok, simpleAssemName) |> Option.map (fun r -> r.resolvedPath) /// This doesn't need to be cancellable, it is only used by F# Interactive - member tcImports.TryFindExistingFullyQualifiedPathByExactAssemblyRef(ctok, assref:ILAssemblyRef) : string option = - resolutions.TryFindByExactILAssemblyRef (ctok, assref) |> Option.map (fun r -> r.resolvedPath) + member tcImports.TryFindExistingFullyQualifiedPathByExactAssemblyRef(ctok, assemblyRef:ILAssemblyRef) : string option = + resolutions.TryFindByExactILAssemblyRef (ctok, assemblyRef) |> Option.map (fun r -> r.resolvedPath) member tcImports.TryResolveAssemblyReference(ctok, assemblyReference:AssemblyReference, mode:ResolveAssemblyReferenceMode) : OperationResult = let tcConfig = tcConfigP.Get(ctok) diff --git a/src/fsharp/DetupleArgs.fs b/src/fsharp/DetupleArgs.fs index bf56deeeb7f..9a7f99e63a6 100644 --- a/src/fsharp/DetupleArgs.fs +++ b/src/fsharp/DetupleArgs.fs @@ -850,11 +850,11 @@ let postTransformExpr (penv:penv) expr = | _ -> None -let passImplFile penv ass = - ass |> RewriteImplFile {PreIntercept =None - PreInterceptBinding=None - PostTransform= postTransformExpr penv - IsUnderQuotations=false } +let passImplFile penv assembly = + assembly |> RewriteImplFile {PreIntercept =None + PreInterceptBinding=None + PostTransform= postTransformExpr penv + IsUnderQuotations=false } //------------------------------------------------------------------------- diff --git a/src/fsharp/FSharp.Core/quotations.fs b/src/fsharp/FSharp.Core/quotations.fs index 992bbe54f62..6198357fa08 100644 --- a/src/fsharp/FSharp.Core/quotations.fs +++ b/src/fsharp/FSharp.Core/quotations.fs @@ -1322,19 +1322,19 @@ module Patterns = // typeof.MakeArrayType(1) returns "Int[*]" but we need "Int[]" | _ -> invalidArg "tys" (SR.GetString(SR.QexpectedOneType)) - let mkNamedTycon (tcName,ass:Assembly) = - match ass.GetType(tcName) with + let mkNamedTycon (tcName,assembly:Assembly) = + match assembly.GetType(tcName) with | null -> // For some reason we can get 'null' returned here even when a type with the right name exists... Hence search the slow way... - match (ass.GetTypes() |> Array.tryFind (fun a -> a.FullName = tcName)) with + match (assembly.GetTypes() |> Array.tryFind (fun a -> a.FullName = tcName)) with | Some ty -> ty - | None -> invalidArg "tcName" (String.Format(SR.GetString(SR.QfailedToBindTypeInAssembly), tcName, ass.FullName)) // "Available types are:\n%A" tcName ass (ass.GetTypes() |> Array.map (fun a -> a.FullName)) + | None -> invalidArg "tcName" (String.Format(SR.GetString(SR.QfailedToBindTypeInAssembly), tcName, assembly.FullName)) // "Available types are:\n%A" tcName assembly (assembly.GetTypes() |> Array.map (fun a -> a.FullName)) | ty -> ty let decodeNamedTy tc tsR = mkNamedType(tc,tsR) let mscorlib = typeof.Assembly - let u_assref st = u_string st + let u_assemblyRef st = u_string st let decodeAssemblyRef st a = if a = "" then mscorlib elif a = "." then st.localAssembly @@ -1345,10 +1345,10 @@ module Patterns = match System.Reflection.Assembly.Load(a) with #endif | null -> raise <| System.InvalidOperationException(String.Format(SR.GetString(SR.QfailedToBindAssembly), a.ToString())) - | ass -> ass + | assembly -> assembly let u_NamedType st = - let a,b = u_tup2 u_string u_assref st + let a,b = u_tup2 u_string u_assemblyRef st let mutable idx = 0 // From FSharp.Core for F# 4.0+ (4.4.0.0+), referenced type definitions can be integer indexes into a table of type definitions provided on quotation // deserialization, avoiding the need for System.Reflection.Assembly.Load @@ -1358,8 +1358,8 @@ module Patterns = // escape commas found in type name, which are not already escaped // '\' is not valid in a type name except as an escape character, so logic can be pretty simple let escapedTcName = System.Text.RegularExpressions.Regex.Replace(a, @"(? None) - IsUnderQuotations=false } ass + IsUnderQuotations=false } assembly //---------------------------------------------------------------------------- @@ -512,12 +512,12 @@ let LowerSeqExpr g amap overallExpr = // Note, however, this leads to a loss of tailcalls: the case not // handled correctly yet is sequence expressions that use yield! in the last position // This can give rise to infinite iterator chains when implemented by the naive expansion to - // for x in e yield e. For example consider this: + // �for x in e yield e�. For example consider this: // // let rec rwalk x = { yield x // yield! rwalk (x + rand()) } // - // This is the moral equivalent of a tailcall optimization. These also dont compile well + // This is the moral equivalent of a tailcall optimization. These also don�t compile well // in the C# compilation model | arbitrarySeqExpr -> diff --git a/src/fsharp/QuotationPickler.fs b/src/fsharp/QuotationPickler.fs index ea9ba920772..79c2ac27968 100644 --- a/src/fsharp/QuotationPickler.fs +++ b/src/fsharp/QuotationPickler.fs @@ -304,12 +304,12 @@ module SimplePickle = open SimplePickle -let p_assref x st = p_string x st +let p_assemblyref x st = p_string x st let p_NamedType x st = match x with - | Idx n -> p_tup2 p_string p_assref (string n, "") st - | Named (nm,ass) -> p_tup2 p_string p_assref (nm, ass) st + | Idx n -> p_tup2 p_string p_assemblyref (string n, "") st + | Named (nm,a) -> p_tup2 p_string p_assemblyref (nm, a) st let p_tycon x st = match x with diff --git a/src/fsharp/QuotationTranslator.fs b/src/fsharp/QuotationTranslator.fs index 24e86da1bad..b0f1e7ce4c7 100644 --- a/src/fsharp/QuotationTranslator.fs +++ b/src/fsharp/QuotationTranslator.fs @@ -978,12 +978,12 @@ and ConvILTypeRef cenv (tr:ILTypeRef) = QP.Idx idx | QuotationSerializationFormat.FSharp_20_Plus -> - let assref = + let assemblyRef = match tr.Scope with | ILScopeRef.Local -> "." | _ -> tr.Scope.QualifiedName - QP.Named(tr.BasicQualifiedName, assref) + QP.Named(tr.BasicQualifiedName, assemblyRef) and ConvVoidType cenv m = QP.mkILNamedTy(ConvTyconRef cenv cenv.g.system_Void_tcref m, []) diff --git a/src/fsharp/SimulatedMSBuildReferenceResolver.fs b/src/fsharp/SimulatedMSBuildReferenceResolver.fs index 1668cdc09d0..6fd5fc53120 100644 --- a/src/fsharp/SimulatedMSBuildReferenceResolver.fs +++ b/src/fsharp/SimulatedMSBuildReferenceResolver.fs @@ -186,8 +186,8 @@ let internal GetBestAvailableResolver() = let tryMSBuild v = // Detect if MSBuild is on the machine, if so use the resolver from there let mb = try Assembly.Load(sprintf "Microsoft.Build.Framework, Version=%s.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" v) |> Option.ofObj with _ -> None - let ass = mb |> Option.bind (fun _ -> try Assembly.Load(sprintf "FSharp.Compiler.Service.MSBuild.v%s" v) |> Option.ofObj with _ -> None) - let ty = ass |> Option.bind (fun ass -> ass.GetType("Microsoft.FSharp.Compiler.MSBuildReferenceResolver") |> Option.ofObj) + let assembly = mb |> Option.bind (fun _ -> try Assembly.Load(sprintf "FSharp.Compiler.Service.MSBuild.v%s" v) |> Option.ofObj with _ -> None) + let ty = assembly |> Option.bind (fun a -> a.GetType("Microsoft.FSharp.Compiler.MSBuildReferenceResolver") |> Option.ofObj) let obj = ty |> Option.bind (fun ty -> ty.InvokeMember("get_Resolver",BindingFlags.Static ||| BindingFlags.Public ||| BindingFlags.InvokeMethod ||| BindingFlags.NonPublic, null, null, [| |]) |> Option.ofObj) let resolver = obj |> Option.bind (fun obj -> match obj with :? Resolver as r -> Some r | _ -> None) resolver diff --git a/src/fsharp/TcGlobals.fs b/src/fsharp/TcGlobals.fs index d6fb7cd3c73..85f12f8b3fd 100755 --- a/src/fsharp/TcGlobals.fs +++ b/src/fsharp/TcGlobals.fs @@ -255,7 +255,7 @@ type public TcGlobals(compilingFslib: bool, ilg:ILGlobals, fslibCcu: CcuThunk, d let path, typeName = splitILTypeName nm let scoref = match tryFindSysTypeCcu path typeName with - | None -> ILScopeRef.Assembly (mkSimpleAssRef (dummyAssemblyNameCarryingUsefulErrorInformation path typeName)) + | None -> ILScopeRef.Assembly (mkSimpleAssemblyRef (dummyAssemblyNameCarryingUsefulErrorInformation path typeName)) | Some ccu -> ccu.ILScopeRef mkILTyRef (scoref, nm) diff --git a/src/fsharp/import.fs b/src/fsharp/import.fs index 2fbb920c8d4..e06ee756da3 100644 --- a/src/fsharp/import.fs +++ b/src/fsharp/import.fs @@ -62,13 +62,13 @@ let CanImportILScopeRef (env:ImportMap) m scoref = match scoref with | ILScopeRef.Local -> true | ILScopeRef.Module _ -> true - | ILScopeRef.Assembly assref -> + | ILScopeRef.Assembly assemblyRef -> // Explanation: This represents an unchecked invariant in the hosted compiler: that any operations // which import types (and resolve assemblies from the tcImports tables) happen on the compilation thread. let ctok = AssumeCompilationThreadWithoutEvidence() - match env.assemblyLoader.FindCcuFromAssemblyRef (ctok, m, assref) with + match env.assemblyLoader.FindCcuFromAssemblyRef (ctok, m, assemblyRef) with | UnresolvedCcu _ -> false | ResolvedCcu _ -> true @@ -84,7 +84,7 @@ let ImportTypeRefData (env:ImportMap) m (scoref,path,typeName) = match scoref with | ILScopeRef.Local -> error(InternalError("ImportILTypeRef: unexpected local scope",m)) | ILScopeRef.Module _ -> error(InternalError("ImportILTypeRef: reference found to a type in an auxiliary module",m)) - | ILScopeRef.Assembly assref -> env.assemblyLoader.FindCcuFromAssemblyRef (ctok, m, assref) // NOTE: only assemblyLoader callsite + | ILScopeRef.Assembly assemblyRef -> env.assemblyLoader.FindCcuFromAssemblyRef (ctok, m, assemblyRef) // NOTE: only assemblyLoader callsite // Do a dereference of a fake tcref for the type just to check it exists in the target assembly and to find // the corresponding Tycon. diff --git a/src/fsharp/service/IncrementalBuild.fs b/src/fsharp/service/IncrementalBuild.fs index e441ad16dac..37c4b16bf21 100755 --- a/src/fsharp/service/IncrementalBuild.fs +++ b/src/fsharp/service/IncrementalBuild.fs @@ -1496,7 +1496,7 @@ type IncrementalBuilder(tcGlobals, frameworkTcImports, nonFrameworkAssemblyInput tcState.Ccu.Deref.Contents <- oldContents with e -> errorRecoveryNoRange e - mkSimpleAssRef assemblyName, None, None + mkSimpleAssemblyRef assemblyName, None, None let finalAccWithErrors = { finalAcc with diff --git a/src/fsharp/service/service.fs b/src/fsharp/service/service.fs index 0546dc9da90..d8eb7442b4a 100644 --- a/src/fsharp/service/service.fs +++ b/src/fsharp/service/service.fs @@ -1159,22 +1159,22 @@ type TypeCheckInfo match item.Item with | Item.CtorGroup (_, (ILMeth (_,ilinfo,_)) :: _) -> match ilinfo.MetadataScope with - | ILScopeRef.Assembly assref -> + | ILScopeRef.Assembly assemblyRef -> let typeVarNames = getTypeVarNames ilinfo ParamTypeSymbol.tryOfILTypes typeVarNames ilinfo.ILMethodRef.ArgTypes |> Option.map (fun args -> let externalSym = ExternalSymbol.Constructor (ilinfo.ILMethodRef.DeclaringTypeRef.FullName, args) - FSharpFindDeclResult.ExternalDecl (assref.Name, externalSym)) + FSharpFindDeclResult.ExternalDecl (assemblyRef.Name, externalSym)) | _ -> None | Item.MethodGroup (name, (ILMeth (_,ilinfo,_)) :: _, _) -> match ilinfo.MetadataScope with - | ILScopeRef.Assembly assref -> + | ILScopeRef.Assembly assemblyRef -> let typeVarNames = getTypeVarNames ilinfo ParamTypeSymbol.tryOfILTypes typeVarNames ilinfo.ILMethodRef.ArgTypes |> Option.map (fun args -> let externalSym = ExternalSymbol.Method (ilinfo.ILMethodRef.DeclaringTypeRef.FullName, name, args, ilinfo.ILMethodRef.GenericArity) - FSharpFindDeclResult.ExternalDecl (assref.Name, externalSym)) + FSharpFindDeclResult.ExternalDecl (assemblyRef.Name, externalSym)) | _ -> None | Item.Property (name, ILProp propInfo :: _) -> @@ -1186,24 +1186,24 @@ type TypeCheckInfo match methInfo with | Some methInfo -> match methInfo.MetadataScope with - | ILScopeRef.Assembly assref -> + | ILScopeRef.Assembly assemblyRef -> let externalSym = ExternalSymbol.Property (methInfo.ILMethodRef.DeclaringTypeRef.FullName, name) - Some (FSharpFindDeclResult.ExternalDecl (assref.Name, externalSym)) + Some (FSharpFindDeclResult.ExternalDecl (assemblyRef.Name, externalSym)) | _ -> None | None -> None | Item.ILField (ILFieldInfo (typeInfo, fieldDef)) when not typeInfo.TyconRefOfRawMetadata.IsLocalRef -> match typeInfo.ILScopeRef with - | ILScopeRef.Assembly assref -> + | ILScopeRef.Assembly assemblyRef -> let externalSym = ExternalSymbol.Field (typeInfo.ILTypeRef.FullName, fieldDef.Name) - Some (FSharpFindDeclResult.ExternalDecl (assref.Name, externalSym)) + Some (FSharpFindDeclResult.ExternalDecl (assemblyRef.Name, externalSym)) | _ -> None | Item.Event (ILEvent (ILEventInfo (typeInfo, eventDef))) when not typeInfo.TyconRefOfRawMetadata.IsLocalRef -> match typeInfo.ILScopeRef with - | ILScopeRef.Assembly assref -> + | ILScopeRef.Assembly assemblyRef -> let externalSym = ExternalSymbol.Event (typeInfo.ILTypeRef.FullName, eventDef.Name) - Some (FSharpFindDeclResult.ExternalDecl (assref.Name, externalSym)) + Some (FSharpFindDeclResult.ExternalDecl (assemblyRef.Name, externalSym)) | _ -> None | Item.ImplicitOp(_, {contents = Some(TraitConstraintSln.FSMethSln(_, _vref, _))}) -> @@ -1214,9 +1214,9 @@ type TypeCheckInfo | Item.Types (_, [ AppTy g (tr, _) ]) when not tr.IsLocalRef -> match tr.TypeReprInfo, tr.PublicPath with - | TILObjectRepr(TILObjectReprData (ILScopeRef.Assembly assref, _, _)), Some (PubPath parts) -> + | TILObjectRepr(TILObjectReprData (ILScopeRef.Assembly assemblyRef, _, _)), Some (PubPath parts) -> let fullName = parts |> String.concat "." - Some (FSharpFindDeclResult.ExternalDecl (assref.Name, ExternalSymbol.Type fullName)) + Some (FSharpFindDeclResult.ExternalDecl (assemblyRef.Name, ExternalSymbol.Type fullName)) | _ -> None | _ -> None match result with @@ -3341,7 +3341,7 @@ type FsiInteractiveChecker(legacyReferenceResolver, reactorOps: IReactorOperatio let projectResults = FSharpCheckProjectResults (filename, Some tcConfig, keepAssemblyContents, errors, Some(tcGlobals, tcImports, tcFileInfo.ThisCcu, tcFileInfo.CcuSigForFile, - [tcFileInfo.ScopeSymbolUses], None, None, mkSimpleAssRef "stdin", + [tcFileInfo.ScopeSymbolUses], None, None, mkSimpleAssemblyRef "stdin", tcState.TcEnvFromImpls.AccessRights, None, dependencyFiles)) parseResults, typeCheckResults, projectResults | _ -> diff --git a/src/ilx/ilxsettings.fs b/src/ilx/ilxsettings.fs index 9033fca0694..520da651c14 100644 --- a/src/ilx/ilxsettings.fs +++ b/src/ilx/ilxsettings.fs @@ -22,7 +22,7 @@ let ilxFsharpCoreLibScopeRef () = if !ilxCompilingFSharpCoreLib then ILScopeRef.Local else - let assref = + let assemblyRef = match !ilxFsharpCoreLibAssemRef with | Some o -> o | None -> @@ -34,6 +34,6 @@ let ilxFsharpCoreLibScopeRef () = Some (PublicKeyToken(Bytes.ofInt32Array [| 0xb0; 0x3f; 0x5f; 0x7f; 0x11; 0xd5; 0x0a; 0x3a |])), false, Some (IL.parseILVersion "0.0.0.0"), None) - ILScopeRef.Assembly assref + ILScopeRef.Assembly assemblyRef let ilxNamespace () = "Microsoft.FSharp.Core" \ No newline at end of file diff --git a/tests/EndToEndBuildTests/ProvidedTypes/ProvidedTypes.fs b/tests/EndToEndBuildTests/ProvidedTypes/ProvidedTypes.fs index c1494b9081a..45974519909 100644 --- a/tests/EndToEndBuildTests/ProvidedTypes/ProvidedTypes.fs +++ b/tests/EndToEndBuildTests/ProvidedTypes/ProvidedTypes.fs @@ -8409,8 +8409,8 @@ namespace ProviderImplementation.ProvidedTypes | None -> None | Some _ -> let m = mdef.ManifestOfAssembly - let assRef = ILAssemblyRef(m.Name, UNone, (match m.PublicKey with USome k -> USome (PublicKey.KeyAsToken(k)) | UNone -> UNone), m.Retargetable, m.Version, m.Locale) - Some (ILScopeRef.Assembly assRef) + let assemblyRef = ILAssemblyRef(m.Name, UNone, (match m.PublicKey with USome k -> USome (PublicKey.KeyAsToken(k)) | UNone -> UNone), m.Retargetable, m.Version, m.Locale) + Some (ILScopeRef.Assembly assemblyRef) else None with _ -> None ) diff --git a/tests/fsharp/core/attributes/test.fsx b/tests/fsharp/core/attributes/test.fsx index 6c367d0ee0f..011ed712d2d 100644 --- a/tests/fsharp/core/attributes/test.fsx +++ b/tests/fsharp/core/attributes/test.fsx @@ -206,12 +206,12 @@ end do () type dummy = Dummy -let ass = typeof.Assembly +let assembly = typeof.Assembly // Assembly attributes are currently ignored by F# Interactive, so this test // fails. We ignore the failure. #if COMPILED -let ca = ass.GetCustomAttributes(typeof,false) +let ca = assembly.GetCustomAttributes(typeof,false) do if Array.length ca <> 1 then failwith "could not find CA on assembly" #endif @@ -809,12 +809,12 @@ module Bug1437_PS_FSharp1_0_AttributesWithArrayArguments = begin [] do () - let ass = typeof.Assembly + let assembly = typeof.Assembly // Assembly attributes are currently ignored by F# Interactive, so this test // fails. We ignore the failure. #if COMPILED - let ca = ass.GetCustomAttributes(typeof,false) + let ca = assembly.GetCustomAttributes(typeof,false) let _ = check "ce99pj32cweq" (Array.length ca) 1 #endif end diff --git a/tests/fsharp/core/libtest/test.fsx b/tests/fsharp/core/libtest/test.fsx index 0c9ee40ed64..eae31d15863 100644 --- a/tests/fsharp/core/libtest/test.fsx +++ b/tests/fsharp/core/libtest/test.fsx @@ -1872,14 +1872,14 @@ let mk_empty_gactuals = ([]: genactuals) let mk_mono_tspec tref = TypeSpec (tref, mk_empty_gactuals) let mscorlib_assembly_name = "mscorlib" let mscorlib_module_name = "CommonLanguageRuntimeLibrary" -let mk_simple_assref n = +let mk_simple_assemblyRef n = { assemRefName=n; assemRefHash=None; assemRefPublicKeyToken=None; assemRefPublicKey=None; assemRefVersion=None; assemRefLocale=None; } -let mscorlib_aref = mk_simple_assref mscorlib_assembly_name +let mscorlib_aref = mk_simple_assemblyRef mscorlib_assembly_name let mscorlib_scoref = ScopeRef(mscorlib_aref,None) let mk_nested_tref (scope,l,nm) = TypeRef (scope,l,nm) let mk_tref (scope,nm) = mk_nested_tref (scope,[],nm) diff --git a/tests/fsharp/core/members/absil.fsi b/tests/fsharp/core/members/absil.fsi index 02c730d0d86..40fb9a9cfbc 100644 --- a/tests/fsharp/core/members/absil.fsi +++ b/tests/fsharp/core/members/absil.fsi @@ -1271,7 +1271,7 @@ type modul = val manifest_of_mainmod: modul -> manifest val module_is_mainmod: modul -> bool -val assname_of_mainmod: modul -> AssemblyName +val assemblyName_of_mainmod: modul -> AssemblyName (* ==================================================================== * PART 2 @@ -1285,14 +1285,14 @@ val assname_of_mainmod: modul -> AssemblyName * Generate references to existing assemblies and modules * -------------------------------------------------------------------- *) -val mk_simple_assref: AssemblyName -> AssemblyRef +val mk_simple_assemblyRef: AssemblyName -> AssemblyRef val mk_simple_modref: ModuleName -> ModuleRef -val mk_simple_scoref_from_assname: AssemblyName -> ScopeRef -val mk_simple_scoref_from_assref: AssemblyRef -> ScopeRef +val mk_simple_scoref_from_assemblyName: AssemblyName -> ScopeRef +val mk_simple_scoref_from_assemblyRef: AssemblyRef -> ScopeRef -val assref_for_manifest: manifest -> AssemblyRef -val assref_for_mainmod: modul -> AssemblyRef +val assemblyRef_for_manifest: manifest -> AssemblyRef +val assemblyRef_for_mainmod: modul -> AssemblyRef (* -------------------------------------------------------------------- * Take apart MethodSpecs diff --git a/tests/fsharp/core/resources/test.fs b/tests/fsharp/core/resources/test.fs index b41d71d67db..cb0991b961e 100644 --- a/tests/fsharp/core/resources/test.fs +++ b/tests/fsharp/core/resources/test.fs @@ -13,8 +13,8 @@ let foreachE (e : System.Collections.IEnumerator) (f : 'a -> unit) = let main() = - let ass = (typeof).Assembly in - Printf.printf "ass = %s\n" (ass.ToString()); + let assembly = (typeof).Assembly in + Printf.printf "assembly = %s\n" (assembly.ToString()); let args = System.Environment.GetCommandLineArgs() in let rname = if Array.length args > 1 then args.[1] else "Resources" in let resourceMan = new System.Resources.ResourceManager(rname, (typeof).Assembly) in diff --git a/tests/service/CSharpProjectAnalysis.fs b/tests/service/CSharpProjectAnalysis.fs index 7047099e8cd..70d805b9e6b 100644 --- a/tests/service/CSharpProjectAnalysis.fs +++ b/tests/service/CSharpProjectAnalysis.fs @@ -67,8 +67,8 @@ let internal getProjectReferences (content, dllFiles, libDirs, otherFlags) = let ``Test that csharp references are recognized as such`` () = let csharpAssembly = PathRelativeToTestAssembly "CSharp_Analysis.dll" let _, table = getProjectReferences("""module M""", [csharpAssembly], None, None) - let ass = table.["CSharp_Analysis"] - let search = ass.Contents.Entities |> Seq.tryFind (fun e -> e.DisplayName = "CSharpClass") + let assembly = table.["CSharp_Analysis"] + let search = assembly.Contents.Entities |> Seq.tryFind (fun e -> e.DisplayName = "CSharpClass") Assert.True search.IsSome let found = search.Value // this is no F# thing diff --git a/vsintegration/tests/UnitTests/LegacyProjectSystem/Tests.ProjectSystem.References.fs b/vsintegration/tests/UnitTests/LegacyProjectSystem/Tests.ProjectSystem.References.fs index 5bc1c6286eb..81b6b55ccb8 100644 --- a/vsintegration/tests/UnitTests/LegacyProjectSystem/Tests.ProjectSystem.References.fs +++ b/vsintegration/tests/UnitTests/LegacyProjectSystem/Tests.ProjectSystem.References.fs @@ -70,8 +70,8 @@ type References() = DoWithTempFile "Test.fsproj" (fun projFile -> File.AppendAllText(projFile, TheTests.SimpleFsprojText([], [], "")) use project = TheTests.CreateProject(projFile) - let assName = new AssemblyName(typeof.Assembly.FullName) - let selectorData = new VSCOMPONENTSELECTORDATA(``type`` = VSCOMPONENTTYPE.VSCOMPONENTTYPE_ComPlus, bstrFile = "*" + assName.FullName) + let assemblyName = new AssemblyName(typeof.Assembly.FullName) + let selectorData = new VSCOMPONENTSELECTORDATA(``type`` = VSCOMPONENTTYPE.VSCOMPONENTTYPE_ComPlus, bstrFile = "*" + assemblyName.FullName) let refContainer = GetReferenceContainerNode(project) refContainer.AddReferenceFromSelectorData(selectorData) |> Assert.IsNotNull let l = new List() From 15d82e117f6cd9b2227c2edcf7e5b6e2928216be Mon Sep 17 00:00:00 2001 From: Don Syme Date: Thu, 6 Dec 2018 15:49:22 -0800 Subject: [PATCH 124/160] prevent rebuild on "build vs" (#5957) * prevent rebuild * prevent rebuild * no-op change --- .../GenerateAssemblyAttributes.targets | 25 +++++++++++++------ src/fsharp/FSharp.Build/WriteCodeFragment.fs | 4 +-- src/fsharp/fsc.fs | 1 + 3 files changed, 20 insertions(+), 10 deletions(-) diff --git a/build/targets/GenerateAssemblyAttributes.targets b/build/targets/GenerateAssemblyAttributes.targets index c3f136e3338..1be6bdb8315 100644 --- a/build/targets/GenerateAssemblyAttributes.targets +++ b/build/targets/GenerateAssemblyAttributes.targets @@ -5,15 +5,20 @@ false - - + $(IntermediateOutputPath)$(MSBuildProjectName).AssemblyLevelAttributes$(DefaultLanguageSourceExtension) $(NoWarn);2003 + + + - - $(FSCoreVersion) @@ -41,7 +44,6 @@ $(IntermediateOutputPath)$(MSBuildProjectName).AssemblyVersion$(DefaultLanguageSourceExtension) - <_UseWriteCodeFragmentHack Condition="'$(OS)' == 'Unix' and '$(Language)' == 'F#'">true @@ -74,6 +76,15 @@ + + + + false) - if not alreadyExists then - File.WriteAllText(fileName, codeText) + File.WriteAllText(fileName, codeText) _outputFile <- outputFileItem true diff --git a/src/fsharp/fsc.fs b/src/fsharp/fsc.fs index 4cb4fbe4866..b19c3b280ab 100644 --- a/src/fsharp/fsc.fs +++ b/src/fsharp/fsc.fs @@ -2111,3 +2111,4 @@ let mainCompile (ctok, argv, legacyReferenceResolver, bannerAlreadyPrinted, redu //System.Runtime.GCSettings.LatencyMode <- System.Runtime.GCLatencyMode.Batch typecheckAndCompile(ctok, argv, legacyReferenceResolver, bannerAlreadyPrinted, reduceMemoryUsage, defaultCopyFSharpCore, exiter, errorLoggerProvider, tcImportsCapture, dynamicAssemblyCreator) + From eecb19c31d3e343f68adede68236829e057ecc08 Mon Sep 17 00:00:00 2001 From: Phillip Carter Date: Fri, 7 Dec 2018 12:28:38 -0800 Subject: [PATCH 125/160] Don't needlessly allocate a Result type during go to definition (#5993) * Don't needless allocate a Result type during to to definition --- .../Navigation/GoToDefinition.fs | 4 +-- .../Navigation/GoToDefinitionService.fs | 23 ++++++--------- .../Navigation/NavigableSymbolsService.fs | 28 ++++++++----------- 3 files changed, 21 insertions(+), 34 deletions(-) diff --git a/vsintegration/src/FSharp.Editor/Navigation/GoToDefinition.fs b/vsintegration/src/FSharp.Editor/Navigation/GoToDefinition.fs index daaa1e6fa57..7cd0152c3dc 100644 --- a/vsintegration/src/FSharp.Editor/Navigation/GoToDefinition.fs +++ b/vsintegration/src/FSharp.Editor/Navigation/GoToDefinition.fs @@ -242,8 +242,8 @@ type internal GoToDefinition(checker: FSharpChecker, projectInfoManager: FSharpP let! targetSymbolUse = checkFileResults.GetSymbolUseAtLocation (fcsTextLineNumber, idRange.EndColumn, lineText, lexerSymbol.FullIsland, userOpName=userOpName) match declarations with - | FSharpFindDeclResult.ExternalDecl (assy, targetExternalSym) -> - let! project = originDocument.Project.Solution.Projects |> Seq.tryFind (fun p -> p.AssemblyName.Equals(assy, StringComparison.OrdinalIgnoreCase)) + | FSharpFindDeclResult.ExternalDecl (assembly, targetExternalSym) -> + let! project = originDocument.Project.Solution.Projects |> Seq.tryFind (fun p -> p.AssemblyName.Equals(assembly, StringComparison.OrdinalIgnoreCase)) let! symbols = SymbolFinder.FindSourceDeclarationsAsync(project, fun _ -> true) let roslynSymbols = diff --git a/vsintegration/src/FSharp.Editor/Navigation/GoToDefinitionService.fs b/vsintegration/src/FSharp.Editor/Navigation/GoToDefinitionService.fs index dd201ab7750..d2bcd9dd4f5 100644 --- a/vsintegration/src/FSharp.Editor/Navigation/GoToDefinitionService.fs +++ b/vsintegration/src/FSharp.Editor/Navigation/GoToDefinitionService.fs @@ -39,20 +39,13 @@ type internal FSharpGoToDefinitionService let gtdTask = gtd.FindDefinitionTask(document, position, cancellationToken) - // Wrap this in a try/with as if the user clicks "Cancel" on the thread dialog, we'll be cancelled + // Wrap this in a try/with as if the user clicks "Cancel" on the thread dialog, we'll be cancelled. // Task.Wait throws an exception if the task is cancelled, so be sure to catch it. - let gtdCompletionOrError = - try - // This call to Wait() is fine because we want to be able to provide the error message in the status bar. - gtdTask.Wait() - Ok gtdTask - with exc -> - Error(Exception.flattenMessage exc) - - match gtdCompletionOrError with - | Ok task -> - if task.Status = TaskStatus.RanToCompletion && task.Result.IsSome then - let item, _ = task.Result.Value + try + // This call to Wait() is fine because we want to be able to provide the error message in the status bar. + gtdTask.Wait() + if gtdTask.Status = TaskStatus.RanToCompletion && gtdTask.Result.IsSome then + let item, _ = gtdTask.Result.Value gtd.NavigateToItem(item, statusBar) // 'true' means do it, like Sheev Palpatine would want us to. @@ -60,8 +53,8 @@ type internal FSharpGoToDefinitionService else statusBar.TempMessage (SR.CannotDetermineSymbol()) false - | Error message -> - statusBar.TempMessage(String.Format(SR.NavigateToFailed(), message)) + with exc -> + statusBar.TempMessage(String.Format(SR.NavigateToFailed(), Exception.flattenMessage exc)) // Don't show the dialog box as it's most likely that the user cancelled. // Don't make them click twice. diff --git a/vsintegration/src/FSharp.Editor/Navigation/NavigableSymbolsService.fs b/vsintegration/src/FSharp.Editor/Navigation/NavigableSymbolsService.fs index 4ec1ef238fb..bc6cf3e233e 100644 --- a/vsintegration/src/FSharp.Editor/Navigation/NavigableSymbolsService.fs +++ b/vsintegration/src/FSharp.Editor/Navigation/NavigableSymbolsService.fs @@ -42,27 +42,21 @@ type internal FSharpNavigableSymbolSource(checkerProvider: FSharpCheckerProvider let snapshot = triggerSpan.Snapshot let position = triggerSpan.Start.Position let document = snapshot.GetOpenDocumentInCurrentContextWithChanges() - let! sourceText = document.GetTextAsync () |> liftTaskAsync + let! sourceText = document.GetTextAsync() |> liftTaskAsync statusBar.Message(SR.LocatingSymbol()) use _ = statusBar.Animate() let gtdTask = gtd.FindDefinitionTask(document, position, cancellationToken) - // Wrap this in a try/with as if the user clicks "Cancel" on the thread dialog, we'll be cancelled + // Wrap this in a try/with as if the user clicks "Cancel" on the thread dialog, we'll be cancelled. // Task.Wait throws an exception if the task is cancelled, so be sure to catch it. - let gtdCompletedOrError = - try - // This call to Wait() is fine because we want to be able to provide the error message in the status bar. - gtdTask.Wait() - Ok gtdTask - with exc -> - Error(Exception.flattenMessage exc) - - match gtdCompletedOrError with - | Ok task -> - if task.Status = TaskStatus.RanToCompletion && task.Result.IsSome then - let (navigableItem, range) = task.Result.Value + try + // This call to Wait() is fine because we want to be able to provide the error message in the status bar. + gtdTask.Wait() + + if gtdTask.Status = TaskStatus.RanToCompletion && gtdTask.Result.IsSome then + let navigableItem, range = gtdTask.Result.Value let declarationTextSpan = RoslynHelpers.FSharpRangeToTextSpan(sourceText, range) let declarationSpan = Span(declarationTextSpan.Start, declarationTextSpan.Length) @@ -70,12 +64,12 @@ type internal FSharpNavigableSymbolSource(checkerProvider: FSharpCheckerProvider return FSharpNavigableSymbol(navigableItem, symbolSpan, gtd, statusBar) :> INavigableSymbol else - statusBar.TempMessage (SR.CannotDetermineSymbol()) + statusBar.TempMessage(SR.CannotDetermineSymbol()) // The NavigableSymbols API accepts 'null' when there's nothing to navigate to. return null - | Error message -> - statusBar.TempMessage (String.Format(SR.NavigateToFailed(), message)) + with exc -> + statusBar.TempMessage(String.Format(SR.NavigateToFailed(), Exception.flattenMessage exc)) // The NavigableSymbols API accepts 'null' when there's nothing to navigate to. return null From dc6be2a5daf54d7f3d6a3c65ac07914a10dad2ea Mon Sep 17 00:00:00 2001 From: "Kevin Ransom (msft)" Date: Fri, 7 Dec 2018 17:43:35 -0800 Subject: [PATCH 126/160] Fix Xlif issue (#5995) --- CoordinateXlif.targets | 3 +++ FSharp.Directory.Build.targets | 1 + 2 files changed, 4 insertions(+) create mode 100644 CoordinateXlif.targets diff --git a/CoordinateXlif.targets b/CoordinateXlif.targets new file mode 100644 index 00000000000..ea1ed17aaa2 --- /dev/null +++ b/CoordinateXlif.targets @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/FSharp.Directory.Build.targets b/FSharp.Directory.Build.targets index 0c0448113ce..84125426d58 100644 --- a/FSharp.Directory.Build.targets +++ b/FSharp.Directory.Build.targets @@ -2,5 +2,6 @@ + From d4432b95f8fdfb5fb093273e06435d430cf94d33 Mon Sep 17 00:00:00 2001 From: "Kevin Ransom (msft)" Date: Mon, 10 Dec 2018 12:46:48 -0800 Subject: [PATCH 127/160] Run the CI on Brettfo sdk proj (#5923) * convert to SDK projects * fix ci_part4 * convert to SDK projects * Done * Init command * ws * Update FSharpBuild.Directory.Build.props * feedback --- FSharpTests.Directory.Build.props | 14 +- FSharpTests.Directory.Build.targets | 52 +- build/targets/PackageVersions.props | 4 + .../FSharp.Compiler.Service.fsproj | 3 +- fcs/fcs.props | 4 +- .../FSharp.Compiler.Private.fsproj | 4 + src/buildfromsource/Fsi/Fsi.fsproj | 1 - .../targets/PackageVersions.props | 4 + src/fsharp/CompileOps.fs | 30 +- src/fsharp/FSharp.Build/FSBuild.txt | 2 +- src/fsharp/FSharp.Build/FSharp.Build.fsproj | 1 + src/fsharp/FSharp.Build/Fsc.fs | 21 +- src/fsharp/FSharp.Build/Fsi.fs | 339 ++++++++++++ .../Microsoft.FSharp.NetSdk.props | 5 + .../Microsoft.FSharp.NetSdk.targets | 2 +- .../FSharp.Build/Microsoft.FSharp.Targets | 6 +- .../FSharp.Build/xlf/FSBuild.txt.cs.xlf | 4 +- .../FSharp.Build/xlf/FSBuild.txt.de.xlf | 4 +- .../FSharp.Build/xlf/FSBuild.txt.en.xlf | 4 +- .../FSharp.Build/xlf/FSBuild.txt.es.xlf | 4 +- .../FSharp.Build/xlf/FSBuild.txt.fr.xlf | 4 +- .../FSharp.Build/xlf/FSBuild.txt.it.xlf | 4 +- .../FSharp.Build/xlf/FSBuild.txt.ja.xlf | 4 +- .../FSharp.Build/xlf/FSBuild.txt.ko.xlf | 4 +- .../FSharp.Build/xlf/FSBuild.txt.pl.xlf | 4 +- .../FSharp.Build/xlf/FSBuild.txt.pt-BR.xlf | 4 +- .../FSharp.Build/xlf/FSBuild.txt.ru.xlf | 4 +- .../FSharp.Build/xlf/FSBuild.txt.tr.xlf | 4 +- .../FSharp.Build/xlf/FSBuild.txt.zh-Hans.xlf | 4 +- .../FSharp.Build/xlf/FSBuild.txt.zh-Hant.xlf | 4 +- .../FSharp.Compiler.Private.fsproj | 4 + src/scripts/fssrgen.fsx | 494 ------------------ src/scripts/fssrgen.targets | 57 -- tests/FSharp.Core.UnitTests/NuGet.Config | 10 - tests/fsharp/core/array/test.fsx | 4 +- tests/fsharp/core/attributes/test.fsx | 31 +- tests/fsharp/core/attributes/testlib.fs | 2 +- tests/fsharp/core/comprehensions-hw/test.fsx | 4 +- tests/fsharp/core/comprehensions/test.fsx | 2 +- tests/fsharp/core/control/test.fsx | 56 +- tests/fsharp/core/controlChamenos/test.fsx | 2 +- tests/fsharp/core/controlMailbox/test.fsx | 24 +- .../fsharp/core/controlStackOverflow/test.fsx | 6 +- tests/fsharp/core/forexpression/test.fsx | 2 +- tests/fsharp/core/lazy/test.fsx | 2 +- tests/fsharp/core/letrec/test.fsx | 5 +- tests/fsharp/core/libtest/test.fsx | 18 +- tests/fsharp/core/longnames/test.fsx | 2 +- tests/fsharp/core/math/numbers/test.fsx | 2 +- tests/fsharp/core/math/numbersVS2008/test.fsx | 2 +- tests/fsharp/core/measures/test.fsx | 10 +- .../core/members/basics-hw-mutrec/test.fs | 2 +- tests/fsharp/core/members/basics-hw/test.fsx | 12 +- .../core/members/incremental-hw/test.fsx | 4 +- .../fsharp/core/members/incremental/test.fsx | 4 +- tests/fsharp/core/patterns/test.fsx | 2 +- tests/fsharp/core/printing/testLoadFile2.fsx | 2 +- .../queriesLeafExpressionConvert/test.fsx | 8 +- tests/fsharp/core/quotes/test.fsx | 12 +- tests/fsharp/core/subtype/test.fsx | 13 +- .../core/unicode/kanji-unicode-utf16.fs | Bin 236 -> 230 bytes tests/fsharp/core/unicode/test.fsx | 2 +- tests/fsharp/single-test.fs | 370 +++++++------ tests/fsharp/tests.fs | 126 +++-- .../fff.config | 4 - tests/service/Common.fs | 2 +- 66 files changed, 850 insertions(+), 1000 deletions(-) create mode 100644 src/fsharp/FSharp.Build/Fsi.fs delete mode 100644 src/scripts/fssrgen.fsx delete mode 100644 src/scripts/fssrgen.targets delete mode 100644 tests/FSharp.Core.UnitTests/NuGet.Config delete mode 100644 tests/projects/misc/TestProjectChanges/Library1AlwaysInMatchingConfiguration/fff.config diff --git a/FSharpTests.Directory.Build.props b/FSharpTests.Directory.Build.props index 7deaa0eb9b0..eb20065bec2 100644 --- a/FSharpTests.Directory.Build.props +++ b/FSharpTests.Directory.Build.props @@ -4,23 +4,36 @@ <_FSharpCompilerPath>$(MSBuildThisFileDirectory)$(Configuration)/net40/bin + true + $(_FSharpCompilerPath) fsc.exe + + $(_FSharpCompilerPath) + fsi.exe + <_FSharpCompilerPath>$(MSBuildThisFileDirectory)$(Configuration)/coreclr/bin + true $(MSBuildThisFileDirectory)Tools/dotnet20 dotnet.exe dotnet $(_FSharpCompilerPath)/fsc.exe + + $(MSBuildThisFileDirectory)Tools/dotnet20 + dotnet.exe + dotnet + $(_FSharpCompilerPath)/fsi.exe + $(_FSharpCompilerPath)/Microsoft.FSharp.Targets $(_FSharpCompilerPath)/Microsoft.FSharp.NetSdk.props $(_FSharpCompilerPath)/Microsoft.FSharp.NetSdk.targets $(_FSharpCompilerPath)/Microsoft.FSharp.Overrides.NetSdk.targets @@ -32,5 +45,4 @@ $(MSBuildThisFileDirectory)$(Configuration)\coreclr\bin\FSharp.Build.dll $(MSBuildThisFileDirectory)$(Configuration)\net40\bin\FSharp.Build.dll - \ No newline at end of file diff --git a/FSharpTests.Directory.Build.targets b/FSharpTests.Directory.Build.targets index e5b000ce518..fe916bf2df2 100644 --- a/FSharpTests.Directory.Build.targets +++ b/FSharpTests.Directory.Build.targets @@ -1,21 +1,41 @@ - - + - - $([System.IO.File]::ReadAllText('$(MSBuildThisFileDirectory)DotnetCLIToolsVersion.txt').Trim()) - - - - - - - - + + + + + + <_CoreCompileResourceInputs Remove="@(_CoreCompileResourceInputs)" /> + + diff --git a/build/targets/PackageVersions.props b/build/targets/PackageVersions.props index 0f1def8f894..e678f7ec6dc 100644 --- a/build/targets/PackageVersions.props +++ b/build/targets/PackageVersions.props @@ -32,6 +32,7 @@ 4.3.0 4.5.0 4.3.0 + 4.3.0 4.3.0 1.6.0 4.3.0 @@ -39,8 +40,11 @@ 4.3.0 4.3.0 4.3.0 + 4.3.0 + 4.3.0 4.3.0 4.3.0 + 4.3.0 4.3.0 4.3.0 4.3.0 diff --git a/fcs/FSharp.Compiler.Service/FSharp.Compiler.Service.fsproj b/fcs/FSharp.Compiler.Service/FSharp.Compiler.Service.fsproj index b831832ea7d..c5f1122386c 100644 --- a/fcs/FSharp.Compiler.Service/FSharp.Compiler.Service.fsproj +++ b/fcs/FSharp.Compiler.Service/FSharp.Compiler.Service.fsproj @@ -5,7 +5,7 @@ - + net45;netstandard2.0 true $(DefineConstants);COMPILER_SERVICE_AS_DLL @@ -641,6 +641,7 @@ + diff --git a/fcs/fcs.props b/fcs/fcs.props index 470ea0b88da..207d1f8085b 100644 --- a/fcs/fcs.props +++ b/fcs/fcs.props @@ -8,7 +8,7 @@ false - $(FSharpSourcesRoot)\..\packages\FSharp.Compiler.Tools.4.1.27\tools - fsi.exe + $(FSharpSourcesRoot)\..\packages\FSharp.Compiler.Tools.4.1.27\tools + fsi.exe \ No newline at end of file diff --git a/src/buildfromsource/FSharp.Compiler.Private/FSharp.Compiler.Private.fsproj b/src/buildfromsource/FSharp.Compiler.Private/FSharp.Compiler.Private.fsproj index 1668c425ebe..7edd03a10e8 100644 --- a/src/buildfromsource/FSharp.Compiler.Private/FSharp.Compiler.Private.fsproj +++ b/src/buildfromsource/FSharp.Compiler.Private/FSharp.Compiler.Private.fsproj @@ -629,18 +629,22 @@ + + + + diff --git a/src/buildfromsource/Fsi/Fsi.fsproj b/src/buildfromsource/Fsi/Fsi.fsproj index 56390954225..69daac7764a 100644 --- a/src/buildfromsource/Fsi/Fsi.fsproj +++ b/src/buildfromsource/Fsi/Fsi.fsproj @@ -34,7 +34,6 @@ - diff --git a/src/buildfromsource/targets/PackageVersions.props b/src/buildfromsource/targets/PackageVersions.props index afb00824fb9..a24eded9c32 100644 --- a/src/buildfromsource/targets/PackageVersions.props +++ b/src/buildfromsource/targets/PackageVersions.props @@ -9,13 +9,17 @@ 4.3.0 4.3.0 4.3.0 + 4.3.0 4.3.0 1.5.0 4.3.0 4.3.0 4.3.0 4.3.0 + 4.3.0 4.3.0 + 4.3.0 + 4.3.0 4.3.0 4.3.0 4.3.0 diff --git a/src/fsharp/CompileOps.fs b/src/fsharp/CompileOps.fs index 080e3d1473d..2fb57789b81 100644 --- a/src/fsharp/CompileOps.fs +++ b/src/fsharp/CompileOps.fs @@ -1825,6 +1825,7 @@ let DefaultReferencesForScriptsAndOutOfProjectSources(assumeDotNetFramework) = yield "System.Data" yield "System.Drawing" yield "System.Core" + // These are the Portable-profile and .NET Standard 1.6 dependencies of FSharp.Core.dll. These are needed // when an F# sript references an F# profile 7, 78, 259 or .NET Standard 1.6 component which in turn refers // to FSharp.Core for profile 7, 78, 259 or .NET Standard. @@ -1850,17 +1851,24 @@ let DefaultReferencesForScriptsAndOutOfProjectSources(assumeDotNetFramework) = yield "System.Windows.Forms" yield "System.Numerics" else - yield Path.Combine(Path.GetDirectoryName(typeof.Assembly.Location), "mscorlib.dll"); // mscorlib - yield typeof.Assembly.Location; // System.Console - yield typeof.Assembly.Location; // System.Runtime - yield typeof.Assembly.Location; // System.ObjectModel - yield typeof.Assembly.Location; // System.IO - yield typeof.Assembly.Location; // System.Linq - //yield typeof.Assembly.Location; // System.Xml.Linq - yield typeof.Assembly.Location; // System.Net.Requests - yield typeof.Assembly.Location; // System.Runtime.Numerics - yield typeof.Assembly.Location; // System.Threading.Tasks - yield typeof.Assembly.Location; // FSharp.Core + yield Path.Combine(Path.GetDirectoryName(typeof.Assembly.Location), "mscorlib.dll") // mscorlib + yield typeof.Assembly.Location // System.Console + yield typeof.Assembly.Location // System.Collections + yield typeof.Assembly.Location // System.Data.SqlClient + yield typeof.Assembly.Location // System.ObjectModel + yield typeof.Assembly.Location // System.IO.FileSystem + yield typeof.Assembly.Location // System.IO + yield typeof.Assembly.Location // System.Linq + yield typeof.Assembly.Location // System.Xml + yield typeof.Assembly.Location // System.Xml.Linq + yield typeof.Assembly.Location // System.Net.Requests + yield typeof.Assembly.Location // System.Runtime.Numerics + yield typeof.Assembly.Location // System.Net.Security + yield typeof.Assembly.Location // System.Security.Claims + yield typeof.Assembly.Location // System.Text.RegularExpressions.Regex + yield typeof.Assembly.Location // System.Threading.Tasks + yield typeof.Assembly.Location // System.Threading + yield typeof.Assembly.Location // FSharp.Core ] diff --git a/src/fsharp/FSharp.Build/FSBuild.txt b/src/fsharp/FSharp.Build/FSBuild.txt index 89840c0d725..10fdedb2151 100644 --- a/src/fsharp/FSharp.Build/FSBuild.txt +++ b/src/fsharp/FSharp.Build/FSBuild.txt @@ -1,2 +1,2 @@ # FSharp.Build resource strings -toolpathUnknown,"ToolPath is unknown; specify the path to fsc.exe as the ToolPath property." \ No newline at end of file +toolpathUnknown,"ToolPath is unknown; specify the path to the tool." \ No newline at end of file diff --git a/src/fsharp/FSharp.Build/FSharp.Build.fsproj b/src/fsharp/FSharp.Build/FSharp.Build.fsproj index f5b606cd451..162c6bf3d31 100644 --- a/src/fsharp/FSharp.Build/FSharp.Build.fsproj +++ b/src/fsharp/FSharp.Build/FSharp.Build.fsproj @@ -19,6 +19,7 @@ + diff --git a/src/fsharp/FSharp.Build/Fsc.fs b/src/fsharp/FSharp.Build/Fsc.fs index 95f3ec2f98c..307261b3a21 100644 --- a/src/fsharp/FSharp.Build/Fsc.fs +++ b/src/fsharp/FSharp.Build/Fsc.fs @@ -121,6 +121,7 @@ type public Fsc () as this = builder.AppendSwitchIfNotNull("--define:", item.ItemSpec) // DocumentationFile builder.AppendSwitchIfNotNull("--doc:", documentationFile) + // GenerateInterfaceFile builder.AppendSwitchIfNotNull("--sig:", generateInterfaceFile) // KeyFile @@ -235,6 +236,8 @@ type public Fsc () as this = builder.AppendSwitchIfNotNull("--targetprofile:", targetProfile) + builder.AppendSwitch("--nocopyfsharpcore") + // OtherFlags - must be second-to-last builder.AppendSwitchUnquotedIfNotNull("", otherFlags) capturedArguments <- builder.CapturedArguments() @@ -485,7 +488,7 @@ type public Fsc () as this = override fsc.ToolName = "fsc.exe" override fsc.StandardErrorEncoding = if utf8output then System.Text.Encoding.UTF8 else base.StandardErrorEncoding override fsc.StandardOutputEncoding = if utf8output then System.Text.Encoding.UTF8 else base.StandardOutputEncoding - override fsc.GenerateFullPathToTool() = + override fsc.GenerateFullPathToTool() = if toolPath = "" then raise (new System.InvalidOperationException(FSBuild.SR.toolpathUnknown())) System.IO.Path.Combine(toolPath, fsc.ToolExe) override fsc.LogToolCommand (message:string) = @@ -524,24 +527,11 @@ type public Fsc () as this = -1 // ok, this is what happens when VS IDE cancels the build, no need to assert, just log the build-canceled error and return -1 to denote task failed | e -> reraise() - // Todo: Remove !FX_NO_CONVERTER code path for VS2017.7 - // Earlier buildtasks usesd System.Converter for cross platform we are moving to Func - // This is so that during the interim, earlier VS's will still load the OSS project let baseCallDelegate = Func(fun () -> fsc.BaseExecuteTool(pathToTool, responseFileCommands, commandLineCommands) ) try invokeCompiler baseCallDelegate with | e -> -#if !FX_NO_CONVERTER - try - let baseCall = fun (dummy : int) -> fsc.BaseExecuteTool(pathToTool, responseFileCommands, commandLineCommands) - // We are using a Converter rather than a "unit->int" because it is too hard to - // figure out how to pass an F# function object via reflection. - let baseCallDelegate = new System.Converter(baseCall) - invokeCompiler baseCallDelegate - with - | e -> -#endif Debug.Assert(false, "HostObject received by Fsc task did not have a Compile method or the compile method threw an exception. "+(e.ToString())) reraise() @@ -565,8 +555,7 @@ type public Fsc () as this = member internal fsc.InternalExecuteTool(pathToTool, responseFileCommands, commandLineCommands) = fsc.ExecuteTool(pathToTool, responseFileCommands, commandLineCommands) - member internal fsc.GetCapturedArguments() = - [| + member internal fsc.GetCapturedArguments() = [| yield! capturedArguments yield! capturedFilenames |] diff --git a/src/fsharp/FSharp.Build/Fsi.fs b/src/fsharp/FSharp.Build/Fsi.fs new file mode 100644 index 00000000000..f30a5bb2fb3 --- /dev/null +++ b/src/fsharp/FSharp.Build/Fsi.fs @@ -0,0 +1,339 @@ +// Copyright (c) Microsoft Corporation. All Rights Reserved. See License.txt in the project root for license information. + +namespace Microsoft.FSharp.Build + +open System +open System.Diagnostics +open System.Globalization +open System.IO +open System.Reflection +open Microsoft.Build.Framework +open Microsoft.Build.Utilities +open Internal.Utilities + +#if FX_RESHAPED_REFLECTION +open Microsoft.FSharp.Core.ReflectionAdapters +#endif + +//There are a lot of flags on fsi.exe. +//For now, not all of them are represented in the "Fsi class" object model. +//The goal is to have the most common/important flags available via the Fsi class, and the +//rest can be "backdoored" through the .OtherFlags property. + +[] +type public Fsi () as this = + + inherit ToolTask () + + let mutable capturedArguments : string list = [] // list of individual args, to pass to HostObject Compile() + let mutable capturedFilenames : string list = [] // list of individual source filenames, to pass to HostObject Compile() + let mutable codePage : string = null + let mutable commandLineArgs : ITaskItem list = [] + let mutable defineConstants : ITaskItem[] = [||] + let mutable disabledWarnings : string = null + let mutable dotnetFsiCompilerPath : string = null + let mutable fsiExec = false + let mutable noFramework = false + let mutable optimize = true + let mutable otherFlags : string = null + let mutable preferredUILang = null + let mutable provideCommandLineArgs = false + let mutable references : ITaskItem[] = [||] + let mutable referencePath : string = null + let mutable resources : ITaskItem[] = [||] + let mutable skipCompilerExecution = false + let mutable sources : ITaskItem[] = [||] + let mutable loadSources : ITaskItem[] = [||] + let mutable useSources : ITaskItem[] = [||] + let mutable tailcalls : bool = true + let mutable targetProfile : string = null + let mutable targetType : string = null + let mutable toolExe : string = "fsi.exe" + let mutable toolPath : string = + let locationOfThisDll = + try Some(Path.GetDirectoryName(typeof.Assembly.Location)) + with _ -> None + match FSharpEnvironment.BinFolderOfDefaultFSharpCompiler(locationOfThisDll) with + | Some s -> s + | None -> "" + let mutable treatWarningsAsErrors : bool = false + let mutable warningsAsErrors : string = null + let mutable warningsNotAsErrors : string = null + let mutable warningLevel : string = null + let mutable vslcid : string = null + let mutable utf8output : bool = false + + // See bug 6483; this makes parallel build faster, and is fine to set unconditionally + do this.YieldDuringToolExecution <- true + + let generateCommandLineBuilder () = + let builder = new FSharpCommandLineBuilder() + + builder.AppendSwitchIfNotNull("--codepage:", codePage) + + if noFramework then builder.AppendSwitch("--noframework") + + if defineConstants <> null then + for item in defineConstants do + builder.AppendSwitchIfNotNull("--define:", item.ItemSpec) + + if optimize then builder.AppendSwitch("--optimize+") + else builder.AppendSwitch("--optimize-") + + if not tailcalls then + builder.AppendSwitch("--tailcalls-") + + if references <> null then + for item in references do + builder.AppendSwitchIfNotNull("-r:", item.ItemSpec) + + let referencePathArray = // create a array of strings + match referencePath with + | null -> null + | _ -> referencePath.Split([|';'; ','|], StringSplitOptions.RemoveEmptyEntries) + + // NoWarn + match disabledWarnings with + | null -> () + | _ -> builder.AppendSwitchIfNotNull("--nowarn:", disabledWarnings.Split([|' '; ';'; ','; '\r'; '\n'|], StringSplitOptions.RemoveEmptyEntries), ",") + + builder.AppendSwitchIfNotNull("--warn:", warningLevel) + + if treatWarningsAsErrors then builder.AppendSwitch("--warnaserror") + + // Change warning 76, HashReferenceNotAllowedInNonScript/HashDirectiveNotAllowedInNonScript/HashIncludeNotAllowedInNonScript, into an error + let warningsAsErrorsArray = + match warningsAsErrors with + | null -> [| "76" |] + | _ -> (warningsAsErrors + " 76 ").Split([|' '; ';'; ','|], StringSplitOptions.RemoveEmptyEntries) + + builder.AppendSwitchIfNotNull("--warnaserror:", warningsAsErrorsArray, ",") + + match warningsNotAsErrors with + | null -> () + | _ -> builder.AppendSwitchIfNotNull("--warnaserror-:", warningsNotAsErrors.Split([|' '; ';'; ','|], StringSplitOptions.RemoveEmptyEntries), ",") + + builder.AppendSwitchIfNotNull("--LCID:", vslcid) + + builder.AppendSwitchIfNotNull("--preferreduilang:", preferredUILang) + + if utf8output then builder.AppendSwitch("--utf8output") + + builder.AppendSwitch("--fullpaths") + builder.AppendSwitch("--flaterrors") + + builder.AppendSwitchIfNotNull("--targetprofile:", targetProfile) + + if loadSources <> null then + for item in loadSources do + builder.AppendSwitchIfNotNull("--load:", item.ItemSpec) + + if useSources <> null then + for item in useSources do + builder.AppendSwitchIfNotNull("--use:", item.ItemSpec) + + // OtherFlags - must be second-to-last + builder.AppendSwitchUnquotedIfNotNull("", otherFlags) + capturedArguments <- builder.CapturedArguments() + + if fsiExec then builder.AppendSwitch("--exec") + + // Sources - these have to go last + builder.AppendFileNamesIfNotNull(sources, " ") + capturedFilenames <- builder.CapturedFilenames() + + builder + + // --codepage : Specify the codepage to use when opening source files + member fsc.CodePage + with get() = codePage + and set(s) = codePage <- s + + // --nowarn : Do not report the given specific warning. + member fsi.DisabledWarnings + with get() = disabledWarnings + and set(a) = disabledWarnings <- a + + // --define : Define the given conditional compilation symbol. + member fsi.DefineConstants + with get() = defineConstants + and set(a) = defineConstants <- a + + member fsi.DotnetFsiCompilerPath + with get() = dotnetFsiCompilerPath + and set(p) = dotnetFsiCompilerPath <- p + + member fsi.FsiExec + with get() = fsiExec + and set(p) = fsiExec <- p + + member fsi.LCID + with get() = vslcid + and set(p) = vslcid <- p + + // --noframework + member fsi.NoFramework + with get() = noFramework + and set(b) = noFramework <- b + + // --optimize + member fsi.Optimize + with get() = optimize + and set(p) = optimize <- p + + // --tailcalls + member fsi.Tailcalls + with get() = tailcalls + and set(p) = tailcalls <- p + + member fsi.OtherFlags + with get() = otherFlags + and set(s) = otherFlags <- s + + member fsi.PreferredUILang + with get() = preferredUILang + and set(s) = preferredUILang <- s + + member fsi.ProvideCommandLineArgs + with get() = provideCommandLineArgs + and set(p) = provideCommandLineArgs <- p + + // -r : Reference an F# or .NET assembly. + member fsi.References + with get() = references + and set(a) = references <- a + + // --lib + member fsi.ReferencePath + with get() = referencePath + and set(s) = referencePath <- s + + // -load:: load an F# source file + member fsi.LoadSources + with get() = loadSources + and set(a) = loadSources <- a + + member fsi.SkipCompilerExecution + with get() = skipCompilerExecution + and set(p) = skipCompilerExecution <- p + + // source files + member fsi.Sources + with get() = sources + and set(a) = sources <- a + + member fsi.TargetProfile + with get() = targetProfile + and set(p) = targetProfile <- p + + member fsi.TreatWarningsAsErrors + with get() = treatWarningsAsErrors + and set(p) = treatWarningsAsErrors <- p + + // For targeting other folders for "fsi.exe" (or ToolExe if different) + member fsi.ToolPath + with get() = toolPath + and set(s) = toolPath <- s + + // --use:: execute an F# source file on startup + member fsi.UseSources + with get() = useSources + and set(a) = useSources <- a + + // For specifying the warning level (0-4) + member fsi.WarningLevel + with get() = warningLevel + and set(s) = warningLevel <- s + + member fsi.WarningsAsErrors + with get() = warningsAsErrors + and set(s) = warningsAsErrors <- s + + member fsi.WarningsNotAsErrors + with get() = warningsNotAsErrors + and set(s) = warningsNotAsErrors <- s + + member fsi.Utf8Output + with get() = utf8output + and set(p) = utf8output <- p + + [] + member fsi.CommandLineArgs + with get() = List.toArray commandLineArgs + and set(p) = commandLineArgs <- (List.ofArray p) + + // ToolTask methods + override fsi.ToolName = "fsi.exe" + override fsi.StandardErrorEncoding = if utf8output then System.Text.Encoding.UTF8 else base.StandardErrorEncoding + override fsi.StandardOutputEncoding = if utf8output then System.Text.Encoding.UTF8 else base.StandardOutputEncoding + override fsi.GenerateFullPathToTool() = + if toolPath = "" then raise (new System.InvalidOperationException(FSBuild.SR.toolpathUnknown())) + System.IO.Path.Combine(toolPath, fsi.ToolExe) + override fsi.LogToolCommand (message:string) = + fsi.Log.LogMessageFromText(message, MessageImportance.Normal) |>ignore + + member internal fsi.InternalGenerateFullPathToTool() = fsi.GenerateFullPathToTool() // expose for unit testing + member internal fsi.BaseExecuteTool(pathToTool, responseFileCommands, commandLineCommands) = // F# does not allow protected members to be captured by lambdas, this is the standard workaround + base.ExecuteTool(pathToTool, responseFileCommands, commandLineCommands) + + /// Intercept the call to ExecuteTool to handle the host compile case. + override fsi.ExecuteTool(pathToTool, responseFileCommands, commandLineCommands) = + if provideCommandLineArgs then + commandLineArgs <- + fsi.GetCapturedArguments() + |> Array.map (fun (arg: string) -> TaskItem(arg) :> ITaskItem) + |> Array.toList + + if skipCompilerExecution then + 0 + else + let host = box fsi.HostObject + match host with + | null -> base.ExecuteTool(pathToTool, responseFileCommands, commandLineCommands) + | _ -> + let sources = sources|>Array.map(fun i->i.ItemSpec) + let invokeCompiler baseCallDelegate = + try + let ret = + (host.GetType()).InvokeMember("Compile", BindingFlags.Public ||| BindingFlags.NonPublic ||| BindingFlags.InvokeMethod ||| BindingFlags.Instance, null, host, + [| baseCallDelegate; box (capturedArguments |> List.toArray); box (capturedFilenames |> List.toArray) |], + CultureInfo.InvariantCulture) + unbox ret + with + | :? TargetInvocationException as tie when (match tie.InnerException with | :? Microsoft.Build.Exceptions.BuildAbortedException -> true | _ -> false) -> + fsi.Log.LogError(tie.InnerException.Message, [| |]) + -1 // ok, this is what happens when VS IDE cancels the build, no need to assert, just log the build-canceled error and return -1 to denote task failed + | e -> reraise() + + let baseCallDelegate = Func(fun () -> fsi.BaseExecuteTool(pathToTool, responseFileCommands, commandLineCommands) ) + try + invokeCompiler baseCallDelegate + with + | e -> + Debug.Assert(false, "HostObject received by Fsi task did not have a Compile method or the compile method threw an exception. "+(e.ToString())) + reraise() + + override fsi.GenerateCommandLineCommands() = + let builder = new FSharpCommandLineBuilder() + if not (String.IsNullOrEmpty(dotnetFsiCompilerPath)) then builder.AppendSwitch(dotnetFsiCompilerPath) + builder.ToString() + + override fsi.GenerateResponseFileCommands() = + let builder = generateCommandLineBuilder () + builder.GetCapturedArguments() |> Seq.fold(fun acc f -> acc + f + Environment.NewLine) "" + + // expose this to internal components (for nunit testing) + member internal fsi.InternalGenerateCommandLineCommands() = + fsi.GenerateCommandLineCommands() + + // expose this to internal components (for nunit testing) + member internal fsi.InternalGenerateResponseFileCommands() = + fsi.GenerateResponseFileCommands() + + member internal fsi.InternalExecuteTool(pathToTool, responseFileCommands, commandLineCommands) = + fsi.ExecuteTool(pathToTool, responseFileCommands, commandLineCommands) + + member internal fsi.GetCapturedArguments() = [| + yield! capturedArguments + yield! capturedFilenames + |] diff --git a/src/fsharp/FSharp.Build/Microsoft.FSharp.NetSdk.props b/src/fsharp/FSharp.Build/Microsoft.FSharp.NetSdk.props index fb8bbf94c72..1b905a5c2f3 100644 --- a/src/fsharp/FSharp.Build/Microsoft.FSharp.NetSdk.props +++ b/src/fsharp/FSharp.Build/Microsoft.FSharp.NetSdk.props @@ -41,6 +41,7 @@ WARNING: DO NOT MODIFY this file unless you are knowledgeable about MSBuild and 3 3239;$(WarningsAsErrors) true + true @@ -59,6 +60,10 @@ WARNING: DO NOT MODIFY this file unless you are knowledgeable about MSBuild and $([System.IO.Path]::GetDirectoryName($(DOTNET_HOST_PATH))) $([System.IO.Path]::GetFileName($(DOTNET_HOST_PATH))) "$(MSBuildThisFileDirectory)fsc.exe" + + $([System.IO.Path]::GetDirectoryName($(DOTNET_HOST_PATH))) + $([System.IO.Path]::GetFileName($(DOTNET_HOST_PATH))) + "$(MSBuildThisFileDirectory)fsi.exe" mscorlib netcore netstandard - $(OtherFlags) --simpleresolution --nocopyfsharpcore + $(OtherFlags) --simpleresolution diff --git a/src/fsharp/FSharp.Build/Microsoft.FSharp.Targets b/src/fsharp/FSharp.Build/Microsoft.FSharp.Targets index 8808c10ebc2..9bdd9868dc0 100644 --- a/src/fsharp/FSharp.Build/Microsoft.FSharp.Targets +++ b/src/fsharp/FSharp.Build/Microsoft.FSharp.Targets @@ -23,6 +23,7 @@ this file. + @@ -152,7 +153,6 @@ this file. - @@ -221,7 +221,9 @@ this file. $(Win32Manifest); @(CustomAdditionalCompileInputs); $(VersionFile); - $(KeyOriginatorFile)" + $(KeyOriginatorFile); + $(UseSource); + $(LoadSource)" Outputs="@(DocFileItem); @(IntermediateAssembly); @(_DebugSymbolsIntermediatePath); diff --git a/src/fsharp/FSharp.Build/xlf/FSBuild.txt.cs.xlf b/src/fsharp/FSharp.Build/xlf/FSBuild.txt.cs.xlf index 1c2cebf36fe..c7540eaf089 100644 --- a/src/fsharp/FSharp.Build/xlf/FSBuild.txt.cs.xlf +++ b/src/fsharp/FSharp.Build/xlf/FSBuild.txt.cs.xlf @@ -3,8 +3,8 @@ - ToolPath is unknown; specify the path to fsc.exe as the ToolPath property. - Parametr ToolPath je neznámý; zadejte cestu k souboru fsc.exe jako vlastnost ToolPath. + ToolPath is unknown; specify the path to the tool. + ToolPath is unknown; specify the path to the tool. diff --git a/src/fsharp/FSharp.Build/xlf/FSBuild.txt.de.xlf b/src/fsharp/FSharp.Build/xlf/FSBuild.txt.de.xlf index ece2090bed3..381fc6afddf 100644 --- a/src/fsharp/FSharp.Build/xlf/FSBuild.txt.de.xlf +++ b/src/fsharp/FSharp.Build/xlf/FSBuild.txt.de.xlf @@ -3,8 +3,8 @@ - ToolPath is unknown; specify the path to fsc.exe as the ToolPath property. - ToolPath ist unbekannt. Geben Sie den Pfad zu "fsc.exe" als ToolPath-Eigenschaft an. + ToolPath is unknown; specify the path to the tool. + ToolPath is unknown; specify the path to the tool. diff --git a/src/fsharp/FSharp.Build/xlf/FSBuild.txt.en.xlf b/src/fsharp/FSharp.Build/xlf/FSBuild.txt.en.xlf index 1cd033f6d2c..50915d20e20 100644 --- a/src/fsharp/FSharp.Build/xlf/FSBuild.txt.en.xlf +++ b/src/fsharp/FSharp.Build/xlf/FSBuild.txt.en.xlf @@ -3,8 +3,8 @@ - ToolPath is unknown; specify the path to fsc.exe as the ToolPath property. - ToolPath is unknown; specify the path to fsc.exe as the ToolPath property. + ToolPath is unknown; specify the path to the tool. + ToolPath is unknown; specify the path to the tool. diff --git a/src/fsharp/FSharp.Build/xlf/FSBuild.txt.es.xlf b/src/fsharp/FSharp.Build/xlf/FSBuild.txt.es.xlf index 4149a8ac602..14821c6fc73 100644 --- a/src/fsharp/FSharp.Build/xlf/FSBuild.txt.es.xlf +++ b/src/fsharp/FSharp.Build/xlf/FSBuild.txt.es.xlf @@ -3,8 +3,8 @@ - ToolPath is unknown; specify the path to fsc.exe as the ToolPath property. - ToolPath desconocido; especifique la ruta de acceso del archivo fsc.exe como propiedad ToolPath. + ToolPath is unknown; specify the path to the tool. + ToolPath is unknown; specify the path to the tool. diff --git a/src/fsharp/FSharp.Build/xlf/FSBuild.txt.fr.xlf b/src/fsharp/FSharp.Build/xlf/FSBuild.txt.fr.xlf index 050b697ac10..8cb98ce31f2 100644 --- a/src/fsharp/FSharp.Build/xlf/FSBuild.txt.fr.xlf +++ b/src/fsharp/FSharp.Build/xlf/FSBuild.txt.fr.xlf @@ -3,8 +3,8 @@ - ToolPath is unknown; specify the path to fsc.exe as the ToolPath property. - ToolPath inconnu ; spécifiez le chemin d'accès de fsc.exe en tant que propriété ToolPath. + ToolPath is unknown; specify the path to the tool. + ToolPath is unknown; specify the path to the tool. diff --git a/src/fsharp/FSharp.Build/xlf/FSBuild.txt.it.xlf b/src/fsharp/FSharp.Build/xlf/FSBuild.txt.it.xlf index 3d1ba6fb8ca..7f8dd0509fa 100644 --- a/src/fsharp/FSharp.Build/xlf/FSBuild.txt.it.xlf +++ b/src/fsharp/FSharp.Build/xlf/FSBuild.txt.it.xlf @@ -3,8 +3,8 @@ - ToolPath is unknown; specify the path to fsc.exe as the ToolPath property. - ToolPath sconosciuto. Specificare il percorso di fsc.exe come proprietà ToolPath. + ToolPath is unknown; specify the path to the tool. + ToolPath is unknown; specify the path to the tool. diff --git a/src/fsharp/FSharp.Build/xlf/FSBuild.txt.ja.xlf b/src/fsharp/FSharp.Build/xlf/FSBuild.txt.ja.xlf index 7801f66a5c1..b87334379e5 100644 --- a/src/fsharp/FSharp.Build/xlf/FSBuild.txt.ja.xlf +++ b/src/fsharp/FSharp.Build/xlf/FSBuild.txt.ja.xlf @@ -3,8 +3,8 @@ - ToolPath is unknown; specify the path to fsc.exe as the ToolPath property. - ToolPath が不明です。fsc.exe へのパスを ToolPath プロパティとして指定してください。 + ToolPath is unknown; specify the path to the tool. + ToolPath is unknown; specify the path to the tool. diff --git a/src/fsharp/FSharp.Build/xlf/FSBuild.txt.ko.xlf b/src/fsharp/FSharp.Build/xlf/FSBuild.txt.ko.xlf index 3e943447be7..9e0c6d16dbb 100644 --- a/src/fsharp/FSharp.Build/xlf/FSBuild.txt.ko.xlf +++ b/src/fsharp/FSharp.Build/xlf/FSBuild.txt.ko.xlf @@ -3,8 +3,8 @@ - ToolPath is unknown; specify the path to fsc.exe as the ToolPath property. - ToolPath를 알 수 없습니다. fsc.exe의 경로를 ToolPath 속성으로 지정하세요. + ToolPath is unknown; specify the path to the tool. + ToolPath is unknown; specify the path to the tool. diff --git a/src/fsharp/FSharp.Build/xlf/FSBuild.txt.pl.xlf b/src/fsharp/FSharp.Build/xlf/FSBuild.txt.pl.xlf index 1d707eca51d..a75fe926a6d 100644 --- a/src/fsharp/FSharp.Build/xlf/FSBuild.txt.pl.xlf +++ b/src/fsharp/FSharp.Build/xlf/FSBuild.txt.pl.xlf @@ -3,8 +3,8 @@ - ToolPath is unknown; specify the path to fsc.exe as the ToolPath property. - Właściwość ToolPath jest nieznana. Określ ścieżkę do pliku fsc.exe jako właściwość ToolPath. + ToolPath is unknown; specify the path to the tool. + ToolPath is unknown; specify the path to the tool. diff --git a/src/fsharp/FSharp.Build/xlf/FSBuild.txt.pt-BR.xlf b/src/fsharp/FSharp.Build/xlf/FSBuild.txt.pt-BR.xlf index ac11dee3e50..b084cd8db2d 100644 --- a/src/fsharp/FSharp.Build/xlf/FSBuild.txt.pt-BR.xlf +++ b/src/fsharp/FSharp.Build/xlf/FSBuild.txt.pt-BR.xlf @@ -3,8 +3,8 @@ - ToolPath is unknown; specify the path to fsc.exe as the ToolPath property. - ToolPath é desconhecido; especifique o caminho para fsc.exe como propriedade de ToolPath. + ToolPath is unknown; specify the path to the tool. + ToolPath is unknown; specify the path to the tool. diff --git a/src/fsharp/FSharp.Build/xlf/FSBuild.txt.ru.xlf b/src/fsharp/FSharp.Build/xlf/FSBuild.txt.ru.xlf index 6970cd9d52b..2b2f588c6ee 100644 --- a/src/fsharp/FSharp.Build/xlf/FSBuild.txt.ru.xlf +++ b/src/fsharp/FSharp.Build/xlf/FSBuild.txt.ru.xlf @@ -3,8 +3,8 @@ - ToolPath is unknown; specify the path to fsc.exe as the ToolPath property. - Неизвестное значение свойства ToolPath; укажите в качестве значения свойства ToolPath путь к файлу fsc.exe. + ToolPath is unknown; specify the path to the tool. + ToolPath is unknown; specify the path to the tool. diff --git a/src/fsharp/FSharp.Build/xlf/FSBuild.txt.tr.xlf b/src/fsharp/FSharp.Build/xlf/FSBuild.txt.tr.xlf index 49b20a79f18..1653136e1ad 100644 --- a/src/fsharp/FSharp.Build/xlf/FSBuild.txt.tr.xlf +++ b/src/fsharp/FSharp.Build/xlf/FSBuild.txt.tr.xlf @@ -3,8 +3,8 @@ - ToolPath is unknown; specify the path to fsc.exe as the ToolPath property. - ToolPath bilinmiyor; fsc.exe yolunu ToolPath özelliği olarak belirtin. + ToolPath is unknown; specify the path to the tool. + ToolPath is unknown; specify the path to the tool. diff --git a/src/fsharp/FSharp.Build/xlf/FSBuild.txt.zh-Hans.xlf b/src/fsharp/FSharp.Build/xlf/FSBuild.txt.zh-Hans.xlf index d224ab41b5b..6d4f74c9d3f 100644 --- a/src/fsharp/FSharp.Build/xlf/FSBuild.txt.zh-Hans.xlf +++ b/src/fsharp/FSharp.Build/xlf/FSBuild.txt.zh-Hans.xlf @@ -3,8 +3,8 @@ - ToolPath is unknown; specify the path to fsc.exe as the ToolPath property. - ToolPath 未知;将 fsc.exe 的路径指定为 ToolPath 属性。 + ToolPath is unknown; specify the path to the tool. + ToolPath is unknown; specify the path to the tool. diff --git a/src/fsharp/FSharp.Build/xlf/FSBuild.txt.zh-Hant.xlf b/src/fsharp/FSharp.Build/xlf/FSBuild.txt.zh-Hant.xlf index 9dce8b27d36..96863db1dda 100644 --- a/src/fsharp/FSharp.Build/xlf/FSBuild.txt.zh-Hant.xlf +++ b/src/fsharp/FSharp.Build/xlf/FSBuild.txt.zh-Hant.xlf @@ -3,8 +3,8 @@ - ToolPath is unknown; specify the path to fsc.exe as the ToolPath property. - 未知的 ToolPath,請指定 fsc.exe 的路徑做為 ToolPath 屬性。 + ToolPath is unknown; specify the path to the tool. + ToolPath is unknown; specify the path to the tool. diff --git a/src/fsharp/FSharp.Compiler.Private/FSharp.Compiler.Private.fsproj b/src/fsharp/FSharp.Compiler.Private/FSharp.Compiler.Private.fsproj index 35ca26f1df2..4e543b673a5 100644 --- a/src/fsharp/FSharp.Compiler.Private/FSharp.Compiler.Private.fsproj +++ b/src/fsharp/FSharp.Compiler.Private/FSharp.Compiler.Private.fsproj @@ -677,17 +677,21 @@ + + + + diff --git a/src/scripts/fssrgen.fsx b/src/scripts/fssrgen.fsx deleted file mode 100644 index 32c5b4fa58c..00000000000 --- a/src/scripts/fssrgen.fsx +++ /dev/null @@ -1,494 +0,0 @@ -// Copyright (c) Microsoft Corporation. All Rights Reserved. See License.txt in the project root for license information. -open System -open System.IO - -let PrintErr(filename, line, msg) = - printfn "%s(%d): error : %s" filename line msg - -let Err(filename, line, msg) = - PrintErr(filename, line, msg) - printfn "Note that the syntax of each line is one of these three alternatives:" - printfn "# comment" - printfn "ident,\"string\"" - printfn "errNum,ident,\"string\"" - failwith (sprintf "there were errors in the file '%s'" filename) - -let xmlBoilerPlateString = @" - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - -" - - -type HoleType = string - - -// The kinds of 'holes' we can do -let ComputeHoles filename lineNum (txt:string) : ResizeArray * string = - // takes in a %d%s kind of string, returns array of HoleType and {0}{1} kind of string - let mutable i = 0 - let mutable holeNumber = 0 - let mutable holes = ResizeArray() // order - let sb = new System.Text.StringBuilder() - let AddHole holeType = - sb.Append(sprintf "{%d}" holeNumber) |> ignore - holeNumber <- holeNumber + 1 - holes.Add(holeType) - while i < txt.Length do - if txt.[i] = '%' then - if i+1 = txt.Length then - Err(filename, lineNum, "(at end of string) % must be followed by d, f, s, or %") - else - match txt.[i+1] with - | 'd' -> AddHole "System.Int32" - | 'f' -> AddHole "System.Double" - | 's' -> AddHole "System.String" - | '%' -> sb.Append('%') |> ignore - | c -> Err(filename, lineNum, sprintf "'%%%c' is not a valid sequence, only %%d %%f %%s or %%%%" c) - i <- i + 2 - else - match txt.[i] with - | '{' -> sb.Append "{{" |> ignore - | '}' -> sb.Append "}}" |> ignore - | c -> sb.Append c |> ignore - i <- i + 1 - //printfn "holes.Length = %d, lineNum = %d" holes.Length //lineNum txt - (holes, sb.ToString()) - -let Unquote (s : string) = - if s.StartsWith "\"" && s.EndsWith "\"" then s.Substring(1, s.Length - 2) - else failwith "error message string should be quoted" - -let ParseLine filename lineNum (txt:string) = - let mutable errNum = None - let identB = new System.Text.StringBuilder() - let mutable i = 0 - // parse optional error number - if i < txt.Length && System.Char.IsDigit txt.[i] then - let numB = new System.Text.StringBuilder() - while i < txt.Length && System.Char.IsDigit txt.[i] do - numB.Append txt.[i] |> ignore - i <- i + 1 - errNum <- Some(int (numB.ToString())) - if i = txt.Length || not(txt.[i] = ',') then - Err(filename, lineNum, sprintf "After the error number '%d' there should be a comma" errNum.Value) - // Skip the comma - i <- i + 1 - // parse short identifier - if i < txt.Length && not(System.Char.IsLetter(txt.[i])) then - Err(filename, lineNum, sprintf "The first character in the short identifier should be a letter, but found '%c'" txt.[i]) - while i < txt.Length && System.Char.IsLetterOrDigit txt.[i] do - identB.Append txt.[i] |> ignore - i <- i + 1 - let ident = identB.ToString() - if ident.Length = 0 then - Err(filename, lineNum, "Did not find the short identifier") - else - if i = txt.Length || not(txt.[i] = ',') then - Err(filename, lineNum, sprintf "After the identifier '%s' there should be a comma" ident) - else - // Skip the comma - i <- i + 1 - if i = txt.Length then - Err(filename, lineNum, sprintf "After the identifier '%s' and comma, there should be the quoted string resource" ident) - else - let str = - try - System.String.Format(Unquote(txt.Substring i)) // Format turns e.g '\n' into that char, but also requires that we 'escape' curlies in the original .txt file, e.g. "{{" - with - e -> Err(filename, lineNum, sprintf "Error calling System.String.Format (note that curly braces must be escaped, and there cannot be trailing space on the line): >>>%s<<< -- %s" (txt.Substring i) e.Message) - let holes, netFormatString = ComputeHoles filename lineNum str - (lineNum, (errNum,ident), str, holes.ToArray(), netFormatString) - -let stringBoilerPlatePrefix = @" -open Microsoft.FSharp.Core.LanguagePrimitives.IntrinsicOperators -open Microsoft.FSharp.Reflection -open System.Reflection -// (namespaces below for specific case of using the tool to compile FSharp.Core itself) -open Microsoft.FSharp.Core -open Microsoft.FSharp.Core.Operators -open Microsoft.FSharp.Text -open Microsoft.FSharp.Collections -open Printf -" -let StringBoilerPlate filename = - - @" - // BEGIN BOILERPLATE - - static let getCurrentAssembly () = - #if FX_RESHAPED_REFLECTION - typeof.GetTypeInfo().Assembly - #else - System.Reflection.Assembly.GetExecutingAssembly() - #endif - - static let getTypeInfo (t: System.Type) = - #if FX_RESHAPED_REFLECTION - t.GetTypeInfo() - #else - t - #endif - - static let resources = lazy (new System.Resources.ResourceManager(""" + filename + @""", getCurrentAssembly())) - - static let GetString(name:string) = - let s = resources.Value.GetString(name, System.Globalization.CultureInfo.CurrentUICulture) - #if DEBUG - if null = s then - System.Diagnostics.Debug.Assert(false, sprintf ""**RESOURCE ERROR**: Resource token %s does not exist!"" name) - #endif - s - - static let mkFunctionValue (tys: System.Type[]) (impl:obj->obj) = - FSharpValue.MakeFunction(FSharpType.MakeFunctionType(tys.[0],tys.[1]), impl) - - static let funTyC = typeof<(obj -> obj)>.GetGenericTypeDefinition() - - static let isNamedType(ty:System.Type) = not (ty.IsArray || ty.IsByRef || ty.IsPointer) - static let isFunctionType (ty1:System.Type) = - isNamedType(ty1) && getTypeInfo(ty1).IsGenericType && (ty1.GetGenericTypeDefinition()).Equals(funTyC) - - static let rec destFunTy (ty:System.Type) = - if isFunctionType ty then - ty, ty.GetGenericArguments() - else - match getTypeInfo(ty).BaseType with - | null -> failwith ""destFunTy: not a function type"" - | b -> destFunTy b - - static let buildFunctionForOneArgPat (ty: System.Type) impl = - let _,tys = destFunTy ty - let rty = tys.[1] - // PERF: this technique is a bit slow (e.g. in simple cases, like 'sprintf ""%x""') - mkFunctionValue tys (fun inp -> impl rty inp) - - static let capture1 (fmt:string) i args ty (go : obj list -> System.Type -> int -> obj) : obj = - match fmt.[i] with - | '%' -> go args ty (i+1) - | 'd' - | 'f' - | 's' -> buildFunctionForOneArgPat ty (fun rty n -> go (n::args) rty (i+1)) - | _ -> failwith ""bad format specifier"" - - // newlines and tabs get converted to strings when read from a resource file - // this will preserve their original intention - static let postProcessString (s : string) = - s.Replace(""\\n"",""\n"").Replace(""\\t"",""\t"").Replace(""\\r"",""\r"").Replace(""\\\"""", ""\"""") - - static let createMessageString (messageString : string) (fmt : Printf.StringFormat<'T>) : 'T = - let fmt = fmt.Value // here, we use the actual error string, as opposed to the one stored as fmt - let len = fmt.Length - - /// Function to capture the arguments and then run. - let rec capture args ty i = - if i >= len || (fmt.[i] = '%' && i+1 >= len) then - let b = new System.Text.StringBuilder() - b.AppendFormat(messageString, [| for x in List.rev args -> x |]) |> ignore - box(b.ToString()) - // REVIEW: For these purposes, this should be a nop, but I'm leaving it - // in incase we ever decide to support labels for the error format string - // E.g., ""%s%d"" - elif System.Char.IsSurrogatePair(fmt,i) then - capture args ty (i+2) - else - match fmt.[i] with - | '%' -> - let i = i+1 - capture1 fmt i args ty capture - | _ -> - capture args ty (i+1) - - (unbox (capture [] (typeof<'T>) 0) : 'T) - - static let mutable swallowResourceText = false - - static let GetStringFunc((messageID : string),(fmt : Printf.StringFormat<'T>)) : 'T = - if swallowResourceText then - sprintf fmt - else - let mutable messageString = GetString(messageID) - messageString <- postProcessString messageString - createMessageString messageString fmt - - /// If set to true, then all error messages will just return the filled 'holes' delimited by ',,,'s - this is for language-neutral testing (e.g. localization-invariant baselines). - static member SwallowResourceText with get () = swallowResourceText - and set (b) = swallowResourceText <- b - // END BOILERPLATE -" - -let RunMain(filename, outFilename, outXmlFilenameOpt, projectNameOpt) = - try - let justfilename = System.IO.Path.GetFileNameWithoutExtension(filename) - if justfilename |> Seq.exists (fun c -> not(System.Char.IsLetterOrDigit(c))) then - Err(filename, 0, sprintf "The filename '%s' is not allowed; only letters and digits can be used, as the filename also becomes the namespace for the SR class" justfilename) - - printfn "fssrgen.fsx: Reading %s" filename - let lines = System.IO.File.ReadAllLines(filename) - |> Array.mapi (fun i s -> i,s) // keep line numbers - |> Array.filter (fun (i,s) -> not(s.StartsWith "#")) // filter out comments - - printfn "fssrgen.fsx: Parsing %s" filename - let stringInfos = lines |> Array.map (fun (i,s) -> ParseLine filename i s) - // now we have array of (lineNum, ident, str, holes, netFormatString) // str has %d, netFormatString has {0} - - printfn "fssrgen.fsx: Validating %s" filename - // validate that all the idents are unique - let allIdents = new System.Collections.Generic.Dictionary() - for (line,(_,ident),_,_,_) in stringInfos do - if allIdents.ContainsKey(ident) then - Err(filename,line,sprintf "Identifier '%s' is already used previously on line %d - each identifier must be unique" ident allIdents.[ident]) - allIdents.Add(ident,line) - - printfn "fssrgen.fsx: Validating uniqueness of %s" filename - // validate that all the strings themselves are unique - let allStrs = new System.Collections.Generic.Dictionary() - for (line,(_,ident),str,_,_) in stringInfos do - if allStrs.ContainsKey(str) then - let prevLine,prevIdent = allStrs.[str] - Err(filename,line,sprintf "String '%s' already appears on line %d with identifier '%s' - each string must be unique" str prevLine prevIdent) - allStrs.Add(str,(line,ident)) - - printfn "fssrgen.fsx: Generating %s" outFilename - - use out = new System.IO.StringWriter() - fprintfn out "// This is a generated file; the original input is '%s'" filename - fprintfn out "namespace %s" justfilename - if Option.isNone outXmlFilenameOpt then - fprintfn out "type internal SR private() =" - else - fprintfn out "%s" stringBoilerPlatePrefix - fprintfn out "type internal SR private() =" - let theResourceName = match projectNameOpt with Some p -> sprintf "%s.%s" p justfilename | None -> justfilename - fprintfn out "%s" (StringBoilerPlate theResourceName) - - printfn "fssrgen.fsx: Generating resource methods for %s" outFilename - // gen each resource method - stringInfos |> Seq.iter (fun (lineNum, (optErrNum,ident), str, holes, netFormatString) -> - let formalArgs = System.Text.StringBuilder() - let actualArgs = System.Text.StringBuilder() - let firstTime = ref true - let n = ref 0 - formalArgs.Append "(" |> ignore - for hole in holes do - if !firstTime then - firstTime := false - else - formalArgs.Append ", " |> ignore - actualArgs.Append " " |> ignore - formalArgs.Append(sprintf "a%d : %s" !n hole) |> ignore - actualArgs.Append(sprintf "a%d" !n) |> ignore - n := !n + 1 - formalArgs.Append ")" |> ignore - fprintfn out " /// %s" str - fprintfn out " /// (Originally from %s:%d)" filename (lineNum+1) - let justPercentsFromFormatString = - (holes |> Array.fold (fun acc holeType -> - acc + match holeType with - | "System.Int32" -> ",,,%d" - | "System.Double" -> ",,,%f" - | "System.String" -> ",,,%s" - | _ -> failwith "unreachable") "") + ",,," - let errPrefix = match optErrNum with - | None -> "" - | Some n -> sprintf "%d, " n - if Option.isNone outXmlFilenameOpt then - fprintfn out " static member %s%s = (%ssprintf \"%s\" %s)" ident (formalArgs.ToString()) errPrefix str (actualArgs.ToString()) - else - fprintfn out " static member %s%s = (%sGetStringFunc(\"%s\",\"%s\") %s)" ident (formalArgs.ToString()) errPrefix ident justPercentsFromFormatString (actualArgs.ToString()) - ) - - if Option.isSome outXmlFilenameOpt then - printfn "fssrgen.fsx: Generating .resx for %s" outFilename - fprintfn out "" - // gen validation method - fprintfn out " /// Call this method once to validate that all known resources are valid; throws if not" - fprintfn out " static member RunStartupValidation() =" - stringInfos |> Seq.iter (fun (lineNum, (optErrNum,ident), str, holes, netFormatString) -> - fprintfn out " ignore(GetString(\"%s\"))" ident - ) - fprintfn out " ()" // in case there are 0 strings, we need the generated code to parse - - let outFileNewText = out.ToString() - let nothingChanged = try File.Exists(outFilename) && File.ReadAllText(outFilename) = outFileNewText with _ -> false - if not nothingChanged then - File.WriteAllText(outFilename, outFileNewText, System.Text.Encoding.UTF8) - - if Option.isSome outXmlFilenameOpt then - // gen resx - let xd = new System.Xml.XmlDocument() - xd.LoadXml(xmlBoilerPlateString) - stringInfos |> Seq.iter (fun (lineNum, (optErrNum,ident), str, holes, netFormatString) -> - let xn = xd.CreateElement("data") - xn.SetAttribute("name",ident) |> ignore - xn.SetAttribute("xml:space","preserve") |> ignore - let xnc = xd.CreateElement "value" - xn.AppendChild xnc |> ignore - xnc.AppendChild(xd.CreateTextNode netFormatString) |> ignore - xd.LastChild.AppendChild xn |> ignore - ) - let outXmlFileNewText = - use outXmlStream = new System.IO.StringWriter() - xd.Save outXmlStream - outXmlStream.ToString() - let outXmlFile = outXmlFilenameOpt.Value - let nothingChanged = try File.Exists(outXmlFile) && File.ReadAllText(outXmlFile) = outXmlFileNewText with _ -> false - if not nothingChanged then - File.WriteAllText(outXmlFile, outXmlFileNewText, System.Text.Encoding.Unicode) - - - printfn "fssrgen.fsx: Done %s" outFilename - 0 - with e -> - PrintErr(filename, 0, sprintf "An exception occurred when processing '%s'\n%s" filename (e.ToString())) - 1 - -#if COMPILED -[] -#endif -let Main args = - - match args |> List.ofArray with - | [ inputFile; outFile; ] -> - let filename = System.IO.Path.GetFullPath(inputFile) - let outFilename = System.IO.Path.GetFullPath(outFile) - - RunMain(filename, outFilename, None, None) - - | [ inputFile; outFile; outXml ] -> - let filename = System.IO.Path.GetFullPath inputFile - let outFilename = System.IO.Path.GetFullPath outFile - let outXmlFilename = System.IO.Path.GetFullPath outXml - - RunMain(filename, outFilename, Some outXmlFilename, None) - - | [ inputFile; outFile; outXml; projectName ] -> - let filename = System.IO.Path.GetFullPath inputFile - let outFilename = System.IO.Path.GetFullPath outFile - let outXmlFilename = System.IO.Path.GetFullPath outXml - - RunMain(filename, outFilename, Some outXmlFilename, Some projectName) - - | _ -> - printfn "Error: invalid arguments." - printfn "Usage: " - 1 -#if !COMPILED -printfn "fssrgen: args = %A" fsi.CommandLineArgs -Main (fsi.CommandLineArgs |> Seq.skip 1 |> Seq.toArray) -#endif diff --git a/src/scripts/fssrgen.targets b/src/scripts/fssrgen.targets deleted file mode 100644 index 3458dd5bff5..00000000000 --- a/src/scripts/fssrgen.targets +++ /dev/null @@ -1,57 +0,0 @@ - - - - - ProcessFsSrGen;$(BuildDependsOn) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - false - - - diff --git a/tests/FSharp.Core.UnitTests/NuGet.Config b/tests/FSharp.Core.UnitTests/NuGet.Config deleted file mode 100644 index 0a86752fee0..00000000000 --- a/tests/FSharp.Core.UnitTests/NuGet.Config +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - diff --git a/tests/fsharp/core/array/test.fsx b/tests/fsharp/core/array/test.fsx index b0c67ce8ab2..ee3c5407823 100644 --- a/tests/fsharp/core/array/test.fsx +++ b/tests/fsharp/core/array/test.fsx @@ -1407,7 +1407,7 @@ module bug872632 = module CheckUnionTypesAreSealed = open System -#if NETSTANDARD +#if NETCOREAPP open System.Reflection type System.Type with member this.IsSealed @@ -1469,7 +1469,7 @@ module manyIndexes = 0 -#if !NETSTANDARD +#if !NETCOREAPP module bug6447 = let a = System.Array.CreateInstance(typeof, [|1|], [|1|]) let a1 = System.Array.CreateInstance(typeof, [|1|], [|3|]) diff --git a/tests/fsharp/core/attributes/test.fsx b/tests/fsharp/core/attributes/test.fsx index 011ed712d2d..f8f60ee019c 100644 --- a/tests/fsharp/core/attributes/test.fsx +++ b/tests/fsharp/core/attributes/test.fsx @@ -7,11 +7,11 @@ module Core_attributes #endif #light -#if !TESTS_AS_APP && !NETSTANDARD +#if !TESTS_AS_APP && !NETCOREAPP #load "testlib.fsi" "testlib.fs" // a warning is expected here #endif -#if !TESTS_AS_APP && !NETSTANDARD +#if !TESTS_AS_APP && !NETCOREAPP #r "cslib.dll" #endif @@ -38,7 +38,7 @@ open System.Diagnostics (* ATTRIBUTES *) -#if !TESTS_AS_APP && !NETSTANDARD +#if !TESTS_AS_APP && !NETCOREAPP [] #endif @@ -58,7 +58,7 @@ let fx3 (x:x2) = fx2 x (* attribute on a method *) let [] myLoggingMethod x = stderr.WriteLine(x:string) -#if !NETSTANDARD +#if !NETCOREAPP let [] myLoggingMethod2 x = stderr.WriteLine(x:string) #endif @@ -212,6 +212,9 @@ let assembly = typeof.Assembly // fails. We ignore the failure. #if COMPILED let ca = assembly.GetCustomAttributes(typeof,false) + +for item in ca do + printfn "%A" ((item :?> System.Reflection.AssemblyTitleAttribute).Title) do if Array.length ca <> 1 then failwith "could not find CA on assembly" #endif @@ -228,7 +231,7 @@ let ca4 = typeof.GetCustomAttributes(typeof,false) do if Array.length ca4 <> 1 then failwith "could not find CA on type" -#if !NETSTANDARD +#if !NETCOREAPP open System.Runtime.InteropServices [] @@ -325,7 +328,7 @@ let ca7d = ty.Assembly.GetCustomAttributes(typeof,false) do if Array.length ca7d <> 1 then report_failure (sprintf "could not get parameterized CA on assembly, num CAs = %d" (Array.length ca7d)) -#if !NETSTANDARD +#if !NETCOREAPP #if COMPILED [<``module``: DontPressThisButton3(1, "", -2)>] do() @@ -376,7 +379,7 @@ module CheckGenericParameterAttibutesAndNames = if typeof.GetMethod("M2").GetGenericArguments().[1].Name <> "V" then report_failure "wrong name on generic parameter (C)" if typeof.GetMethod("M3").GetGenericArguments().[0].Name <> "a" then report_failure "unexpected inferred name on generic parameter (D)" -#if !TESTS_AS_APP && !NETSTANDARD +#if !TESTS_AS_APP && !NETCOREAPP module CheckAttributesOnElementsWithSignatures = let checkOneAttribute msg (cas: _ []) = @@ -432,7 +435,7 @@ end // -#if !NETSTANDARD +#if !NETCOREAPP #r "System.Security.dll";; #r "System.Configuration.dll";; @@ -511,7 +514,7 @@ module ThreadStaticTest = begin static val mutable private results : int list static member Results with get() = C.results and set v = C.results <- v -#if !MONO && !NETSTANDARD +#if !MONO && !NETCOREAPP let N = 1000 let main() = let t1 = @@ -561,7 +564,7 @@ end (*------------------------------------------------------------------------- !* System.Runtime.InteropServices.In/OUT attributes *------------------------------------------------------------------------- *) -#if !NETSTANDARD +#if !NETCOREAPP open System let g ( [] x : int byref) = 0 let g2 (( [] x : int byref), ([] y : int byref)) = 0 @@ -611,7 +614,7 @@ type C = end -#if !NETSTANDARD +#if !NETCOREAPP let test2179 = let ty = typeof in @@ -884,7 +887,7 @@ module Bug6161_PS_FSharp1_0_MoreAttributesWithArrayArguments = begin check "ce99pj32cweqT" (ca.[0].GetType()) (typeof) check "ce99pj32cweqY" (ca.[0] :?> AnyAttribute).Value (box [| 42 |]) -#if !TESTS_AS_APP && !NETSTANDARD +#if !TESTS_AS_APP && !NETCOREAPP let _ = let ty = typeof let ca = ty.GetCustomAttributes(typeof,false) @@ -1090,7 +1093,7 @@ module NullsInAttributes = test "TestProperty5" (null, null, null, Some null, Some null, Some null) test "TestProperty6" (box "1", "2", typeof, Some (box "3"), Some "4", Some typeof) -#if !NETSTANDARD +#if !NETCOREAPP module Bug5762 = open System open System.IO @@ -1333,7 +1336,7 @@ module BugWithOverloadedAttributes = [] type Bar = class end -#if !TESTS_AS_APP && !NETSTANDARD +#if !TESTS_AS_APP && !NETCOREAPP module Bug719b = open TestLibModule.Bug719 diff --git a/tests/fsharp/core/attributes/testlib.fs b/tests/fsharp/core/attributes/testlib.fs index f83ed790953..3691bd8751e 100644 --- a/tests/fsharp/core/attributes/testlib.fs +++ b/tests/fsharp/core/attributes/testlib.fs @@ -118,7 +118,7 @@ module TypeParamAttributesDifferent = type ThisLibAssembly = X | Y -#if !NETCOREAPP1_0 +#if !NETCOREAPP module Bug719 = open System.Runtime.InteropServices diff --git a/tests/fsharp/core/comprehensions-hw/test.fsx b/tests/fsharp/core/comprehensions-hw/test.fsx index 78391076798..54ccfa1f167 100644 --- a/tests/fsharp/core/comprehensions-hw/test.fsx +++ b/tests/fsharp/core/comprehensions-hw/test.fsx @@ -447,7 +447,7 @@ test "coic23" -#if !NETSTANDARD +#if !NETCOREAPP let pickering() = let files = Directory.GetFiles(@"C:\Program Files\Microsoft Enterprise Library January 2006\", "*.csproj", SearchOption.AllDirectories) for file in files do @@ -557,7 +557,7 @@ module RandomSmallIfThenElseTest = do () return a } -#if !NETSTANDARD +#if !NETCOREAPP module MoreExtensions = open Microsoft.FSharp.Control diff --git a/tests/fsharp/core/comprehensions/test.fsx b/tests/fsharp/core/comprehensions/test.fsx index b29714cdd5a..5ab55a9a2ae 100644 --- a/tests/fsharp/core/comprehensions/test.fsx +++ b/tests/fsharp/core/comprehensions/test.fsx @@ -518,7 +518,7 @@ module MaxIntMinIntBOundaryCases = begin end -#if !NETSTANDARD +#if !NETCOREAPP open System.IO open System.Xml diff --git a/tests/fsharp/core/control/test.fsx b/tests/fsharp/core/control/test.fsx index 2155729db98..5b3ae01492b 100644 --- a/tests/fsharp/core/control/test.fsx +++ b/tests/fsharp/core/control/test.fsx @@ -4,7 +4,7 @@ module Core_control #endif #light -#if NETSTANDARD +#if NETCOREAPP open System.Threading.Tasks #endif @@ -32,7 +32,7 @@ let report_failure s = log (sprintf "FAILURE: %s failed" s) ) -#if !NETSTANDARD +#if !NETCOREAPP System.AppDomain.CurrentDomain.UnhandledException.AddHandler( fun _ (args:System.UnhandledExceptionEventArgs) -> lock syncObj (fun () -> @@ -355,7 +355,7 @@ module SpawnTests = do result <- 1 }); while result = 0 do printf "." -#if NETSTANDARD +#if NETCOREAPP Task.Delay(10).Wait() #else System.Threading.Thread.Sleep(10) @@ -363,7 +363,7 @@ module SpawnTests = result) 1 -#if !NETSTANDARD +#if !NETCOREAPP module FromBeginEndTests = // FromBeginEnd let FromBeginEndTest() = @@ -395,7 +395,7 @@ module FromBeginEndTests = if (!savedCallback).IsNone then failwith "expected a callback (loc cwowen903)" (!savedCallback).Value.Invoke iar else -#if NETSTANDARD +#if NETCOREAPP Task.Run(fun _ -> Task.Delay(sleep).Wait() #else @@ -465,7 +465,7 @@ module Bug6078 = "foo" Test() -#if !MONO && !NETSTANDARD +#if !MONO && !NETCOREAPP module AwaitEventTests = let AwaitEventTest() = // AwaitEvent @@ -486,7 +486,7 @@ module AwaitEventTests = if completeSynchronously then ev.Trigger(r) else -#if NETSTANDARD +#if NETCOREAPP Task.Run(fun _ -> Task.Delay(sleep).Wait() #else @@ -773,7 +773,7 @@ module OnCancelTests = return () }, asyncGroup.Token); while count = 0 do do printfn "waiting to enter cancellation section" -#if NETSTANDARD +#if NETCOREAPP Task.Delay(10).Wait() #else System.Threading.Thread.Sleep(10) @@ -782,7 +782,7 @@ module OnCancelTests = res) 0 -#if !TESTS_AS_APP && !NETSTANDARD +#if !TESTS_AS_APP && !NETCOREAPP module SyncContextReturnTests = let p() = printfn "running on %A" System.Threading.SynchronizationContext.Current @@ -1082,7 +1082,7 @@ module ParallelTests = member x.Dispose() = // This gets run when the cancel happens // Sleep a bit to check we wait for the sleep after the cancel -#if NETSTANDARD +#if NETCOREAPP Task.Delay(10).Wait() #else System.Threading.Thread.Sleep(10) @@ -1134,7 +1134,7 @@ module ParallelTests = [| 0..n-1 |] -#if !NETSTANDARD +#if !NETCOREAPP module AsyncWaitOneTest1 = let Run() = @@ -1259,7 +1259,7 @@ Async.RunSynchronously (async { let! n = s.AsyncRead(buffer,0,9) in return n }) *) #endif -#if !NETSTANDARD +#if !NETCOREAPP module AsyncGenerateTests = let Run() = for length in 1 .. 10 do @@ -1315,7 +1315,7 @@ module AsyncGenerateTests = [| 0 .. length-1|];; #endif -#if !NETSTANDARD +#if !NETCOREAPP (* #This part of control suite disabled under bug#1809 module ThreadAbortTests = @@ -1401,7 +1401,7 @@ let catch a = let to_be_cancelled n flag1 flag2 = async { use! holder = Async.OnCancel(fun _ -> incr flag1) -#if NETSTANDARD +#if NETCOREAPP do Task.Delay(n/8).Wait() #else do System.Threading.Thread.Sleep (n / 8) @@ -1422,7 +1422,7 @@ let test2 () = test "test2 - OnCancel" (!flag1 >= 0 && !flag1 < n && !flag2 >= 0 && !flag2 < n) -#if !NETSTANDARD +#if !NETCOREAPP // SwitchToNewThread let test3 () = let ids = ref [] @@ -1484,7 +1484,7 @@ let test8() = let syncRoot = System.Object() let k = ref 0 let comp _ = async { return lock syncRoot (fun () -> incr k -#if NETSTANDARD +#if NETCOREAPP Task.Delay(1).Wait() #else System.Threading.Thread.Sleep(1) @@ -1628,7 +1628,7 @@ let test15() = Async.Parallel2(a, cancel) |> Async.RunSynchronously |> ignore with _ -> () -#if NETSTANDARD +#if NETCOREAPP Task.Delay(300).Wait() #else System.Threading.Thread.Sleep(300) @@ -1651,7 +1651,7 @@ let test15b() = let a = Async.TryCancelled(a, (fun _ -> p.Check -1)) a |> Async.RunSynchronously |> ignore with _ -> () -#if NETSTANDARD +#if NETCOREAPP Task.Delay(100).Wait() #else System.Threading.Thread.Sleep(100) @@ -1659,7 +1659,7 @@ let test15b() = test1() test2() -#if !NETSTANDARD +#if !NETCOREAPP test3() #endif test8() @@ -1685,7 +1685,7 @@ let test22() = let p = Path "test22" let a = async { do p.Check 1 -#if NETSTANDARD +#if NETCOREAPP do Task.Delay(200).Wait() #else do System.Threading.Thread.Sleep(200) @@ -1703,14 +1703,14 @@ let test22() = let run = Async.TryCancelled(run, fun _ -> p.Check 4) let group = new System.Threading.CancellationTokenSource() Async.Start(run,group.Token) -#if NETSTANDARD +#if NETCOREAPP Task.Delay(100).Wait() #else System.Threading.Thread.Sleep(100) #endif p.Check 2 group.Cancel() -#if NETSTANDARD +#if NETCOREAPP Task.Delay(200).Wait() #else System.Threading.Thread.Sleep(200) @@ -1748,7 +1748,7 @@ module ParallelTest = member x.Dispose() = // This gets run when the cancel happens if i=n-1 then // last guy waits a long time to ensure client is blocked -#if NETSTANDARD +#if NETCOREAPP Task.Delay(200).Wait() #else System.Threading.Thread.Sleep(2000) @@ -1780,7 +1780,7 @@ module ParallelTest = Test() -#if !TESTS_AS_APP && !NETSTANDARD +#if !TESTS_AS_APP && !NETCOREAPP // See bug 5570, check we do not switch threads module CheckNoPumpingOrThreadSwitchingBecauseWeTrampolineSynchronousCode = let checkOnThread msg expectedThreadId = @@ -2053,7 +2053,7 @@ module Bug391710 = Async.Start(a1, cancellationToken = cts.Token) Async.Start(a2) -#if NETSTANDARD +#if NETCOREAPP Task.Delay(500).Wait(); #else System.Threading.Thread.Sleep(500) @@ -2062,7 +2062,7 @@ module Bug391710 = try Bug391710() -#if NETSTANDARD +#if NETCOREAPP Task.Delay(500).Wait(); #else System.Threading.Thread.Sleep(2000) @@ -2079,13 +2079,13 @@ let RunAll() = StartChildOutsideOfAsync.Run() SpawnTests.Run() AsBeginEndTests.AsBeginEndTest() -#if !MONO && !NETSTANDARD +#if !MONO && !NETCOREAPP AwaitEventTests.AwaitEventTest() #endif OnCancelTests.Run() GenerateTests.Run() ParallelTests.Run() -#if !NETSTANDARD +#if !NETCOREAPP AsyncWaitOneTest1.Run() AsyncGenerateTests.Run() #endif diff --git a/tests/fsharp/core/controlChamenos/test.fsx b/tests/fsharp/core/controlChamenos/test.fsx index c7b494322da..b95bfff4c80 100644 --- a/tests/fsharp/core/controlChamenos/test.fsx +++ b/tests/fsharp/core/controlChamenos/test.fsx @@ -27,7 +27,7 @@ let report_failure s = log (sprintf "FAILURE: %s failed" s) ) -#if !NETSTANDARD +#if !NETCOREAPP System.AppDomain.CurrentDomain.UnhandledException.AddHandler( fun _ (args:System.UnhandledExceptionEventArgs) -> lock syncObj (fun () -> diff --git a/tests/fsharp/core/controlMailbox/test.fsx b/tests/fsharp/core/controlMailbox/test.fsx index 9807a5dea6d..fc8a1cc7aea 100644 --- a/tests/fsharp/core/controlMailbox/test.fsx +++ b/tests/fsharp/core/controlMailbox/test.fsx @@ -6,7 +6,7 @@ module Core_controlMailBox #nowarn "40" // recursive references -#if NETSTANDARD +#if NETCOREAPP open System.Threading.Tasks #endif @@ -31,7 +31,7 @@ let report_failure s = log (sprintf "FAILURE: %s failed" s) ) -#if !NETSTANDARD +#if !NETCOREAPP System.AppDomain.CurrentDomain.UnhandledException.AddHandler( fun _ (args:System.UnhandledExceptionEventArgs) -> lock syncObj (fun () -> @@ -210,7 +210,7 @@ module MailboxProcessorBasicTests = while !received < n do if !received % 100 = 0 then printfn "received = %d" !received -#if NETSTANDARD +#if NETCOREAPP Task.Delay(1).Wait() #else System.Threading.Thread.Sleep(1) @@ -233,7 +233,7 @@ module MailboxProcessorBasicTests = | Some _ -> do incr received }) mb1.Start(); for i in 0 .. n-1 do -#if NETSTANDARD +#if NETCOREAPP Task.Delay(1).Wait(); #else System.Threading.Thread.Sleep(1) @@ -242,7 +242,7 @@ module MailboxProcessorBasicTests = while !received < n do if !received % 100 = 0 then printfn "main thread: received = %d" !received -#if NETSTANDARD +#if NETCOREAPP Task.Delay(1).Wait(); #else System.Threading.Thread.Sleep(1) @@ -275,7 +275,7 @@ module MailboxProcessorBasicTests = w.Start() while w.ElapsedMilliseconds < 1000L && (!timedOut).IsNone do mb.Post(-1) -#if NETSTANDARD +#if NETCOREAPP Task.Delay(1).Wait(); #else System.Threading.Thread.Sleep(1) @@ -298,7 +298,7 @@ module MailboxProcessorBasicTests = w.Start() while w.ElapsedMilliseconds < 100L do mb.Post(false) -#if NETSTANDARD +#if NETCOREAPP Task.Delay(0).Wait(); #else System.Threading.Thread.Sleep(0) @@ -318,7 +318,7 @@ module MailboxProcessorErrorEventTests = let res = ref 100 mb1.Error.Add(fun _ -> res := 0) mb1.Start(); -#if NETSTANDARD +#if NETCOREAPP Task.Delay(200).Wait(); #else System.Threading.Thread.Sleep(200) @@ -333,7 +333,7 @@ module MailboxProcessorErrorEventTests = let res = ref 0 mb1.Error.Add(fun _ -> res := 100) mb1.Start(); -#if NETSTANDARD +#if NETCOREAPP Task.Delay(200).Wait(); #else System.Threading.Thread.Sleep(200) @@ -351,7 +351,7 @@ module MailboxProcessorErrorEventTests = mb1.Error.Add(function Err n -> res := n | _ -> check "rwe90r - unexpected error" 0 1) mb1.Start(); mb1.Post 100 -#if NETSTANDARD +#if NETCOREAPP Task.Delay(200).Wait(); #else System.Threading.Thread.Sleep(200) @@ -473,7 +473,7 @@ let test7() = let timeoutboxes str = new MailboxProcessor<'b>(fun inbox -> async { for i in 1 .. 10 do -#if NETSTANDARD +#if NETCOREAPP Task.Delay(200).Wait() #else do System.Threading.Thread.Sleep 200 @@ -586,7 +586,7 @@ module LotsOfMessages = check "celrv09ervkn" (queueLength >= logger.CurrentQueueLength) true queueLength <- logger.CurrentQueueLength -#if NETSTANDARD +#if NETCOREAPP Task.Delay(10).Wait() #else System.Threading.Thread.Sleep(10) diff --git a/tests/fsharp/core/controlStackOverflow/test.fsx b/tests/fsharp/core/controlStackOverflow/test.fsx index b733e23508b..735b09173c9 100644 --- a/tests/fsharp/core/controlStackOverflow/test.fsx +++ b/tests/fsharp/core/controlStackOverflow/test.fsx @@ -8,7 +8,7 @@ module Core_controlStackOverflow #nowarn "40" // recursive references -#if NETSTANDARD +#if NETCOREAPP open System.Threading.Tasks #endif @@ -36,7 +36,7 @@ let report_failure s = log (sprintf "FAILURE: %s failed" s) ) -#if !NETSTANDARD +#if !NETCOREAPP System.AppDomain.CurrentDomain.UnhandledException.AddHandler( fun _ (args:System.UnhandledExceptionEventArgs) -> lock syncObj (fun () -> @@ -231,7 +231,7 @@ module StackDiveTests = let quwiAsync x = Async.FromContinuations(fun (c,_,_) -> -#if NETSTANDARD +#if NETCOREAPP Task.Run( fun _ -> async { diff --git a/tests/fsharp/core/forexpression/test.fsx b/tests/fsharp/core/forexpression/test.fsx index 9caa642f371..6384d113693 100644 --- a/tests/fsharp/core/forexpression/test.fsx +++ b/tests/fsharp/core/forexpression/test.fsx @@ -109,7 +109,7 @@ let sumOverRange () = let sumOverString () = let mutable sum = 0 for i in testString do -#if NETSTANDARD +#if NETCOREAPP sum <- sum + ((int (i :?> char)) - (int '0')) #else sum <- sum + ((int i) - (int '0')) diff --git a/tests/fsharp/core/lazy/test.fsx b/tests/fsharp/core/lazy/test.fsx index 42b6771630b..7b2424252df 100644 --- a/tests/fsharp/core/lazy/test.fsx +++ b/tests/fsharp/core/lazy/test.fsx @@ -43,7 +43,7 @@ do test "fedeoin" (let x = 3 in Lazy.force (Lazy.force (lazy (lazy (x+x)))) = 6) do test "fedeoin" (let x = ref 3 in let y = lazy (x := !x + 1; 6) in ignore (Lazy.force y); ignore (Lazy.force y); !x = 4) do test "fedeoin" (let x = ref 3 in let y = lazy (x := !x + 1; "abc") in ignore (Lazy.force y); ignore (Lazy.force y); !x = 4) -#if !NETSTANDARD +#if !NETCOREAPP module Bug5770 = open System.Threading do diff --git a/tests/fsharp/core/letrec/test.fsx b/tests/fsharp/core/letrec/test.fsx index 5f9ac767bdf..4c746116db1 100644 --- a/tests/fsharp/core/letrec/test.fsx +++ b/tests/fsharp/core/letrec/test.fsx @@ -127,7 +127,7 @@ let WouldFailAtRuntimeTest2 () = and a3 = (fun x -> a2 + 2) 1 in a2 + a3 -#if !TESTS_AS_APP && !NETSTANDARD +#if !TESTS_AS_APP && !NETCOREAPP open System open System.Windows.Forms @@ -300,9 +300,10 @@ module RecursiveInterfaceObjectExpressions = begin do if CosOp.Name <> "cos" then report_failure "RecursiveInterfaceObjectExpressions: test 1" do if CosOp2.Name <> "abc" then report_failure "RecursiveInterfaceObjectExpressions: test 2" + end -#if !TESTS_AS_APP && !NETSTANDARD +#if !TESTS_AS_APP && !NETCOREAPP module RecursiveInnerConstrainedGenerics = begin open System.Windows.Forms diff --git a/tests/fsharp/core/libtest/test.fsx b/tests/fsharp/core/libtest/test.fsx index eae31d15863..f76c479de5e 100644 --- a/tests/fsharp/core/libtest/test.fsx +++ b/tests/fsharp/core/libtest/test.fsx @@ -1872,14 +1872,14 @@ let mk_empty_gactuals = ([]: genactuals) let mk_mono_tspec tref = TypeSpec (tref, mk_empty_gactuals) let mscorlib_assembly_name = "mscorlib" let mscorlib_module_name = "CommonLanguageRuntimeLibrary" -let mk_simple_assemblyRef n = +let mk_simple_assref n = { assemRefName=n; assemRefHash=None; assemRefPublicKeyToken=None; assemRefPublicKey=None; assemRefVersion=None; assemRefLocale=None; } -let mscorlib_aref = mk_simple_assemblyRef mscorlib_assembly_name +let mscorlib_aref = mk_simple_assref mscorlib_assembly_name let mscorlib_scoref = ScopeRef(mscorlib_aref,None) let mk_nested_tref (scope,l,nm) = TypeRef (scope,l,nm) let mk_tref (scope,nm) = mk_nested_tref (scope,[],nm) @@ -2227,7 +2227,7 @@ do check "generic format m" "-1y" (sprintf "%A" (-1y)) do check "generic format n" "-1s" (sprintf "%A" (-1s)) do check "generic format o" "-1" (sprintf "%A" (-1)) do check "generic format p" "-1L" (sprintf "%A" (-1L)) -#if !NETSTANDARD +#if !NETCOREAPP // See FSHARP1.0:4797 // On NetFx4.0 and above we do not emit the 'I' suffix let bigintsuffix = if (System.Environment.Version.Major, System.Environment.Version.Minor) > (2,0) then "" else "I" @@ -2716,7 +2716,7 @@ module SeqTestsOnEnumerableEnforcingDisposalAtEnd = begin do check "" numActiveEnumerators 0 do check "Seq.max" (Seq.max (countEnumeratorsAndCheckedDisposedAtMostOnce [1; 4; 2; 5; 8; 4; 0; 3])) 8 do check "" numActiveEnumerators 0 -#if !NETSTANDARD +#if !NETCOREAPP // strings don't have enumerators in portable do check "Seq.minBy" (Seq.minBy int (countEnumeratorsAndCheckedDisposedAtMostOnce "this is a test")) ' ' do check "" numActiveEnumerators 0 @@ -3694,7 +3694,7 @@ module MiscIEnumerableTests = begin open System.Net open System.IO -#if !NETSTANDARD +#if !NETCOREAPP /// generate the sequence of lines read off an internet connection let httpSeq (nm:string) = Seq.generate @@ -3866,7 +3866,7 @@ module FloatParseTests = begin do check "FloatParse.A" (to_bits (of_string "Infinity")) 0x7ff0000000000000L // 9218868437227405312L do check "FloatParse.B" (to_bits (of_string "-Infinity")) 0xfff0000000000000L // (-4503599627370496L) do check "FloatParse.C" (to_bits (of_string "NaN")) 0xfff8000000000000L // (-2251799813685248L) -#if !NETSTANDARD +#if !NETCOREAPP do check "FloatParse.D" (to_bits (of_string "-NaN")) ( // http://en.wikipedia.org/wiki/NaN let bit64 = System.IntPtr.Size = 8 in if bit64 && System.Environment.Version.Major < 4 then @@ -4268,7 +4268,7 @@ do check "clwnwe91" 10m 10m do check "clwnwe92" 10m 10.000m do check "clwnwe93" 1000000000m 1000000000m do check "clwnwe94" (4294967296000000000m.ToString()) "4294967296000000000" -#if !NETSTANDARD +#if !NETCOREAPP do check "clwnwe95" (10.000m.ToString(System.Globalization.CultureInfo.GetCultureInfo(1033).NumberFormat)) "10.000" // The actual output of a vanilla .ToString() depends on current culture UI. For this reason I am specifying the en-us culture. #endif do check "clwnwe96" (10m.ToString()) "10" @@ -4319,7 +4319,7 @@ do check "lkvcnwd09g" 2.0M (20.0M % 6.00M) do check "lkvcnwd09h" 20.0M (floor 20.300M) do check "lkvcnwd09j" 20.0 (floor 20.300) do check "lkvcnwd09k" 20.0f (floor 20.300f) -#if !NETSTANDARD +#if !NETCOREAPP do check "lkvcnwd09l" 20.0M (round 20.300M) do check "lkvcnwd09z" 20.0M (round 20.500M) do check "lkvcnwd09x" 22.0M (round 21.500M) @@ -5561,7 +5561,7 @@ module bug122495 = let c = C( P = a.[0..1]) -#if !NETSTANDARD +#if !NETCOREAPP (*--------------------------------------------------------------------------- !* Bug 33760: wrong codegen for params[] Action overload *--------------------------------------------------------------------------- *) diff --git a/tests/fsharp/core/longnames/test.fsx b/tests/fsharp/core/longnames/test.fsx index d0fefa720a9..577dc547a6d 100644 --- a/tests/fsharp/core/longnames/test.fsx +++ b/tests/fsharp/core/longnames/test.fsx @@ -112,7 +112,7 @@ let v12 = let v13 = Microsoft.FSharp.Core.Some(1) -#if !NETSTANDARD +#if !NETCOREAPP (* check lid setting bug *) open System.Diagnostics diff --git a/tests/fsharp/core/math/numbers/test.fsx b/tests/fsharp/core/math/numbers/test.fsx index 51c6e938cc2..dfdc2b005a3 100644 --- a/tests/fsharp/core/math/numbers/test.fsx +++ b/tests/fsharp/core/math/numbers/test.fsx @@ -3,7 +3,7 @@ module Core_math_numbers #endif -#if NETSTANDARD +#if NETCOREAPP open CoreClrUtilities #endif diff --git a/tests/fsharp/core/math/numbersVS2008/test.fsx b/tests/fsharp/core/math/numbersVS2008/test.fsx index 353d74ada2b..ec3adaf70c8 100644 --- a/tests/fsharp/core/math/numbersVS2008/test.fsx +++ b/tests/fsharp/core/math/numbersVS2008/test.fsx @@ -248,7 +248,7 @@ let negative64s = (-4611686018427387905L , -4611686018427387904L , -4611686018427387903L); (999L , -9223372036854775808L , -9223372036854775807L); (* MinValue is -2^63 *) (999L , 999L , 999L)] -#if !NETSTANDARD +#if !NETCOREAPP // Regression 3481: ToInt32 let triple k n project = let x = k * BigInteger.Pow(2I,n) in project (x - 1I),project x,project (x + 1I) diff --git a/tests/fsharp/core/measures/test.fsx b/tests/fsharp/core/measures/test.fsx index 3f073bc08de..f1dec887c09 100644 --- a/tests/fsharp/core/measures/test.fsx +++ b/tests/fsharp/core/measures/test.fsx @@ -123,7 +123,7 @@ module FLOAT = let x23p = sinh (4.4<_>) let x23r = tan (4.4<_>) let x23s = tanh (4.4<_>) -#if !NETSTANDARD +#if !NETCOREAPP let x23t = truncate (4.5<_>) #endif // check the types and values! @@ -313,7 +313,7 @@ module DECIMAL = let x1d : decimal = ceil 4.4M let x1h : decimal = floor 4.4M let x1l : decimal = pown 4.4M 3 -#if !NETSTANDARD +#if !NETCOREAPP let x1m : decimal = round 4.4M #endif let x1n : int = sign 4.4M @@ -516,7 +516,7 @@ module MembersTest = let f1 = (f :> System.IFormattable) let f2 = (f :> System.IComparable) let f3 = (f :> System.IEquatable>) -#if !NETSTANDARD +#if !NETCOREAPP let f4 = (f :> System.IConvertible) #endif @@ -549,7 +549,7 @@ module WrappedFloatTypeTest = static member Sin (c1:C<1>) = C<1>(sin c1.V) static member Sinh (c1:C<1>) = C<1>(sinh c1.V) static member Tanh (c1:C<1>) = C<1>(tan c1.V) -#if !NETSTANDARD +#if !NETCOREAPP static member Truncate (c1:C<1>) = C<1>(truncate c1.V) #endif static member Pow (c1:C<1>,c2:C<1>) = C<1>( c1.V ** c2.V) @@ -597,7 +597,7 @@ module WrappedFloatTypeTest = let c26 = sin (C<1>(0.5)) let c27 = sinh (C<1>(0.5)) let c28 = tanh (C<1>(0.5)) -#if !NETSTANDARD +#if !NETCOREAPP let c29 = truncate (C<1>(0.5)) #endif let c30 = C<1>(0.5) ** C<1>(2.0) diff --git a/tests/fsharp/core/members/basics-hw-mutrec/test.fs b/tests/fsharp/core/members/basics-hw-mutrec/test.fs index c3421cee247..2faf94b7ba4 100644 --- a/tests/fsharp/core/members/basics-hw-mutrec/test.fs +++ b/tests/fsharp/core/members/basics-hw-mutrec/test.fs @@ -1,4 +1,4 @@ -// #Regression #Conformance #SignatureFiles #Classes #ObjectConstructors #ObjectOrientedTypes #Fields #MemberDefinitions #MethodsAndProperties #Unions #InterfacesAndImplementations #Events #Overloading #Recursion #Regression + // #Regression #Conformance #SignatureFiles #Classes #ObjectConstructors #ObjectOrientedTypes #Fields #MemberDefinitions #MethodsAndProperties #Unions #InterfacesAndImplementations #Events #Overloading #Recursion #Regression diff --git a/tests/fsharp/core/members/basics-hw/test.fsx b/tests/fsharp/core/members/basics-hw/test.fsx index 4fcf58c7c2a..58420e78210 100644 --- a/tests/fsharp/core/members/basics-hw/test.fsx +++ b/tests/fsharp/core/members/basics-hw/test.fsx @@ -58,7 +58,7 @@ test "fweoew093" ((f(1)).b = 2) open System open System.Collections -#if !NETSTANDARD +#if !NETCOREAPP open System.Windows.Forms #endif @@ -66,7 +66,7 @@ open System.Windows.Forms // Some simple object-expression tests let x0 = { new System.Object() with member __.GetHashCode() = 3 } -#if !NETSTANDARD +#if !NETCOREAPP let x1 = { new System.Windows.Forms.Form() with member __.GetHashCode() = 3 } #endif @@ -981,7 +981,7 @@ let [] button () = 1 // Test we can use base calls -#if !NETSTANDARD +#if !NETCOREAPP open System.Windows.Forms type MyCanvas2 = @@ -1781,14 +1781,14 @@ module DefaultConstructorConstraints = begin let x1 = (f1() : obj) let x2 = (f1() : int) let x3 = (f1() : DateTime) -#if !NETSTANDARD +#if !NETCOREAPP let x4 = (f1() : System.Windows.Forms.Form) #endif let f2 () = f1() let y1 = (f2() : obj) let y2 = (f2() : int) let y3 = (f2() : DateTime) -#if !NETSTANDARD +#if !NETCOREAPP let y4 = (f2() : System.Windows.Forms.Form) #endif @@ -2031,7 +2031,7 @@ module T1 = Vector2D(1.0,1.0) = Vector2D(1.0,1.0) -#if !NETSTANDARD +#if !NETCOREAPP module Ex5 = open System.Drawing type Label(?text,?font) = diff --git a/tests/fsharp/core/members/incremental-hw/test.fsx b/tests/fsharp/core/members/incremental-hw/test.fsx index b3bd0f00e90..5090b112779 100644 --- a/tests/fsharp/core/members/incremental-hw/test.fsx +++ b/tests/fsharp/core/members/incremental-hw/test.fsx @@ -227,7 +227,7 @@ module WireVariations = //! Area variations -#if !NETSTANDARD +#if !NETCOREAPP module AreaVariations = (* Accepted *) open System.Drawing @@ -404,7 +404,7 @@ module ScalaPersonExample = //! Forms -#if !NETSTANDARD +#if !NETCOREAPP module Forms1 = open System.Drawing open System.Windows.Forms diff --git a/tests/fsharp/core/members/incremental/test.fsx b/tests/fsharp/core/members/incremental/test.fsx index 9459250c43e..473b485ce2d 100644 --- a/tests/fsharp/core/members/incremental/test.fsx +++ b/tests/fsharp/core/members/incremental/test.fsx @@ -225,7 +225,7 @@ end //! Area variations -#if !MONO && !NETSTANDARD +#if !MONO && !NETCOREAPP module AreaVariations = begin (* Accepted *) open System.Drawing @@ -402,7 +402,7 @@ end //! Forms -#if !MONO && !NETSTANDARD +#if !MONO && !NETCOREAPP module Forms1 = begin open System.Drawing open System.Windows.Forms diff --git a/tests/fsharp/core/patterns/test.fsx b/tests/fsharp/core/patterns/test.fsx index 9c3eb0ffd0d..ba88f07d7b2 100644 --- a/tests/fsharp/core/patterns/test.fsx +++ b/tests/fsharp/core/patterns/test.fsx @@ -685,7 +685,7 @@ module Combinator_Examples = begin end -#if !NETSTANDARD +#if !NETCOREAPP module XmlPattern_Examples = begin diff --git a/tests/fsharp/core/printing/testLoadFile2.fsx b/tests/fsharp/core/printing/testLoadFile2.fsx index 9638102de92..ab00483c814 100644 --- a/tests/fsharp/core/printing/testLoadFile2.fsx +++ b/tests/fsharp/core/printing/testLoadFile2.fsx @@ -1,4 +1,4 @@ -#if NETSTANDARD +#if NETCOREAPP open CoreClrUtilities #endif diff --git a/tests/fsharp/core/queriesLeafExpressionConvert/test.fsx b/tests/fsharp/core/queriesLeafExpressionConvert/test.fsx index 61a045d9fe8..4e4d1b9f6e3 100644 --- a/tests/fsharp/core/queriesLeafExpressionConvert/test.fsx +++ b/tests/fsharp/core/queriesLeafExpressionConvert/test.fsx @@ -565,7 +565,7 @@ module LeafExpressionEvaluationTests = checkEval "vrewoinrv09c" (<@ ceil 2.0 @>) (ceil 2.0) checkEval "vrewoinrv09v" (<@ sqrt 2.0 @>) (sqrt 2.0) checkEval "vrewoinrv09b" (<@ sign 2.0 @>) (sign 2.0) -#if !NETSTANDARD +#if !NETCOREAPP checkEval "vrewoinrv09n" (<@ truncate 2.3 @>) (truncate 2.3) #endif checkEval "vrewoinrv09m" (<@ floor 2.3 @>) (floor 2.3) @@ -585,7 +585,7 @@ module LeafExpressionEvaluationTests = checkEval "vrewoinrv09D" (<@ ceil 2.0f @>) (ceil 2.0f) checkEval "vrewoinrv09F" (<@ sqrt 2.0f @>) (sqrt 2.0f) checkEval "vrewoinrv09G" (<@ sign 2.0f @>) (sign 2.0f) -#if !NETSTANDARD +#if !NETCOREAPP checkEval "vrewoinrv09H" (<@ truncate 2.3f @>) (truncate 2.3f) #endif checkEval "vrewoinrv09J" (<@ floor 2.3f @>) (floor 2.3f) @@ -597,7 +597,7 @@ module LeafExpressionEvaluationTests = checkEval "vrewoinrv09V" (<@ ceil 2.0M @>) (ceil 2.0M) checkEval "vrewoinrv09B" (<@ sign 2.0M @>) (sign 2.0M) -#if !NETSTANDARD +#if !NETCOREAPP checkEval "vrewoinrv09N" (<@ truncate 2.3M @>) (truncate 2.3M) #endif checkEval "vrewoinrv09M" (<@ floor 2.3M @>) (floor 2.3M) @@ -617,7 +617,7 @@ module LeafExpressionEvaluationTests = checkEval "vrewoinrv09SS" (<@ [ 0UL .. 10UL ] @>) [ 0UL .. 10UL ] //Comment this testcase under portable due to bug 500323:[FSharp] portable library can't run "round" function -#if !NETSTANDARD +#if !NETCOREAPP // Round dynamic dispatch on Decimal checkEval "vrewoinrv09FF" (<@ round 2.3M @>) (round 2.3M) #endif diff --git a/tests/fsharp/core/quotes/test.fsx b/tests/fsharp/core/quotes/test.fsx index f6f28489a08..289988569de 100644 --- a/tests/fsharp/core/quotes/test.fsx +++ b/tests/fsharp/core/quotes/test.fsx @@ -4,7 +4,7 @@ module Core_quotes #endif #light -#if !TESTS_AS_APP && !NETSTANDARD +#if !TESTS_AS_APP && !NETCOREAPP #r "cslib.dll" #endif @@ -352,7 +352,7 @@ module TypedTest = begin test "check PropertyGet (static)" ((<@ System.DateTime.Now @> |> (function PropertyGet(None,_,[]) -> true | _ -> false))) test "check PropertyGet (instance)" ((<@ ("1").Length @> |> (function PropertyGet(Some(String("1")),_,[]) -> true | _ -> false))) -#if !NETSTANDARD +#if !NETCOREAPP test "check PropertySet (static)" ((<@ System.Environment.ExitCode <- 1 @> |> (function PropertySet(None,_,[],Int32(1)) -> true | _ -> false))) #endif test "check PropertySet (instance)" ((<@ ("1").Length @> |> (function PropertyGet(Some(String("1")),_,[]) -> true | _ -> false))) @@ -543,7 +543,7 @@ module TypedTest = begin | _ -> false end -#if !FSHARP_CORE_31 && !TESTS_AS_APP && !NETSTANDARD +#if !FSHARP_CORE_31 && !TESTS_AS_APP && !NETCOREAPP test "check accesses to readonly fields in ReflectedDefinitions" begin let c1 = Class1("a") @@ -1681,7 +1681,7 @@ module QuotationConstructionTests = check "vcknwwe066" (try let _ = Expr.PropertyGet(getof <@@ System.DateTime.Now @@>,[ <@@ 1 @@> ]) in false with :? ArgumentException -> true) true check "vcknwwe077" (Expr.PropertyGet(<@@ "3" @@>, getof <@@ "1".Length @@>)) <@@ "3".Length @@> check "vcknwwe088" (Expr.PropertyGet(<@@ "3" @@>, getof <@@ "1".Length @@>,[ ])) <@@ "3".Length @@> -#if !TESTS_AS_APP && !NETSTANDARD +#if !TESTS_AS_APP && !NETCOREAPP check "vcknwwe099" (Expr.PropertySet(<@@ (new System.Windows.Forms.Form()) @@>, setof <@@ (new System.Windows.Forms.Form()).Text <- "2" @@>, <@@ "3" @@> )) <@@ (new System.Windows.Forms.Form()).Text <- "3" @@> #endif check "vcknwwe099" (Expr.PropertySet(<@@ (new Foo()) @@>, setof <@@ (new Foo()).[3] <- 1 @@>, <@@ 2 @@> , [ <@@ 3 @@> ] )) <@@ (new Foo()).[3] <- 2 @@> @@ -2303,7 +2303,7 @@ module ReflectedDefinitionOnTypesWithImplicitCodeGen = module M = // This type has an implicit IComparable implementation, it is not accessible as a reflected definition type R = { x:int; y:string; z:System.DateTime } -#if NETSTANDARD +#if NETCOREAPP for m in typeof.GetMethods() do #else for m in typeof.GetMethods(System.Reflection.BindingFlags.DeclaredOnly) do @@ -2337,7 +2337,7 @@ module ReflectedDefinitionOnTypesWithImplicitCodeGen = #endif check "celnwer35" (Quotations.Expr.TryGetReflectedDefinition(m).IsNone) true -#if !NETSTANDARD +#if !NETCOREAPP module BasicUsingTEsts = let q1() = let a = ResizeArray<_>() diff --git a/tests/fsharp/core/subtype/test.fsx b/tests/fsharp/core/subtype/test.fsx index f89380ad77e..d40791e305b 100644 --- a/tests/fsharp/core/subtype/test.fsx +++ b/tests/fsharp/core/subtype/test.fsx @@ -31,7 +31,7 @@ open System.Collections.Generic let f1 (x: 'a[]) = (x :> ICollection<'a>) do let x = f1 [| 3;4; |] in test "test239809" (x.Contains(3)) -#if !NETSTANDARD +#if !NETCOREAPP (* 'a[] :> IReadOnlyCollection<'a> *) let f1ReadOnly (x: 'a[]) = (x :> IReadOnlyCollection<'a>) do let x = f1ReadOnly [| 3;4; |] in test "test239809ReadOnly" (x.Count = 2) @@ -41,7 +41,7 @@ do let x = f1ReadOnly [| 3;4; |] in test "test239809ReadOnly" (x.Count = 2) let f2 (x: 'a[]) = (x :> IList<'a>) do let x = f2 [| 3;4; |] in test "test239810" (x.Item(1) = 4) -#if !NETSTANDARD +#if !NETCOREAPP (* 'a[] :> IReadOnlyList<'a> *) let f2ReadOnly (x: 'a[]) = (x :> IReadOnlyList<'a>) do let x = f2ReadOnly [| 3;4; |] in test "test239810ReadOnly" (x.Item(1) = 4) @@ -55,7 +55,7 @@ do let x = f3 [| 3;4; |] in for x in x do (Printf.printf "val %d\n" x) done let f4 (x: 'a[]) = (x :> IList<'a>) do let x = f4 [| 31;42; |] in for x in x do (Printf.printf "val %d\n" x) done -#if !NETSTANDARD +#if !NETCOREAPP (* Call 'foreachG' using an IReadOnlyList (solved to IEnumerable) *) let f4ReadOnly (x: 'a[]) = (x :> IReadOnlyList<'a>) do let x = f4ReadOnly [| 31;42; |] in for x in x do (Printf.printf "val %d\n" x) done @@ -65,7 +65,7 @@ do let x = f4ReadOnly [| 31;42; |] in for x in x do (Printf.printf "val %d\n" x) let f5 (x: 'a[]) = (x :> ICollection<'a>) do let x = f5 [| 31;42; |] in for x in x do (Printf.printf "val %d\n" x) done -#if !NETSTANDARD +#if !NETCOREAPP (* Call 'foreachG' using an IReadOnlyCollection (solved to IEnumerable) *) let f5ReadOnly (x: 'a[]) = (x :> IReadOnlyCollection<'a>) do let x = f5ReadOnly [| 31;42; |] in for x in x do (Printf.printf "val %d\n" x) done @@ -106,7 +106,7 @@ let testUpcastToEnum1 (x: System.AttributeTargets) = (x :> System.Enum) let testUpcastToEnum6 (x: System.Enum) = (x :> System.Enum) // these delegates don't exist in portable -#if !UNIX && !NETSTANDARD +#if !UNIX && !NETCOREAPP let testUpcastToDelegate1 (x: System.Threading.ThreadStart) = (x :> System.Delegate) let testUpcastToMulticastDelegate1 (x: System.Threading.ThreadStart) = (x :> System.MulticastDelegate) @@ -244,7 +244,7 @@ module SomeRandomOperatorConstraints = begin let sum64 seq : int64 = Seq.reduce (+) seq let sum32 seq : int64 = Seq.reduce (+) seq -#if !NETSTANDARD +#if !NETCOREAPP let sumBigInt seq : BigInteger = Seq.reduce (+) seq #endif let sumDateTime (dt : DateTime) (seq : #seq) : DateTime = Seq.fold (+) dt seq @@ -1905,7 +1905,6 @@ module TestInheritFunc3 = check "cnwcki4" ((Foo() |> box |> unbox int -> int -> int> ) 5 6 7) 19 #if !NETCOREAPP - module TestConverter = open System diff --git a/tests/fsharp/core/unicode/kanji-unicode-utf16.fs b/tests/fsharp/core/unicode/kanji-unicode-utf16.fs index 4319c31f981e1a778bea3a78236acccc061f7a43..5e0256ad2e53a1dbed3222b9e8df34b4ce332994 100644 GIT binary patch delta 9 QcmaFE_>6Ia!$h}b02N{cA^-pY delta 15 WcmaFH_=a(U1FIoJJcGeR`{e*B)&$`I diff --git a/tests/fsharp/core/unicode/test.fsx b/tests/fsharp/core/unicode/test.fsx index c9904336671..9b7303c0d32 100644 --- a/tests/fsharp/core/unicode/test.fsx +++ b/tests/fsharp/core/unicode/test.fsx @@ -19,7 +19,7 @@ let test (s : string) b = (* TEST SUITE FOR UNICODE CHARS *) -#if !TESTS_AS_APP && !NETSTANDARD +#if !TESTS_AS_APP && !NETCOREAPP let input_byte (x : System.IO.FileStream) = let b = x.ReadByte() if b = -1 then raise (System.IO.EndOfStreamException()) else b diff --git a/tests/fsharp/single-test.fs b/tests/fsharp/single-test.fs index 06ca7f8044d..4e221bed17c 100644 --- a/tests/fsharp/single-test.fs +++ b/tests/fsharp/single-test.fs @@ -12,7 +12,6 @@ type Permutation = | FSI_CORECLR #if !FSHARP_SUITE_DRIVES_CORECLR_TESTS | FSI_FILE - | FSIANYCPU_FILE | FSI_STDIN | GENERATED_SIGNATURE | FSC_OPT_MINUS_DEBUG @@ -37,49 +36,100 @@ let emitFile filename (body:string) = sw.WriteLine(body) with | _ -> () -let copyFilesToDest sourceDir destDir compilerPath = - // copy existing files +let copyFilesToDest sourceDir destDir = let filenames = Directory.GetFiles(sourceDir, "*", SearchOption.TopDirectoryOnly) for file in filenames do let dest = Path.Combine(destDir, Path.GetFileName(file)) File.Copy(file, dest) - // generate Directory.Build.props that points to the built compiler - let lines = - [ "" - " " - sprintf " %s" compilerPath - " " - sprintf " " __SOURCE_DIRECTORY__ - "" ] - let dest = Path.Combine(destDir, "Directory.Build.props") - File.WriteAllLines(dest, lines) - -let generateProjectArtifacts (framework:string) (sourceDirectory:string) (sourceItems:string list) (extraSourceItems:string list) (utilitySourceItems:string list) (referenceItems:string list) = - let computeSourceItems addDirectory addCondition isCompileItem sources = + +type CompileItem = Reference | Compile | UseSource | LoadSource + +type OutputType = Library | Exe | Script + +type ProjectConfiguration = { + OutputType:OutputType + Framework:string + SourceDirectory:string + SourceItems:string list + ExtraSourceItems:string list + UtilitySourceItems:string list + ReferenceItems:string list + LoadSources:string list + UseSources:string list + Optimize:bool +} + + +let replaceTokens tag (replacement:string) (template:string) = template.Replace(tag, replacement) + +let generateProps testCompilerVersion= + let template = @" + + release + $(TESTCOMPILERVERSION) + + +" + template + |> replaceTokens "$(PROJECTDIRECTORY)" (Path.GetFullPath(__SOURCE_DIRECTORY__)) + |> replaceTokens "$(TESTCOMPILERVERSION)" testCompilerVersion + +let generateTargets = + let template = @" + + +" + template + |> replaceTokens "$(PROJECTDIRECTORY)" (Path.GetFullPath(__SOURCE_DIRECTORY__)) + +let generateOverrides = + let template = @" + + +" + template + +let generateProjectArtifacts (pc:ProjectConfiguration) targetFramework = + let computeSourceItems addDirectory addCondition (compileItem:CompileItem) sources = let computeInclude src = - let fileName = if addDirectory then Path.Combine(sourceDirectory, src) else src + let fileName = if addDirectory then Path.Combine(pc.SourceDirectory, src) else src let condition = if addCondition then " Condition=\"Exists('" + fileName + "')\"" else "" - if isCompileItem then - "\n " - else - "\n " + match compileItem with + | CompileItem.Compile -> + "\n " + | CompileItem.Reference -> + "\n " + | CompileItem.UseSource -> + "\n " + | CompileItem.LoadSource -> + "\n " + sources |> List.map(fun src -> computeInclude src) |> List.fold (fun acc s -> acc + s) "" - let replace tag items addDirectory addCondition isCompileItem (template:string) = template.Replace(tag, computeSourceItems addDirectory addCondition isCompileItem items) + let replace tag items addDirectory addCondition compileItem (template:string) = template.Replace(tag, computeSourceItems addDirectory addCondition compileItem items) + let outputType = + match pc.OutputType with + | OutputType.Script -> "Script" + | _ -> "Exe" + let optimize = if pc.Optimize then "True" else "False" + let debug = if pc.Optimize then "True" else "False" let generateProjBody = let template = @" - + - Exe + $(OUTPUTTYPE) $(TARGETFRAMEWORK) false - true + $(DEBUG) portable - true - $(DefineConstants);FX_RESHAPED_REFLECTION;NETSTANDARD + $(OPTIMIZE) + false + FX_RESHAPED_REFLECTION + NETCOREAPP + false @@ -96,182 +146,154 @@ let generateProjectArtifacts (framework:string) (sourceDirectory:string) (source $(REFERENCEITEMS) + + -" - template.Replace("$(TARGETFRAMEWORK)", framework) - |> replace "$(UTILITYSOURCEITEMS)" utilitySourceItems false false true - |> replace "$(SOURCEITEMS)" sourceItems true false true - |> replace "$(EXTRASOURCEITEMS)" extraSourceItems true true true - |> replace "$(REFERENCEITEMS)" referenceItems true true false + + + + + + +" + template + |> replace "$(UTILITYSOURCEITEMS)" pc.UtilitySourceItems false false CompileItem.Compile + |> replace "$(SOURCEITEMS)" pc.SourceItems true false CompileItem.Compile + |> replace "$(EXTRASOURCEITEMS)" pc.ExtraSourceItems true true CompileItem.Compile + |> replace "$(REFERENCEITEMS)" pc.ReferenceItems true true CompileItem.Reference + |> replace "$(LOADSOURCEITEMS)" pc.LoadSources true true CompileItem.LoadSource + |> replace "$(USESOURCEITEMS)" pc.UseSources true true CompileItem.UseSource + |> replaceTokens "$(DIRECTORYBUILDLOCATION)" (Path.GetFullPath(__SOURCE_DIRECTORY__)) + |> replaceTokens "$(OUTPUTTYPE)" outputType + |> replaceTokens "$(OPTIMIZE)" optimize + |> replaceTokens "$(DEBUG)" debug + |> replaceTokens "$(TARGETFRAMEWORK)" targetFramework generateProjBody let singleTestBuildAndRunCore cfg copyFiles p = - printfn "singleTestBuildAndRunCore: %A : %A" copyFiles p - let sources = - ["testlib.fsi";"testlib.fs";"test.mli";"test.ml";"test.fsi";"test.fs";"test2.fsi";"test2.fs";"test.fsx";"test2.fsx"] - |> List.filter (fileExists cfg) - let extraSources = [] - let utilitySources = - [__SOURCE_DIRECTORY__ ++ "coreclr_utilities.fs"] - |> List.filter (File.Exists) + let sources = [] + let loadSources = [] + let useSources = [] + let extraSources = ["testlib.fsi";"testlib.fs";"test.mli";"test.ml";"test.fsi";"test.fs";"test2.fsi";"test2.fs";"test.fsx";"test2.fsx"] + let utilitySources = [__SOURCE_DIRECTORY__ ++ "coreclr_utilities.fs"] let referenceItems = if String.IsNullOrEmpty(copyFiles) then [] else [copyFiles] - let framework = "netcoreapp2.1" - match p with - | FSC_CORECLR -> + let framework = "netcoreapp2.0" + + let executeSingleTestBuildAndRun outputType compilerType targetFramework optimize = let mutable result = false let directory = Path.Combine(Path.GetTempPath(), Path.GetRandomFileName() ) - let projectBody = generateProjectArtifacts framework cfg.Directory sources extraSources utilitySources referenceItems + let pc = { + OutputType = outputType + Framework = framework + SourceDirectory = cfg.Directory + SourceItems = sources + ExtraSourceItems = extraSources + UtilitySourceItems = utilitySources + ReferenceItems = referenceItems + LoadSources = loadSources + UseSources = useSources + Optimize = optimize + } + + let targetsBody = generateTargets + let overridesBody = generateOverrides + let targetsFileName = Path.Combine(directory, "Directory.Build.targets") + let propsFileName = Path.Combine(directory, "Directory.Build.props") + let overridesFileName = Path.Combine(directory, "Directory.Overrides.targets") let projectFileName = Path.Combine(directory, Path.GetRandomFileName() + ".fsproj") try - use testOkFile = new FileGuard(Path.Combine(directory, "test.ok")) - printfn "Configuration: %s" cfg.Directory - printfn "Directory: %s" directory - printfn "Filename: %s" projectFileName Directory.CreateDirectory(directory) |> ignore - copyFilesToDest cfg.Directory directory cfg.BinPath - emitFile projectFileName projectBody - exec { cfg with Directory = directory } cfg.DotNet20Exe "run" - testOkFile.CheckExists() - result <- true + copyFilesToDest cfg.Directory directory + emitFile targetsFileName targetsBody + emitFile overridesFileName overridesBody + if outputType = OutputType.Exe then + let executeFsc testCompilerVersion targetFramework = + let propsBody = generateProps testCompilerVersion + emitFile propsFileName propsBody + let projectBody = generateProjectArtifacts pc targetFramework + emitFile projectFileName projectBody + use testOkFile = new FileGuard(Path.Combine(directory, "test.ok")) + exec { cfg with Directory = directory } cfg.DotNet20Exe (sprintf "run -f %s" targetFramework) + testOkFile.CheckExists() + executeFsc compilerType targetFramework + else + let executeFsi testCompilerVersion targetFramework = + let propsBody = generateProps testCompilerVersion + emitFile propsFileName propsBody + let projectBody = generateProjectArtifacts pc targetFramework + emitFile projectFileName projectBody + use testOkFile = new FileGuard(Path.Combine(directory, "test.ok")) + exec { cfg with Directory = directory } cfg.DotNet20Exe "build /t:RunFSharpScript" + testOkFile.CheckExists() + executeFsi compilerType targetFramework + result <- true finally - if result <> false then Directory.Delete(directory, true) - () - | _ -> - match p with - | FSC_CORECLR -> - use cleanup = (cleanUpFSharpCore cfg) - use testOkFile = new FileGuard (getfullpath cfg "test.ok") - - let testName = getBasename cfg.Directory - let extraSource = (__SOURCE_DIRECTORY__ ++ "coreclr_utilities.fs") - let outDir = (__SOURCE_DIRECTORY__ ++ sprintf @"../testbin/%s/coreclr/fsharp/core/%s" cfg.BUILD_CONFIG testName) - let outFile = (__SOURCE_DIRECTORY__ ++ sprintf @"../testbin/%s/coreclr/fsharp/core/%s/test.exe" cfg.BUILD_CONFIG testName) - - makeDirectory (getDirectoryName outFile) - let fscArgs = - sprintf """--debug:portable --debug+ --out:%s --target:exe -g --define:FX_RESHAPED_REFLECTION --define:NETCOREAPP1_0 "%s" %s """ - outFile - extraSource - (String.concat " " sources) - - let fsccArgs = sprintf """--OutputDir:%s --CopyDlls:%s %s""" outDir copyFiles fscArgs - - fsi_script cfg "--exec %s %s %s" - cfg.fsi_flags - (__SOURCE_DIRECTORY__ ++ @"../scripts/fscc.fsx") - fsccArgs - [] - - exec cfg cfg.DotNetExe outFile - - testOkFile.CheckExists() - - | FSI_CORECLR -> - use cleanup = (cleanUpFSharpCore cfg) - use testOkFile = new FileGuard (getfullpath cfg "test.ok") - - let testName = getBasename cfg.Directory - let extraSource = (__SOURCE_DIRECTORY__ ++ "coreclr_utilities.fs") - let outDir = (__SOURCE_DIRECTORY__ ++ sprintf @"../testbin/%s/coreclr/fsharp/core/%s" cfg.BUILD_CONFIG testName) - let fsiArgs = - sprintf """ --define:NETCOREAPP1_0 --define:FX_RESHAPED_REFLECTION "%s" %s """ - extraSource - (String.concat " " sources) - - let fsciArgs = sprintf """--verbose:repro --OutputDir:%s --CopyDlls:%s %s""" outDir copyFiles fsiArgs - - fsi_script cfg "--exec %s %s %s" - cfg.fsi_flags - (__SOURCE_DIRECTORY__ ++ @"../scripts/fsci.fsx") - fsciArgs - [] - - testOkFile.CheckExists() - -#if !FSHARP_SUITE_DRIVES_CORECLR_TESTS - | FSI_FILE -> - use cleanup = (cleanUpFSharpCore cfg) - use testOkFile = new FileGuard (getfullpath cfg "test.ok") - - fsi cfg "%s" cfg.fsi_flags sources - - testOkFile.CheckExists() - - | FSIANYCPU_FILE -> - use cleanup = (cleanUpFSharpCore cfg) - use testOkFile = new FileGuard (getfullpath cfg "test.ok") - - fsiAnyCpu cfg "%s" cfg.fsi_flags sources - - testOkFile.CheckExists() - - | FSI_STDIN -> - use cleanup = (cleanUpFSharpCore cfg) - use testOkFile = new FileGuard (getfullpath cfg "test.ok") - - fsiStdin cfg (sources |> List.rev |> List.head) "" [] //use last file, because `cmd < a.txt b.txt` redirect b.txt only - - testOkFile.CheckExists() - - | GENERATED_SIGNATURE -> - use cleanup = (cleanUpFSharpCore cfg) + if result <> false then + Directory.Delete(directory, true) + else + printfn "Configuration: %s" cfg.Directory + printfn "Directory: %s" directory + printfn "Filename: %s" projectFileName - let source1 = - ["test.ml"; "test.fs"; "test.fsx"] - |> List.rev - |> List.tryFind (fileExists cfg) + match p with + | FSC_CORECLR -> executeSingleTestBuildAndRun OutputType.Exe "coreclr" "netcoreapp2.0" true + | FSI_CORECLR -> executeSingleTestBuildAndRun OutputType.Script "coreclr" "netcoreapp2.0" true - source1 |> Option.iter (fun from -> copy_y cfg from "tmptest.fs") +#if !FSHARP_SUITE_DRIVES_CORECLR_TESTS + | FSC_OPT_PLUS_DEBUG -> executeSingleTestBuildAndRun OutputType.Exe "net40" "net472" true + | FSC_OPT_MINUS_DEBUG -> executeSingleTestBuildAndRun OutputType.Exe "net40" "net472" false + | FSI_FILE -> executeSingleTestBuildAndRun OutputType.Script "net40" "net472" true - log "Generated signature file..." - fsc cfg "%s --sig:tmptest.fsi --define:TESTS_AS_APP" cfg.fsc_flags ["tmptest.fs"] - (if File.Exists("FSharp.Core.dll") then log "found fsharp.core.dll after build" else log "found fsharp.core.dll after build") |> ignore + | FSI_STDIN -> + use cleanup = (cleanUpFSharpCore cfg) + use testOkFile = new FileGuard (getfullpath cfg "test.ok") + let sources = extraSources |> List.filter (fileExists cfg) - log "Compiling against generated signature file..." - fsc cfg "%s -o:tmptest1.exe --define:TESTS_AS_APP" cfg.fsc_flags ["tmptest.fsi";"tmptest.fs"] - (if File.Exists("FSharp.Core.dll") then log "found fsharp.core.dll after build" else log "found fsharp.core.dll after build") |> ignore + fsiStdin cfg (sources |> List.rev |> List.head) "" [] //use last file, because `cmd < a.txt b.txt` redirect b.txt only - log "Verifying built .exe..." - peverify cfg "tmptest1.exe" + testOkFile.CheckExists() - | FSC_OPT_MINUS_DEBUG -> - use cleanup = (cleanUpFSharpCore cfg) - use testOkFile = new FileGuard (getfullpath cfg "test.ok") + | GENERATED_SIGNATURE -> + use cleanup = (cleanUpFSharpCore cfg) - fsc cfg "%s --optimize- --debug -o:test--optminus--debug.exe -g" cfg.fsc_flags sources - peverify cfg "test--optminus--debug.exe" - exec cfg ("." ++ "test--optminus--debug.exe") "" + let source1 = + ["test.ml"; "test.fs"; "test.fsx"] + |> List.rev + |> List.tryFind (fileExists cfg) - testOkFile.CheckExists() + source1 |> Option.iter (fun from -> copy_y cfg from "tmptest.fs") - | FSC_OPT_PLUS_DEBUG -> - use cleanup = (cleanUpFSharpCore cfg) - use testOkFile = new FileGuard (getfullpath cfg "test.ok") + log "Generated signature file..." + fsc cfg "%s --sig:tmptest.fsi" cfg.fsc_flags ["tmptest.fs"] + (if File.Exists("FSharp.Core.dll") then log "found fsharp.core.dll after build" else log "found fsharp.core.dll after build") |> ignore - fsc cfg "%s --optimize+ --debug -o:test--optplus--debug.exe -g" cfg.fsc_flags sources - peverify cfg "test--optplus--debug.exe" - exec cfg ("." ++ "test--optplus--debug.exe") "" + log "Compiling against generated signature file..." + fsc cfg "%s -o:tmptest1.exe" cfg.fsc_flags ["tmptest.fsi";"tmptest.fs"] + (if File.Exists("FSharp.Core.dll") then log "found fsharp.core.dll after build" else log "found fsharp.core.dll after build") |> ignore - testOkFile.CheckExists() + log "Verifying built .exe..." + peverify cfg "tmptest1.exe" - | AS_DLL -> - // Compile as a DLL to exercise pickling of interface data, then recompile the original source file referencing this DLL - // THe second compilation will not utilize the information from the first in any meaningful way, but the - // compiler will unpickle the interface and optimization data, so we test unpickling as well. - use cleanup = (cleanUpFSharpCore cfg) - use testOkFile = new FileGuard (getfullpath cfg "test.ok") + | AS_DLL -> + // Compile as a DLL to exercise pickling of interface data, then recompile the original source file referencing this DLL + // THe second compilation will not utilize the information from the first in any meaningful way, but the + // compiler will unpickle the interface and optimization data, so we test unpickling as well. + use cleanup = (cleanUpFSharpCore cfg) + use testOkFile = new FileGuard (getfullpath cfg "test.ok") + + let sources = extraSources |> List.filter (fileExists cfg) - fsc cfg "%s --optimize -a -o:test--optimize-lib.dll -g" cfg.fsc_flags sources - fsc cfg "%s --optimize -r:test--optimize-lib.dll -o:test--optimize-client-of-lib.exe -g" cfg.fsc_flags sources + fsc cfg "%s --optimize -a -o:test--optimize-lib.dll -g" cfg.fsc_flags sources + fsc cfg "%s --optimize -r:test--optimize-lib.dll -o:test--optimize-client-of-lib.exe -g" cfg.fsc_flags sources - peverify cfg "test--optimize-lib.dll" - peverify cfg "test--optimize-client-of-lib.exe" + peverify cfg "test--optimize-lib.dll" + peverify cfg "test--optimize-client-of-lib.exe" - exec cfg ("." ++ "test--optimize-client-of-lib.exe") "" + exec cfg ("." ++ "test--optimize-client-of-lib.exe") "" - testOkFile.CheckExists() + testOkFile.CheckExists() #endif let singleTestBuildAndRunAux cfg p = diff --git a/tests/fsharp/tests.fs b/tests/fsharp/tests.fs index 21d57d3e2f2..d18197ee20d 100644 --- a/tests/fsharp/tests.fs +++ b/tests/fsharp/tests.fs @@ -1,4 +1,4 @@ -// vvvvvvvvvvvvv To run these tests in F# Interactive , 'build net40', then send this chunk, then evaluate body of a test vvvvvvvvvvvvvvvv +// To run these tests in F# Interactive , 'build net40', then send this chunk, then evaluate body of a test vvvvvvvvvvvvvvvv #if INTERACTIVE #r @"../../packages/NUnit.3.5.0/lib/net45/nunit.framework.dll" #load "../../src/scripts/scriptlib.fsx" @@ -32,42 +32,41 @@ module CoreTests = [] let ``access-FSC_BASIC``() = singleTestBuildAndRun "core/access" FSC_BASIC -// All tests below here are known to pass for .NET Core but not yet enabled due to CI problems -//// [] -//// let ``access-FSI_BASIC``() = singleTestBuildAndRun "core/access" FSI_BASIC -//// + [] + let ``access-FSI_BASIC``() = singleTestBuildAndRun "core/access" FSI_BASIC + [] let ``apporder-FSC_BASIC`` () = singleTestBuildAndRun "core/apporder" FSC_BASIC -//// [] -//// let ``apporder-FSI_BASIC`` () = singleTestBuildAndRun "core/apporder" FSI_BASIC + [] + let ``apporder-FSI_BASIC`` () = singleTestBuildAndRun "core/apporder" FSI_BASIC [] let ``array-FSC_BASIC`` () = singleTestBuildAndRun "core/array" FSC_BASIC -//// [] -//// let ``array-FSI_BASIC`` () = singleTestBuildAndRun "core/array" FSI_BASIC + [] + let ``array-FSI_BASIC`` () = singleTestBuildAndRun "core/array" FSI_BASIC [] let ``comprehensions-FSC_BASIC`` () = singleTestBuildAndRun "core/comprehensions" FSC_BASIC -//// [] -//// let ``comprehensions-FSI_BASIC`` () = singleTestBuildAndRun "core/comprehensions" FSI_BASIC + [] + let ``comprehensions-FSI_BASIC`` () = singleTestBuildAndRun "core/comprehensions" FSI_BASIC [] let ``comprehensionshw-FSC_BASIC`` () = singleTestBuildAndRun "core/comprehensions-hw" FSC_BASIC -//// [] -//// let ``comprehensionshw-FSI_BASIC`` () = singleTestBuildAndRun "core/comprehensions-hw" FSI_BASIC + [] + let ``comprehensionshw-FSI_BASIC`` () = singleTestBuildAndRun "core/comprehensions-hw" FSI_BASIC -//// [] -//// let ``genericmeasures-FSI_BASIC`` () = singleTestBuildAndRun "core/genericmeasures" FSI_BASIC + [] + let ``genericmeasures-FSI_BASIC`` () = singleTestBuildAndRun "core/genericmeasures" FSI_BASIC [] let ``genericmeasures-FSC_BASIC`` () = singleTestBuildAndRun "core/genericmeasures" FSC_BASIC -//// [] -//// let ``innerpoly-FSI_BASIC`` () = singleTestBuildAndRun "core/innerpoly" FSI_BASIC + [] + let ``innerpoly-FSI_BASIC`` () = singleTestBuildAndRun "core/innerpoly" FSI_BASIC [] let ``innerpoly-FSC_BASIC`` () = singleTestBuildAndRun "core/innerpoly" FSC_BASIC @@ -78,26 +77,26 @@ module CoreTests = [] let unicode2 () = singleTestBuildAndRun "core/unicode" FSC_BASIC -//// [] -//// let ``unicode2-FSI_BASIC`` () = singleTestBuildAndRun "core/unicode" FSI_BASIC + [] + let ``unicode2-FSI_BASIC`` () = singleTestBuildAndRun "core/unicode" FSI_BASIC [] let ``lazy test-FSC_BASIC`` () = singleTestBuildAndRun "core/lazy" FSC_BASIC -//// [] -//// let ``lazy test-FSI_BASIC`` () = singleTestBuildAndRun "core/lazy" FSI_BASIC + [] + let ``lazy test-FSI_BASIC`` () = singleTestBuildAndRun "core/lazy" FSI_BASIC [] let ``letrec-FSC_BASIC`` () = singleTestBuildAndRun "core/letrec" FSC_BASIC -//// [] -//// let ``letrec-FSI_BASIC`` () = singleTestBuildAndRun "core/letrec" FSI_BASIC + [] + let ``letrec-FSI_BASIC`` () = singleTestBuildAndRun "core/letrec" FSI_BASIC [] let ``letrec (mutrec variations part one) FSC_BASIC`` () = singleTestBuildAndRun "core/letrec-mutrec" FSC_BASIC -//// [] -//// let ``letrec (mutrec variations part one) FSI_BASIC`` () = singleTestBuildAndRun "core/letrec-mutrec" FSI_BASIC + [] + let ``letrec (mutrec variations part one) FSI_BASIC`` () = singleTestBuildAndRun "core/letrec-mutrec" FSI_BASIC [] let ``libtest-FSC_BASIC`` () = singleTestBuildAndRun "core/libtest" FSC_BASIC @@ -108,8 +107,8 @@ module CoreTests = [] let map () = singleTestBuildAndRun "core/map" FSC_BASIC -//// [] -//// let ``measures-FSI_BASIC`` () = singleTestBuildAndRun "core/measures" FSI_BASIC + [] + let ``measures-FSI_BASIC`` () = singleTestBuildAndRun "core/measures" FSI_BASIC [] let ``measures-FSC_BASIC`` () = singleTestBuildAndRun "core/measures" FSC_BASIC @@ -966,7 +965,7 @@ module CoreTests = let ``letrec (mutrec variations part two) FSI_BASIC`` () = singleTestBuildAndRun "core/letrec-mutrec2" FSI_BASIC [] - let recordResolution () = singleTestBuildAndRun "core/recordResolution" FSC_OPT_PLUS_DEBUG + let recordResolution () = singleTestBuildAndRun "core/recordResolution" FSC_BASIC [] let ``no-warn-2003-tests`` () = @@ -1681,14 +1680,14 @@ module RegressionTests = [] let ``literal-value-bug-2-FSC_BASIC`` () = singleTestBuildAndRun "regression/literal-value-bug-2" FSC_BASIC -//// [] -//// let ``literal-value-bug-2-FSI_BASIC`` () = singleTestBuildAndRun "regression/literal-value-bug-2" FSI_BASIC + [] + let ``literal-value-bug-2-FSI_BASIC`` () = singleTestBuildAndRun "regression/literal-value-bug-2" FSI_BASIC [] let ``OverloadResolution-bug-FSC_BASIC`` () = singleTestBuildAndRun "regression/OverloadResolution-bug" FSC_BASIC -//// [] -//// let ``OverloadResolution-bug-FSI_BASIC`` () = singleTestBuildAndRun "regression/OverloadResolution-bug" FSI_BASIC + [] + let ``OverloadResolution-bug-FSI_BASIC`` () = singleTestBuildAndRun "regression/OverloadResolution-bug" FSI_BASIC [] let ``struct-tuple-bug-1-FSC_BASIC`` () = singleTestBuildAndRun "regression/struct-tuple-bug-1" FSC_BASIC @@ -1696,6 +1695,35 @@ module RegressionTests = [] let ``tuple-bug-1-FSC_BASIC`` () = singleTestBuildAndRun "regression/tuple-bug-1" FSC_BASIC +#if !FSHARP_SUITE_DRIVES_CORECLR_TESTS + [] + let ``SRTP doesn't handle calling member hiding hinherited members`` () = + let cfg = testConfig "regression/5531" + + let outFile = "compilation.output.test.txt" + let expectedFile = "compilation.output.test.bsl" + + fscBothToOut cfg outFile "%s --nologo -O" cfg.fsc_flags ["test.fs"] + + let diff = fsdiff cfg outFile expectedFile + + match diff with + | "" -> () + | _ -> + Assert.Fail (sprintf "'%s' and '%s' differ; %A" (getfullpath cfg outFile) (getfullpath cfg expectedFile) diff) + + let outFile2 = "output.test.txt" + let expectedFile2 = "output.test.bsl" + + execBothToOut cfg (cfg.Directory) outFile2 (cfg.Directory ++ "test.exe") "" + + let diff2 = fsdiff cfg outFile2 expectedFile2 + match diff2 with + | "" -> () + | _ -> + Assert.Fail (sprintf "'%s' and '%s' differ; %A" (getfullpath cfg outFile2) (getfullpath cfg expectedFile2) diff2) +#endif + [] let ``26`` () = singleTestBuildAndRun "regression/26" FSC_BASIC @@ -1752,38 +1780,8 @@ module RegressionTests = [] let ``86`` () = singleTestBuildAndRun "regression/86" FSC_BASIC -//// [] -//// let ``struct-tuple-bug-1-FSI_BASIC`` () = singleTestBuildAndRun "regression/struct-tuple-bug-1" FSI_BASIC - -#if !FSHARP_SUITE_DRIVES_CORECLR_TESTS - [] - let ``SRTP doesn't handle calling member hiding hinherited members`` () = - let cfg = testConfig "regression/5531" - - let outFile = "compilation.output.test.txt" - let expectedFile = "compilation.output.test.bsl" - - fscBothToOut cfg outFile "%s --nologo -O" cfg.fsc_flags ["test.fs"] - - let diff = fsdiff cfg outFile expectedFile - - match diff with - | "" -> () - | _ -> - Assert.Fail (sprintf "'%s' and '%s' differ; %A" (getfullpath cfg outFile) (getfullpath cfg expectedFile) diff) - - let outFile2 = "output.test.txt" - let expectedFile2 = "output.test.bsl" - - execBothToOut cfg (cfg.Directory) outFile2 (cfg.Directory ++ "test.exe") "" - - let diff2 = fsdiff cfg outFile2 expectedFile2 - - match diff2 with - | "" -> () - | _ -> - Assert.Fail (sprintf "'%s' and '%s' differ; %A" (getfullpath cfg outFile2) (getfullpath cfg expectedFile2) diff2) -#endif + [] + let ``struct-tuple-bug-1-FSI_BASIC`` () = singleTestBuildAndRun "regression/struct-tuple-bug-1" FSI_BASIC #if !FSHARP_SUITE_DRIVES_CORECLR_TESTS // This test is disabled in coreclr builds dependent on fixing : https://github.com/Microsoft/visualfsharp/issues/2600 diff --git a/tests/projects/misc/TestProjectChanges/Library1AlwaysInMatchingConfiguration/fff.config b/tests/projects/misc/TestProjectChanges/Library1AlwaysInMatchingConfiguration/fff.config deleted file mode 100644 index 4db38eab9ce..00000000000 --- a/tests/projects/misc/TestProjectChanges/Library1AlwaysInMatchingConfiguration/fff.config +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/tests/service/Common.fs b/tests/service/Common.fs index 081a24bbc33..07c2484e70a 100644 --- a/tests/service/Common.fs +++ b/tests/service/Common.fs @@ -109,7 +109,7 @@ let mkProjectCommandLineArgsSilent (dllName, fileNames) = yield "--noframework" yield "--debug:full" yield "--define:DEBUG" -#if NETCOREAPP2_0 +#if NETCOREAPP yield "--targetprofile:netcore" #endif yield "--optimize-" From efb68b8df1e031c5d31be76b82c6e4aefd69469a Mon Sep 17 00:00:00 2001 From: Don Syme Date: Mon, 10 Dec 2018 21:30:23 -0800 Subject: [PATCH 128/160] add notes on FsLexYacc (#6000) * add notes on FsLexYacc * add notes on FsLexYacc * add notes on FsLexYacc * add notes on FsLexYacc * add notes on FsLexYacc --- src/buildtools/README-fslexyacc.md | 74 +++++++++++++ src/utils/prim-lexing.fs | 1 + src/utils/prim-lexing.fsi | 25 ++++- src/utils/prim-parsing.fs | 163 ++++++++++++++++------------- src/utils/prim-parsing.fsi | 66 +++++++++--- 5 files changed, 236 insertions(+), 93 deletions(-) create mode 100644 src/buildtools/README-fslexyacc.md diff --git a/src/buildtools/README-fslexyacc.md b/src/buildtools/README-fslexyacc.md new file mode 100644 index 00000000000..a498a74720b --- /dev/null +++ b/src/buildtools/README-fslexyacc.md @@ -0,0 +1,74 @@ +# Notes on FsLex and FsYacc + +For better or worse the F# compiler contains three tokenizers (`*.fsl`) and three +grammars (`*.fsy`) implemented using FsLex and FsYacc respectively, including the all-important F# grammar itself. +The canonical home for FsLex and FsYacc is http://github.com/fsprojects/FsLexYacc. +FsLex and FsYacc are themselves built using earlier versions of FsLex and FsYacc. + +**If you would like to improve, modify, extend, test or document these +tools, generally please do so in that repository. There are some exceptions, see below.** + +The `src\buildtools\fslex` and `src\buildtools\fsyacc` directories are an _exact_ copy of `packages\FsLexYacc.XYZ\src\fslex` and `packages\FsLexYacc.XYZ\src\fsyacc`. We should really verify this as part of our build. +This copy is done because we needed to have a build-from-source story. +In build-from-source, the only tool we can assume is an install of the .NET SDK. +That means we have to build up FsLex and FsYacc from scratch, _including_ their own generated fslexlex.fs, fslexpars.fs and so on. +We can't pick up the source from "packages" because in a build-from-source scenario we can't even fetch those +packages - we really have to build from just our source tree and .NET SDK. + +Please do _not_ modify the code in these directories except by copying over from an upgraded FsLexYacc pacakge. +Without the testing and documentation in the `FsLexYacc` repo, this copied code is just a bunch of untested, undocumented and +largely generated code checked into our source tree. + +## What if I want to modify/improve FsLex and FsYacc + +First, be clear on what you want to do: + +1. You might want to update the _code generators_ for the fslex or fsyacc tools. + +2. You might want to update the _runtime_ of the fslex or fsyacc tools. + +For (1), to improve the code/table generators, make a PR to the `FsLexYacc` repository and go through the cycle of updating these files to match a package upgrade. + +For (2), normally for FsLexYacc-based tools the runtime is either a source inclusion of `Lexing.fs`, Lexing.fsi, Parsing.fs, Parsing.fsi or a reference to the `FsLexYacc.Runtime` package. The runtime contains LexBuffer and the lexing/parsing table interpreters. + +However long ago we decided to duplicate and ingest the _runtime_ files for FsLex and FsYacc into the F# compiler rather than taking them directly from the FsLexYacc project. This was mainly because we wanted to squeeze optimizations out of them based on profiling and simplify them a bit. The duplicated files are `prim-lexing.fs`, `prim-parsing.fs` and the corresponding `.fsi` files in `src/utils`. These files are sufficient to implement the contracts exepcted by the FsLex/FsYacc generated code, and require exactly the same table formats as generated by FsLex/FsYacc. + +This means you can improve some aspects of the _runtime_ for FsLex and FsYacc by making direct changes to `prim-lexing.fs` and `prim-parsing.fs`. + +For example, the _actual_ `LexBuffer` type being used in the F# compiler (for all three lexers and grammars) is this one: https://github.com/Microsoft/visualfsharp/blob/master/src/utils/prim-lexing.fsi#L50. (That version of the Lex/Yacc runtime has added some things: `BufferLocalStore` for example, which we use for the `XmlDoc` accumulator as we strip those out. It's also dropped any mention of async lexing, and any mention of `byte`. The use +of generics for `LexBuffer<'Char>` is also superfluous because `'Char` is always `char` but is needed because the FsLex/FsYacc generated code expects this type to be generic.) + +## What if I want to eridicate our use of FsLex and FsYacc? + +The use of FsLex and FsYacc in this repo is somewhat controversial since the C# compiler implementation uses hand-written lexers and parsers. + +In the balance the use of FsLex is fairly reasonable and unlikely to change, though moving to an alternative tokenization technique wouldn't be +overly difficult given the declarative nature of `FsLex` tokenization. + +The use of a table-driven LALR(1) parser is more controversial: there is a general feeling that it would be great to +somehow move on from FsYacc and do parsing some other way. However, it is not at all easy to do that and remain +fully compatible. For this reason it is unlikely we will remove the use of FsYacc any time soon. However incremental +modifications to extract more information from the grammer may yield good results. + +## Why aren't FsLex and FsYacc just ingested into this repo if we depend on them (and even have an exact copy of them for build-from-source)? + +FsLex and FsYacc are non-trivial tools that require documentation and testing. Also, for external users, they require packaging. Changes to their design should be +considered carefully. While we are open to adding features to these tools specifically for use by the F# compiler, the tools are open source and available +independently. For these reasons it is generally best that these tools live in their own repository. + +The copy of the `fslex` and `fsyacc` source code in `buildtools` is an exact copy and is not tested or documented +apart from what's been done before in FsLexYacc repo. Adjusting these copies is not allowed and would be wrong from an engineering persepctive, +because there's no place to put documentation or tests. + +Occasionally we discuss ingesting FsLex and FsYacc into this repository. This often comes up in the hope that by doing so +we can somehow eventually code-fold them away until we no longer require them at all, instead moving to hand-written parsers +and lexers. That's an admirable goal. However, moving the tools into this repo doesn't actually help with eliminating their +use, and may indeed make it harder. This is because these tools use table generation +based on very specific lexer/grammar specifications. The tables are unreadable and unmaintainable. You can't just +somehow "specialize" the tools to the F# grammar and then get rid of them as this doesn't give a useful, maintainable lexer or parser. +To our knowledge there is no way to convert an LALR(1) parser specification to readable, maintainable recursive descent parsing code. + +As a result, ingesting the tools into this repo (and modifying them here) would be counter-productive, as the tools would no longer be tested, documented or +maintained properly, and overall engineering quality would decrease. Further the bootstrap process for the repo then becomes very unwieldy. + + diff --git a/src/utils/prim-lexing.fs b/src/utils/prim-lexing.fs index 531e3e5f183..2a49afc5799 100644 --- a/src/utils/prim-lexing.fs +++ b/src/utils/prim-lexing.fs @@ -2,6 +2,7 @@ #nowarn "47" // recursive initialization of LexBuffer +// NOTE: the code in this file is a drop-in replacement runtime for Lexing.fs from the FsLexYacc repository namespace Internal.Utilities.Text.Lexing diff --git a/src/utils/prim-lexing.fsi b/src/utils/prim-lexing.fsi index 49eb2e6bc40..9ee890b8d19 100644 --- a/src/utils/prim-lexing.fsi +++ b/src/utils/prim-lexing.fsi @@ -2,7 +2,10 @@ // LexBuffers are for use with automatically generated lexical analyzers, // in particular those produced by 'fslex'. - +// +// NOTE: the code in this file is a drop-in replacement runtime for Lexing.fsi from the FsLexYacc repository +// and is referenced by generated code for the three FsLex generated lexers in the F# compiler. +// The underlying table format intepreted must precisely match the format generated by FsLex. namespace Internal.Utilities.Text.Lexing open System.Collections.Generic @@ -14,27 +17,35 @@ open Microsoft.FSharp.Control type internal Position = /// The file index for the file associated with the input stream, use fileOfFileIndex in range.fs to decode val FileIndex : int + /// The line number in the input stream, assuming fresh positions have been updated /// for the new line by modifying the EndPos property of the LexBuffer. val Line : int + /// The line number for the position in the input stream, assuming fresh positions have been updated /// using for the new line. val OriginalLine : int + /// The character number in the input stream. val AbsoluteOffset : int + /// Return absolute offset of the start of the line marked by the position. val StartOfLineAbsoluteOffset : int + /// Return the column number marked by the position, /// i.e. the difference between the AbsoluteOffset and the StartOfLineAbsoluteOffset member Column : int - // Given a position just beyond the end of a line, return a position at the start of the next line. + + /// Given a position just beyond the end of a line, return a position at the start of the next line. member NextLine : Position /// Given a position at the start of a token of length n, return a position just beyond the end of the token. member EndOfToken: n:int -> Position + /// Gives a position shifted by specified number of characters. member ShiftColumnBy: by:int -> Position - // Same line, column -1. + + /// Same line, column -1. member ColumnMinusOne : Position /// Apply a #line directive. @@ -47,11 +58,15 @@ type internal Position = [] /// Input buffers consumed by lexers generated by fslex.exe. +/// The type must be generic to match the code generated by FsLex and FsYacc (if you would like to +/// fix this, please submit a PR to the FsLexYacc repository allowing for optional emit of a non-generic type reference). type internal LexBuffer<'Char> = /// The start position for the lexeme. member StartPos: Position with get,set + /// The end position for the lexeme. member EndPos: Position with get,set + /// The matched string. member Lexeme: 'Char [] @@ -67,13 +82,17 @@ type internal LexBuffer<'Char> = /// Create a lex buffer suitable for Unicode lexing that reads characters from the given array. /// Important: does take ownership of the array. static member FromChars: char[] -> LexBuffer + /// Create a lex buffer that reads character or byte inputs by using the given function. static member FromFunction: ('Char[] * int * int -> int) -> LexBuffer<'Char> /// The type of tables for an unicode lexer generated by fslex.exe. [] type internal UnicodeTables = + + /// Create the tables from raw data static member Create : uint16[][] * uint16[] -> UnicodeTables + /// Interpret tables for a unicode lexer generated by fslex.exe. member Interpret: initialState:int * LexBuffer -> int diff --git a/src/utils/prim-parsing.fs b/src/utils/prim-parsing.fs index b5e87d19f2d..c9ff1bb595f 100644 --- a/src/utils/prim-parsing.fs +++ b/src/utils/prim-parsing.fs @@ -1,6 +1,9 @@ // Copyright (c) Microsoft Corporation. All Rights Reserved. See License.txt in the project root for license information. +// NOTE: the code in this file is a drop-in replacement runtime for Parsing.fs from the FsLexYacc repository + namespace Internal.Utilities.Text.Parsing + open Internal.Utilities open Internal.Utilities.Text.Lexing @@ -11,21 +14,29 @@ exception RecoverableParseError exception Accept of obj [] -type internal IParseState(ruleStartPoss:Position[],ruleEndPoss:Position[],lhsPos:Position[],ruleValues:obj[],lexbuf:LexBuffer) = +type internal IParseState(ruleStartPoss:Position[], ruleEndPoss:Position[], lhsPos:Position[], ruleValues:obj[], lexbuf:LexBuffer) = member p.LexBuffer = lexbuf - member p.InputRange n = ruleStartPoss.[n-1], ruleEndPoss.[n-1]; + + member p.InputRange n = ruleStartPoss.[n-1], ruleEndPoss.[n-1] + member p.InputStartPosition n = ruleStartPoss.[n-1] - member p.InputEndPosition n = ruleEndPoss.[n-1]; + + member p.InputEndPosition n = ruleEndPoss.[n-1] + member p.ResultStartPosition = lhsPos.[0] - member p.ResultEndPosition = lhsPos.[1]; - member p.GetInput n = ruleValues.[n-1]; - member p.ResultRange = (lhsPos.[0], lhsPos.[1]); - member p.RaiseError() = raise RecoverableParseError (* NOTE: this binding tests the fairly complex logic associated with an object expression implementing a generic abstract method *) -//------------------------------------------------------------------------- -// This context is passed to the error reporter when a syntax error occurs + member p.ResultEndPosition = lhsPos.[1] + + member p.GetInput n = ruleValues.[n-1] + + member p.ResultRange = (lhsPos.[0], lhsPos.[1]) + + // Side note: this definition coincidentally tests the fairly complex logic associated with an object expression implementing a generic abstract method. + member p.RaiseError() = raise RecoverableParseError + [] +/// This context is passed to the error reporter when a syntax error occurs type internal ParseErrorContext<'tok> (//lexbuf: LexBuffer<_>, stateStack:int list, @@ -49,24 +60,24 @@ type internal ParseErrorContext<'tok> // This is the data structure emitted as code by FSYACC. type internal Tables<'tok> = - { reductions: (IParseState -> obj)[]; - endOfInputTag: int; - tagOfToken: 'tok -> int; - dataOfToken: 'tok -> obj; - actionTableElements: uint16[]; - actionTableRowOffsets: uint16[]; - reductionSymbolCounts: uint16[]; - immediateActions: uint16[]; - gotos: uint16[]; - sparseGotoTableRowOffsets: uint16[]; - stateToProdIdxsTableElements: uint16[]; - stateToProdIdxsTableRowOffsets: uint16[]; - productionToNonTerminalTable: uint16[]; + { reductions: (IParseState -> obj)[] + endOfInputTag: int + tagOfToken: 'tok -> int + dataOfToken: 'tok -> obj + actionTableElements: uint16[] + actionTableRowOffsets: uint16[] + reductionSymbolCounts: uint16[] + immediateActions: uint16[] + gotos: uint16[] + sparseGotoTableRowOffsets: uint16[] + stateToProdIdxsTableElements: uint16[] + stateToProdIdxsTableRowOffsets: uint16[] + productionToNonTerminalTable: uint16[] /// For fsyacc.exe, this entry is filled in by context from the generated parser file. If no 'parse_error' function /// is defined by the user then ParseHelpers.parse_error is used by default (ParseHelpers is opened /// at the top of the generated parser file) - parseError: ParseErrorContext<'tok> -> unit; - numTerminals: int; + parseError: ParseErrorContext<'tok> -> unit + numTerminals: int tagOfErrorTerminal: int } //------------------------------------------------------------------------- @@ -91,8 +102,8 @@ type Stack<'a>(n) = member buf.Peep() = contents.[count - 1] member buf.Top(n) = [ for x in contents.[max 0 (count-n)..count - 1] -> x ] |> List.rev member buf.Push(x) = - buf.Ensure(count + 1); - contents.[count] <- x; + buf.Ensure(count + 1) + contents.[count] <- x count <- count + 1 member buf.IsEmpty = (count = 0) @@ -197,10 +208,10 @@ module internal Implementation = let interpret (tables: Tables<'tok>) lexer (lexbuf : LexBuffer<_>) initialState = #if DEBUG - if Flags.debug then System.Console.WriteLine("\nParser: interpret tables"); + if Flags.debug then System.Console.WriteLine("\nParser: interpret tables") #endif let stateStack : Stack = new Stack<_>(100) - stateStack.Push(initialState); + stateStack.Push(initialState) let valueStack = new Stack(100) let mutable haveLookahead = false let mutable lookaheadToken = Unchecked.defaultof<'tok> @@ -244,19 +255,19 @@ module internal Implementation = let rec popStackUntilErrorShifted(tokenOpt) = // Keep popping the stack until the "error" terminal is shifted #if DEBUG - if Flags.debug then System.Console.WriteLine("popStackUntilErrorShifted"); + if Flags.debug then System.Console.WriteLine("popStackUntilErrorShifted") #endif if stateStack.IsEmpty then #if DEBUG if Flags.debug then - System.Console.WriteLine("state stack empty during error recovery - generating parse error"); + System.Console.WriteLine("state stack empty during error recovery - generating parse error") #endif - failwith "parse error"; + failwith "parse error" let currState = stateStack.Peep() #if DEBUG if Flags.debug then - System.Console.WriteLine("In state {0} during error recovery", currState); + System.Console.WriteLine("In state {0} during error recovery", currState) #endif let action = actionTable.Read(currState, tables.tagOfErrorTerminal) @@ -269,22 +280,22 @@ module internal Implementation = actionKind (actionTable.Read(nextState, tables.tagOfToken(token))) = shiftFlag) then #if DEBUG - if Flags.debug then System.Console.WriteLine("shifting error, continuing with error recovery"); + if Flags.debug then System.Console.WriteLine("shifting error, continuing with error recovery") #endif let nextState = actionValue action // The "error" non terminal needs position information, though it tends to be unreliable. // Use the StartPos/EndPos from the lex buffer. - valueStack.Push(ValueInfo(box (), lexbuf.StartPos, lexbuf.EndPos)); + valueStack.Push(ValueInfo(box (), lexbuf.StartPos, lexbuf.EndPos)) stateStack.Push(nextState) else if valueStack.IsEmpty then - failwith "parse error"; + failwith "parse error" #if DEBUG if Flags.debug then - System.Console.WriteLine("popping stack during error recovery"); + System.Console.WriteLine("popping stack during error recovery") #endif - valueStack.Pop(); - stateStack.Pop(); + valueStack.Pop() + stateStack.Pop() popStackUntilErrorShifted(tokenOpt) while not finished do @@ -316,7 +327,7 @@ module internal Implementation = lookaheadToken <- lexer lexbuf lookaheadStartPos <- lexbuf.StartPos lookaheadEndPos <- lexbuf.EndPos - haveLookahead <- true; + haveLookahead <- true let tag = if haveLookahead then tables.tagOfToken lookaheadToken @@ -328,17 +339,17 @@ module internal Implementation = let kind = actionKind action if kind = shiftFlag then ( if errorSuppressionCountDown > 0 then - errorSuppressionCountDown <- errorSuppressionCountDown - 1; + errorSuppressionCountDown <- errorSuppressionCountDown - 1 #if DEBUG - if Flags.debug then Console.WriteLine("shifting, reduced errorRecoverylevel to {0}\n", errorSuppressionCountDown); + if Flags.debug then Console.WriteLine("shifting, reduced errorRecoverylevel to {0}\n", errorSuppressionCountDown) #endif let nextState = actionValue action - if not haveLookahead then failwith "shift on end of input!"; + if not haveLookahead then failwith "shift on end of input!" let data = tables.dataOfToken lookaheadToken - valueStack.Push(ValueInfo(data, lookaheadStartPos, lookaheadEndPos)); - stateStack.Push(nextState); + valueStack.Push(ValueInfo(data, lookaheadStartPos, lookaheadEndPos)) + stateStack.Push(nextState) #if DEBUG - if Flags.debug then Console.WriteLine("shift/consume input {0}, shift to state {1}", report haveLookahead lookaheadToken, nextState); + if Flags.debug then Console.WriteLine("shift/consume input {0}, shift to state {1}", report haveLookahead lookaheadToken, nextState) #endif haveLookahead <- false @@ -348,31 +359,31 @@ module internal Implementation = let n = int tables.reductionSymbolCounts.[prod] // pop the symbols, populate the values and populate the locations #if DEBUG - if Flags.debug then Console.Write("reduce popping {0} values/states, lookahead {1}", n, report haveLookahead lookaheadToken); + if Flags.debug then Console.Write("reduce popping {0} values/states, lookahead {1}", n, report haveLookahead lookaheadToken) #endif for i = 0 to n - 1 do - if valueStack.IsEmpty then failwith "empty symbol stack"; + if valueStack.IsEmpty then failwith "empty symbol stack" let topVal = valueStack.Peep() - valueStack.Pop(); - stateStack.Pop(); - ruleValues.[(n-i)-1] <- topVal.value; - ruleStartPoss.[(n-i)-1] <- topVal.startPos; - ruleEndPoss.[(n-i)-1] <- topVal.endPos; - if i = 0 then lhsPos.[1] <- topVal.endPos; + valueStack.Pop() + stateStack.Pop() + ruleValues.[(n-i)-1] <- topVal.value + ruleStartPoss.[(n-i)-1] <- topVal.startPos + ruleEndPoss.[(n-i)-1] <- topVal.endPos + if i = 0 then lhsPos.[1] <- topVal.endPos if i = n - 1 then lhsPos.[0] <- topVal.startPos // Use the lookahead token to populate the locations if the rhs is empty if n = 0 then if haveLookahead then - lhsPos.[0] <- lookaheadStartPos; - lhsPos.[1] <- lookaheadEndPos; + lhsPos.[0] <- lookaheadStartPos + lhsPos.[1] <- lookaheadEndPos else - lhsPos.[0] <- lexbuf.StartPos; - lhsPos.[1] <- lexbuf.EndPos; + lhsPos.[0] <- lexbuf.StartPos + lhsPos.[1] <- lexbuf.EndPos try - // printf "reduce %d\n" prod; + // printf "reduce %d\n" prod let redResult = reduction parseState - valueStack.Push(ValueInfo(redResult, lhsPos.[0], lhsPos.[1])); + valueStack.Push(ValueInfo(redResult, lhsPos.[0], lhsPos.[1])) let currState = stateStack.Peep() let newGotoState = gotoTable.Read(int tables.productionToNonTerminalTable.[prod], currState) stateStack.Push(newGotoState) @@ -381,23 +392,23 @@ module internal Implementation = #endif with | Accept res -> - finished <- true; + finished <- true valueStack.Push(ValueInfo(res, lhsPos.[0], lhsPos.[1])) | RecoverableParseError -> #if DEBUG - if Flags.debug then Console.WriteLine("RecoverableParseErrorException...\n"); + if Flags.debug then Console.WriteLine("RecoverableParseErrorException...\n") #endif - popStackUntilErrorShifted(None); + popStackUntilErrorShifted(None) // User code raised a Parse_error. Don't report errors again until three tokens have been shifted errorSuppressionCountDown <- 3 elif kind = errorFlag then ( #if DEBUG - if Flags.debug then Console.Write("ErrorFlag... "); + if Flags.debug then Console.Write("ErrorFlag... ") #endif // Silently discard inputs and don't report errors // until three tokens in a row have been shifted #if DEBUG - if Flags.debug then printfn "error on token '%s' " (report haveLookahead lookaheadToken); + if Flags.debug then printfn "error on token '%s' " (report haveLookahead lookaheadToken) #endif if errorSuppressionCountDown > 0 then // If we're in the end-of-file count down then we're very keen to 'Accept'. @@ -405,16 +416,16 @@ module internal Implementation = // and an EOF token. if inEofCountDown && eofCountDown < 10 then #if DEBUG - if Flags.debug then printfn "popping stack, looking to shift both 'error' and that token, during end-of-file error recovery" ; + if Flags.debug then printfn "popping stack, looking to shift both 'error' and that token, during end-of-file error recovery" #endif - popStackUntilErrorShifted(if haveLookahead then Some(lookaheadToken) else None); + popStackUntilErrorShifted(if haveLookahead then Some(lookaheadToken) else None) // If we don't haveLookahead then the end-of-file count down is over and we have no further options. if not haveLookahead then failwith "parse error: unexpected end of file" #if DEBUG - if Flags.debug then printfn "discarding token '%s' during error suppression" (report haveLookahead lookaheadToken); + if Flags.debug then printfn "discarding token '%s' during error suppression" (report haveLookahead lookaheadToken) #endif // Discard the token haveLookahead <- false @@ -449,28 +460,30 @@ module internal Implementation = if not (explicit.Contains(tag)) then yield tag ] in //let activeRules = stateStack |> List.iter (fun state -> - let errorContext = new ParseErrorContext<'tok>(stateStack,parseState, reduceTokens,currentToken,reducibleProductions, shiftableTokens, "syntax error") - tables.parseError(errorContext); - popStackUntilErrorShifted(None); - errorSuppressionCountDown <- 3; + let errorContext = new ParseErrorContext<'tok>(stateStack, parseState, reduceTokens, currentToken, reducibleProductions, shiftableTokens, "syntax error") + tables.parseError(errorContext) + popStackUntilErrorShifted(None) + errorSuppressionCountDown <- 3 #if DEBUG - if Flags.debug then System.Console.WriteLine("generated syntax error and shifted error token, haveLookahead = {0}\n", haveLookahead); + if Flags.debug then System.Console.WriteLine("generated syntax error and shifted error token, haveLookahead = {0}\n", haveLookahead) #endif ) ) elif kind = acceptFlag then finished <- true #if DEBUG else - if Flags.debug then System.Console.WriteLine("ALARM!!! drop through case in parser"); + if Flags.debug then System.Console.WriteLine("ALARM!!! drop through case in parser") #endif - done; + done // OK, we're done - read off the overall generated value valueStack.Peep().value type internal Tables<'tok> with - member tables.Interpret (lexer,lexbuf,initialState) = + member tables.Interpret (lexer, lexbuf, initialState) = Implementation.interpret tables lexer lexbuf initialState module internal ParseHelpers = + let parse_error (_s:string) = () + let parse_error_rich = (None : (ParseErrorContext<_> -> unit) option) diff --git a/src/utils/prim-parsing.fsi b/src/utils/prim-parsing.fsi index d6502da55ba..7ec3e7a0a80 100644 --- a/src/utils/prim-parsing.fsi +++ b/src/utils/prim-parsing.fsi @@ -1,6 +1,9 @@ // Copyright (c) Microsoft Corporation. All Rights Reserved. See License.txt in the project root for license information. +// NOTE: the code in this file is a drop-in replacement runtime for Parsing.fsi from the FsLexYacc repository + namespace Internal.Utilities.Text.Parsing + open Internal.Utilities open Internal.Utilities.Text.Lexing @@ -8,22 +11,31 @@ open System.Collections.Generic [] type internal IParseState = + /// Get the start and end position for the terminal or non-terminal at a given index matched by the production. member InputRange: index:int -> Position * Position + /// Get the end position for the terminal or non-terminal at a given index matched by the production. member InputEndPosition: int -> Position + /// Get the start position for the terminal or non-terminal at a given index matched by the production. member InputStartPosition: int -> Position + /// Get the start of the range of positions matched by the production. member ResultStartPosition: Position + /// Get the end of the range of positions matched by the production. member ResultEndPosition: Position + /// Get the full range of positions matched by the production. member ResultRange: Position * Position + /// Get the value produced by the terminal or non-terminal at the given position. member GetInput : int -> obj + /// Raise an error in this parse context. member RaiseError<'b> : unit -> 'b + /// Return the LexBuffer for this parser instance. member LexBuffer : LexBuffer @@ -33,16 +45,22 @@ type internal IParseState = type internal ParseErrorContext<'tok> = /// The stack of state indexes active at the parse error . member StateStack : int list + /// The state active at the parse error. member ParseState : IParseState + /// The tokens that would cause a reduction at the parse error. member ReduceTokens: int list + /// The stack of productions that would be reduced at the parse error. member ReducibleProductions : int list list + /// The token that caused the parse error. member CurrentToken : 'tok option + /// The token that would cause a shift at the parse error. member ShiftTokens : int list + /// The message associated with the parse error. member Message : string @@ -51,35 +69,50 @@ type internal ParseErrorContext<'tok> = type internal Tables<'tok> = { /// The reduction table. - reductions: (IParseState -> obj) array ; + reductions: (IParseState -> obj)[] + /// The token number indicating the end of input. - endOfInputTag: int; + endOfInputTag: int + /// A function to compute the tag of a token. - tagOfToken: 'tok -> int; + tagOfToken: 'tok -> int + /// A function to compute the data carried by a token. - dataOfToken: 'tok -> obj; + dataOfToken: 'tok -> obj + /// The sparse action table elements. - actionTableElements: uint16[]; + actionTableElements: uint16[] + /// The sparse action table row offsets. - actionTableRowOffsets: uint16[]; + actionTableRowOffsets: uint16[] + /// The number of symbols for each reduction. - reductionSymbolCounts: uint16[]; + reductionSymbolCounts: uint16[] + /// The immediate action table. - immediateActions: uint16[]; + immediateActions: uint16[] + /// The sparse goto table. - gotos: uint16[]; + gotos: uint16[] + /// The sparse goto table row offsets. - sparseGotoTableRowOffsets: uint16[]; + sparseGotoTableRowOffsets: uint16[] + /// The sparse table for the productions active for each state. - stateToProdIdxsTableElements: uint16[]; + stateToProdIdxsTableElements: uint16[] + /// The sparse table offsets for the productions active for each state. - stateToProdIdxsTableRowOffsets: uint16[]; + stateToProdIdxsTableRowOffsets: uint16[] + /// This table is logically part of the Goto table. - productionToNonTerminalTable: uint16[]; + productionToNonTerminalTable: uint16[] + /// This function is used to hold the user specified "parse_error" or "parse_error_rich" functions. - parseError: ParseErrorContext<'tok> -> unit; + parseError: ParseErrorContext<'tok> -> unit + /// The total number of terminals. - numTerminals: int; + numTerminals: int + /// The tag of the error terminal. tagOfErrorTerminal: int } @@ -89,6 +122,7 @@ type internal Tables<'tok> = /// Indicates an accept action has occurred. exception internal Accept of obj + /// Indicates a parse error has occurred and parse recovery is in progress. exception internal RecoverableParseError @@ -99,8 +133,10 @@ module internal Flags = /// Helpers used by generated parsers. module internal ParseHelpers = + /// The default implementation of the parse_error_rich function. val parse_error_rich: (ParseErrorContext<'tok> -> unit) option + /// The default implementation of the parse_error function. val parse_error: string -> unit From 970bf1ebe86ac85b68aae71124fcf39d132f8faf Mon Sep 17 00:00:00 2001 From: Jakub Majocha Date: Wed, 12 Dec 2018 00:17:18 +0100 Subject: [PATCH 129/160] Visual Studio Editor Options bug fixes (#5999) * fix options ui logic and syncing between IDE instances * add comments * feedback --- .../FSharp.Editor/Options/EditorOptions.fs | 18 ++--- .../Options/SettingsPersistence.fs | 79 +++++++++++++------ .../src/FSharp.Editor/Options/UIHelpers.fs | 34 +++++++- 3 files changed, 92 insertions(+), 39 deletions(-) diff --git a/vsintegration/src/FSharp.Editor/Options/EditorOptions.fs b/vsintegration/src/FSharp.Editor/Options/EditorOptions.fs index 14578e617c6..269ae085680 100644 --- a/vsintegration/src/FSharp.Editor/Options/EditorOptions.fs +++ b/vsintegration/src/FSharp.Editor/Options/EditorOptions.fs @@ -119,19 +119,19 @@ type EditorOptions store.Register CodeLensOptions.Default store.Register FormattingOptions.Default - member __.IntelliSense : IntelliSenseOptions = store.Read() - member __.QuickInfo : QuickInfoOptions = store.Read() - member __.CodeFixes : CodeFixesOptions = store.Read() - member __.LanguageServicePerformance : LanguageServicePerformanceOptions = store.Read() - member __.Advanced: AdvancedOptions = store.Read() - member __.CodeLens: CodeLensOptions = store.Read() - member __.Formatting : FormattingOptions = store.Read() + member __.IntelliSense : IntelliSenseOptions = store.Get() + member __.QuickInfo : QuickInfoOptions = store.Get() + member __.CodeFixes : CodeFixesOptions = store.Get() + member __.LanguageServicePerformance : LanguageServicePerformanceOptions = store.Get() + member __.Advanced: AdvancedOptions = store.Get() + member __.CodeLens: CodeLensOptions = store.Get() + member __.Formatting : FormattingOptions = store.Get() interface Microsoft.CodeAnalysis.Host.IWorkspaceService interface IPersistSettings with - member __.Read() = store.Read() - member __.Write(settings) = store.Write(settings) + member __.LoadSettings() = store.LoadSettings() + member __.SaveSettings(settings) = store.SaveSettings(settings) [] diff --git a/vsintegration/src/FSharp.Editor/Options/SettingsPersistence.fs b/vsintegration/src/FSharp.Editor/Options/SettingsPersistence.fs index cc985a00585..d4e2c84dce6 100644 --- a/vsintegration/src/FSharp.Editor/Options/SettingsPersistence.fs +++ b/vsintegration/src/FSharp.Editor/Options/SettingsPersistence.fs @@ -9,8 +9,8 @@ open Microsoft.VisualStudio.Settings open Newtonsoft.Json type IPersistSettings = - abstract member Read : unit -> 't - abstract member Write : 't -> unit + abstract member LoadSettings : unit -> 't + abstract member SaveSettings : 't -> unit [] type SVsSettingsPersistenceManager = class end @@ -18,42 +18,69 @@ type SVsSettingsPersistenceManager = class end type SettingsStore(serviceProvider: IServiceProvider) = let settingsManager = serviceProvider.GetService(typeof) :?> ISettingsManager - // settings quallified type names are used as keys, this should be enough to avoid collisions - let storageKey (typ: Type) = typ.Namespace + "." + typ.Name + + let storageKeyVersions (typ: Type) = + // "TextEditor" prefix seems to be required for settings changes to be synced between IDE instances + [ "TextEditor.FSharp." + typ.Namespace + "." + typ.Name + // we keep this old storage key to upgrade without reverting user changes + typ.Namespace + "." + typ.Name ] + + let storageKey (typ: Type) = storageKeyVersions typ |> List.head // Each group of settings is a value of some named type, for example 'IntelliSenseOptions', 'QuickInfoOptions' - // We cache exactly one instance of each, treating them as immutable. - // This cache is updated by the SettingsStore when the user changes an option. - let cache = System.Collections.Concurrent.ConcurrentDictionary() + // and it is usually representing one separate option page in the UI. + // We cache exactly one immutable value of each type. + // This cache is updated by the SettingsStore when the user makes changes in the Options dialog + // or when a change is propagated from another VS IDE instance by SVsSettingsPersistenceManager. + let cache = ConcurrentDictionary() - let read() = + let getCached() = match cache.TryGetValue(typeof<'t>) with - | true, value -> value :?> 't - | _ -> failwithf "Settings %s are not registered." typeof<'t>.Name + | true, (:? 't as value) -> value + | _ -> failwithf "Settings %s are not registered." typeof<'t>.Name - let write settings = cache.[settings.GetType()] <- settings + let keepInCache settings = cache.[settings.GetType()] <- settings + + // The settings record, even though immutable, is being effectively mutated in two instances: + // when it is passed to the UI (provided it is marked with CLIMutable attribute); + // when it is being populated from JSON using JsonConvert.PopulateObject; + // We make a deep copy in these instances to isolate and contain the mutation + let clone (v: 't) = JsonConvert.SerializeObject v |> JsonConvert.DeserializeObject<'t> let updateFromStore settings = - let result, json = settings.GetType() |> storageKey |> settingsManager.TryGetValue - if result = GetValueResult.Success then - // if it fails we just return what we got - try JsonConvert.PopulateObject(json, settings) with _ -> () - settings - - member __.Read() = read() + // make a deep copy so that PopulateObject does not alter the original + let copy = clone settings + // if the new key is not found by ISettingsManager, we try the old keys + // so that user settings are not lost + settings.GetType() |> storageKeyVersions + |> Seq.map (settingsManager.TryGetValue) + |> Seq.tryPick ( function GetValueResult.Success, json -> Some json | _ -> None ) + |> Option.iter (fun json -> try JsonConvert.PopulateObject(json, copy) with _ -> ()) + copy - member __.Write settings = - write settings - // we replace default serialization with Newtonsoft.Json for easy schema evolution + member __.Get() = getCached() + + // Used by the AbstractOptionPage to populate dialog controls. + // We always have the latest value in the cache so we just return + // cloned value here because it may be altered by the UI if declared with [] + member __.LoadSettings() = getCached() |> clone + + member __.SaveSettings settings = + // We replace default serialization with Newtonsoft.Json for easy schema evolution. + // For example, if we add a new bool field to the record, representing another checkbox in Options dialog + // deserialization will still work fine. When we pass default value to JsonConvert.PopulateObject it will + // fill just the known fields. settingsManager.SetValueAsync(settings.GetType() |> storageKey, JsonConvert.SerializeObject settings, false) - |> Async.AwaitTask |> Async.StartImmediate + |> Async.AwaitTask |> Async.Start - member __.Register (defaultSettings : 'options) = - defaultSettings |> updateFromStore |> write + // This is the point we retrieve the initial value and subscribe to watch for changes + member __.Register (defaultSettings : 'options) = + defaultSettings |> updateFromStore |> keepInCache let subset = defaultSettings.GetType() |> storageKey |> settingsManager.GetSubset - + // this event is also raised when a setting change occurs in another VS instance, so we can keep everything in sync PropertyChangedAsyncEventHandler ( fun _ _ -> - (read() :'options) |> updateFromStore |> write + (getCached(): 'options) |> updateFromStore |> keepInCache System.Threading.Tasks.Task.CompletedTask ) |> subset.add_SettingChangedAsync + \ No newline at end of file diff --git a/vsintegration/src/FSharp.Editor/Options/UIHelpers.fs b/vsintegration/src/FSharp.Editor/Options/UIHelpers.fs index 1a7c8584133..2adae7a7a46 100644 --- a/vsintegration/src/FSharp.Editor/Options/UIHelpers.fs +++ b/vsintegration/src/FSharp.Editor/Options/UIHelpers.fs @@ -13,8 +13,12 @@ module internal OptionsUIHelpers = type AbstractOptionPage<'options>() as this = inherit UIElementDialogPage() + // this replicates the logic used by Roslyn option pages. Some following comments have been copied from + // https://github.com/dotnet/roslyn/blob/5b125935f891b3c20405459f8f7e1cdfdc2cfa3d/src/VisualStudio/Core/Impl/Options/AbstractOptionPage.cs + let mutable needsLoadOnNextActivate = true + let view = lazy this.CreateView() - + let optionService = // lazy, so GetService is called from UI thread lazy @@ -25,11 +29,33 @@ module internal OptionsUIHelpers = override this.Child = upcast view.Value + override this.OnActivate _ = + if needsLoadOnNextActivate then + // It looks like the bindings do not always pick up new source, unless we cycle the DataContext like this + view.Value.DataContext <- DependencyProperty.UnsetValue + view.Value.DataContext <- optionService.Value.LoadSettings<'options>() + needsLoadOnNextActivate <- false + override this.SaveSettingsToStorage() = - downcast view.Value.DataContext |> optionService.Value.Write<'options> + downcast view.Value.DataContext |> optionService.Value.SaveSettings<'options> + // Make sure we load the next time the page is activated, in case if options changed + // programmatically between now and the next time the page is activated + needsLoadOnNextActivate <- true - override this.LoadSettingsFromStorage() = - view.Value.DataContext <- optionService.Value.Read<'options>() + override this.LoadSettingsFromStorage() = + // This gets called in two situations: + // + // 1) during the initial page load when you first activate the page, before OnActivate + // is called. + // 2) during the closing of the dialog via Cancel/close when options don't need to be + // saved. The intent here is the settings get reloaded so the next time you open the + // page they are properly populated. + // + // This second one is tricky, because we don't actually want to update our controls + // right then, because they'd be wrong the next time the page opens -- it's possible + // they may have been changed programmatically. Therefore, we'll set a flag so we load + // next time + needsLoadOnNextActivate <- true //data binding helpers let radioButtonCoverter = From 2277eb28bbfb07bb54b62fb6ca1c626175548870 Mon Sep 17 00:00:00 2001 From: "Kevin Ransom (msft)" Date: Fri, 14 Dec 2018 13:16:50 -0800 Subject: [PATCH 130/160] Fix #4946 --- Update FSC and FSI to recognize upto .net framework 472 (#6005) * Fix #4946 --- Update FSC and FSI to recognize upto .net framework 472 * support really old frameworks * Update test to satisfy net472 as well as earlier versions of dotnet * comparer --- .../FSharp.Compiler.Private.fsproj | 1 + src/fsharp/MSBuildReferenceResolver.fs | 117 ++++++++++-------- src/utils/reshapedmsbuild.fs | 4 + .../ValueTupleAliasConstructor.il.bsl.net47 | 83 +++++++++++++ .../testenv/src/ILComparer/Program.fs | 26 ++-- 5 files changed, 169 insertions(+), 62 deletions(-) create mode 100644 tests/fsharpqa/Source/CodeGen/EmittedIL/Tuples/ValueTupleAliasConstructor.il.bsl.net47 diff --git a/src/fsharp/FSharp.Compiler.Private/FSharp.Compiler.Private.fsproj b/src/fsharp/FSharp.Compiler.Private/FSharp.Compiler.Private.fsproj index 4e543b673a5..97d17b10972 100644 --- a/src/fsharp/FSharp.Compiler.Private/FSharp.Compiler.Private.fsproj +++ b/src/fsharp/FSharp.Compiler.Private/FSharp.Compiler.Private.fsproj @@ -9,6 +9,7 @@ $(NoWarn);45;55;62;75;1204 true $(DefineConstants);COMPILER + $(DefineConstants);MSBUILD_AT_LEAST_15 $(OtherFlags) --warnon:1182 --maxerrors:20 --extraoptimizationloops:1 true true diff --git a/src/fsharp/MSBuildReferenceResolver.fs b/src/fsharp/MSBuildReferenceResolver.fs index 804c6b74088..c2a9d2133b7 100644 --- a/src/fsharp/MSBuildReferenceResolver.fs +++ b/src/fsharp/MSBuildReferenceResolver.fs @@ -41,62 +41,52 @@ module internal Microsoft.FSharp.Compiler.MSBuildReferenceResolver // ATTENTION!: the following code needs to be updated every time we are switching to the new MSBuild version because new .NET framework version was released // 1. List of frameworks // 2. DeriveTargetFrameworkDirectoriesFor45Plus - // 3. HighestInstalledNetFrameworkVersion + // 3. HighestInstalledRefAssembliesOrDotNETFramework // 4. GetPathToDotNetFrameworkImlpementationAssemblies [] - let private Net10 = "v1.0" + let private Net45 = "v4.5" [] - let private Net11 = "v1.1" + let private Net451 = "v4.5.1" [] - let private Net20 = "v2.0" + let private Net452 = "v4.5.2" // not available in Dev15 MSBuild version [] - let private Net30 = "v3.0" + let private Net46 = "v4.6" [] - let private Net35 = "v3.5" + let private Net461 = "v4.6.1" [] - let private Net40 = "v4.0" + let private Net462 = "v4.6.2" [] - let private Net45 = "v4.5" + let private Net47 = "v4.7" [] - let private Net451 = "v4.5.1" - - /// The list of supported .NET Framework version numbers, using the monikers of the Reference Assemblies folder. - let SupportedNetFrameworkVersions = set [ Net20; Net30; Net35; Net40; Net45; Net451; (*SL only*) "v5.0" ] - - //[] - //let private Net452 = "v4.5.2" // not available in Dev15 MSBuild version + let private Net471 = "v4.7.1" -#if MSBUILD_AT_LEAST_14 [] - let private Net46 = "v4.6" + let private Net472 = "v4.7.2" - [] - let private Net461 = "v4.6.1" -#endif + let SupportedDesktopFrameworkVersions = [ Net472; Net471; Net47; Net462; Net461; Net46; Net452; Net451; Net45 ] - /// Get the path to the .NET Framework implementation assemblies by using ToolLocationHelper.GetPathToDotNetFramework. + /// Get the path to the .NET Framework implementation assemblies by using ToolLocationHelper.GetPathToDotNetFramework /// This is only used to specify the "last resort" path for assembly resolution. let GetPathToDotNetFrameworkImlpementationAssemblies(v) = let v = match v with - | Net11 -> Some TargetDotNetFrameworkVersion.Version11 - | Net20 -> Some TargetDotNetFrameworkVersion.Version20 - | Net30 -> Some TargetDotNetFrameworkVersion.Version30 - | Net35 -> Some TargetDotNetFrameworkVersion.Version35 - | Net40 -> Some TargetDotNetFrameworkVersion.Version40 | Net45 -> Some TargetDotNetFrameworkVersion.Version45 | Net451 -> Some TargetDotNetFrameworkVersion.Version451 -#if MSBUILD_AT_LEAST_14 - //| Net452 -> Some TargetDotNetFrameworkVersion.Version452 // not available in Dev15 MSBuild version +#if MSBUILD_AT_LEAST_15 + | Net452 -> Some TargetDotNetFrameworkVersion.Version452 | Net46 -> Some TargetDotNetFrameworkVersion.Version46 | Net461 -> Some TargetDotNetFrameworkVersion.Version461 + | Net462 -> Some TargetDotNetFrameworkVersion.Version462 + | Net47 -> Some TargetDotNetFrameworkVersion.Version47 + | Net471 -> Some TargetDotNetFrameworkVersion.Version471 + | Net472 -> Some TargetDotNetFrameworkVersion.Version472 #endif | _ -> assert false; None match v with @@ -106,7 +96,6 @@ module internal Microsoft.FSharp.Compiler.MSBuildReferenceResolver | x -> [x] | _ -> [] - let GetPathToDotNetFrameworkReferenceAssemblies(version) = #if NETSTANDARD1_6 || NETSTANDARD2_0 ignore version @@ -118,41 +107,59 @@ module internal Microsoft.FSharp.Compiler.MSBuildReferenceResolver | x -> [x] #endif - /// Use MSBuild to determine the version of the highest installed framework. - let HighestInstalledNetFrameworkVersion() = - try -#if MSBUILD_AT_LEAST_14 - if box (ToolLocationHelper.GetPathToDotNetFramework(TargetDotNetFrameworkVersion.Version461)) <> null then Net461 - elif box (ToolLocationHelper.GetPathToDotNetFramework(TargetDotNetFrameworkVersion.Version46)) <> null then Net46 - // 4.5.2 enumeration is not available in Dev15 MSBuild version - //elif box (ToolLocationHelper.GetPathToDotNetFramework(TargetDotNetFrameworkVersion.Version452)) <> null then Net452 - elif box (ToolLocationHelper.GetPathToDotNetFramework(TargetDotNetFrameworkVersion.Version451)) <> null then Net451 + /// Use MSBuild to determine the version of the highest installed set of reference assemblies, failing that grab the highest installed framework version + let HighestInstalledRefAssembliesOrDotNETFramework () = + let getHighestInstalledDotNETFramework () = + try +// The Mono build still uses an ancient version of msbuild from around Dev 14 +#if MSBUILD_AT_LEAST_15 + if box (ToolLocationHelper.GetPathToDotNetFramework(TargetDotNetFrameworkVersion.Version472)) <> null then Net472 + elif box (ToolLocationHelper.GetPathToDotNetFramework(TargetDotNetFrameworkVersion.Version471)) <> null then Net471 + elif box (ToolLocationHelper.GetPathToDotNetFramework(TargetDotNetFrameworkVersion.Version47)) <> null then Net47 + elif box (ToolLocationHelper.GetPathToDotNetFramework(TargetDotNetFrameworkVersion.Version462)) <> null then Net462 + elif box (ToolLocationHelper.GetPathToDotNetFramework(TargetDotNetFrameworkVersion.Version461)) <> null then Net461 + elif box (ToolLocationHelper.GetPathToDotNetFramework(TargetDotNetFrameworkVersion.Version461)) <> null then Net461 + elif box (ToolLocationHelper.GetPathToDotNetFramework(TargetDotNetFrameworkVersion.Version46)) <> null then Net46 + elif box (ToolLocationHelper.GetPathToDotNetFramework(TargetDotNetFrameworkVersion.Version452)) <> null then Net452 + elif box (ToolLocationHelper.GetPathToDotNetFramework(TargetDotNetFrameworkVersion.Version451)) <> null then Net451 #else - if box (ToolLocationHelper.GetPathToDotNetFramework(TargetDotNetFrameworkVersion.Version451)) <> null then Net451 + if box (ToolLocationHelper.GetPathToDotNetFramework(TargetDotNetFrameworkVersion.Version451)) <> null then Net451 +#endif + elif box (ToolLocationHelper.GetPathToDotNetFramework(TargetDotNetFrameworkVersion.Version45)) <> null then Net45 + else Net45 // version is 4.5 assumed since this code is running. + with _ -> Net45 + +#if !FX_RESHAPED_REFLECTION + // 1. First look to see if we can find the highest installed set of dotnet reference assemblies, if yes then select that framework + // 2. Otherwise ask msbuild for the highestinstalled framework + let checkFrameworkForReferenceAssemblies (dotNetVersion:string) = + if not (String.IsNullOrEmpty(dotNetVersion)) then + try + let v = if dotNetVersion.StartsWith("v") then dotNetVersion.Substring(1) else dotNetVersion + let frameworkName = new System.Runtime.Versioning.FrameworkName(".NETFramework", new Version(v)) + match ToolLocationHelper.GetPathToReferenceAssemblies(frameworkName) |> Seq.tryHead with + | Some p -> if Directory.Exists(p) then true else false + | None -> false + with _ -> false + else false + match SupportedDesktopFrameworkVersions |> Seq.tryFind(fun v -> checkFrameworkForReferenceAssemblies v) with + | Some v -> v + | None -> getHighestInstalledDotNETFramework() +#else + getHighestInstalledDotNETFramework() #endif - elif box (ToolLocationHelper.GetPathToDotNetFramework(TargetDotNetFrameworkVersion.Version45)) <> null then Net45 - else Net45 // version is 4.5 assumed since this code is running. - with _ -> Net45 - /// Derive the target framework directories. + /// Derive the target framework directories. let DeriveTargetFrameworkDirectories (targetFrameworkVersion:string, logMessage) = let targetFrameworkVersion = if not(targetFrameworkVersion.StartsWith("v",StringComparison.Ordinal)) then "v"+targetFrameworkVersion else targetFrameworkVersion - let result = - if targetFrameworkVersion.StartsWith(Net10, StringComparison.Ordinal) then ReplaceVariablesForLegacyFxOnWindows([@"{WindowsFramework}\v1.0.3705"]) - elif targetFrameworkVersion.StartsWith(Net11, StringComparison.Ordinal) then ReplaceVariablesForLegacyFxOnWindows([@"{WindowsFramework}\v1.1.4322"]) - elif targetFrameworkVersion.StartsWith(Net20, StringComparison.Ordinal) then ReplaceVariablesForLegacyFxOnWindows([@"{WindowsFramework}\v2.0.50727"]) - elif targetFrameworkVersion.StartsWith(Net30, StringComparison.Ordinal) then ReplaceVariablesForLegacyFxOnWindows([@"{ReferenceAssemblies}\v3.0"; @"{WindowsFramework}\v3.0"; @"{WindowsFramework}\v2.0.50727"]) - elif targetFrameworkVersion.StartsWith(Net35, StringComparison.Ordinal) then ReplaceVariablesForLegacyFxOnWindows([@"{ReferenceAssemblies}\v3.5"; @"{WindowsFramework}\v3.5"; @"{ReferenceAssemblies}\v3.0"; @"{WindowsFramework}\v3.0"; @"{WindowsFramework}\v2.0.50727"]) - else GetPathToDotNetFrameworkReferenceAssemblies(targetFrameworkVersion) - - let result = result |> Array.ofList - logMessage (sprintf "Derived target framework directories for version %s are: %s" targetFrameworkVersion (String.Join(",", result))) + let result = GetPathToDotNetFrameworkReferenceAssemblies(targetFrameworkVersion) |> Array.ofList + logMessage (sprintf "Derived target framework directories for version %s are: %s" targetFrameworkVersion (String.Join(",", result))) result - + /// Describes the location where the reference was found, used only for debug and tooltip output type ResolvedFrom = | AssemblyFolders @@ -364,7 +371,7 @@ module internal Microsoft.FSharp.Compiler.MSBuildReferenceResolver let Resolver = { new ReferenceResolver.Resolver with - member __.HighestInstalledNetFrameworkVersion() = HighestInstalledNetFrameworkVersion() + member __.HighestInstalledNetFrameworkVersion() = HighestInstalledRefAssembliesOrDotNETFramework() member __.DotNetFrameworkReferenceAssembliesRootDirectory = DotNetFrameworkReferenceAssembliesRootDirectory /// Perform the resolution on rooted and unrooted paths, and then combine the results. diff --git a/src/utils/reshapedmsbuild.fs b/src/utils/reshapedmsbuild.fs index 925b904e3e2..f84e8a5d319 100644 --- a/src/utils/reshapedmsbuild.fs +++ b/src/utils/reshapedmsbuild.fs @@ -85,6 +85,10 @@ module internal MsBuildAdapters = | Version46 = 7 | Version461 = 8 | Version452 = 9 + | Version462 = 10 + | Version47 = 11 + | Version471 = 12 + | Version472 = 13 | VersionLatest = 8 //TargetDotNetFrameworkVersion.Version461 /// diff --git a/tests/fsharpqa/Source/CodeGen/EmittedIL/Tuples/ValueTupleAliasConstructor.il.bsl.net47 b/tests/fsharpqa/Source/CodeGen/EmittedIL/Tuples/ValueTupleAliasConstructor.il.bsl.net47 new file mode 100644 index 00000000000..0c4121676d1 --- /dev/null +++ b/tests/fsharpqa/Source/CodeGen/EmittedIL/Tuples/ValueTupleAliasConstructor.il.bsl.net47 @@ -0,0 +1,83 @@ + +// Microsoft (R) .NET Framework IL Disassembler. Version 4.6.1055.0 +// Copyright (c) Microsoft Corporation. All rights reserved. + + + +// Metadata version: v4.0.30319 +.assembly extern mscorlib +{ + .publickeytoken = (B7 7A 5C 56 19 34 E0 89 ) // .z\V.4.. + .ver 4:0:0:0 +} +.assembly extern FSharp.Core +{ + .publickeytoken = (B0 3F 5F 7F 11 D5 0A 3A ) // .?_....: + .ver 4:5:0:0 +} +.assembly ValueTupleAliasConstructor +{ + .custom instance void [FSharp.Core]Microsoft.FSharp.Core.FSharpInterfaceDataVersionAttribute::.ctor(int32, + int32, + int32) = ( 01 00 02 00 00 00 00 00 00 00 00 00 00 00 00 00 ) + + // --- The following custom attribute is added automatically, do not uncomment ------- + // .custom instance void [mscorlib]System.Diagnostics.DebuggableAttribute::.ctor(valuetype [mscorlib]System.Diagnostics.DebuggableAttribute/DebuggingModes) = ( 01 00 01 00 00 00 00 00 ) + + .hash algorithm 0x00008004 + .ver 0:0:0:0 +} +.mresource public FSharpSignatureData.ValueTupleAliasConstructor +{ + // Offset: 0x00000000 Length: 0x000001EA +} +.mresource public FSharpOptimizationData.ValueTupleAliasConstructor +{ + // Offset: 0x000001F0 Length: 0x00000061 +} +.module ValueTupleAliasConstructor.exe +// MVID: {5C136441-E59F-7FAD-A745-03834164135C} +.imagebase 0x00400000 +.file alignment 0x00000200 +.stackreserve 0x00100000 +.subsystem 0x0003 // WINDOWS_CUI +.corflags 0x00000001 // ILONLY +// Image base: 0x01150000 + + +// =============== CLASS MEMBERS DECLARATION =================== + +.class public abstract auto ansi sealed ValueTupleAliasConstructor + extends [mscorlib]System.Object +{ + .custom instance void [FSharp.Core]Microsoft.FSharp.Core.CompilationMappingAttribute::.ctor(valuetype [FSharp.Core]Microsoft.FSharp.Core.SourceConstructFlags) = ( 01 00 07 00 00 00 00 00 ) +} // end of class ValueTupleAliasConstructor + +.class private abstract auto ansi sealed ''.$ValueTupleAliasConstructor + extends [mscorlib]System.Object +{ + .field static assembly int32 init@ + .custom instance void [mscorlib]System.Diagnostics.DebuggerBrowsableAttribute::.ctor(valuetype [mscorlib]System.Diagnostics.DebuggerBrowsableState) = ( 01 00 00 00 00 00 00 00 ) + .custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 ) + .custom instance void [mscorlib]System.Diagnostics.DebuggerNonUserCodeAttribute::.ctor() = ( 01 00 00 00 ) + .method public static void main@() cil managed + { + .entrypoint + // Code size 9 (0x9) + .maxstack 8 + .language '{AB4F38C9-B6E6-43BA-BE3B-58080B2CCCE3}', '{994B45C4-E6E9-11D2-903F-00C04FA302A1}', '{5A869D0B-6611-11D3-BD2A-0000F80849BD}' + .line 3,3 : 9,22 'c:\\kevinransom\\visualfsharp\\tests\\fsharpqa\\Source\\CodeGen\\EmittedIL\\Tuples\\ValueTupleAliasConstructor.fs' + IL_0000: ldc.i4.2 + IL_0001: ldc.i4.2 + IL_0002: newobj instance void valuetype [mscorlib]System.ValueTuple`2::.ctor(!0, + !1) + IL_0007: pop + IL_0008: ret + } // end of method $ValueTupleAliasConstructor::main@ + +} // end of class ''.$ValueTupleAliasConstructor + + +// ============================================================= + +// *********** DISASSEMBLY COMPLETE *********************** diff --git a/tests/fsharpqa/testenv/src/ILComparer/Program.fs b/tests/fsharpqa/testenv/src/ILComparer/Program.fs index 1b2d33b24c3..3673f6fd57c 100644 --- a/tests/fsharpqa/testenv/src/ILComparer/Program.fs +++ b/tests/fsharpqa/testenv/src/ILComparer/Program.fs @@ -3,9 +3,6 @@ open System.IO [] let main (argv : string array) = - let fn1 = argv.[0] - let fn2 = argv.[1] - // Read file into an array let File2List (filename:string) = use s = new StreamReader(filename) @@ -16,9 +13,6 @@ let main (argv : string array) = if not isblank_or_comment then l <- List.append l ( line :: []) l - let f1 = File2List fn1 - let f2 = File2List fn2 - let rec compareAux (f1:string list) (f2:string list) i = match f1, f2 with | a :: resta, b :: restb -> @@ -73,4 +67,22 @@ let main (argv : string array) = printfn "%s" (e.ToString()) false - exit (if compare f1 f2 then 0 else 1) + let fn1 = argv.[0] + let fn2 = argv.[1] + let fn3 = argv.[0] + ".net47" + + let f2 = File2List fn2 + + // Check to see if fn1+".net47" exists, if so check this baseline first if not equal then check fn1 baseline + // the fn1 + ".net47" baseline exists in the rare case where il produced has changed for example valuetuple moved form system.valuetuple.dll to mscorlib.dll, making baselines tricky + let result = + if File.Exists(fn3) then + let f3 = File2List fn3 + if compare f3 f2 then 0 else 1 + else + 1 + if result = 0 then + exit 0 + else + let f1 = File2List fn1 + exit (if compare f1 f2 then 0 else 1) From 4a9274bb3de5e802af64af2e358932ac02e52007 Mon Sep 17 00:00:00 2001 From: Don Syme Date: Sat, 15 Dec 2018 08:40:47 +0000 Subject: [PATCH 131/160] try to re-enable fcs tests (#5703) --- .vsts-pr.yaml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.vsts-pr.yaml b/.vsts-pr.yaml index c722dd1662d..37246474bf7 100644 --- a/.vsts-pr.yaml +++ b/.vsts-pr.yaml @@ -10,9 +10,9 @@ jobs: _command: make _args: Configuration=release # disabled until it can be properly fixed - #release_fcs: - # _command: ./fcs/build.sh - # _args: Build + release_fcs: + _command: ./fcs/build.sh + _args: Build steps: - script: $(_command) $(_args) - task: PublishBuildArtifacts@1 From 3f8bcb2120e75e842c8ab567ab2ee32cd087c11d Mon Sep 17 00:00:00 2001 From: Will Smith Date: Sat, 15 Dec 2018 15:13:27 -0800 Subject: [PATCH 132/160] Initial benchmarking --- benchmarks/Benchmarks.sln | 37 ++++++++++++ benchmarks/Benchmarks/Benchmarks.fsproj | 12 ++++ benchmarks/Benchmarks/Program.fs | 8 +++ .../CompilerServiceBenchmarks.fsproj | 21 +++++++ .../CompilerServiceBenchmarks/Program.fs | 60 +++++++++++++++++++ 5 files changed, 138 insertions(+) create mode 100644 benchmarks/Benchmarks.sln create mode 100644 benchmarks/Benchmarks/Benchmarks.fsproj create mode 100644 benchmarks/Benchmarks/Program.fs create mode 100644 benchmarks/CompilerServiceBenchmarks/CompilerServiceBenchmarks.fsproj create mode 100644 benchmarks/CompilerServiceBenchmarks/Program.fs diff --git a/benchmarks/Benchmarks.sln b/benchmarks/Benchmarks.sln new file mode 100644 index 00000000000..5d339f7a99f --- /dev/null +++ b/benchmarks/Benchmarks.sln @@ -0,0 +1,37 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 15 +VisualStudioVersion = 15.0.28307.136 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "CompilerServiceBenchmarks", "CompilerServiceBenchmarks\CompilerServiceBenchmarks.fsproj", "{9A3C565C-B514-4AE0-8B01-CA80E8453EB0}" +EndProject +Project("{6EC3EE1D-3C4E-46DD-8F32-0CC8E7565705}") = "FSharp.Core", "..\src\fsharp\FSharp.Core\FSharp.Core.fsproj", "{BB9EAE76-194A-49D8-9618-586CBE7031D9}" +EndProject +Project("{6EC3EE1D-3C4E-46DD-8F32-0CC8E7565705}") = "FSharp.Compiler.Private", "..\src\fsharp\FSharp.Compiler.Private\FSharp.Compiler.Private.fsproj", "{F57B02B1-CF26-4D93-9211-8CEB4F1572F0}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {9A3C565C-B514-4AE0-8B01-CA80E8453EB0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {9A3C565C-B514-4AE0-8B01-CA80E8453EB0}.Debug|Any CPU.Build.0 = Debug|Any CPU + {9A3C565C-B514-4AE0-8B01-CA80E8453EB0}.Release|Any CPU.ActiveCfg = Release|Any CPU + {9A3C565C-B514-4AE0-8B01-CA80E8453EB0}.Release|Any CPU.Build.0 = Release|Any CPU + {BB9EAE76-194A-49D8-9618-586CBE7031D9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {BB9EAE76-194A-49D8-9618-586CBE7031D9}.Debug|Any CPU.Build.0 = Debug|Any CPU + {BB9EAE76-194A-49D8-9618-586CBE7031D9}.Release|Any CPU.ActiveCfg = Release|Any CPU + {BB9EAE76-194A-49D8-9618-586CBE7031D9}.Release|Any CPU.Build.0 = Release|Any CPU + {F57B02B1-CF26-4D93-9211-8CEB4F1572F0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F57B02B1-CF26-4D93-9211-8CEB4F1572F0}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F57B02B1-CF26-4D93-9211-8CEB4F1572F0}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F57B02B1-CF26-4D93-9211-8CEB4F1572F0}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {049A4D02-709F-418C-AD59-7FB0DBE956B1} + EndGlobalSection +EndGlobal diff --git a/benchmarks/Benchmarks/Benchmarks.fsproj b/benchmarks/Benchmarks/Benchmarks.fsproj new file mode 100644 index 00000000000..99c5133a5a3 --- /dev/null +++ b/benchmarks/Benchmarks/Benchmarks.fsproj @@ -0,0 +1,12 @@ + + + + Exe + netcoreapp2.1 + + + + + + + diff --git a/benchmarks/Benchmarks/Program.fs b/benchmarks/Benchmarks/Program.fs new file mode 100644 index 00000000000..a7458f52201 --- /dev/null +++ b/benchmarks/Benchmarks/Program.fs @@ -0,0 +1,8 @@ +// Learn more about F# at http://fsharp.org + +open System + +[] +let main argv = + printfn "Hello World from F#!" + 0 // return an integer exit code diff --git a/benchmarks/CompilerServiceBenchmarks/CompilerServiceBenchmarks.fsproj b/benchmarks/CompilerServiceBenchmarks/CompilerServiceBenchmarks.fsproj new file mode 100644 index 00000000000..fcdd08995e3 --- /dev/null +++ b/benchmarks/CompilerServiceBenchmarks/CompilerServiceBenchmarks.fsproj @@ -0,0 +1,21 @@ + + + + Exe + net472 + + + + + + + + + + + + + + + + diff --git a/benchmarks/CompilerServiceBenchmarks/Program.fs b/benchmarks/CompilerServiceBenchmarks/Program.fs new file mode 100644 index 00000000000..f32bfbdaac5 --- /dev/null +++ b/benchmarks/CompilerServiceBenchmarks/Program.fs @@ -0,0 +1,60 @@ +open System +open System.IO +open BenchmarkDotNet.Attributes +open BenchmarkDotNet.Running +open Microsoft.FSharp.Compiler.ErrorLogger +open Microsoft.FSharp.Compiler.SourceCodeServices +open System.Text + +[] +type CompilerServiceParsing() = + + let mutable checkerOpt = None + + let mutable sourceOpt = None + + let parsingOptions = + { + SourceFiles = [|"TypeChecker.fs"|] + ConditionalCompilationDefines = [] + ErrorSeverityOptions = FSharpErrorSeverityOptions.Default + IsInteractive = false + LightSyntax = None + CompilingFsLib = false + IsExe = false + } + + [] + member __.Setup() = + match checkerOpt with + | None -> checkerOpt <- Some(FSharpChecker.Create()) + | _ -> () + + match sourceOpt with + | None -> + let source = File.ReadAllText("""C:\visualfsharp\src\fsharp\TypeChecker.fs""") + sourceOpt <- Some(source) + | _ -> () + + [] + member __.ParsingSetup() = + match checkerOpt with + | None -> failwith "no checker" + | Some(checker) -> + checker.InvalidateAll() + checker.ClearLanguageServiceRootCachesAndCollectAndFinalizeAllTransients() + checker.ParseFile("dummy.fs", "dummy", parsingOptions) |> Async.RunSynchronously |> ignore + + [] + member __.Parsing() = + match checkerOpt, sourceOpt with + | None, _ -> failwith "no checker" + | _, None -> failwith "no source" + | Some(checker), Some(source) -> + let results = checker.ParseFile("TypeChecker.fs", source, parsingOptions) |> Async.RunSynchronously + if results.ParseHadErrors then failwithf "parse had errors: %A" results.Errors + +[] +let main argv = + let _ = BenchmarkRunner.Run() + 0 From e13a1ec8596a650cbac27d9cef2bfd3ab99db694 Mon Sep 17 00:00:00 2001 From: Will Smith Date: Sat, 15 Dec 2018 15:51:41 -0800 Subject: [PATCH 133/160] Removing unused files --- benchmarks/Benchmarks/Benchmarks.fsproj | 12 ------------ benchmarks/Benchmarks/Program.fs | 8 -------- 2 files changed, 20 deletions(-) delete mode 100644 benchmarks/Benchmarks/Benchmarks.fsproj delete mode 100644 benchmarks/Benchmarks/Program.fs diff --git a/benchmarks/Benchmarks/Benchmarks.fsproj b/benchmarks/Benchmarks/Benchmarks.fsproj deleted file mode 100644 index 99c5133a5a3..00000000000 --- a/benchmarks/Benchmarks/Benchmarks.fsproj +++ /dev/null @@ -1,12 +0,0 @@ - - - - Exe - netcoreapp2.1 - - - - - - - diff --git a/benchmarks/Benchmarks/Program.fs b/benchmarks/Benchmarks/Program.fs deleted file mode 100644 index a7458f52201..00000000000 --- a/benchmarks/Benchmarks/Program.fs +++ /dev/null @@ -1,8 +0,0 @@ -// Learn more about F# at http://fsharp.org - -open System - -[] -let main argv = - printfn "Hello World from F#!" - 0 // return an integer exit code From 3974de0c5e3a19935eb33dbb23502e9a7a98399e Mon Sep 17 00:00:00 2001 From: Will Smith Date: Sat, 15 Dec 2018 16:38:42 -0800 Subject: [PATCH 134/160] Fixing path --- benchmarks/CompilerServiceBenchmarks/Program.fs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/benchmarks/CompilerServiceBenchmarks/Program.fs b/benchmarks/CompilerServiceBenchmarks/Program.fs index f32bfbdaac5..d5e45275775 100644 --- a/benchmarks/CompilerServiceBenchmarks/Program.fs +++ b/benchmarks/CompilerServiceBenchmarks/Program.fs @@ -32,7 +32,7 @@ type CompilerServiceParsing() = match sourceOpt with | None -> - let source = File.ReadAllText("""C:\visualfsharp\src\fsharp\TypeChecker.fs""") + let source = File.ReadAllText("""..\..\..\..\..\src\fsharp\TypeChecker.fs""") sourceOpt <- Some(source) | _ -> () From b0351f1324f486664fbbaf83708f8831c2a63f9b Mon Sep 17 00:00:00 2001 From: Phillip Carter Date: Tue, 18 Dec 2018 16:04:26 -0800 Subject: [PATCH 135/160] Remove quickparse from VS.FSI (#5841) --- .../src/FSharp.VS.FSI/FSharp.VS.FSI.fsproj | 1 - vsintegration/src/FSharp.VS.FSI/quickparse.fs | 80 ------------------- 2 files changed, 81 deletions(-) delete mode 100644 vsintegration/src/FSharp.VS.FSI/quickparse.fs diff --git a/vsintegration/src/FSharp.VS.FSI/FSharp.VS.FSI.fsproj b/vsintegration/src/FSharp.VS.FSI/FSharp.VS.FSI.fsproj index 659932a17ee..ff45634d032 100644 --- a/vsintegration/src/FSharp.VS.FSI/FSharp.VS.FSI.fsproj +++ b/vsintegration/src/FSharp.VS.FSI/FSharp.VS.FSI.fsproj @@ -29,7 +29,6 @@ CompilerLocationUtils.fs - diff --git a/vsintegration/src/FSharp.VS.FSI/quickparse.fs b/vsintegration/src/FSharp.VS.FSI/quickparse.fs deleted file mode 100644 index 9099134a660..00000000000 --- a/vsintegration/src/FSharp.VS.FSI/quickparse.fs +++ /dev/null @@ -1,80 +0,0 @@ -// Copyright (c) Microsoft Corporation. All Rights Reserved. See License.txt in the project root for license information. - -namespace Microsoft.VisualStudio.FSharp.Interactive -open System.Globalization - -// Duplication note: -// Inlined from Language Service. -// If/when there is a common DLL this code can be shared. - -/// Methods for cheaply and innacurately parsing F# -module internal QuickParse = - /// The characters that are allowed to be in an identifier. - let private IsIdentifierPartCharacter c = - let cat = System.Char.GetUnicodeCategory(c) - ( - // Letters - cat = UnicodeCategory.UppercaseLetter - || cat = UnicodeCategory.LowercaseLetter - || cat = UnicodeCategory.TitlecaseLetter - || cat = UnicodeCategory.ModifierLetter - || cat = UnicodeCategory.OtherLetter - || cat = UnicodeCategory.LetterNumber - // Numbers - || cat = UnicodeCategory.DecimalDigitNumber - // Connectors - || cat = UnicodeCategory.ConnectorPunctuation - // Combiners - || cat = UnicodeCategory.NonSpacingMark - || cat = UnicodeCategory.SpacingCombiningMark - ) - /// Is this character a part of a long identifier - let private IsLongIdentifierPartCharacter c = - (IsIdentifierPartCharacter c) || (c='.') - /// Given a line of text and an index into the line return the - /// "island" of text that could be an identifier around index. - let GetIdentifierIsland(line:string,index)= - if index=0 && IsLongIdentifierPartCharacter line.[left] do left<-left-1 - while right Date: Tue, 18 Dec 2018 20:57:02 -0800 Subject: [PATCH 136/160] reshape the output directory to match divisional standards (#5985) --- .gitignore | 14 +- .vsts-pr.yaml | 6 +- .vsts-signed.yaml | 10 +- FSharpBuild.Directory.Build.props | 13 +- FSharpBuild.Directory.Build.targets | 36 ---- FSharpTests.Directory.Build.props | 43 ++-- Makefile | 21 +- PublishToBlob.proj | 2 +- artifacts/.gitignore | 1 - build.cmd | 197 ++++++++++++------ build/config/AssemblySignToolData.json | 76 +++---- build/config/InsertionSignToolData.json | 10 +- build/config/PackageSignToolData.json | 3 +- build/projects/Signing.proj | 4 +- build/targets/ConvertPortablePdbs.targets | 21 +- .../GenerateAssemblyAttributes.targets | 3 +- build/targets/PackageVersions.props | 2 +- fcs/Directory.Build.props | 10 +- ...FSharp.Compiler.Service.MSBuild.v12.fsproj | 1 - ...arp.Compiler.Service.ProjectCracker.fsproj | 8 +- ...Compiler.Service.ProjectCrackerTool.fsproj | 1 - .../FSharp.Compiler.Service.Tests.fsproj | 2 +- .../FSharp.Compiler.Service.fsproj | 1 - fcs/build.fsx | 6 +- fsharp.proj | 77 ++++--- init-tools.cmd | 2 +- proto.proj | 2 +- setup/Directory.Build.props | 13 +- setup/Directory.Build.targets | 1 - setup/FSharp.Setup.props | 142 ------------- setup/Localization.props | 120 +++++++++++ setup/Swix/Directory.Build.props | 6 +- setup/Swix/Directory.Build.targets | 7 + .../Files.swr | 8 +- ...crosoft.FSharp.Compiler.Resources.swixproj | 1 + .../Swix/Microsoft.FSharp.Compiler/Files.swr | 50 ++--- .../Microsoft.FSharp.Compiler.swixproj | 1 + .../Microsoft.FSharp.Dependencies/Files.swr | 16 +- .../Microsoft.FSharp.Dependencies.swixproj | 2 + setup/Swix/Microsoft.FSharp.IDE/Files.swr | 10 +- .../Microsoft.FSharp.IDE.swixproj | 2 +- .../Microsoft.FSharp.Vsix.Resources/Files.swr | 22 +- .../Microsoft.FSharp.Vsix.Resources.swixproj | 1 + .../Templates.swr | 6 +- setup/Swix/Microsoft.FSharp.vsmanproj | 18 +- setup/publish-assets.ps1 | 5 +- .../Microsoft.FSharp.NetSdk.Shim.props | 0 .../Microsoft.FSharp.NetSdk.Shim.targets | 0 ...osoft.FSharp.Overrides.NetSdk.Shim.targets | 0 .../Microsoft.FSharp.Shim.targets | 0 .../Microsoft.Portable.FSharp.Shim.targets | 0 src/buildtools/Directory.Build.props | 2 +- src/buildtools/Directory.Build.targets | 2 +- src/buildtools/buildtools.targets | 4 +- src/fsharp/Directory.Build.props | 1 + src/fsharp/Directory.Nuget.props | 1 + src/fsharp/Directory.Nuget.targets | 10 - .../FSharp.Compiler.Private.fsproj | 17 +- .../Directory.Build.targets | 4 +- .../Microsoft.FSharp.Compiler.nuspec | 44 ++-- src/fsharp/FSharp.Core/FSharp.Core.nuspec | 20 +- src/fsharp/{Fsc => fsc}/InternalsVisibleTo.fs | 0 src/fsharp/{Fsc => fsc}/app.config | 0 src/fsharp/{Fsc/Fsc.fsproj => fsc/fsc.fsproj} | 0 src/fsharp/fsi/{Fsi.fsproj => fsi.fsproj} | 2 +- .../{FsiAnyCPU.fsproj => fsiAnyCpu.fsproj} | 0 tests/.gitignore | 1 - tests/FSharp.Directory.Build.props | 6 - tests/fsharp/SDKTests/AllSdkTargetsTests.proj | 2 +- tests/fsharp/SDKTests/tests/Test.props | 6 +- tests/fsharp/SDKTests/tests/Test.targets | 2 +- tests/fsharp/Test.Directory.Build.props | 8 - tests/fsharp/single-test.fs | 16 +- tests/fsharp/test-framework.fs | 44 ++-- tests/fsharp/tests.fs | 18 +- .../Source/CodeGen/EmittedIL/CompareIL.cmd | 4 +- tests/fsharpqa/Source/run.pl | 4 +- tests/service/FscTests.fs | 2 +- verify-translations.cmd | 2 +- vsintegration/ItemTemplates/.gitignore | 2 + vsintegration/ProjectTemplates/.gitignore | 2 + vsintegration/Templates.Directory.Build.props | 6 + .../Templates.Directory.Build.targets | 17 ++ vsintegration/Vsix/Directory.Build.targets | 5 + .../VisualFSharpFull/VisualFSharpFull.csproj | 6 +- vsintegration/src/Directory.Build.props | 9 + .../FSharp.PropertiesPages.vbproj | 4 +- .../GetTypesVSUnitTests.fsproj | 3 + vsintegration/tests/Salsa/salsa.fs | 6 +- .../Tests.LanguageService.ParameterInfo.fs | 22 +- vsintegration/tests/UnitTests/Tests.Build.fs | 100 ++++++--- .../UnitTests/VisualFSharp.UnitTests.fsproj | 20 ++ 92 files changed, 761 insertions(+), 666 deletions(-) delete mode 100644 artifacts/.gitignore delete mode 100644 setup/FSharp.Setup.props create mode 100644 setup/Localization.props rename setup/{resources => shims}/Microsoft.FSharp.NetSdk.Shim.props (100%) rename setup/{resources => shims}/Microsoft.FSharp.NetSdk.Shim.targets (100%) rename setup/{resources => shims}/Microsoft.FSharp.Overrides.NetSdk.Shim.targets (100%) rename setup/{resources => shims}/Microsoft.FSharp.Shim.targets (100%) rename setup/{resources => shims}/Microsoft.Portable.FSharp.Shim.targets (100%) rename src/fsharp/{Fsc => fsc}/InternalsVisibleTo.fs (100%) rename src/fsharp/{Fsc => fsc}/app.config (100%) rename src/fsharp/{Fsc/Fsc.fsproj => fsc/fsc.fsproj} (100%) rename src/fsharp/fsi/{Fsi.fsproj => fsi.fsproj} (96%) rename src/fsharp/fsiAnyCpu/{FsiAnyCPU.fsproj => fsiAnyCpu.fsproj} (100%) delete mode 100644 tests/fsharp/Test.Directory.Build.props create mode 100644 vsintegration/ItemTemplates/.gitignore create mode 100644 vsintegration/ProjectTemplates/.gitignore create mode 100644 vsintegration/src/Directory.Build.props diff --git a/.gitignore b/.gitignore index 9ab09dfa936..28d53ff4e47 100644 --- a/.gitignore +++ b/.gitignore @@ -1,12 +1,7 @@ -# Downloaded packages and build tools. -/lkg -/packages -/Tools +# output location +artifacts/ /tests/scripts/current -/release -/debug -/Proto # auto-generated during the build global.json @@ -88,9 +83,6 @@ lib/bootstrap/4.1/policy* obj/ bin/ aclocal.m4 -Debug -Release -Proto sign_temp .libs configure @@ -114,7 +106,6 @@ ossreadme*.txt *.cto *.vstman project.lock.json -Tools/ Backup/ tests/fsharp/core/array/dont.run.peverify tests/fsharp/core/innerpoly/dont.run.peverify @@ -123,7 +114,6 @@ times /tests/fsharpqa/testenv/bin/System.ValueTuple.dll source_link.json .vs/ -/VSRelease/net40/bin System.ValueTuple.dll tests/fsharpqa/testenv/bin/System.ValueTuple.dll */.fake diff --git a/.vsts-pr.yaml b/.vsts-pr.yaml index 37246474bf7..44c277a3943 100644 --- a/.vsts-pr.yaml +++ b/.vsts-pr.yaml @@ -17,7 +17,7 @@ jobs: - script: $(_command) $(_args) - task: PublishBuildArtifacts@1 inputs: - PathtoPublish: '$(Build.SourcesDirectory)/tests/TestResults' + PathtoPublish: '$(Build.SourcesDirectory)/artifacts/TestResults' ArtifactName: 'Linux $(_command) $(_args)' publishLocation: Container continueOnError: true @@ -26,7 +26,7 @@ jobs: - job: Windows pool: vmImage: vs2017-win2016 - timeoutInMinutes: 90 + timeoutInMinutes: 120 strategy: maxParallel: 7 matrix: @@ -55,7 +55,7 @@ jobs: - script: $(_command) $(_args) - task: PublishBuildArtifacts@1 inputs: - PathtoPublish: '$(Build.SourcesDirectory)\tests\TestResults' + PathtoPublish: '$(Build.SourcesDirectory)\artifacts\TestResults' ArtifactName: 'Windows $(_command) $(_args)' publishLocation: Container continueOnError: true diff --git a/.vsts-signed.yaml b/.vsts-signed.yaml index 82b5d247362..25d7642cf09 100644 --- a/.vsts-signed.yaml +++ b/.vsts-signed.yaml @@ -29,7 +29,7 @@ jobs: displayName: Publish nightly package to MyGet inputs: scriptName: 'setup\publish-assets.ps1' - arguments: '-binariesPath $(MSBuildConfiguration) -branchName $(Build.SourceBranch) -apiKey $(FSharp.MyGetApiKey)' + arguments: '-binariesPath artifacts\bin -configuration $(MSBuildConfiguration) -branchName $(Build.SourceBranch) -apiKey $(FSharp.MyGetApiKey)' condition: and(succeeded(), contains(variables['PB_PublishType'], 'myget')) # Publish packages to Azure Blob Storage @@ -44,7 +44,7 @@ jobs: - task: PublishBuildArtifacts@1 displayName: Create static drop inputs: - PathtoPublish: '$(MSBuildConfiguration)' + PathtoPublish: 'artifacts' ArtifactName: '$(Build.BuildNumber)' publishLocation: FilePath TargetPath: '$(DropRoot)\$(Build.DefinitionName)\$(Build.SourceBranchName)' @@ -58,7 +58,7 @@ jobs: inputs: SymbolsPath: '$(DropRoot)\$(Build.DefinitionName)\$(Build.SourceBranchName)\$(Build.BuildNumber)\Symbols' SearchPattern: '**\*.dll;**\*.exe;**\*.pdb' - SymbolsFolder: '$(Build.SourcesDirectory)\$(MSBuildConfiguration)' + SymbolsFolder: '$(Build.SourcesDirectory)\artifacts\SymStore' TreatNotIndexedAsWarning: true SymbolsProduct: '$(Build.DefinitionName)' SymbolsVersion: '$(Build.BuildNumber)' @@ -69,7 +69,7 @@ jobs: - task: ms-vseng.MicroBuildTasks.4305a8de-ba66-4d8b-b2d1-0dc4ecbbf5e8.MicroBuildUploadVstsDropFolder@1 displayName: Upload VSTS Drop inputs: - DropFolder: '$(Build.SourcesDirectory)\$(MSBuildConfiguration)\insertion' + DropFolder: '$(Build.SourcesDirectory)\artifacts\VSSetup\$(MSBuildConfiguration)\Insertion' condition: and(succeeded(), contains(variables['PB_PublishType'], 'vsts')) # Execute cleanup tasks @@ -91,6 +91,6 @@ jobs: displayName: Publish symbols to SymWeb inputs: symbolServiceURI: 'https://microsoft.artifacts.visualstudio.com/DefaultCollection' - sourcePath: '$(DropRoot)\$(Build.DefinitionName)\$(Build.SourceBranchName)\$(Build.BuildNumber)\Symbols' + sourcePath: '$(DropRoot)\$(Build.DefinitionName)\$(Build.SourceBranchName)\$(Build.BuildNumber)\SymStore' usePat: false condition: and(succeeded(), contains(variables['PB_PublishType'], 'symweb')) diff --git a/FSharpBuild.Directory.Build.props b/FSharpBuild.Directory.Build.props index 81701799796..c5e4108181c 100644 --- a/FSharpBuild.Directory.Build.props +++ b/FSharpBuild.Directory.Build.props @@ -10,9 +10,16 @@ Debug $(MSBuildThisFileDirectory) $(RepoRoot)src - $(RepoRoot)Tools - $(RepoRoot)Proto\net40\bin - $(RepoRoot)Proto\coreclr\bin + $(RepoRoot)artifacts + $(ArtifactsDir)\toolset + $(ArtifactsDir)\bin + $(ArtifactsDir)\obj + $(ArtifactsDir)\packages + $(ArtifactsBinDir)\$(MSBuildProjectName) + $(ArtifactsObjDir)\$(MSBuildProjectName) + $(ArtifactsDir)\SymStore + $(ArtifactsBinDir)\fsc\Proto\net46 + $(ArtifactsBinDir)/fsc/Proto/netcoreapp2.1 4.4.0 diff --git a/FSharpBuild.Directory.Build.targets b/FSharpBuild.Directory.Build.targets index 375416e5cf3..ef7f82861c5 100644 --- a/FSharpBuild.Directory.Build.targets +++ b/FSharpBuild.Directory.Build.targets @@ -34,42 +34,6 @@ - - - - - coreclr - net40 - $(MSBuildProjectDirectory)\$(OutputPath) - $(OutputPath) - $(RepoRoot)$(Configuration)\$(TargetDotnetProfile)\bin - $(RepoRoot)$(Configuration)\$(TargetDotnetProfile)\obj - - - - - - - - - - - - - - - - diff --git a/FSharpTests.Directory.Build.props b/FSharpTests.Directory.Build.props index eb20065bec2..d9fc35fc05d 100644 --- a/FSharpTests.Directory.Build.props +++ b/FSharpTests.Directory.Build.props @@ -1,48 +1,43 @@ - - - <_FSharpCompilerPath>$(MSBuildThisFileDirectory)$(Configuration)/net40/bin - + true - $(_FSharpCompilerPath) + $(MSBuildThisFileDirectory)artifacts\bin\fsc\$(Configuration)\net46 fsc.exe - $(_FSharpCompilerPath) + $(MSBuildThisFileDirectory)artifacts\bin\fsi\$(Configuration)\net46 fsi.exe - - - <_FSharpCompilerPath>$(MSBuildThisFileDirectory)$(Configuration)/coreclr/bin - + true - $(MSBuildThisFileDirectory)Tools/dotnet20 + + $(MSBuildThisFileDirectory)artifacts\toolset\dotnet dotnet.exe dotnet - $(_FSharpCompilerPath)/fsc.exe + $(MSBuildThisFileDirectory)artifacts\bin\fsc\$(Configuration)\netcoreapp2.1\fsc.exe - $(MSBuildThisFileDirectory)Tools/dotnet20 + $(MSBuildThisFileDirectory)artifacts\toolset\dotnet dotnet.exe dotnet - $(_FSharpCompilerPath)/fsi.exe + $(MSBuildThisFileDirectory)artifacts\bin\fsi\$(Configuration)\netcoreapp2.0\fsi.exe - $(_FSharpCompilerPath)/Microsoft.FSharp.Targets - $(_FSharpCompilerPath)/Microsoft.FSharp.NetSdk.props - $(_FSharpCompilerPath)/Microsoft.FSharp.NetSdk.targets - $(_FSharpCompilerPath)/Microsoft.FSharp.Overrides.NetSdk.targets - + <_FSharpBuildTargetFramework Condition="'$(FSharpTestCompilerVersion)' == 'net40'">net46 + <_FSharpBuildTargetFramework Condition="'$(FSharpTestCompilerVersion)' == 'coreclr'">netstandard2.0 + <_FSharpBuildBinPath>$(MSBuildThisFileDirectory)artifacts\bin\FSharp.Build\$(Configuration)\$(_FSharpBuildTargetFramework) + $(_FSharpBuildBinPath)\FSharp.Build.dll - - - $(MSBuildThisFileDirectory)$(Configuration)\coreclr\bin\FSharp.Build.dll - $(MSBuildThisFileDirectory)$(Configuration)\net40\bin\FSharp.Build.dll + $(_FSharpBuildBinPath)/Microsoft.FSharp.Targets + $(_FSharpBuildBinPath)/Microsoft.FSharp.NetSdk.props + $(_FSharpBuildBinPath)/Microsoft.FSharp.NetSdk.targets + $(_FSharpBuildBinPath)/Microsoft.FSharp.Overrides.NetSdk.targets - \ No newline at end of file + + diff --git a/Makefile b/Makefile index d596299cb57..e402025e0ef 100644 --- a/Makefile +++ b/Makefile @@ -1,11 +1,12 @@ Configuration ?= release DotNetVersion = `cat DotnetCLIToolsVersion.txt` -DotNetExe = "$(CURDIR)/Tools/dotnet20/dotnet" +DotNetToolPath = $(CURDIR)/artifacts/toolset/dotnet +DotNetExe = "$(DotNetToolPath)/dotnet" all: proto restore build test tools: - $(CURDIR)/scripts/dotnet-install.sh --version $(DotNetVersion) --install-dir $(CURDIR)/Tools/dotnet20 + $(CURDIR)/scripts/dotnet-install.sh --version $(DotNetVersion) --install-dir "$(DotNetToolPath)" global.json: tools echo { \"sdk\": { \"version\": \"$(DotNetVersion)\" } }>global.json @@ -14,18 +15,18 @@ proto: global.json $(DotNetExe) build-server shutdown $(DotNetExe) restore src/buildtools/buildtools.proj $(DotNetExe) restore src/fsharp/FSharp.Build/FSharp.Build.fsproj - $(DotNetExe) restore src/fsharp/Fsc/Fsc.fsproj + $(DotNetExe) restore src/fsharp/fsc/fsc.fsproj $(DotNetExe) build src/buildtools/buildtools.proj -c Proto $(DotNetExe) build src/fsharp/FSharp.Build/FSharp.Build.fsproj -f netstandard2.0 -c Proto - $(DotNetExe) build src/fsharp/Fsc/Fsc.fsproj -f netcoreapp2.1 -c Proto + $(DotNetExe) build src/fsharp/fsc/fsc.fsproj -f netcoreapp2.1 -c Proto restore: global.json $(DotNetExe) restore src/fsharp/FSharp.Core/FSharp.Core.fsproj $(DotNetExe) restore src/fsharp/FSharp.Build/FSharp.Build.fsproj $(DotNetExe) restore src/fsharp/FSharp.Compiler.Private/FSharp.Compiler.Private.fsproj - $(DotNetExe) restore src/fsharp/Fsc/Fsc.fsproj + $(DotNetExe) restore src/fsharp/fsc/fsc.fsproj $(DotNetExe) restore src/fsharp/FSharp.Compiler.Interactive.Settings/FSharp.Compiler.Interactive.Settings.fsproj - $(DotNetExe) restore src/fsharp/fsi/Fsi.fsproj + $(DotNetExe) restore src/fsharp/fsi/fsi.fsproj $(DotNetExe) restore tests/FSharp.Core.UnitTests/FSharp.Core.UnitTests.fsproj $(DotNetExe) restore tests/FSharp.Build.UnitTests/FSharp.Build.UnitTests.fsproj @@ -34,9 +35,9 @@ build: proto restore $(DotNetExe) build -c $(Configuration) -f netstandard1.6 src/fsharp/FSharp.Core/FSharp.Core.fsproj $(DotNetExe) build -c $(Configuration) -f netstandard2.0 src/fsharp/FSharp.Build/FSharp.Build.fsproj $(DotNetExe) build -c $(Configuration) -f netstandard1.6 src/fsharp/FSharp.Compiler.Private/FSharp.Compiler.Private.fsproj - $(DotNetExe) build -c $(Configuration) -f netcoreapp2.1 src/fsharp/Fsc/Fsc.fsproj + $(DotNetExe) build -c $(Configuration) -f netcoreapp2.1 src/fsharp/fsc/fsc.fsproj $(DotNetExe) build -c $(Configuration) -f netstandard1.6 src/fsharp/FSharp.Compiler.Interactive.Settings/FSharp.Compiler.Interactive.Settings.fsproj - $(DotNetExe) build -c $(Configuration) -f netcoreapp2.0 src/fsharp/fsi/Fsi.fsproj + $(DotNetExe) build -c $(Configuration) -f netcoreapp2.0 src/fsharp/fsi/fsi.fsproj $(DotNetExe) build -c $(Configuration) -f netcoreapp2.0 tests/FSharp.Core.UnitTests/FSharp.Core.UnitTests.fsproj $(DotNetExe) build -c $(Configuration) -f netcoreapp2.0 tests/FSharp.Build.UnitTests/FSharp.Build.UnitTests.fsproj @@ -45,6 +46,4 @@ test: build $(DotNetExe) test -f netcoreapp2.0 -c $(Configuration) --no-restore --no-build tests/FSharp.Build.UnitTests/FSharp.Build.UnitTests.fsproj -l "trx;LogFileName=$(CURDIR)/tests/TestResults/FSharp.Build.UnitTests.coreclr.trx" clean: - rm -rf $(CURDIR)/Proto - rm -rf $(CURDIR)/debug - rm -rf $(CURDIR)/release + rm -rf $(CURDIR)/artifacts diff --git a/PublishToBlob.proj b/PublishToBlob.proj index 00bcee63359..71fbfad44ed 100644 --- a/PublishToBlob.proj +++ b/PublishToBlob.proj @@ -17,7 +17,7 @@ - + diff --git a/artifacts/.gitignore b/artifacts/.gitignore deleted file mode 100644 index 72e8ffc0db8..00000000000 --- a/artifacts/.gitignore +++ /dev/null @@ -1 +0,0 @@ -* diff --git a/build.cmd b/build.cmd index 504616ccab2..389679d5ba4 100644 --- a/build.cmd +++ b/build.cmd @@ -63,7 +63,7 @@ set BUILD_CORECLR=0 set BUILD_FROMSOURCE=0 set BUILD_VS=0 set BUILD_FCS=0 -set BUILD_CONFIG=release +set BUILD_CONFIG=Release set BUILD_DIAG= set BUILD_PUBLICSIGN=0 @@ -228,8 +228,8 @@ if /i "%ARG%" == "microbuild" ( set CI=1 REM redirecting TEMP directories - set TEMP=%~dp0%BUILD_CONFIG%\TEMP - set TMP=%~dp0%BUILD_CONFIG%\TEMP + set TEMP=%~dp0artifacts\tmp + set TMP=%~dp0artifacts\tmp ) if /i "%ARG%" == "nuget" ( @@ -319,11 +319,11 @@ if /i "%ARG%" == "diag" ( ) if /i "%ARG%" == "debug" ( - set BUILD_CONFIG=debug + set BUILD_CONFIG=Debug ) if /i "%ARG%" == "release" ( - set BUILD_CONFIG=release + set BUILD_CONFIG=Release ) if /i "%ARG%" == "test-sign" ( @@ -614,13 +614,13 @@ echo { "sdk": { "version": "%DOTNET_TOOLS_VERSION%" } }>global.json :: Restore the Tools directory call "%~dp0init-tools.cmd" -set _dotnetexe=%~dp0Tools\dotnet20\dotnet.exe -set path=%~dp0Tools\dotnet20\;%path% +set _dotnetexe=%~dp0artifacts\toolset\dotnet\dotnet.exe +set path=%~dp0artifacts\toolset\dotnet;%path% if not "%PB_PackageVersionPropsUrl%" == "" ( echo ----------- do dependency uptake check ----------- - set dependencyUptakeDir=%~dp0Tools\dependencyUptake + set dependencyUptakeDir=%~dp0artifacts\dependencyUptake if not exist "!dependencyUptakeDir!" mkdir "!dependencyUptakeDir!" :: download package version overrides @@ -647,19 +647,19 @@ if "%BUILD_PROTO_WITH_CORECLR_LKG%" == "1" ( ) echo ---------------- Done with package restore, starting proto ------------------------ -set logdir=%~dp0%BUILD_CONFIG%\logs +set logdir=%~dp0artifacts\log\%BUILD_CONFIG% if not exist "!logdir!" mkdir "!logdir!" rem Build Proto if "%BUILD_PROTO%" == "1" ( - rmdir /s /q Proto + rmdir /s /q artifacts/bin/fsc/Proto - echo %_msbuildexe% proto.proj /t:Restore /bl:%~dp0Proto\proto.proj.restore.binlog - %_msbuildexe% proto.proj /t:Restore /bl:%~dp0Proto\proto.proj.restore.binlog + echo %_msbuildexe% proto.proj /t:Restore /bl:%~dp0artifacts\log\Proto\proto.proj.restore.binlog + %_msbuildexe% proto.proj /t:Restore /bl:%~dp0artifacts\log\Proto\proto.proj.restore.binlog @if ERRORLEVEL 1 echo Error restoring proto failed && goto :failure - echo %_msbuildexe% proto.proj /t:Build /bl:%~dp0Proto\proto.proj.build.binlog - %_msbuildexe% proto.proj /t:Build /bl:%~dp0Proto\proto.proj.build.binlog + echo %_msbuildexe% proto.proj /t:Build /bl:%~dp0artifacts\log\Proto\proto.proj.build.binlog + %_msbuildexe% proto.proj /t:Build /bl:%~dp0artifacts\log\Proto\proto.proj.build.binlog @if ERRORLEVEL 1 echo Error building proto failed && goto :failure ) @@ -667,11 +667,11 @@ echo ---------------- Done with SDK restore, starting build -------------------- if "%BUILD_PHASE%" == "1" ( - echo %_msbuildexe% fsharp.proj /t:Restore /p:Configuration=%BUILD_CONFIG% /bl:%~dp0%BUILD_CONFIG%\fsharp.proj.restore.binlog - %_msbuildexe% fsharp.proj /t:Restore /p:Configuration=%BUILD_CONFIG% /bl:%~dp0%BUILD_CONFIG%\fsharp.proj.restore.binlog + echo %_dotnetexe% restore fsharp.proj /p:Configuration=%BUILD_CONFIG% /bl:!logdir!\fsharp.proj.restore.binlog + %_dotnetexe% restore fsharp.proj /p:Configuration=%BUILD_CONFIG% /bl:!logdir!\fsharp.proj.restore.binlog - echo %_msbuildexe% fsharp.proj /t:Build /p:Configuration=%BUILD_CONFIG% /p:BUILD_PUBLICSIGN=%BUILD_PUBLICSIGN% /bl:%~dp0%BUILD_CONFIG%\fsharp.proj.build.binlog - %_msbuildexe% fsharp.proj /t:Build /p:Configuration=%BUILD_CONFIG% /p:BUILD_PUBLICSIGN=%BUILD_PUBLICSIGN% /bl:%~dp0%BUILD_CONFIG%\fsharp.proj.build.binlog + echo %_msbuildexe% fsharp.proj /t:Build /p:Configuration=%BUILD_CONFIG% /p:BUILD_PUBLICSIGN=%BUILD_PUBLICSIGN% /bl:!logdir!\fsharp.proj.build.binlog + %_msbuildexe% fsharp.proj /t:Build /p:Configuration=%BUILD_CONFIG% /p:BUILD_PUBLICSIGN=%BUILD_PUBLICSIGN% /bl:!logdir!\fsharp.proj.build.binlog @if ERRORLEVEL 1 echo Error build failed && goto :failure ) @@ -681,8 +681,8 @@ set asmvercheckpath=%~dp0tests\fsharpqa\testenv\src\AssemblyVersionCheck if "%BUILD_NET40%" == "1" ( echo #r @"%USERPROFILE%\.nuget\packages\Newtonsoft.Json\9.0.1\lib\net45\Newtonsoft.Json.dll">%asmvercheckpath%\assemblies.fsx - echo "%~dp0%BUILD_CONFIG%\net40\bin\fsi.exe" "%asmvercheckpath%\AssemblyVersionCheck.fsx" -- "%~dp0build\config\AssemblySignToolData.json" "%~dp0%BUILD_CONFIG%" - "%~dp0%BUILD_CONFIG%\net40\bin\fsi.exe" "%asmvercheckpath%\AssemblyVersionCheck.fsx" -- "%~dp0build\config\AssemblySignToolData.json" "%~dp0%BUILD_CONFIG%" + echo "%~dp0artifacts\bin\fsi\%BUILD_CONFIG%\net46\fsi.exe" "%asmvercheckpath%\AssemblyVersionCheck.fsx" -- "%~dp0build\config\AssemblySignToolData.json" "%~dp0artifacts\bin" + "%~dp0artifacts\bin\fsi\%BUILD_CONFIG%\net46\fsi.exe" "%asmvercheckpath%\AssemblyVersionCheck.fsx" -- "%~dp0build\config\AssemblySignToolData.json" "%~dp0artifacts\bin" if ERRORLEVEL 1 echo Error verifying assembly versions and commit hashes. && goto :failure ) @@ -692,56 +692,46 @@ if not "%SIGN_TYPE%" == "" ( echo %_msbuildexe% build\projects\Signing.proj /t:Restore %_msbuildexe% build\projects\Signing.proj /t:Restore - echo %_msbuildexe% build\projects\Signing.proj /t:DoSigning /p:SignType=%SIGN_TYPE% /p:Configuration=%BUILD_CONFIG% /p:ConfigFile=%~dp0build\config\AssemblySignToolData.json - %_msbuildexe% build\projects\Signing.proj /t:DoSigning /p:SignType=%SIGN_TYPE% /p:Configuration=%BUILD_CONFIG% /p:ConfigFile=%~dp0build\config\AssemblySignToolData.json + echo %_msbuildexe% build\projects\Signing.proj /t:DoSigning /p:SignType=%SIGN_TYPE% /p:Configuration=%BUILD_CONFIG% /p:BinaryBasePath=%~dp0artifacts\bin /p:ConfigFile=%~dp0build\config\AssemblySignToolData.json + %_msbuildexe% build\projects\Signing.proj /t:DoSigning /p:SignType=%SIGN_TYPE% /p:Configuration=%BUILD_CONFIG% /p:BinaryBasePath=%~dp0artifacts\bin /p:ConfigFile=%~dp0build\config\AssemblySignToolData.json if ERRORLEVEL 1 echo Error running sign tool && goto :failure ) echo ---------------- Done with assembly signing, start package creation --------------- -echo %_msbuildexe% %msbuildflags% build-nuget-packages.proj /p:Configuration=%BUILD_CONFIG% /t:Pack /bl:%~dp0%BUILD_CONFIG%\logs\msbuild.build-nuget-packages.build.%BUILD_CONFIG%.binlog - %_msbuildexe% %msbuildflags% build-nuget-packages.proj /p:Configuration=%BUILD_CONFIG% /t:Pack /bl:%~dp0%BUILD_CONFIG%\logs\msbuild.build-nuget-packages.build.%BUILD_CONFIG%.binlog +echo %_msbuildexe% %msbuildflags% build-nuget-packages.proj /p:Configuration=%BUILD_CONFIG% /t:Pack /bl:!logdir!\msbuild.build-nuget-packages.build.%BUILD_CONFIG%.binlog + %_msbuildexe% %msbuildflags% build-nuget-packages.proj /p:Configuration=%BUILD_CONFIG% /t:Pack /bl:!logdir!\msbuild.build-nuget-packages.build.%BUILD_CONFIG%.binlog if ERRORLEVEL 1 echo Error building NuGet packages && goto :failure if not "%SIGN_TYPE%" == "" ( - echo %_msbuildexe% build\projects\Signing.proj /t:DoSigning /p:SignType=%SIGN_TYPE% /p:Configuration=%BUILD_CONFIG% /p:ConfigFile=%~dp0build\config\PackageSignToolData.json - %_msbuildexe% build\projects\Signing.proj /t:DoSigning /p:SignType=%SIGN_TYPE% /p:Configuration=%BUILD_CONFIG% /p:ConfigFile=%~dp0build\config\PackageSignToolData.json + echo %_msbuildexe% build\projects\Signing.proj /t:DoSigning /p:SignType=%SIGN_TYPE% /p:Configuration=%BUILD_CONFIG% /p:BinaryBasepath=%~dp0artifacts\packages\%BUILD_CONFIG% /p:ConfigFile=%~dp0build\config\PackageSignToolData.json + %_msbuildexe% build\projects\Signing.proj /t:DoSigning /p:SignType=%SIGN_TYPE% /p:Configuration=%BUILD_CONFIG% /p:BinaryBasepath=%~dp0artifacts\packages\%BUILD_CONFIG% /p:ConfigFile=%~dp0build\config\PackageSignToolData.json if ERRORLEVEL 1 echo Error running sign tool && goto :failure ) if "%BUILD_SETUP%" == "1" ( - echo %_msbuildexe% %msbuildflags% setup\build-insertion.proj /p:Configuration=%BUILD_CONFIG% /bl:%~dp0%BUILD_CONFIG%\logs\msbuild.build-insertion.build.%BUILD_CONFIG%.binlog - %_msbuildexe% %msbuildflags% setup\build-insertion.proj /p:Configuration=%BUILD_CONFIG% /bl:%~dp0%BUILD_CONFIG%\logs\msbuild.build-insertion.build.%BUILD_CONFIG%.binlog + echo %_msbuildexe% %msbuildflags% setup\build-insertion.proj /p:Configuration=%BUILD_CONFIG% /bl:!logdir!\msbuild.build-insertion.build.%BUILD_CONFIG%.binlog + %_msbuildexe% %msbuildflags% setup\build-insertion.proj /p:Configuration=%BUILD_CONFIG% /bl:!logdir!\msbuild.build-insertion.build.%BUILD_CONFIG%.binlog if ERRORLEVEL 1 echo Error building insertion packages && goto :failure ) if not "%SIGN_TYPE%" == "" ( - echo %_msbuildexe% build\projects\Signing.proj /t:DoSigning /p:SignType=%SIGN_TYPE% /p:Configuration=%BUILD_CONFIG% /p:ConfigFile=%~dp0build\config\InsertionSignToolData.json - %_msbuildexe% build\projects\Signing.proj /t:DoSigning /p:SignType=%SIGN_TYPE% /p:Configuration=%BUILD_CONFIG% /p:ConfigFile=%~dp0build\config\InsertionSignToolData.json + echo %_msbuildexe% build\projects\Signing.proj /t:DoSigning /p:SignType=%SIGN_TYPE% /p:Configuration=%BUILD_CONFIG% /p:BinaryBasepath=%~dp0artifacts\VSSetup\%BUILD_CONFIG%\Insertion /p:ConfigFile=%~dp0build\config\InsertionSignToolData.json + %_msbuildexe% build\projects\Signing.proj /t:DoSigning /p:SignType=%SIGN_TYPE% /p:Configuration=%BUILD_CONFIG% /p:BinaryBasePath=%~dp0artifacts\VSSetup\%BUILD_CONFIG%\Insertion /p:ConfigFile=%~dp0build\config\InsertionSignToolData.json if ERRORLEVEL 1 echo Error running sign tool && goto :failure ) echo ---------------- Done with signing, building insertion files --------------- if "%BUILD_SETUP%" == "1" ( - echo %_msbuildexe% %msbuildflags% setup\Swix\Microsoft.FSharp.vsmanproj /p:Configuration=%BUILD_CONFIG% /bl:%~dp0%BUILD_CONFIG%\logs\msbuild.setup-swix.build.%BUILD_CONFIG%.binlog - %_msbuildexe% %msbuildflags% setup\Swix\Microsoft.FSharp.vsmanproj /p:Configuration=%BUILD_CONFIG% /bl:%~dp0%BUILD_CONFIG%\logs\msbuild.setup-swix.build.%BUILD_CONFIG%.binlog + echo %_msbuildexe% %msbuildflags% setup\Swix\Microsoft.FSharp.vsmanproj /p:Configuration=%BUILD_CONFIG% /bl:!logdir!\msbuild.setup-swix.build.%BUILD_CONFIG%.binlog + %_msbuildexe% %msbuildflags% setup\Swix\Microsoft.FSharp.vsmanproj /p:Configuration=%BUILD_CONFIG% /bl:!logdir!\msbuild.setup-swix.build.%BUILD_CONFIG%.binlog if ERRORLEVEL 1 echo Error building .vsmanproj && goto :failure ) echo ---------------- Done building insertion files, starting pack/update/prepare --------------- -if "%BUILD_NET40_FSHARP_CORE%" == "1" ( - echo ---------------- start update.cmd --------------- - call src\update.cmd %BUILD_CONFIG% -ngen -) - -if "%COPY_FSCOMP_RESOURCE_FOR_BUILD_FROM_SOURCES%" == "1" ( - echo ---------------- copy fscomp resource for build from sources --------------- - copy /y src\fsharp\FSharp.Compiler.Private\obj\%BUILD_CONFIG%\net40\FSComp.* src\buildfromsource\FSharp.Compiler.Private -) - set X86_PROGRAMFILES=%ProgramFiles% if "%OSARCH%"=="AMD64" set X86_PROGRAMFILES=%ProgramFiles(x86)% @@ -787,21 +777,19 @@ if not exist "%link_exe%" ( if /I not "%single_threaded%" == "true" (set PARALLEL_ARG=-procs:%NUMBER_OF_PROCESSORS%) else set PARALLEL_ARG=-procs:0 -set FSCBINPATH=%~dp0%BUILD_CONFIG%\net40\bin -set RESULTSDIR=%~dp0tests\TestResults -if not exist "%RESULTSDIR%" (mkdir "%RESULTSDIR%") +set FSCBINPATH=%~dp0artifacts\bin\fsc\%BUILD_CONFIG%\net46 ECHO FSCBINPATH=%FSCBINPATH% -ECHO RESULTSDIR=%RESULTSDIR% ECHO link_exe=%link_exe% REM ---------------- test-net40-fsharp ----------------------- +set TESTLOGDIR=%~dp0artifacts\TestResults\%BUILD_CONFIG% if "%TEST_NET40_FSHARP_SUITE%" == "1" ( - set LOGFILE=%~dp0tests\TestResults\FSharp.Tests.FSharpSuite.net40.trx - echo "%_dotnetexe%" test "%~dp0tests\fsharp\FSharp.Tests.FSharpSuite.fsproj" --no-restore --no-build -c %BUILD_CONFIG% -f net46 -l "trx;LogFileName=!LOGFILE!" -o "%~dp0%BUILD_CONFIG%\net40\bin" - "%_dotnetexe%" test "%~dp0tests\fsharp\FSharp.Tests.FSharpSuite.fsproj" --no-restore --no-build -c %BUILD_CONFIG% -f net46 -l "trx;LogFileName=!LOGFILE!" -o "%~dp0%BUILD_CONFIG%\net40\bin" + set LOGFILE=%TESTLOGDIR%\FSharp.Tests.FSharpSuite_net46.trx + echo "%_dotnetexe%" test "%~dp0tests\fsharp\FSharp.Tests.FSharpSuite.fsproj" --no-restore --no-build -c %BUILD_CONFIG% -f net46 -l "trx;LogFileName=!LOGFILE!" + "%_dotnetexe%" test "%~dp0tests\fsharp\FSharp.Tests.FSharpSuite.fsproj" --no-restore --no-build -c %BUILD_CONFIG% -f net46 -l "trx;LogFileName=!LOGFILE!" if errorlevel 1 ( echo -------------------------------------------------------------- @@ -809,13 +797,20 @@ if "%TEST_NET40_FSHARP_SUITE%" == "1" ( echo -------------------------------------------------------------- goto :failure ) + + if not exist "!LOGFILE!" ( + echo -------------------------------------------------------- + echo Test results file !LOGFILE! not found, ensure tests ran. + echo -------------------------------------------------------- + goto :failure + ) ) REM ---------------- test-fcs ----------------------- if "%TEST_FCS%" == "1" ( - set LOGFILE=%~dp0tests\TestResults\FSharp.Compiler.Service.Tests.net40.trx + set LOGFILE=%TESTLOGDIR%\FSharp.Compiler.Service.Tests_net46.trx echo "%_dotnetexe%" test "%~dp0fcs\FSharp.Compiler.Service.Tests\FSharp.Compiler.Service.Tests.fsproj" --no-restore --no-build -c %BUILD_CONFIG% -f net46 -l "trx;LogFileName=!LOGFILE!" "%_dotnetexe%" test "%~dp0fcs\FSharp.Compiler.Service.Tests\FSharp.Compiler.Service.Tests.fsproj" --no-restore --no-build -c %BUILD_CONFIG% -f net46 -l "trx;LogFileName=!LOGFILE!" @@ -826,7 +821,14 @@ if "%TEST_FCS%" == "1" ( goto :failure ) - set LOGFILE=%~dp0tests\TestResults\FSharp.Compiler.Service.Tests.coreclr.trx + if not exist "!LOGFILE!" ( + echo -------------------------------------------------------- + echo Test results file !LOGFILE! not found, ensure tests ran. + echo -------------------------------------------------------- + goto :failure + ) + + set LOGFILE=%TESTLOGDIR%\FSharp.Compiler.Service.Tests_netcoreapp2.0.trx echo "%_dotnetexe%" test "%~dp0fcs\FSharp.Compiler.Service.Tests\FSharp.Compiler.Service.Tests.fsproj" --no-restore --no-build -c %BUILD_CONFIG% -f netcoreapp2.0 -l "trx;LogFileName=!LOGFILE!" "%_dotnetexe%" test "%~dp0fcs\FSharp.Compiler.Service.Tests\FSharp.Compiler.Service.Tests.fsproj" --no-restore --no-build -c %BUILD_CONFIG% -f netcoreapp2.0 -l "trx;LogFileName=!LOGFILE!" @@ -836,6 +838,13 @@ if "%TEST_FCS%" == "1" ( echo -------------------------------------------------------------- goto :failure ) + + if not exist "!LOGFILE!" ( + echo -------------------------------------------------------- + echo Test results file !LOGFILE! not found, ensure tests ran. + echo -------------------------------------------------------- + goto :failure + ) ) REM ---------------- end2end ----------------------- @@ -871,6 +880,7 @@ if "%TEST_NET40_FSHARPQA_SUITE%" == "1" ( set perlexe=%USERPROFILE%\.nuget\packages\StrawberryPerl64\5.22.2.1\Tools\perl\bin\perl.exe if not exist !perlexe! (echo Error: perl was not downloaded from check the packages directory: !perlexe! && goto :failure ) + set RESULTSDIR=%~dp0artifacts\TestResults\%BUILD_CONFIG% set OUTPUTFILE=test-net40-fsharpqa-results.log set ERRORFILE=test-net40-fsharpqa-errors.log set FAILENV=test-net40-fsharpqa-errors @@ -881,9 +891,10 @@ if "%TEST_NET40_FSHARPQA_SUITE%" == "1" ( popd if ERRORLEVEL 1 ( - type "%RESULTSDIR%\!OUTPUTFILE!" echo ----------------------------------------------------------------- - type "%RESULTSDIR%\!ERRORFILE!" + type "!RESULTSDIR!\!OUTPUTFILE!" + echo ----------------------------------------------------------------- + type "!RESULTSDIR!\!ERRORFILE!" echo ----------------------------------------------------------------- echo Error: Running tests net40-fsharpqa failed, see logs above -- FAILED echo ----------------------------------------------------------------- @@ -895,7 +906,7 @@ REM ---------------- net40-compilerunit ----------------------- if "%TEST_NET40_COMPILERUNIT_SUITE%" == "1" ( - set LOGFILE=%~dp0tests\TestResults\FSharp.Compiler.UnitTests.net40.trx + set LOGFILE=%TESTLOGDIR%\FSharp.Compiler.UnitTests_net46.trx echo "%_dotnetexe%" test "%~dp0tests\FSharp.Compiler.UnitTests\FSharp.Compiler.UnitTests.fsproj" --no-restore --no-build -c %BUILD_CONFIG% -f net46 -l "trx;LogFileName=!LOGFILE!" "%_dotnetexe%" test "%~dp0tests\FSharp.Compiler.UnitTests\FSharp.Compiler.UnitTests.fsproj" --no-restore --no-build -c %BUILD_CONFIG% -f net46 -l "trx;LogFileName=!LOGFILE!" @@ -906,7 +917,14 @@ if "%TEST_NET40_COMPILERUNIT_SUITE%" == "1" ( goto :failure ) - set LOGFILE=%~dp0tests\TestResults\FSharp.Build.UnitTests.net40.trx + if not exist "!LOGFILE!" ( + echo -------------------------------------------------------- + echo Test results file !LOGFILE! not found, ensure tests ran. + echo -------------------------------------------------------- + goto :failure + ) + + set LOGFILE=%TESTLOGDIR%\FSharp.Build.UnitTests_net46.trx echo "%_dotnetexe%" test "%~dp0tests\FSharp.Build.UnitTests\FSharp.Build.UnitTests.fsproj" --no-restore --no-build -c %BUILD_CONFIG% -f net46 -l "trx;LogFileName=!LOGFILE!" "%_dotnetexe%" test "%~dp0tests\FSharp.Build.UnitTests\FSharp.Build.UnitTests.fsproj" --no-restore --no-build -c %BUILD_CONFIG% -f net46 -l "trx;LogFileName=!LOGFILE!" @@ -916,13 +934,20 @@ if "%TEST_NET40_COMPILERUNIT_SUITE%" == "1" ( echo ----------------------------------------------------------------- goto :failure ) + + if not exist "!LOGFILE!" ( + echo -------------------------------------------------------- + echo Test results file !LOGFILE! not found, ensure tests ran. + echo -------------------------------------------------------- + goto :failure + ) ) REM ---------------- net40-coreunit ----------------------- if "%TEST_NET40_COREUNIT_SUITE%" == "1" ( - set LOGFILE=%~dp0tests\TestResults\FSharp.Core.UnitTests.net40.trx + set LOGFILE=%TESTLOGDIR%\FSharp.Core.UnitTests_net46.trx echo "%_dotnetexe%" test "%~dp0tests\FSharp.Core.UnitTests\FSharp.Core.UnitTests.fsproj" --no-restore --no-build -c %BUILD_CONFIG% -f net46 -l "trx;LogFileName=!LOGFILE!" "%_dotnetexe%" test "%~dp0tests\FSharp.Core.UnitTests\FSharp.Core.UnitTests.fsproj" --no-restore --no-build -c %BUILD_CONFIG% -f net46 -l "trx;LogFileName=!LOGFILE!" @@ -932,13 +957,20 @@ if "%TEST_NET40_COREUNIT_SUITE%" == "1" ( echo ----------------------------------------------------------------- goto :failure ) + + if not exist "!LOGFILE!" ( + echo -------------------------------------------------------- + echo Test results file !LOGFILE! not found, ensure tests ran. + echo -------------------------------------------------------- + goto :failure + ) ) REM ---------------- coreclr-coreunit ----------------------- if "%TEST_CORECLR_COREUNIT_SUITE%" == "1" ( - set LOGFILE=%~dp0tests\TestResults\FSharp.Build.UnitTests.coreclr.trx + set LOGFILE=%TESTLOGDIR%\FSharp.Build.UnitTests_netcoreapp2.0.trx echo "%_dotnetexe%" test "%~dp0tests\FSharp.Build.UnitTests\FSharp.Build.UnitTests.fsproj" --no-restore --no-build -c %BUILD_CONFIG% -f netcoreapp2.0 -l "trx;LogFileName=!LOGFILE!" "%_dotnetexe%" test "%~dp0tests\FSharp.Build.UnitTests\FSharp.Build.UnitTests.fsproj" --no-restore --no-build -c %BUILD_CONFIG% -f netcoreapp2.0 -l "trx;LogFileName=!LOGFILE!" @@ -949,7 +981,14 @@ if "%TEST_CORECLR_COREUNIT_SUITE%" == "1" ( goto :failure ) - set LOGFILE=%~dp0tests\TestResults\FSharp.Core.UnitTests.coreclr.trx + if not exist "!LOGFILE!" ( + echo -------------------------------------------------------- + echo Test results file !LOGFILE! not found, ensure tests ran. + echo -------------------------------------------------------- + goto :failure + ) + + set LOGFILE=%TESTLOGDIR%\FSharp.Core.UnitTests_netcoreapp2.0.trx echo "%_dotnetexe%" test "%~dp0tests\FSharp.Core.UnitTests\FSharp.Core.UnitTests.fsproj" --no-restore --no-build -c %BUILD_CONFIG% -f netcoreapp2.0 -l "trx;LogFileName=!LOGFILE!" "%_dotnetexe%" test "%~dp0tests\FSharp.Core.UnitTests\FSharp.Core.UnitTests.fsproj" --no-restore --no-build -c %BUILD_CONFIG% -f netcoreapp2.0 -l "trx;LogFileName=!LOGFILE!" @@ -959,14 +998,21 @@ if "%TEST_CORECLR_COREUNIT_SUITE%" == "1" ( echo ------------------------------------------------------------------ goto :failure ) + + if not exist "!LOGFILE!" ( + echo -------------------------------------------------------- + echo Test results file !LOGFILE! not found, ensure tests ran. + echo -------------------------------------------------------- + goto :failure + ) ) REM ---------------- coreclr-fsharp ----------------------- if "%TEST_CORECLR_FSHARP_SUITE%" == "1" ( - set LOGFILE=%~dp0tests\TestResults\FSharp.Tests.FSharpSuite.coreclr.trx - echo "%_dotnetexe%" test "%~dp0tests\fsharp\FSharp.Tests.FSharpSuite.fsproj" --no-restore --no-build -c %BUILD_CONFIG% -f netcoreapp2.0 -l "trx;LogFileName=!LOGFILE!" -o "%~dp0%BUILD_CONFIG%\coreclr\bin" - "%_dotnetexe%" test "%~dp0tests\fsharp\FSharp.Tests.FSharpSuite.fsproj" --no-restore --no-build -c %BUILD_CONFIG% -f netcoreapp2.0 -l "trx;LogFileName=!LOGFILE!" -o "%~dp0%BUILD_CONFIG%\coreclr\bin" + set LOGFILE=%TESTLOGDIR%\FSharp.Tests.FSharpSuite_netcoreapp2.0.trx + echo "%_dotnetexe%" test "%~dp0tests\fsharp\FSharp.Tests.FSharpSuite.fsproj" --no-restore --no-build -c %BUILD_CONFIG% -f netcoreapp2.0 -l "trx;LogFileName=!LOGFILE!" + "%_dotnetexe%" test "%~dp0tests\fsharp\FSharp.Tests.FSharpSuite.fsproj" --no-restore --no-build -c %BUILD_CONFIG% -f netcoreapp2.0 -l "trx;LogFileName=!LOGFILE!" if errorlevel 1 ( echo ---------------------------------------------------------------- @@ -974,12 +1020,19 @@ if "%TEST_CORECLR_FSHARP_SUITE%" == "1" ( echo ---------------------------------------------------------------- goto :failure ) + + if not exist "!LOGFILE!" ( + echo -------------------------------------------------------- + echo Test results file !LOGFILE! not found, ensure tests ran. + echo -------------------------------------------------------- + goto :failure + ) ) REM ---------------- vs-ideunit ----------------------- if "%TEST_VS_IDEUNIT_SUITE%" == "1" ( - set LOGFILE=%~dp0tests\TestResults\GetTypesVSUnitTests.net40.trx + set LOGFILE=%TESTLOGDIR%\GetTypesVSUnitTests_net46.trx echo "%_dotnetexe%" test "%~dp0vsintegration\tests\GetTypesVSUnitTests\GetTypesVSUnitTests.fsproj" --no-restore --no-build -c %BUILD_CONFIG% -f net46 -l "trx;LogFileName=!LOGFILE!" "%_dotnetexe%" test "%~dp0vsintegration\tests\GetTypesVSUnitTests\GetTypesVSUnitTests.fsproj" --no-restore --no-build -c %BUILD_CONFIG% -f net46 -l "trx;LogFileName=!LOGFILE!" @@ -990,15 +1043,29 @@ if "%TEST_VS_IDEUNIT_SUITE%" == "1" ( goto :failure ) - set LOGFILE=%~dp0tests\TestResults\VisualFSharp.UnitTests.net40.trx - echo "%_dotnetexe%" test "%~dp0vsintegration\tests\UnitTests\VisualFSharp.UnitTests.fsproj" --no-restore --no-build -c %BUILD_CONFIG% -f net46 -l "trx;LogFileName=!LOGFILE!" -o "%~dp0%BUILD_CONFIG%\net40\bin" - "%_dotnetexe%" test "%~dp0vsintegration\tests\UnitTests\VisualFSharp.UnitTests.fsproj" --no-restore --no-build -c %BUILD_CONFIG% -f net46 -l "trx;LogFileName=!LOGFILE!" -o "%~dp0%BUILD_CONFIG%\net40\bin" + if not exist "!LOGFILE!" ( + echo -------------------------------------------------------- + echo Test results file !LOGFILE! not found, ensure tests ran. + echo -------------------------------------------------------- + goto :failure + ) + + set LOGFILE=%TESTLOGDIR%\VisualFSharp.UnitTests_net46.trx + echo "%_dotnetexe%" test "%~dp0vsintegration\tests\UnitTests\VisualFSharp.UnitTests.fsproj" --no-restore --no-build -c %BUILD_CONFIG% -f net46 -l "trx;LogFileName=!LOGFILE!" + "%_dotnetexe%" test "%~dp0vsintegration\tests\UnitTests\VisualFSharp.UnitTests.fsproj" --no-restore --no-build -c %BUILD_CONFIG% -f net46 -l "trx;LogFileName=!LOGFILE!" if errorlevel 1 ( echo ------------------------------------------------------------ echo Error: Running tests vs-ideunit failed, see file `!LOGFILE!` echo ------------------------------------------------------------ goto :failure ) + + if not exist "!LOGFILE!" ( + echo -------------------------------------------------------- + echo Test results file !LOGFILE! not found, ensure tests ran. + echo -------------------------------------------------------- + goto :failure + ) ) goto :success diff --git a/build/config/AssemblySignToolData.json b/build/config/AssemblySignToolData.json index 6857a57f0dd..3cd0f5b61c1 100644 --- a/build/config/AssemblySignToolData.json +++ b/build/config/AssemblySignToolData.json @@ -4,55 +4,45 @@ "certificate": "Microsoft", "strongName": "StrongName", "values": [ - "net40\\bin\\FSharp.Core.dll", - "net40\\bin\\*\\FSharp.Core.resources.dll", - "net40\\bin\\FSharp.Build.dll", - "net40\\bin\\*\\FSharp.Build.resources.dll", - "net40\\bin\\FSharp.Compiler.Private.dll", - "net40\\bin\\*\\FSharp.Compiler.Private.resources.dll", - "net40\\bin\\FSharp.Compiler.Server.Shared.dll", - "net40\\bin\\FSharp.Compiler.Interactive.Settings.dll", - "net40\\bin\\*\\FSharp.Compiler.Interactive.Settings.resources.dll", - "net40\\bin\\fsc.exe", - "net40\\bin\\fsi.exe", - "net40\\bin\\fsiAnyCpu.exe", - "net40\\bin\\FSharp.VS.FSI.dll", - "net40\\bin\\*\\FSharp.VS.FSI.resources.dll", - "net40\\bin\\FSharp.LanguageService.Base.dll", - "net40\\bin\\*\\FSharp.LanguageService.Base.resources.dll", - "net40\\bin\\FSharp.LanguageService.dll", - "net40\\bin\\*\\FSharp.LanguageService.resources.dll", - "net40\\bin\\FSharp.UIResources.dll", - "net40\\bin\\*\\FSharp.UIResources.resources.dll", - "net40\\bin\\FSharp.Editor.dll", - "net40\\bin\\*\\FSharp.Editor.resources.dll", - "net40\\bin\\FSharp.ProjectSystem.Base.dll", - "net40\\bin\\*\\FSharp.ProjectSystem.Base.resources.dll", - "net40\\bin\\FSharp.ProjectSystem.PropertyPages.dll", - "net40\\bin\\*\\FSharp.ProjectSystem.PropertyPages.resources.dll", - "net40\\bin\\FSharp.ProjectSystem.FSharp.dll", - "net40\\bin\\*\\FSharp.ProjectSystem.FSharp.resources.dll", - "net40\\bin\\FSharp.PatternMatcher.dll", - "coreclr\\bin\\FSharp.Core.dll", - "coreclr\\bin\\*\\FSharp.Core.resources.dll", - "coreclr\\bin\\FSharp.Build.dll", - "coreclr\\bin\\*\\FSharp.Build.resources.dll", - "coreclr\\bin\\FSharp.Compiler.Private.dll", - "coreclr\\bin\\*\\FSharp.Compiler.Private.resources.dll", - "coreclr\\bin\\FSharp.Compiler.Interactive.Settings.dll", - "coreclr\\bin\\*\\FSharp.Compiler.Interactive.Settings.resources.dll", - "coreclr\\bin\\fsc.exe", - "coreclr\\bin\\fsi.exe" + "FSharp.Core\\*\\*\\FSharp.Core.dll", + "FSharp.Core\\*\\*\\*\\FSharp.Core.resources.dll", + "FSharp.Build\\*\\*\\FSharp.Build.dll", + "FSharp.Build\\*\\*\\*\\FSharp.Build.resources.dll", + "FSharp.Compiler.Private\\*\\*\\FSharp.Compiler.Private.dll", + "FSharp.Compiler.Private\\*\\*\\*\\FSharp.Compiler.Private.resources.dll", + "FSharp.Compiler.Server.Shared\\*\\*\\FSharp.Compiler.Server.Shared.dll", + "FSharp.Compiler.Interactive.Settings\\*\\*\\FSharp.Compiler.Interactive.Settings.dll", + "FSharp.Compiler.Interactive.Settings\\*\\*\\*\\FSharp.Compiler.Interactive.Settings.resources.dll", + "fsc\\*\\*\\fsc.exe", + "fsi\\*\\*\\fsi.exe", + "fsiAnyCpu\\*\\*\\fsiAnyCpu.exe", + "FSharp.VS.FSI\\*\\*\\FSharp.VS.FSI.dll", + "FSharp.VS.FSI\\*\\*\\*\\FSharp.VS.FSI.resources.dll", + "FSharp.LanguageService.Base\\*\\*\\FSharp.LanguageService.Base.dll", + "FSharp.LanguageService.Base\\*\\*\\*\\FSharp.LanguageService.Base.resources.dll", + "FSharp.LanguageService\\*\\*\\FSharp.LanguageService.dll", + "FSharp.LanguageService\\*\\*\\*\\FSharp.LanguageService.resources.dll", + "FSharp.UIResources\\*\\*\\FSharp.UIResources.dll", + "FSharp.UIResources\\*\\*\\*\\FSharp.UIResources.resources.dll", + "FSharp.Editor\\*\\*\\FSharp.Editor.dll", + "FSharp.Editor\\*\\*\\*\\FSharp.Editor.resources.dll", + "FSharp.ProjectSystem.Base\\*\\*\\FSharp.ProjectSystem.Base.dll", + "FSharp.ProjectSystem.Base\\*\\*\\*\\FSharp.ProjectSystem.Base.resources.dll", + "FSharp.ProjectSystem.PropertyPages\\*\\*\\FSharp.ProjectSystem.PropertyPages.dll", + "FSharp.ProjectSystem.PropertyPages\\*\\*\\*\\FSharp.ProjectSystem.PropertyPages.resources.dll", + "FSharp.ProjectSystem.FSharp\\*\\*\\FSharp.ProjectSystem.FSharp.dll", + "FSharp.ProjectSystem.FSharp\\*\\*\\*\\FSharp.ProjectSystem.FSharp.resources.dll", + "FSharp.PatternMatcher\\*\\*\\FSharp.PatternMatcher.dll" ] }, { "certificate": "VsixSHA2", "strongName": null, "values": [ - "net40\\bin\\VisualFSharpFull.vsix", - "net40\\bin\\VisualFSharpTemplate.vsix", - "insertion\\Microsoft.FSharp.Dependencies.vsix", - "insertion\\Microsoft.FSharp.VSIX.Full.Resources.*.vsix" + "VisualFSharpFull\\*\\*VisualFSharpFull.vsix", + "VisualFSharpTemplates\\*\\*\\VisualFSharpTemplate.vsix", + "..\\VSSetup\\*\\Insertion\\Microsoft.FSharp.Dependencies.vsix", + "..\\VSSetup\\*\\Insertion\\Microsoft.FSharp.VSIX.Full.Resources.*.vsix" ] } ], diff --git a/build/config/InsertionSignToolData.json b/build/config/InsertionSignToolData.json index ec8432ca9ad..d81579b12c9 100644 --- a/build/config/InsertionSignToolData.json +++ b/build/config/InsertionSignToolData.json @@ -4,11 +4,11 @@ "certificate": "VsixSHA2", "strongName": null, "values": [ - "insertion\\Microsoft.FSharp.Compiler.vsix", - "insertion\\Microsoft.FSharp.Compiler.Resources.*.vsix", - "insertion\\Microsoft.FSharp.Dependencies.vsix", - "insertion\\Microsoft.FSharp.IDE.vsix", - "insertion\\Microsoft.FSharp.SDK.vsix" + "Microsoft.FSharp.Compiler.vsix", + "Microsoft.FSharp.Compiler.Resources.*.vsix", + "Microsoft.FSharp.Dependencies.vsix", + "Microsoft.FSharp.IDE.vsix", + "Microsoft.FSharp.SDK.vsix" ] } ], diff --git a/build/config/PackageSignToolData.json b/build/config/PackageSignToolData.json index 20007f59e36..5bc74386355 100644 --- a/build/config/PackageSignToolData.json +++ b/build/config/PackageSignToolData.json @@ -4,8 +4,7 @@ "certificate": "NuGet", "strongName": null, "values": [ - "artifacts\\*.nupkg", - "artifacts\\*\\*.nupkg" + "*.nupkg" ] } ], diff --git a/build/projects/Signing.proj b/build/projects/Signing.proj index 4999fb6d085..9e981e135ec 100644 --- a/build/projects/Signing.proj +++ b/build/projects/Signing.proj @@ -3,7 +3,6 @@ net46 - $(RepoRoot)$(Configuration) $(NuGetPackageRoot)RoslynTools.SignTool\$(RoslynToolsSignToolPackageVersion)\tools\SignTool.exe -msbuildPath "$(MSBuildBinPath)\msbuild.exe" -nugetPackagesPath "$(NuGetPackageRoot.TrimEnd('\'))" -config "$(ConfigFile)" -testSign $(SignToolArgs) @@ -17,11 +16,12 @@ + - + diff --git a/build/targets/ConvertPortablePdbs.targets b/build/targets/ConvertPortablePdbs.targets index 474fe091a5d..c43042a499e 100644 --- a/build/targets/ConvertPortablePdbs.targets +++ b/build/targets/ConvertPortablePdbs.targets @@ -6,20 +6,33 @@ - $(FinalOutputPath)\ConvertedPdbs $(NuGetPackageRoot)Pdb2Pdb\$(Pdb2PdbPackageVersion)\tools\Pdb2Pdb.exe - "$(TargetPath)" /out "$(ConvertedPdbsDirectory)\$(TargetName).pdb" /srcsvrvar SRC_INDEX=public + "$(TargetPath)" /out "$(SymStoreDirectory)\$(TargetName).pdb" /srcsvrvar SRC_INDEX=public - + + + + $(TargetDir)\$(TargetName).pdb + + + + + + diff --git a/build/targets/GenerateAssemblyAttributes.targets b/build/targets/GenerateAssemblyAttributes.targets index 1be6bdb8315..7b747c9dd92 100644 --- a/build/targets/GenerateAssemblyAttributes.targets +++ b/build/targets/GenerateAssemblyAttributes.targets @@ -82,8 +82,7 @@ Inputs="$(MSBuildThisFileFullPath);$(MSBuildProjectFile)" Outputs="$(GeneratedFSharpAssemblyVersionFile)" DependsOnTargets="PrepareGenerateAssemblyFileVersion;PrepareForBuild" - BeforeTargets="CoreCompile" - Condition="'$(Configuration)' != 'Proto'"> + BeforeTargets="CoreCompile"> $(PB_RestoreSource);$(RestoreSources) - $(MSBuildThisFileDirectory)..\..\Tools\dependencyUptake\PackageVersions.props + $(MSBuildThisFileDirectory)..\..\artifacts\dependencyUptake\PackageVersions.props $([System.IO.File]::ReadAllText('$(MSBuildThisFileDirectory)..\..\RoslynPackageVersion.txt').Trim()) diff --git a/fcs/Directory.Build.props b/fcs/Directory.Build.props index cdcbdd4b8b3..6535dbd2aea 100644 --- a/fcs/Directory.Build.props +++ b/fcs/Directory.Build.props @@ -4,17 +4,19 @@ $(HOME)/.nuget/packages/ $(NuGetPackageRoot)\ $(NuGetPackageRoot)/ + $(MSBuildThisFileDirectory)..\artifacts + $(ArtifactsDir)\bin + $(ArtifactsDir)\obj + $(ArtifactsBinDir)\fcs + $(ArtifactsObjDir)\fcs - $(MSBuildThisFileDirectory)..\Proto\net40\bin + $(ArtifactsBinDir)\FSharp.Build\Proto\net46 - $(ProtoOutputPath)\Microsoft.FSharp.Targets $(ProtoOutputPath)\Microsoft.FSharp.NetSdk.props $(ProtoOutputPath)\Microsoft.FSharp.NetSdk.targets diff --git a/fcs/FSharp.Compiler.Service.MSBuild.v12/FSharp.Compiler.Service.MSBuild.v12.fsproj b/fcs/FSharp.Compiler.Service.MSBuild.v12/FSharp.Compiler.Service.MSBuild.v12.fsproj index 42b99d95a05..1126a60f2b6 100644 --- a/fcs/FSharp.Compiler.Service.MSBuild.v12/FSharp.Compiler.Service.MSBuild.v12.fsproj +++ b/fcs/FSharp.Compiler.Service.MSBuild.v12/FSharp.Compiler.Service.MSBuild.v12.fsproj @@ -7,7 +7,6 @@ net45 true - ..\..\$(Configuration.ToLower())\fcs $(DefineConstants);CROSS_PLATFORM_COMPILER $(DefineConstants);ENABLE_MONO_SUPPORT diff --git a/fcs/FSharp.Compiler.Service.ProjectCracker/FSharp.Compiler.Service.ProjectCracker.fsproj b/fcs/FSharp.Compiler.Service.ProjectCracker/FSharp.Compiler.Service.ProjectCracker.fsproj index 1bf41b7bf27..c132ae80bb1 100644 --- a/fcs/FSharp.Compiler.Service.ProjectCracker/FSharp.Compiler.Service.ProjectCracker.fsproj +++ b/fcs/FSharp.Compiler.Service.ProjectCracker/FSharp.Compiler.Service.ProjectCracker.fsproj @@ -1,13 +1,9 @@  - - $(MSBuildProjectDirectory)\..\..\src - net45 true - ..\..\$(Configuration.ToLower())\fcs Legacy project file cracker for the F# compiler service. @@ -25,8 +21,8 @@ - - + + diff --git a/fcs/FSharp.Compiler.Service.ProjectCrackerTool/FSharp.Compiler.Service.ProjectCrackerTool.fsproj b/fcs/FSharp.Compiler.Service.ProjectCrackerTool/FSharp.Compiler.Service.ProjectCrackerTool.fsproj index 9dddb1cb616..9f690c58ea1 100644 --- a/fcs/FSharp.Compiler.Service.ProjectCrackerTool/FSharp.Compiler.Service.ProjectCrackerTool.fsproj +++ b/fcs/FSharp.Compiler.Service.ProjectCrackerTool/FSharp.Compiler.Service.ProjectCrackerTool.fsproj @@ -13,7 +13,6 @@ $(OtherFlags) --staticlink:FSharp.Core true false - ..\..\$(Configuration.ToLower())\fcs diff --git a/fcs/FSharp.Compiler.Service.Tests/FSharp.Compiler.Service.Tests.fsproj b/fcs/FSharp.Compiler.Service.Tests/FSharp.Compiler.Service.Tests.fsproj index 8d09c3a26f1..abe71b6159a 100644 --- a/fcs/FSharp.Compiler.Service.Tests/FSharp.Compiler.Service.Tests.fsproj +++ b/fcs/FSharp.Compiler.Service.Tests/FSharp.Compiler.Service.Tests.fsproj @@ -76,7 +76,7 @@ - + diff --git a/fcs/FSharp.Compiler.Service/FSharp.Compiler.Service.fsproj b/fcs/FSharp.Compiler.Service/FSharp.Compiler.Service.fsproj index c5f1122386c..c5357aab06b 100644 --- a/fcs/FSharp.Compiler.Service/FSharp.Compiler.Service.fsproj +++ b/fcs/FSharp.Compiler.Service/FSharp.Compiler.Service.fsproj @@ -12,7 +12,6 @@ $(DefineConstants);COMPILER $(DefineConstants);ENABLE_MONO_SUPPORT $(DefineConstants);NO_STRONG_NAMES - ..\..\$(Configuration.ToLower())\fcs $(TargetFramework)\ $(TargetFramework)\ $(OtherFlags) /warnon:1182 diff --git a/fcs/build.fsx b/fcs/build.fsx index 204faa244ab..7f9f96f3574 100644 --- a/fcs/build.fsx +++ b/fcs/build.fsx @@ -13,8 +13,8 @@ open Fake.ReleaseNotesHelper #if MONO // prevent incorrect output encoding (e.g. https://github.com/fsharp/FAKE/issues/1196) System.Console.OutputEncoding <- System.Text.Encoding.UTF8 -CleanDir (__SOURCE_DIRECTORY__ + "/../tests/TestResults") -File.WriteAllText(__SOURCE_DIRECTORY__ + "/../tests/TestResults/notestsyet.txt","No tests yet") +CleanDir (__SOURCE_DIRECTORY__ + "/../artifacts/TestResults") +File.WriteAllText(__SOURCE_DIRECTORY__ + "/../artifacts/TestResults/notestsyet.txt","No tests yet") let isMono = true #else let isMono = false @@ -54,7 +54,7 @@ let runCmdIn workDir (exe:string) = Printf.ksprintf (fun (args:string) -> // The rest of the code is standard F# build script // -------------------------------------------------------------------------------------- -let releaseDir = Path.Combine(__SOURCE_DIRECTORY__, "../release/fcs") +let releaseDir = Path.Combine(__SOURCE_DIRECTORY__, "../artifacts/bin/fcs") // Read release notes & version info from RELEASE_NOTES.md let release = LoadReleaseNotes (__SOURCE_DIRECTORY__ + "/RELEASE_NOTES.md") diff --git a/fsharp.proj b/fsharp.proj index 42d2f15b16f..e695da391c9 100644 --- a/fsharp.proj +++ b/fsharp.proj @@ -41,25 +41,25 @@ - - - - - - - - - - + + + + + + + + + + - - - - - - + + + + + + @@ -70,41 +70,40 @@ - + - - - + + + - - - - + + + + - + - - - + + + - - - - + + + - + @@ -116,24 +115,20 @@ - - - - - + - + - + - + diff --git a/init-tools.cmd b/init-tools.cmd index 2c1b6d60bdb..cbdeb27afef 100644 --- a/init-tools.cmd +++ b/init-tools.cmd @@ -2,7 +2,7 @@ setlocal enabledelayedexpansion set /p DOTNET_TOOLS_VERSION=<"%~dp0DotnetCLIToolsVersion.txt" -set DOTNET_TOOLS_PATH=%~dp0Tools\dotnet20 +set DOTNET_TOOLS_PATH=%~dp0artifacts\toolset\dotnet set dotnetexe=%DOTNET_TOOLS_PATH%\dotnet.exe set sdksentinel=%DOTNET_TOOLS_PATH%\sdk-version.txt diff --git a/proto.proj b/proto.proj index 96f223470ec..c3a704496ee 100644 --- a/proto.proj +++ b/proto.proj @@ -8,7 +8,7 @@ - + diff --git a/setup/Directory.Build.props b/setup/Directory.Build.props index 64b72eafc9f..bd233e75785 100644 --- a/setup/Directory.Build.props +++ b/setup/Directory.Build.props @@ -1,12 +1,21 @@ - - + true false + $(MSBuildThisFileDirectory) + $(SetupRootFolder)resources + $(SetupRootFolder)..\artifacts\bin + $(ArtifactsDir)\VSSetup\$(Configuration) + $(ArtifactsDir)\VSSetup.obj\$(Configuration)\$(MSBuildProjectName) + $(SetupRootFolder)..\artifacts\VSSetup\$(Configuration) + $(SetupRootFolder)..\artifacts\VSSetup\$(Configuration)\Insertion + + + $(VSMajorVersion).$(VSMinorVersion).$(BUILD_BUILDNUMBER) diff --git a/setup/Directory.Build.targets b/setup/Directory.Build.targets index 0619a12001e..ccd47cc0a9a 100644 --- a/setup/Directory.Build.targets +++ b/setup/Directory.Build.targets @@ -1,4 +1,3 @@ - diff --git a/setup/FSharp.Setup.props b/setup/FSharp.Setup.props deleted file mode 100644 index 25398779040..00000000000 --- a/setup/FSharp.Setup.props +++ /dev/null @@ -1,142 +0,0 @@ - - - - - $(MSBuildThisFileDirectory) - - - - - $(VSMajorVersion).$(VSMinorVersion).$(BUILD_BUILDNUMBER) - - - - Debug - AnyCPU - - - - $(SetupRootFolder)\..\$(Configuration) - $(BinariesDir)\net40\bin\ - $(BinariesDir)\insertion - obj\$(Configuration)\ - $(BinariesDir)\setup - $(BinariesDir)\setup\$(Lang) - - - - - ENU - 1033 - 9 - en - en-US - false - - - CHT - 1028 - 31748 - zh-Hant - zh-TW - true - - - CSY - 1029 - 5 - cs - cs-CZ - true - - - DEU - 1031 - 7 - de - de-DE - true - - - FRA - 1036 - 12 - fr - fr-FR - true - - - ITA - 1040 - 16 - it - it-IT - true - - - JPN - 1041 - 17 - ja - ja-JP - true - - - KOR - 1042 - 18 - ko - ko-KR - true - - - PLK - 1045 - 21 - pl - pl-PL - true - - - PTB - 1046 - 1046 - pt-BR - pt-BR - true - - - RUS - 1049 - 25 - ru - ru-RU - true - - - TRK - 1055 - 31 - tr - tr-TR - true - - - CHS - 2052 - 4 - zh-Hans - zh-CN - true - - - ESN - 3082 - 10 - es - es-ES - true - - - - diff --git a/setup/Localization.props b/setup/Localization.props new file mode 100644 index 00000000000..37c13afcd2c --- /dev/null +++ b/setup/Localization.props @@ -0,0 +1,120 @@ + + + + + + + ENU + 1033 + 9 + en + en-US + false + + + CHT + 1028 + 31748 + zh-Hant + zh-TW + true + + + CSY + 1029 + 5 + cs + cs-CZ + true + + + DEU + 1031 + 7 + de + de-DE + true + + + FRA + 1036 + 12 + fr + fr-FR + true + + + ITA + 1040 + 16 + it + it-IT + true + + + JPN + 1041 + 17 + ja + ja-JP + true + + + KOR + 1042 + 18 + ko + ko-KR + true + + + PLK + 1045 + 21 + pl + pl-PL + true + + + PTB + 1046 + 1046 + pt-BR + pt-BR + true + + + RUS + 1049 + 25 + ru + ru-RU + true + + + TRK + 1055 + 31 + tr + tr-TR + true + + + CHS + 2052 + 4 + zh-Hans + zh-CN + true + + + ESN + 3082 + 10 + es + es-ES + true + + + + diff --git a/setup/Swix/Directory.Build.props b/setup/Swix/Directory.Build.props index 92203d4e217..f64df1d29de 100644 --- a/setup/Swix/Directory.Build.props +++ b/setup/Swix/Directory.Build.props @@ -1,14 +1,14 @@ + + Debug neutral false vsix true - $(FSharpSourcesRoot)\..\$(Configuration) - $(BinariesFolder)\insertion - $(MSBuildProjectDirectory)\obj + $(ArtifactsBinDir) diff --git a/setup/Swix/Directory.Build.targets b/setup/Swix/Directory.Build.targets index 14437118703..974c6da4f1b 100644 --- a/setup/Swix/Directory.Build.targets +++ b/setup/Swix/Directory.Build.targets @@ -1,3 +1,10 @@ + + + + $(ArtifactsDir)\VSSetup\$(Configuration)\Insertion\$(OutputName).vsix + + + diff --git a/setup/Swix/Microsoft.FSharp.Compiler.Resources/Files.swr b/setup/Swix/Microsoft.FSharp.Compiler.Resources/Files.swr index 464fdd774ee..f3f60d490b9 100644 --- a/setup/Swix/Microsoft.FSharp.Compiler.Resources/Files.swr +++ b/setup/Swix/Microsoft.FSharp.Compiler.Resources/Files.swr @@ -5,7 +5,7 @@ package name=Microsoft.FSharp.Compiler.Resources vs.package.language=$(LocaleSpecificCulture) folder "InstallDir:Common7\IDE\CommonExtensions\Microsoft\FSharpCompiler\$(LocaleParentCulture)" - file source="$(BinariesFolder)\net40\bin\$(LocaleParentCulture)\FSharp.Build.resources.dll" - file source="$(BinariesFolder)\net40\bin\$(LocaleParentCulture)\FSharp.Compiler.Interactive.Settings.resources.dll" - file source="$(BinariesFolder)\net40\bin\$(LocaleParentCulture)\FSharp.Compiler.Private.resources.dll" - file source="$(BinariesFolder)\net40\bin\$(LocaleParentCulture)\FSharp.Core.resources.dll" + file source="$(BinariesFolder)\FSharp.Build\$(Configuration)\net46\$(LocaleParentCulture)\FSharp.Build.resources.dll" + file source="$(BinariesFolder)\FSharp.Compiler.Interactive.Settings\$(Configuration)\net46\$(LocaleParentCulture)\FSharp.Compiler.Interactive.Settings.resources.dll" + file source="$(BinariesFolder)\FSharp.Compiler.Private\$(Configuration)\net46\$(LocaleParentCulture)\FSharp.Compiler.Private.resources.dll" + file source="$(BinariesFolder)\FSharp.Core\$(Configuration)\net45\$(LocaleParentCulture)\FSharp.Core.resources.dll" diff --git a/setup/Swix/Microsoft.FSharp.Compiler.Resources/Microsoft.FSharp.Compiler.Resources.swixproj b/setup/Swix/Microsoft.FSharp.Compiler.Resources/Microsoft.FSharp.Compiler.Resources.swixproj index 166cbb2d519..ac8e74d4854 100644 --- a/setup/Swix/Microsoft.FSharp.Compiler.Resources/Microsoft.FSharp.Compiler.Resources.swixproj +++ b/setup/Swix/Microsoft.FSharp.Compiler.Resources/Microsoft.FSharp.Compiler.Resources.swixproj @@ -10,6 +10,7 @@ $(PackagePreprocessorDefinitions);BinariesFolder=$(BinariesFolder) + $(PackagePreprocessorDefinitions);Configuration=$(Configuration) $(PackagePreprocessorDefinitions);FSharpPackageVersion=$(FSharpPackageVersion) $(PackagePreprocessorDefinitions);LocaleParentCulture=$(LocaleParentCulture) $(PackagePreprocessorDefinitions);LocaleSpecificCulture=$(LocaleSpecificCulture) diff --git a/setup/Swix/Microsoft.FSharp.Compiler/Files.swr b/setup/Swix/Microsoft.FSharp.Compiler/Files.swr index 58129a51ee0..b56667d2465 100644 --- a/setup/Swix/Microsoft.FSharp.Compiler/Files.swr +++ b/setup/Swix/Microsoft.FSharp.Compiler/Files.swr @@ -5,35 +5,35 @@ package name=Microsoft.FSharp.Compiler folder "InstallDir:Common7\IDE\CommonExtensions\Microsoft\FSharp" - file source=$(BinariesFolder)\net40\bin\fsc.exe vs.file.ngen=yes vs.file.ngenArchitecture=All vs.file.ngenPriority=2 vs.file.ngenApplication="[installDir]\Common7\IDE\CommonExtensions\Microsoft\FSharp\fsc.exe" - file source="$(BinariesFolder)\net40\bin\fsc.exe.config" + file source=$(BinariesFolder)\fsc\$(Configuration)\net46\fsc.exe vs.file.ngen=yes vs.file.ngenArchitecture=All vs.file.ngenPriority=2 vs.file.ngenApplication="[installDir]\Common7\IDE\CommonExtensions\Microsoft\FSharp\fsc.exe" + file source="$(BinariesFolder)\fsc\$(Configuration)\net46\fsc.exe.config" - file source=$(BinariesFolder)\net40\bin\fsi.exe vs.file.ngen=yes vs.file.ngenArchitecture=X86 vs.file.ngenPriority=2 vs.file.ngenApplication="[installDir]\Common7\IDE\CommonExtensions\Microsoft\FSharp\fsi.exe" - file source="$(BinariesFolder)\net40\bin\fsi.exe.config" + file source=$(BinariesFolder)\fsi\$(Configuration)\net46\fsi.exe vs.file.ngen=yes vs.file.ngenArchitecture=X86 vs.file.ngenPriority=2 vs.file.ngenApplication="[installDir]\Common7\IDE\CommonExtensions\Microsoft\FSharp\fsi.exe" + file source="$(BinariesFolder)\fsi\$(Configuration)\net46\fsi.exe.config" - file source="$(BinariesFolder)\net40\bin\fsiAnyCpu.exe" vs.file.ngen=yes vs.file.ngenArchitecture=X64 vs.file.ngenPriority=2 vs.file.ngenApplication="[installDir]\Common7\IDE\CommonExtensions\Microsoft\FSharp\fsiAnyCpu.exe" - file source="$(BinariesFolder)\net40\bin\fsiAnyCpu.exe.config" + file source="$(BinariesFolder)\fsiAnyCpu\$(Configuration)\net46\fsiAnyCpu.exe" vs.file.ngen=yes vs.file.ngenArchitecture=X64 vs.file.ngenPriority=2 vs.file.ngenApplication="[installDir]\Common7\IDE\CommonExtensions\Microsoft\FSharp\fsiAnyCpu.exe" + file source="$(BinariesFolder)\fsiAnyCpu\$(Configuration)\net46\fsiAnyCpu.exe.config" - file source="$(BinariesFolder)\net40\bin\FSharp.Compiler.Interactive.Settings.dll" vs.file.ngen=yes vs.file.ngenArchitecture=All vs.file.ngenPriority=2 - file source="$(BinariesFolder)\net40\bin\FSharp.Compiler.Private.dll" vs.file.ngen=yes vs.file.ngenArchitecture=All vs.file.ngenPriority=2 - file source="$(BinariesFolder)\net40\bin\FSharp.Compiler.Server.Shared.dll" vs.file.ngen=yes vs.file.ngenArchitecture=All vs.file.ngenPriority=2 + file source="$(BinariesFolder)\FSharp.Compiler.Interactive.Settings\$(Configuration)\net46\FSharp.Compiler.Interactive.Settings.dll" vs.file.ngen=yes vs.file.ngenArchitecture=All vs.file.ngenPriority=2 + file source="$(BinariesFolder)\FSharp.Compiler.Private\$(Configuration)\net46\FSharp.Compiler.Private.dll" vs.file.ngen=yes vs.file.ngenArchitecture=All vs.file.ngenPriority=2 + file source="$(BinariesFolder)\FSharp.Compiler.Server.Shared\$(Configuration)\net46\FSharp.Compiler.Server.Shared.dll" vs.file.ngen=yes vs.file.ngenArchitecture=All vs.file.ngenPriority=2 - file source="$(BinariesFolder)\net40\bin\FSharp.Core.dll" vs.file.ngen=yes vs.file.ngenArchitecture=All vs.file.ngenPriority=2 - file source="$(BinariesFolder)\net40\bin\FSharp.Core.optdata" - file source="$(BinariesFolder)\net40\bin\FSharp.Core.sigdata" + file source="$(BinariesFolder)\FSharp.Core\$(Configuration)\net45\FSharp.Core.dll" vs.file.ngen=yes vs.file.ngenArchitecture=All vs.file.ngenPriority=2 + file source="$(BinariesFolder)\FSharp.Core\$(Configuration)\net45\FSharp.Core.optdata" + file source="$(BinariesFolder)\FSharp.Core\$(Configuration)\net45\FSharp.Core.sigdata" - file source="$(BinariesFolder)\net40\bin\FSharp.Build.dll" vs.file.ngen=yes vs.file.ngenArchitecture=All vs.file.ngenPriority=2 + file source="$(BinariesFolder)\FSharp.Build\$(Configuration)\net46\FSharp.Build.dll" vs.file.ngen=yes vs.file.ngenArchitecture=All vs.file.ngenPriority=2 file source="$(PackagesFolder)\Microsoft.VisualFSharp.Type.Providers.Redist\$(MicrosoftVisualFSharpTypeProvidersRedistPackageVersion)\content\4.3.0.0\FSharp.Data.TypeProviders.dll" - file source="$(BinariesFolder)\net40\bin\Microsoft.Build.dll" - file source="$(BinariesFolder)\net40\bin\Microsoft.Build.Framework.dll" - file source="$(BinariesFolder)\net40\bin\Microsoft.Build.Tasks.Core.dll" - file source="$(BinariesFolder)\net40\bin\Microsoft.Build.Utilities.Core.dll" - file source="$(BinariesFolder)\net40\bin\Microsoft.Portable.FSharp.Targets" - file source="$(BinariesFolder)\net40\bin\System.Collections.Immutable.dll" - file source="$(BinariesFolder)\net40\bin\System.Reflection.Metadata.dll" - file source="$(BinariesFolder)\net40\bin\System.ValueTuple.dll" - file source="$(BinariesFolder)\net40\bin\Microsoft.FSharp.NetSdk.props" - file source="$(BinariesFolder)\net40\bin\Microsoft.FSharp.NetSdk.targets" - file source="$(BinariesFolder)\net40\bin\Microsoft.FSharp.Overrides.NetSdk.targets" - file source="$(BinariesFolder)\net40\bin\Microsoft.FSharp.Targets" + file source="$(BinariesFolder)\FSharp.Build\$(Configuration)\net46\Microsoft.Build.dll" + file source="$(BinariesFolder)\FSharp.Build\$(Configuration)\net46\Microsoft.Build.Framework.dll" + file source="$(BinariesFolder)\FSharp.Build\$(Configuration)\net46\Microsoft.Build.Tasks.Core.dll" + file source="$(BinariesFolder)\FSharp.Build\$(Configuration)\net46\Microsoft.Build.Utilities.Core.dll" + file source="$(BinariesFolder)\FSharp.Build\$(Configuration)\net46\Microsoft.Portable.FSharp.Targets" + file source="$(BinariesFolder)\FSharp.Build\$(Configuration)\net46\System.Collections.Immutable.dll" + file source="$(BinariesFolder)\FSharp.Compiler.Private\$(Configuration)\net46\System.Reflection.Metadata.dll" + file source="$(BinariesFolder)\FSharp.Compiler.Private\$(Configuration)\net46\System.ValueTuple.dll" + file source="$(BinariesFolder)\FSharp.Build\$(Configuration)\net46\Microsoft.FSharp.NetSdk.props" + file source="$(BinariesFolder)\FSharp.Build\$(Configuration)\net46\Microsoft.FSharp.NetSdk.targets" + file source="$(BinariesFolder)\FSharp.Build\$(Configuration)\net46\Microsoft.FSharp.Overrides.NetSdk.targets" + file source="$(BinariesFolder)\FSharp.Build\$(Configuration)\net46\Microsoft.FSharp.Targets" diff --git a/setup/Swix/Microsoft.FSharp.Compiler/Microsoft.FSharp.Compiler.swixproj b/setup/Swix/Microsoft.FSharp.Compiler/Microsoft.FSharp.Compiler.swixproj index 955da213a71..f256dd46779 100644 --- a/setup/Swix/Microsoft.FSharp.Compiler/Microsoft.FSharp.Compiler.swixproj +++ b/setup/Swix/Microsoft.FSharp.Compiler/Microsoft.FSharp.Compiler.swixproj @@ -10,6 +10,7 @@ $(PackagePreprocessorDefinitions);BinariesFolder=$(BinariesFolder) + $(PackagePreprocessorDefinitions);Configuration=$(Configuration) $(PackagePreprocessorDefinitions);PackagesFolder=$(NuGetPackageRoot) $(PackagePreprocessorDefinitions);FSharpTreeRoot=$(FSharpTreeRoot) $(PackagePreprocessorDefinitions);FSharpPackageVersion=$(FSharpPackageVersion) diff --git a/setup/Swix/Microsoft.FSharp.Dependencies/Files.swr b/setup/Swix/Microsoft.FSharp.Dependencies/Files.swr index 6ded7ba325f..c1ec9568099 100644 --- a/setup/Swix/Microsoft.FSharp.Dependencies/Files.swr +++ b/setup/Swix/Microsoft.FSharp.Dependencies/Files.swr @@ -4,16 +4,16 @@ package name=Microsoft.FSharp.Dependencies version=$(FSharpPackageVersion) folder "InstallDir:MSBuild\Microsoft\VisualStudio\v$(VSGeneralVersion)\FSharp" - file "Microsoft.FSharp.targets" source="$(BinariesFolder)\setup\$(TargetFramework)\resources\Microsoft.FSharp.Shim.targets" - file "Microsoft.Portable.FSharp.targets" source="$(BinariesFolder)\setup\$(TargetFramework)\resources\Microsoft.Portable.FSharp.Shim.targets" - file "Microsoft.FSharp.NetSdk.targets" source="$(BinariesFolder)\setup\$(TargetFramework)\resources\Microsoft.FSharp.NetSdk.Shim.targets" - file "Microsoft.FSharp.Overrides.NetSdk.targets" source="$(BinariesFolder)\setup\$(TargetFramework)\resources\Microsoft.FSharp.Overrides.NetSdk.Shim.targets" - file "Microsoft.FSharp.NetSdk.props" source="$(BinariesFolder)\setup\$(TargetFramework)\resources\Microsoft.FSharp.NetSdk.Shim.props" + file "Microsoft.FSharp.targets" source="$(SetupShimsDir)\Microsoft.FSharp.Shim.targets" + file "Microsoft.Portable.FSharp.targets" source="$(SetupShimsDir)\Microsoft.Portable.FSharp.Shim.targets" + file "Microsoft.FSharp.NetSdk.targets" source="$(SetupShimsDir)\Microsoft.FSharp.NetSdk.Shim.targets" + file "Microsoft.FSharp.Overrides.NetSdk.targets" source="$(SetupShimsDir)\Microsoft.FSharp.Overrides.NetSdk.Shim.targets" + file "Microsoft.FSharp.NetSdk.props" source="$(SetupShimsDir)\Microsoft.FSharp.NetSdk.Shim.props" folder "InstallDir:Common7\IDE\PublicAssemblies" - file source="$(BinariesFolder)\net40\bin\FSharp.Core.dll" vs.file.ngen=yes - file source="$(BinariesFolder)\net40\bin\FSharp.Core.optdata" - file source="$(BinariesFolder)\net40\bin\FSharp.Core.sigdata" + file source="$(BinariesFolder)\FSharp.Core\$(Configuration)\net45\FSharp.Core.dll" vs.file.ngen=yes + file source="$(BinariesFolder)\FSharp.Core\$(Configuration)\net45\FSharp.Core.optdata" + file source="$(BinariesFolder)\FSharp.Core\$(Configuration)\net45\FSharp.Core.sigdata" folder "InstallDir:Common7\Tools\VsDevCmd\Ext" file source="fsharp.bat" diff --git a/setup/Swix/Microsoft.FSharp.Dependencies/Microsoft.FSharp.Dependencies.swixproj b/setup/Swix/Microsoft.FSharp.Dependencies/Microsoft.FSharp.Dependencies.swixproj index dd1452bbefc..e30eaaf0fe1 100644 --- a/setup/Swix/Microsoft.FSharp.Dependencies/Microsoft.FSharp.Dependencies.swixproj +++ b/setup/Swix/Microsoft.FSharp.Dependencies/Microsoft.FSharp.Dependencies.swixproj @@ -10,7 +10,9 @@ $(PackagePreprocessorDefinitions);BinariesFolder=$(BinariesFolder) + $(PackagePreprocessorDefinitions);Configuration=$(Configuration) $(PackagePreprocessorDefinitions);FSharpPackageVersion=$(FSharpPackageVersion) + $(PackagePreprocessorDefinitions);SetupShimsDir=$(MSBuildThisFileDirectory)..\..\shims $(PackagePreprocessorDefinitions);TargetFramework=$(TargetFramework) $(PackagePreprocessorDefinitions);VSGeneralVersion=$(VSGeneralVersion) diff --git a/setup/Swix/Microsoft.FSharp.IDE/Files.swr b/setup/Swix/Microsoft.FSharp.IDE/Files.swr index 0d47c502090..2e0ee2bcf3b 100644 --- a/setup/Swix/Microsoft.FSharp.IDE/Files.swr +++ b/setup/Swix/Microsoft.FSharp.IDE/Files.swr @@ -4,10 +4,10 @@ package name=Microsoft.FSharp.IDE version=$(FSharpPackageVersion) folder "InstallDir:Common7\IDE\NewScriptItems" - file source="$(BinariesFolder)\setup\$(TargetFramework)\resources\NewFileDialog\Script\NewFSharpScriptItems.vsdir" - file source="$(BinariesFolder)\setup\$(TargetFramework)\resources\NewFileDialog\Script\Script.fsx" + file source="$(SetupResourcesDir)\NewFileDialog\Script\NewFSharpScriptItems.vsdir" + file source="$(SetupResourcesDir)\NewFileDialog\Script\Script.fsx" folder "InstallDir:Common7\IDE\NewFileItems" - file source="$(BinariesFolder)\setup\$(TargetFramework)\resources\NewFileDialog\General\NewFSharpFileItems.vsdir" - file source="$(BinariesFolder)\setup\$(TargetFramework)\resources\NewFileDialog\General\File.fs" - file source="$(BinariesFolder)\setup\$(TargetFramework)\resources\NewFileDialog\General\Script.fsx" + file source="$(SetupResourcesDir)\NewFileDialog\General\NewFSharpFileItems.vsdir" + file source="$(SetupResourcesDir)\NewFileDialog\General\File.fs" + file source="$(SetupResourcesDir)\NewFileDialog\General\Script.fsx" diff --git a/setup/Swix/Microsoft.FSharp.IDE/Microsoft.FSharp.IDE.swixproj b/setup/Swix/Microsoft.FSharp.IDE/Microsoft.FSharp.IDE.swixproj index b26924e23c2..223a7262fcb 100644 --- a/setup/Swix/Microsoft.FSharp.IDE/Microsoft.FSharp.IDE.swixproj +++ b/setup/Swix/Microsoft.FSharp.IDE/Microsoft.FSharp.IDE.swixproj @@ -9,8 +9,8 @@ - $(PackagePreprocessorDefinitions);BinariesFolder=$(BinariesFolder) $(PackagePreprocessorDefinitions);FSharpPackageVersion=$(FSharpPackageVersion) + $(PackagePreprocessorDefinitions);SetupResourcesDir=$(MSBuildThisFileDirectory)..\..\resources $(PackagePreprocessorDefinitions);TargetFramework=$(TargetFramework) diff --git a/setup/Swix/Microsoft.FSharp.Vsix.Resources/Files.swr b/setup/Swix/Microsoft.FSharp.Vsix.Resources/Files.swr index a8c5becc80e..f3b95d49900 100644 --- a/setup/Swix/Microsoft.FSharp.Vsix.Resources/Files.swr +++ b/setup/Swix/Microsoft.FSharp.Vsix.Resources/Files.swr @@ -5,16 +5,16 @@ package name=Microsoft.FSharp.VSIX.Full.Resources vs.package.language=$(LocaleSpecificCulture) folder "InstallDir:Common7\IDE\PublicAssemblies\$(LocaleParentCulture)" - file source="$(BinariesFolder)\net40\bin\$(LocaleParentCulture)\FSharp.Core.resources.dll" vs.file.ngen=yes + file source="$(BinariesFolder)\FSharp.Core\$(Configuration)\net45\$(LocaleParentCulture)\FSharp.Core.resources.dll" vs.file.ngen=yes folder "InstallDir:Common7\IDE\CommonExtensions\Microsoft\FSharp\$(LocaleParentCulture)" - file source="$(BinariesFolder)\net40\bin\$(LocaleParentCulture)\FSharp.Compiler.Private.resources.dll" vs.file.ngen=yes - file source="$(BinariesFolder)\net40\bin\$(LocaleParentCulture)\FSharp.Core.resources.dll" vs.file.ngen=yes - file source="$(BinariesFolder)\net40\bin\$(LocaleParentCulture)\FSharp.Editor.resources.dll" vs.file.ngen=yes - file source="$(BinariesFolder)\net40\bin\$(LocaleParentCulture)\FSharp.LanguageService.Base.resources.dll" vs.file.ngen=yes - file source="$(BinariesFolder)\net40\bin\$(LocaleParentCulture)\FSharp.LanguageService.resources.dll" vs.file.ngen=yes - file source="$(BinariesFolder)\net40\bin\$(LocaleParentCulture)\FSharp.ProjectSystem.Base.resources.dll" vs.file.ngen=yes - file source="$(BinariesFolder)\net40\bin\$(LocaleParentCulture)\FSharp.ProjectSystem.FSharp.resources.dll" vs.file.ngen=yes - file source="$(BinariesFolder)\net40\bin\$(LocaleParentCulture)\FSharp.ProjectSystem.PropertyPages.resources.dll" vs.file.ngen=yes - file source="$(BinariesFolder)\net40\bin\$(LocaleParentCulture)\FSharp.UIResources.resources.dll" vs.file.ngen=yes - file source="$(BinariesFolder)\net40\bin\$(LocaleParentCulture)\FSharp.VS.FSI.resources.dll" vs.file.ngen=yes + file source="$(BinariesFolder)\FSharp.Compiler.Private\$(Configuration)\net46\$(LocaleParentCulture)\FSharp.Compiler.Private.resources.dll" vs.file.ngen=yes + file source="$(BinariesFolder)\FSharp.Core\$(Configuration)\net45\$(LocaleParentCulture)\FSharp.Core.resources.dll" vs.file.ngen=yes + file source="$(BinariesFolder)\FSharp.Editor\$(Configuration)\net46\$(LocaleParentCulture)\FSharp.Editor.resources.dll" vs.file.ngen=yes + file source="$(BinariesFolder)\FSharp.LanguageService.Base\$(Configuration)\net46\$(LocaleParentCulture)\FSharp.LanguageService.Base.resources.dll" vs.file.ngen=yes + file source="$(BinariesFolder)\FSharp.LanguageService\$(Configuration)\net46\$(LocaleParentCulture)\FSharp.LanguageService.resources.dll" vs.file.ngen=yes + file source="$(BinariesFolder)\ProjectSystem.Base\$(Configuration)\net46\$(LocaleParentCulture)\FSharp.ProjectSystem.Base.resources.dll" vs.file.ngen=yes + file source="$(BinariesFolder)\ProjectSystem\$(Configuration)\net46\$(LocaleParentCulture)\FSharp.ProjectSystem.FSharp.resources.dll" vs.file.ngen=yes + file source="$(BinariesFolder)\FSharp.PropertiesPages\$(Configuration)\net46\$(LocaleParentCulture)\FSharp.ProjectSystem.PropertyPages.resources.dll" vs.file.ngen=yes + file source="$(BinariesFolder)\FSharp.UIResources\$(Configuration)\net46\$(LocaleParentCulture)\FSharp.UIResources.resources.dll" vs.file.ngen=yes + file source="$(BinariesFolder)\FSharp.VS.FSI\$(Configuration)\net46\$(LocaleParentCulture)\FSharp.VS.FSI.resources.dll" vs.file.ngen=yes diff --git a/setup/Swix/Microsoft.FSharp.Vsix.Resources/Microsoft.FSharp.Vsix.Resources.swixproj b/setup/Swix/Microsoft.FSharp.Vsix.Resources/Microsoft.FSharp.Vsix.Resources.swixproj index fd39c147b4c..d8952b40fe7 100644 --- a/setup/Swix/Microsoft.FSharp.Vsix.Resources/Microsoft.FSharp.Vsix.Resources.swixproj +++ b/setup/Swix/Microsoft.FSharp.Vsix.Resources/Microsoft.FSharp.Vsix.Resources.swixproj @@ -9,6 +9,7 @@ + $(PackagePreprocessorDefinitions);Configuration=$(Configuration) $(PackagePreprocessorDefinitions);BinariesFolder=$(BinariesFolder) $(PackagePreprocessorDefinitions);FSharpPackageVersion=$(FSharpPackageVersion) $(PackagePreprocessorDefinitions);LocaleCode=$(LocaleCode) diff --git a/setup/Swix/Microsoft.FSharp.Vsix.Resources/Templates.swr b/setup/Swix/Microsoft.FSharp.Vsix.Resources/Templates.swr index 770d904e226..5de89f0cadd 100644 --- a/setup/Swix/Microsoft.FSharp.Vsix.Resources/Templates.swr +++ b/setup/Swix/Microsoft.FSharp.Vsix.Resources/Templates.swr @@ -6,8 +6,8 @@ package name=Microsoft.FSharp.VSIX.Full.Resources folder "InstallDir:Common7\IDE\ProjectTemplates\FSharp\$(LocaleId)" folder "ConsoleApplication" - file source="$(BinariesFolder)\net40\bin\ProjectTemplates\FSharp\$(LocaleParentId)\ConsoleApplication.zip" + file source="$(BinariesFolder)\ConsoleProject\$(Configuration)\$(LocaleParentId)\ConsoleApplication.zip" folder "Library" - file source="$(BinariesFolder)\net40\bin\ProjectTemplates\FSharp\$(LocaleParentId)\Library.zip" + file source="$(BinariesFolder)\LibraryProject\$(Configuration)\$(LocaleParentId)\Library.zip" folder "Tutorial" - file source="$(BinariesFolder)\net40\bin\ProjectTemplates\FSharp\$(LocaleParentId)\Tutorial.zip" + file source="$(BinariesFolder)\TutorialProject\$(Configuration)\$(LocaleParentId)\Tutorial.zip" diff --git a/setup/Swix/Microsoft.FSharp.vsmanproj b/setup/Swix/Microsoft.FSharp.vsmanproj index d2b0388c272..ec9461e1137 100644 --- a/setup/Swix/Microsoft.FSharp.vsmanproj +++ b/setup/Swix/Microsoft.FSharp.vsmanproj @@ -6,7 +6,7 @@ true true - $(OutputPath) + $(OutputPath)\Insertion $(FSharpPackageVersion) @@ -23,17 +23,17 @@ - - + + - + - - + + - - - + + + diff --git a/setup/publish-assets.ps1 b/setup/publish-assets.ps1 index 29604698b4c..bfa905bbad9 100644 --- a/setup/publish-assets.ps1 +++ b/setup/publish-assets.ps1 @@ -16,7 +16,8 @@ The API key used to authenticate with MyGet. Param( [string]$binariesPath = $null, [string]$branchName = $null, - [string]$apiKey = $null + [string]$apiKey = $null, + [string]$configuration = $null ) Set-StrictMode -Version 2.0 @@ -40,7 +41,7 @@ try { } $branchName = $branchName.Replace("/", "_") # can't have slashes in the branch name - $vsix = Join-Path $binariesPath "net40\bin\VisualFSharpFull.vsix" + $vsix = Join-Path $binariesPath "VisualFSharpFull\$configuration\net46\VisualFSharpFull.vsix" Write-Host " Uploading '$vsix' to '$requestUrl'." diff --git a/setup/resources/Microsoft.FSharp.NetSdk.Shim.props b/setup/shims/Microsoft.FSharp.NetSdk.Shim.props similarity index 100% rename from setup/resources/Microsoft.FSharp.NetSdk.Shim.props rename to setup/shims/Microsoft.FSharp.NetSdk.Shim.props diff --git a/setup/resources/Microsoft.FSharp.NetSdk.Shim.targets b/setup/shims/Microsoft.FSharp.NetSdk.Shim.targets similarity index 100% rename from setup/resources/Microsoft.FSharp.NetSdk.Shim.targets rename to setup/shims/Microsoft.FSharp.NetSdk.Shim.targets diff --git a/setup/resources/Microsoft.FSharp.Overrides.NetSdk.Shim.targets b/setup/shims/Microsoft.FSharp.Overrides.NetSdk.Shim.targets similarity index 100% rename from setup/resources/Microsoft.FSharp.Overrides.NetSdk.Shim.targets rename to setup/shims/Microsoft.FSharp.Overrides.NetSdk.Shim.targets diff --git a/setup/resources/Microsoft.FSharp.Shim.targets b/setup/shims/Microsoft.FSharp.Shim.targets similarity index 100% rename from setup/resources/Microsoft.FSharp.Shim.targets rename to setup/shims/Microsoft.FSharp.Shim.targets diff --git a/setup/resources/Microsoft.Portable.FSharp.Shim.targets b/setup/shims/Microsoft.Portable.FSharp.Shim.targets similarity index 100% rename from setup/resources/Microsoft.Portable.FSharp.Shim.targets rename to setup/shims/Microsoft.Portable.FSharp.Shim.targets diff --git a/src/buildtools/Directory.Build.props b/src/buildtools/Directory.Build.props index bb5b23d29d0..12d9ad073ec 100644 --- a/src/buildtools/Directory.Build.props +++ b/src/buildtools/Directory.Build.props @@ -1,3 +1,3 @@ - + diff --git a/src/buildtools/Directory.Build.targets b/src/buildtools/Directory.Build.targets index bb5b23d29d0..14437118703 100644 --- a/src/buildtools/Directory.Build.targets +++ b/src/buildtools/Directory.Build.targets @@ -1,3 +1,3 @@ - + diff --git a/src/buildtools/buildtools.targets b/src/buildtools/buildtools.targets index 9285a376e88..9b00e18cf72 100644 --- a/src/buildtools/buildtools.targets +++ b/src/buildtools/buildtools.targets @@ -15,7 +15,7 @@ BeforeTargets="CoreCompile"> - $(MSBuildThisFileDirectory)fslex\bin\Proto\netcoreapp2.0\fslex.dll + $(ArtifactsBinDir)\fslex\Proto\netcoreapp2.0\fslex.dll @@ -38,7 +38,7 @@ BeforeTargets="CoreCompile"> - $(MSBuildThisFileDirectory)fsyacc\bin\Proto\netcoreapp2.0\fsyacc.dll + $(ArtifactsBinDir)\fsyacc\Proto\netcoreapp2.0\fsyacc.dll diff --git a/src/fsharp/Directory.Build.props b/src/fsharp/Directory.Build.props index 57c8aa24ba7..151415117e4 100644 --- a/src/fsharp/Directory.Build.props +++ b/src/fsharp/Directory.Build.props @@ -6,6 +6,7 @@ true true false + $(ArtifactsPackagesDir)\$(Configuration) diff --git a/src/fsharp/Directory.Nuget.props b/src/fsharp/Directory.Nuget.props index 97266b7c79d..6521936cfe3 100644 --- a/src/fsharp/Directory.Nuget.props +++ b/src/fsharp/Directory.Nuget.props @@ -20,6 +20,7 @@ tags=$(PackageTags); githeadsha=$(NormalizedGitHeadSha); configuration=$(Configuration); + artifactsbindir=$(ArtifactsBinDir); diff --git a/src/fsharp/Directory.Nuget.targets b/src/fsharp/Directory.Nuget.targets index f3ae171dc38..e30b155faad 100644 --- a/src/fsharp/Directory.Nuget.targets +++ b/src/fsharp/Directory.Nuget.targets @@ -8,14 +8,4 @@ - - - - - - - - - diff --git a/src/fsharp/FSharp.Compiler.Private/FSharp.Compiler.Private.fsproj b/src/fsharp/FSharp.Compiler.Private/FSharp.Compiler.Private.fsproj index 97d17b10972..46e8888f03b 100644 --- a/src/fsharp/FSharp.Compiler.Private/FSharp.Compiler.Private.fsproj +++ b/src/fsharp/FSharp.Compiler.Private/FSharp.Compiler.Private.fsproj @@ -21,14 +21,17 @@ + + $(BaseOutputPath)\$(Configuration)\$(TargetFramework) + - - - - - - - + + + + + + + diff --git a/src/fsharp/FSharp.Compiler.nuget/Directory.Build.targets b/src/fsharp/FSharp.Compiler.nuget/Directory.Build.targets index a20d4be41e6..7d885b518db 100644 --- a/src/fsharp/FSharp.Compiler.nuget/Directory.Build.targets +++ b/src/fsharp/FSharp.Compiler.nuget/Directory.Build.targets @@ -4,8 +4,8 @@ - - + + diff --git a/src/fsharp/FSharp.Compiler.nuget/Microsoft.FSharp.Compiler.nuspec b/src/fsharp/FSharp.Compiler.nuget/Microsoft.FSharp.Compiler.nuspec index ac76a4a2403..87ef49f5521 100644 --- a/src/fsharp/FSharp.Compiler.nuget/Microsoft.FSharp.Compiler.nuspec +++ b/src/fsharp/FSharp.Compiler.nuget/Microsoft.FSharp.Compiler.nuspec @@ -54,30 +54,30 @@ this approach gives a very small deployment. Which is kind of necessary. --> - - - - - - + + + + + + - - - - - - + + + + + + - - - - - - + + + + + + - - - - + + + + diff --git a/src/fsharp/FSharp.Core/FSharp.Core.nuspec b/src/fsharp/FSharp.Core/FSharp.Core.nuspec index 21b484cb8ab..443388a8278 100644 --- a/src/fsharp/FSharp.Core/FSharp.Core.nuspec +++ b/src/fsharp/FSharp.Core/FSharp.Core.nuspec @@ -56,18 +56,18 @@ - - - - + + + + - - - - + + + + - - + + diff --git a/src/fsharp/Fsc/InternalsVisibleTo.fs b/src/fsharp/fsc/InternalsVisibleTo.fs similarity index 100% rename from src/fsharp/Fsc/InternalsVisibleTo.fs rename to src/fsharp/fsc/InternalsVisibleTo.fs diff --git a/src/fsharp/Fsc/app.config b/src/fsharp/fsc/app.config similarity index 100% rename from src/fsharp/Fsc/app.config rename to src/fsharp/fsc/app.config diff --git a/src/fsharp/Fsc/Fsc.fsproj b/src/fsharp/fsc/fsc.fsproj similarity index 100% rename from src/fsharp/Fsc/Fsc.fsproj rename to src/fsharp/fsc/fsc.fsproj diff --git a/src/fsharp/fsi/Fsi.fsproj b/src/fsharp/fsi/fsi.fsproj similarity index 96% rename from src/fsharp/fsi/Fsi.fsproj rename to src/fsharp/fsi/fsi.fsproj index 9fbc4dc1331..6a4b7df15d5 100644 --- a/src/fsharp/fsi/Fsi.fsproj +++ b/src/fsharp/fsi/fsi.fsproj @@ -28,10 +28,10 @@ + - diff --git a/src/fsharp/fsiAnyCpu/FsiAnyCPU.fsproj b/src/fsharp/fsiAnyCpu/fsiAnyCpu.fsproj similarity index 100% rename from src/fsharp/fsiAnyCpu/FsiAnyCPU.fsproj rename to src/fsharp/fsiAnyCpu/fsiAnyCpu.fsproj diff --git a/tests/.gitignore b/tests/.gitignore index 2de72583ada..bf970a32fde 100644 --- a/tests/.gitignore +++ b/tests/.gitignore @@ -1,6 +1,5 @@ FSharp_* net40-fsharpqa-suite-* CoreUnit_* -TestResults *.il dont.run.peverify \ No newline at end of file diff --git a/tests/FSharp.Directory.Build.props b/tests/FSharp.Directory.Build.props index 19257808542..bb8eac309b1 100644 --- a/tests/FSharp.Directory.Build.props +++ b/tests/FSharp.Directory.Build.props @@ -1,9 +1,3 @@ - - - - - - diff --git a/tests/fsharp/SDKTests/AllSdkTargetsTests.proj b/tests/fsharp/SDKTests/AllSdkTargetsTests.proj index 857e3efd636..9da3a21fea1 100644 --- a/tests/fsharp/SDKTests/AllSdkTargetsTests.proj +++ b/tests/fsharp/SDKTests/AllSdkTargetsTests.proj @@ -1,7 +1,7 @@ - release + Release diff --git a/tests/fsharp/SDKTests/tests/Test.props b/tests/fsharp/SDKTests/tests/Test.props index fdfc314758e..b4665ec5749 100644 --- a/tests/fsharp/SDKTests/tests/Test.props +++ b/tests/fsharp/SDKTests/tests/Test.props @@ -6,14 +6,14 @@ <_TargetFrameworkVersionWithoutV Condition="'$(_TargetFrameworkVersionWithoutV)' == ''">4.6 .NETFramework - release - $(MSBuildThisFileDirectory)..\..\..\..\$(Configuration)\net40\bin + Release + $(MSBuildThisFileDirectory)..\..\..\..\artifacts\bin\FSharp.Build\$(Configuration)\net46 AnyCPU $(MSBuildThisFileDirectory) - + diff --git a/tests/fsharp/SDKTests/tests/Test.targets b/tests/fsharp/SDKTests/tests/Test.targets index 5526c118403..6f1638051d8 100644 --- a/tests/fsharp/SDKTests/tests/Test.targets +++ b/tests/fsharp/SDKTests/tests/Test.targets @@ -1,6 +1,6 @@ - + diff --git a/tests/fsharp/Test.Directory.Build.props b/tests/fsharp/Test.Directory.Build.props deleted file mode 100644 index 6603d10e659..00000000000 --- a/tests/fsharp/Test.Directory.Build.props +++ /dev/null @@ -1,8 +0,0 @@ - - - $(CompilerTestPath)\Microsoft.FSharp.Targets - $(CompilerTestPath)\Microsoft.FSharp.NetSdk.props - $(CompilerTestPath)\Microsoft.FSharp.NetSdk.targets - $(CompilerTestPath)\Microsoft.FSharp.Overrides.NetSdk.targets - - diff --git a/tests/fsharp/single-test.fs b/tests/fsharp/single-test.fs index 4e221bed17c..14a79c360d2 100644 --- a/tests/fsharp/single-test.fs +++ b/tests/fsharp/single-test.fs @@ -62,10 +62,10 @@ type ProjectConfiguration = { let replaceTokens tag (replacement:string) (template:string) = template.Replace(tag, replacement) -let generateProps testCompilerVersion= +let generateProps testCompilerVersion = let template = @" - release + Release $(TESTCOMPILERVERSION) @@ -96,13 +96,13 @@ let generateProjectArtifacts (pc:ProjectConfiguration) targetFramework = let condition = if addCondition then " Condition=\"Exists('" + fileName + "')\"" else "" match compileItem with | CompileItem.Compile -> - "\n " + "\n " | CompileItem.Reference -> - "\n " + "\n " | CompileItem.UseSource -> - "\n " + "\n " | CompileItem.LoadSource -> - "\n " + "\n " sources |> List.map(fun src -> computeInclude src) @@ -215,7 +215,7 @@ let singleTestBuildAndRunCore cfg copyFiles p = let projectBody = generateProjectArtifacts pc targetFramework emitFile projectFileName projectBody use testOkFile = new FileGuard(Path.Combine(directory, "test.ok")) - exec { cfg with Directory = directory } cfg.DotNet20Exe (sprintf "run -f %s" targetFramework) + exec { cfg with Directory = directory } cfg.DotNetExe (sprintf "run -f %s" targetFramework) testOkFile.CheckExists() executeFsc compilerType targetFramework else @@ -225,7 +225,7 @@ let singleTestBuildAndRunCore cfg copyFiles p = let projectBody = generateProjectArtifacts pc targetFramework emitFile projectFileName projectBody use testOkFile = new FileGuard(Path.Combine(directory, "test.ok")) - exec { cfg with Directory = directory } cfg.DotNet20Exe "build /t:RunFSharpScript" + exec { cfg with Directory = directory } cfg.DotNetExe "build /t:RunFSharpScript" testOkFile.CheckExists() executeFsi compilerType targetFramework result <- true diff --git a/tests/fsharp/test-framework.fs b/tests/fsharp/test-framework.fs index e00fc7111e7..85bc6319f19 100644 --- a/tests/fsharp/test-framework.fs +++ b/tests/fsharp/test-framework.fs @@ -122,19 +122,19 @@ type TestConfig = BUILD_CONFIG : string FSC : string fsc_flags : string - BinPath : string FSCOREDLLPATH : string FSI : string #if !FSHARP_SUITE_DRIVES_CORECLR_TESTS FSIANYCPU : string #endif FSI_FOR_SCRIPTS : string + FSharpBuild : string + FSharpCompilerInteractiveSettings : string fsi_flags : string ILDASM : string PEVERIFY : string Directory: string DotNetExe: string - DotNet20Exe: string DefaultPlatform: string} @@ -157,11 +157,21 @@ let config configurationName envVars = let SCRIPT_ROOT = __SOURCE_DIRECTORY__ let packagesDir = Environment.GetEnvironmentVariable("USERPROFILE") ++ ".nuget" ++ "packages" #if NET46 - let architecture = "net40" + let fscArchitecture = "net46" + let fsiArchitecture = "net46" + let fsharpCoreArchitecture = "net45" + let fsharpBuildArchitecture = "net46" + let fsharpCompilerInteractiveSettingsArchitecture = "net46" #else - let architecture = "coreclr" + let fscArchitecture = "netcoreapp2.1" + let fsiArchitecture = "netcoreapp2.0" + let fsharpCoreArchitecture = "netstandard1.6" + let fsharpBuildArchitecture = "netstandard2.0" + let fsharpCompilerInteractiveSettingsArchitecture = "netstandard1.6" #endif - let BINPATH = SCRIPT_ROOT ++ ".." ++ ".." ++ configurationName ++ architecture ++ "bin" + let repoRoot = SCRIPT_ROOT ++ ".." ++ ".." + let artifactsPath = repoRoot ++ "artifacts" + let artifactsBinPath = artifactsPath ++ "bin" let csc_flags = "/nologo" let fsc_flags = "-r:System.Core.dll --nowarn:20 --define:COMPILED" let fsi_flags = "-r:System.Core.dll --nowarn:20 --define:INTERACTIVE --maxerrors:1 --abortonerror" @@ -170,20 +180,20 @@ let config configurationName envVars = let CSC = requireFile (packagesDir ++ "Microsoft.Net.Compilers" ++ "2.7.0" ++ "tools" ++ "csc.exe") let ILDASM = requireFile (packagesDir ++ ("runtime.win-" + architectureMoniker + ".Microsoft.NETCore.ILDAsm") ++ "2.0.3" ++ "runtimes" ++ ("win-" + architectureMoniker) ++ "native" ++ "ildasm.exe") let coreclrdll = requireFile (packagesDir ++ ("runtime.win-" + architectureMoniker + ".Microsoft.NETCore.Runtime.CoreCLR") ++ "2.0.3" ++ "runtimes" ++ ("win-" + architectureMoniker) ++ "native" ++ "coreclr.dll") - let PEVERIFY = requireFile (SCRIPT_ROOT ++ ".." ++ "fsharpqa" ++ "testenv" ++ "src" ++ "PEVerify" ++ "bin" ++ configurationName ++ "net46" ++ "PEVerify.exe") - let FSI_FOR_SCRIPTS = BINPATH ++ "fsi.exe" - let toolsDir = SCRIPT_ROOT ++ ".." ++ ".." ++ "Tools" - let dotNetExe = toolsDir ++ "dotnetcli" ++ "dotnet.exe" - let dotNet20Exe = toolsDir ++ "dotnet20" ++ "dotnet.exe" + let PEVERIFY = requireFile (artifactsBinPath ++ "PEVerify" ++ configurationName ++ "net46" ++ "PEVerify.exe") + let FSI_FOR_SCRIPTS = artifactsBinPath ++ "fsi" ++ configurationName ++ fsiArchitecture ++ "fsi.exe" + let FSharpBuild = requireFile (artifactsBinPath ++ "FSharp.Build" ++ configurationName ++ fsharpBuildArchitecture ++ "FSharp.Build.dll") + let FSharpCompilerInteractiveSettings = requireFile (artifactsBinPath ++ "FSharp.Compiler.Interactive.Settings" ++ configurationName ++ fsharpCompilerInteractiveSettingsArchitecture ++ "FSharp.Compiler.Interactive.Settings.dll") + let dotNetExe = artifactsPath ++ "toolset" ++ "dotnet" ++ "dotnet.exe" // ildasm requires coreclr.dll to run which has already been restored to the packages directory File.Copy(coreclrdll, Path.GetDirectoryName(ILDASM) ++ "coreclr.dll", overwrite=true) - let FSI = requireFile (BINPATH ++ "fsi.exe") + let FSI = requireFile (FSI_FOR_SCRIPTS) #if !FSHARP_SUITE_DRIVES_CORECLR_TESTS - let FSIANYCPU = requireFile (BINPATH ++ "fsiAnyCpu.exe") + let FSIANYCPU = requireFile (artifactsBinPath ++ "fsiAnyCpu" ++ configurationName ++ "net46" ++ "fsiAnyCpu.exe") #endif - let FSC = requireFile (BINPATH ++ "fsc.exe") - let FSCOREDLLPATH = requireFile (BINPATH ++ "FSharp.Core.dll") + let FSC = requireFile (artifactsBinPath ++ "fsc" ++ configurationName ++ fscArchitecture ++ "fsc.exe") + let FSCOREDLLPATH = requireFile (artifactsBinPath ++ "FSharp.Core" ++ configurationName ++ fsharpCoreArchitecture ++ "FSharp.Core.dll") let defaultPlatform = match Is64BitOperatingSystem with @@ -193,7 +203,6 @@ let config configurationName envVars = | false -> "win7-x86" { EnvironmentVariables = envVars - BinPath = BINPATH |> Commands.pathAddBackslash FSCOREDLLPATH = FSCOREDLLPATH ILDASM = ILDASM PEVERIFY = PEVERIFY @@ -205,12 +214,13 @@ let config configurationName envVars = FSIANYCPU = FSIANYCPU #endif FSI_FOR_SCRIPTS = FSI_FOR_SCRIPTS + FSharpBuild = FSharpBuild + FSharpCompilerInteractiveSettings = FSharpCompilerInteractiveSettings csc_flags = csc_flags fsc_flags = fsc_flags fsi_flags = fsi_flags Directory="" DotNetExe = dotNetExe - DotNet20Exe = dotNet20Exe DefaultPlatform = defaultPlatform } let logConfig (cfg: TestConfig) = @@ -222,7 +232,6 @@ let logConfig (cfg: TestConfig) = log "csc_flags =%s" cfg.csc_flags log "FSC =%s" cfg.FSC log "fsc_flags =%s" cfg.fsc_flags - log "BINPATH =%s" cfg.BinPath log "FSCOREDLLPATH =%s" cfg.FSCOREDLLPATH log "FSI =%s" cfg.FSI #if !FSHARP_SUITE_DRIVES_CORECLR_TESTS @@ -452,6 +461,7 @@ let rm cfg x = Commands.rm cfg.Directory x let rmdir cfg x = Commands.rmdir cfg.Directory x let mkdir cfg = Commands.mkdir_p cfg.Directory let copy_y cfg f = Commands.copy_y cfg.Directory f >> checkResult +let copySystemValueTuple cfg = copy_y cfg (getDirectoryName(cfg.FSC) ++ "System.ValueTuple.dll") ("." ++ "System.ValueTuple.dll") let diff normalize path1 path2 = let result = System.Text.StringBuilder() diff --git a/tests/fsharp/tests.fs b/tests/fsharp/tests.fs index d18197ee20d..7f5804ea1f2 100644 --- a/tests/fsharp/tests.fs +++ b/tests/fsharp/tests.fs @@ -326,7 +326,7 @@ module CoreTests = fsc cfg "%s -a -o:lib.dll" cfg.fsc_flags ["lib.fs"] - copy_y cfg (cfg.BinPath ++ "System.ValueTuple.dll") ("." ++ "System.ValueTuple.dll") + copySystemValueTuple cfg peverify cfg "lib.dll" fsc cfg "%s -r:lib.dll" cfg.fsc_flags ["test.fsx"] @@ -479,7 +479,7 @@ module CoreTests = fsc cfg "%s -a -o:lib.dll -g" cfg.fsc_flags ["lib.fs"] - copy_y cfg (cfg.BinPath ++ "System.ValueTuple.dll") ("." ++ "System.ValueTuple.dll") + copySystemValueTuple cfg peverify cfg "lib.dll" @@ -789,7 +789,7 @@ module CoreTests = fsc cfg "%s -o:test.exe -r cslib.dll -g" cfg.fsc_flags ["test.fsx"] - copy_y cfg (cfg.BinPath ++ "System.ValueTuple.dll") ("." ++ "System.ValueTuple.dll") + copySystemValueTuple cfg peverify cfg "test.exe" @@ -1072,7 +1072,7 @@ module CoreTests = echo "Test 6=================================================" - fscAppend cfg stdoutPath stderrPath "--nologo -r FSharp.Compiler.Interactive.Settings" ["usesfsi.fsx"] + fscAppend cfg stdoutPath stderrPath "--nologo -r \"%s\"" cfg.FSharpCompilerInteractiveSettings ["usesfsi.fsx"] echo "Test 7=================================================" @@ -1632,13 +1632,13 @@ module CoreTests = let verify () = let cfg = testConfig "core/verify" - peverifyWithArgs cfg "/nologo" (cfg.BinPath ++ "FSharp.Build.dll") + peverifyWithArgs cfg "/nologo" (cfg.FSharpBuild) - // peverifyWithArgs cfg "/nologo /MD" (cfg.BinPath ++ "FSharp.Compiler.dll") + // peverifyWithArgs cfg "/nologo /MD" (getDirectoryName(cfg.FSC) ++ "FSharp.Compiler.dll") - peverifyWithArgs cfg "/nologo" (cfg.BinPath ++ "fsi.exe") + peverifyWithArgs cfg "/nologo" (cfg.FSI) - peverifyWithArgs cfg "/nologo" (cfg.BinPath ++ "FSharp.Compiler.Interactive.Settings.dll") + peverifyWithArgs cfg "/nologo" (cfg.FSharpCompilerInteractiveSettings) fsc cfg "%s -o:xmlverify.exe -g" cfg.fsc_flags ["xmlverify.fs"] @@ -1957,7 +1957,7 @@ module TypecheckTests = let ``sigs pos27`` () = let cfg = testConfig "typecheck/sigs" fsc cfg "%s --target:exe -o:pos27.exe" cfg.fsc_flags ["pos27.fs"] - copy_y cfg (cfg.BinPath ++ "System.ValueTuple.dll") ("." ++ "System.ValueTuple.dll") + copySystemValueTuple cfg peverify cfg "pos27.exe" [] diff --git a/tests/fsharpqa/Source/CodeGen/EmittedIL/CompareIL.cmd b/tests/fsharpqa/Source/CodeGen/EmittedIL/CompareIL.cmd index da8260013c7..1786d4bc552 100644 --- a/tests/fsharpqa/Source/CodeGen/EmittedIL/CompareIL.cmd +++ b/tests/fsharpqa/Source/CodeGen/EmittedIL/CompareIL.cmd @@ -3,7 +3,7 @@ REM == %1 --> assembly ildasm /TEXT /LINENUM /NOBAR "%~nx1" >"%~n1.il" IF NOT ERRORLEVEL 0 exit 1 -echo ..\..\..\..\testenv\bin\ILComparer.exe "%~n1.il.bsl" "%~n1.il" -..\..\..\..\testenv\bin\ILComparer.exe "%~n1.il.bsl" "%~n1.il" +echo %~dp0..\..\..\testenv\bin\ILComparer.exe "%~n1.il.bsl" "%~n1.il" + %~dp0..\..\..\testenv\bin\ILComparer.exe "%~n1.il.bsl" "%~n1.il" exit /b %ERRORLEVEL% diff --git a/tests/fsharpqa/Source/run.pl b/tests/fsharpqa/Source/run.pl index c999def6387..d9c3de8c3de 100644 --- a/tests/fsharpqa/Source/run.pl +++ b/tests/fsharpqa/Source/run.pl @@ -265,12 +265,12 @@ my $PEVERIFY = $ENV{PEVERIFY}; unless(defined($PEVERIFY)) { my $scriptPath = dirname(__FILE__); - $PEVERIFY = "$scriptPath\\..\\testenv\\src\\PEVerify\\bin\\Release\\net46\\PEVerify.exe"; + $PEVERIFY = "$scriptPath\\..\\..\\..\\artifacts\\bin\\PEVerify\\Release\\net46\\PEVerify.exe"; if (-e $PEVERIFY) { $ENV{PEVERIFY} = $PEVERIFY; } else { - $ENV{PEVERIFY} = "$scriptPath\\..\\testenv\\src\\PEVerify\\bin\\Debug\\net46\\PEVerify.exe"; + $ENV{PEVERIFY} = "$scriptPath\\..\\..\\..\\artifacts\\bin\\PEVerify\\Debug\\net46\\PEVerify.exe"; } } diff --git a/tests/service/FscTests.fs b/tests/service/FscTests.fs index 82914dbdbae..553f5e468b0 100644 --- a/tests/service/FscTests.fs +++ b/tests/service/FscTests.fs @@ -48,7 +48,7 @@ type PEVerifier () = Some ("pedump", "--verify all") else let peverifyPath configuration = - Path.Combine(__SOURCE_DIRECTORY__, "..", "fsharpqa", "testenv", "src", "PEVerify", "bin", configuration, "net46", "PEVerify.exe") + Path.Combine(__SOURCE_DIRECTORY__, "..", "..", "artifacts", "bin", "PEVerify", configuration, "net46", "PEVerify.exe") let peverify = if File.Exists(peverifyPath "Debug") then peverifyPath "Debug" else peverifyPath "Release" diff --git a/verify-translations.cmd b/verify-translations.cmd index 6717de0f778..2580890c6fb 100644 --- a/verify-translations.cmd +++ b/verify-translations.cmd @@ -1,3 +1,3 @@ @echo off -%~dp0release\net40\bin\fsi.exe %~dp0src\scripts\VerifyAllTranslations.fsx -- %~dp0 +%~dp0artifacts\bin\fsi\Release\net46\fsi.exe %~dp0src\scripts\VerifyAllTranslations.fsx -- %~dp0 diff --git a/vsintegration/ItemTemplates/.gitignore b/vsintegration/ItemTemplates/.gitignore new file mode 100644 index 00000000000..cd42ee34e87 --- /dev/null +++ b/vsintegration/ItemTemplates/.gitignore @@ -0,0 +1,2 @@ +bin/ +obj/ diff --git a/vsintegration/ProjectTemplates/.gitignore b/vsintegration/ProjectTemplates/.gitignore new file mode 100644 index 00000000000..cd42ee34e87 --- /dev/null +++ b/vsintegration/ProjectTemplates/.gitignore @@ -0,0 +1,2 @@ +bin/ +obj/ diff --git a/vsintegration/Templates.Directory.Build.props b/vsintegration/Templates.Directory.Build.props index 9be1daa15b8..c6a5cea2009 100644 --- a/vsintegration/Templates.Directory.Build.props +++ b/vsintegration/Templates.Directory.Build.props @@ -2,6 +2,12 @@ + + + + + + net46 v4.6 diff --git a/vsintegration/Templates.Directory.Build.targets b/vsintegration/Templates.Directory.Build.targets index 84513c489fc..4d8df139274 100644 --- a/vsintegration/Templates.Directory.Build.targets +++ b/vsintegration/Templates.Directory.Build.targets @@ -11,4 +11,21 @@ + + + + + $(OutputPath)$(TemplateCategory)\FSharp + $(MSBuildProjectDirectory)\$(TemplatesRootPath) + + + + + + + + + + diff --git a/vsintegration/Vsix/Directory.Build.targets b/vsintegration/Vsix/Directory.Build.targets index fa37bc2cd13..677cf0afc9d 100644 --- a/vsintegration/Vsix/Directory.Build.targets +++ b/vsintegration/Vsix/Directory.Build.targets @@ -2,6 +2,11 @@ + + $(ArtifactsDir)\VSSetup\$(Configuration) + $(ArtifactsDir)\VSSetup.obj\$(Configuration)\Microsoft.FSharp\ + + False diff --git a/vsintegration/Vsix/VisualFSharpFull/VisualFSharpFull.csproj b/vsintegration/Vsix/VisualFSharpFull/VisualFSharpFull.csproj index 54b61728a7f..95a623bfa12 100644 --- a/vsintegration/Vsix/VisualFSharpFull/VisualFSharpFull.csproj +++ b/vsintegration/Vsix/VisualFSharpFull/VisualFSharpFull.csproj @@ -85,7 +85,7 @@ True TargetFramework=net45 - + {8B3E283D-B5FE-4055-9D80-7E3A32F3967B} FsiAnyCPU BuiltProjectOutputGroup%3bGetCopyToOutputDirectoryItems%3b @@ -97,7 +97,7 @@ True TargetFramework=net46 - + {D0E98C0D-490B-4C61-9329-0862F6E87645} Fsi BuiltProjectOutputGroup%3bGetCopyToOutputDirectoryItems%3b @@ -109,7 +109,7 @@ True TargetFramework=net46 - + {C94C257C-3C0A-4858-B5D8-D746498D1F08} fsc BuiltProjectOutputGroup%3bGetCopyToOutputDirectoryItems%3b diff --git a/vsintegration/src/Directory.Build.props b/vsintegration/src/Directory.Build.props new file mode 100644 index 00000000000..1ad6fb80ecd --- /dev/null +++ b/vsintegration/src/Directory.Build.props @@ -0,0 +1,9 @@ + + + + + + false + + + diff --git a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/FSharp.PropertiesPages.vbproj b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/FSharp.PropertiesPages.vbproj index 8e8042c83a0..a04064212fd 100644 --- a/vsintegration/src/FSharp.ProjectSystem.PropertyPages/FSharp.PropertiesPages.vbproj +++ b/vsintegration/src/FSharp.ProjectSystem.PropertyPages/FSharp.PropertiesPages.vbproj @@ -4,8 +4,7 @@ Debug - net40 - $(FSharpSourcesRoot)\..\$(Configuration)\$(TargetDotnetProfile)\bin + $(ArtifactsBinDir)\$(MSBuildProjectName)\$(Configuration)\$(TargetFramework) AnyCPU 9.0.21022 2.0 @@ -24,6 +23,7 @@ false 41999,42016,42017,42018,42019,42020,42021,42022,42032,42036 40026;42105;42107;42353 + win v4.6 diff --git a/vsintegration/tests/GetTypesVSUnitTests/GetTypesVSUnitTests.fsproj b/vsintegration/tests/GetTypesVSUnitTests/GetTypesVSUnitTests.fsproj index 1167ad2577c..68470cf046d 100644 --- a/vsintegration/tests/GetTypesVSUnitTests/GetTypesVSUnitTests.fsproj +++ b/vsintegration/tests/GetTypesVSUnitTests/GetTypesVSUnitTests.fsproj @@ -10,6 +10,8 @@ false true true + true + true @@ -19,6 +21,7 @@ + diff --git a/vsintegration/tests/Salsa/salsa.fs b/vsintegration/tests/Salsa/salsa.fs index 8a86f834180..9314dbf3662 100644 --- a/vsintegration/tests/Salsa/salsa.fs +++ b/vsintegration/tests/Salsa/salsa.fs @@ -43,13 +43,13 @@ module internal Salsa = { new System.IDisposable with member this.Dispose() = actuallyBuild <- true } member th.Results = capturedFlags, capturedSources - member th.Compile(compile:System.Converter, flags:string[], sources:string[]) = + member th.Compile(compile:System.Func, flags:string[], sources:string[]) = capturedFlags <- flags capturedSources <- sources if actuallyBuild then - compile.Invoke(0) + compile.Invoke() else - 0 + 0 interface ITaskHost type BuildResult = { diff --git a/vsintegration/tests/UnitTests/LegacyLanguageService/Tests.LanguageService.ParameterInfo.fs b/vsintegration/tests/UnitTests/LegacyLanguageService/Tests.LanguageService.ParameterInfo.fs index 9339aaa02a8..06b42d32efc 100644 --- a/vsintegration/tests/UnitTests/LegacyLanguageService/Tests.LanguageService.ParameterInfo.fs +++ b/vsintegration/tests/UnitTests/LegacyLanguageService/Tests.LanguageService.ParameterInfo.fs @@ -433,19 +433,15 @@ type UsingMSBuild() = | [] -> System.String.Format((*Mark*) | x :: xs -> f xs""" // Note, 3 of these 8 are only available on .NET 4.6.1. On .NET 4.5 only 5 overloads are returned. - let expected45 = [["format"; "arg0"]; //Net4.5 - ["format"; "args"]; //Net4.5 - ["provider"; "format"; "args"]; //Net4.5 - ["format"; "arg0"; "arg1"]; //Net4.5 - ["format"; "arg0"; "arg1"; "arg2"]] //Net4.5 - let expected461 = [["provider"; "format"; "arg0"]; //Net4.6.1 - ["provider"; "format"; "arg0"; "arg1"]; //Net4.6.1 - ["provider"; "format"; "arg0"; "arg1"; "arg2"]] //Net4.6.1 - - let expected = - if Environment.Version.CompareTo(v461) >= 0 then - List.concat [expected45;expected461] - else expected45 + let expected = [["format"; "arg0"]; //Net4.5 + ["format"; "args"]; //Net4.5 + ["provider"; "format"; "args"]; //Net4.5 + ["format"; "arg0"; "arg1"]; //Net4.5 + ["format"; "arg0"; "arg1"; "arg2"]; //Net4.5 + ["provider"; "format"; "arg0"]; //Net4.6.1 + ["provider"; "format"; "arg0"; "arg1"]; //Net4.6.1 + ["provider"; "format"; "arg0"; "arg1"; "arg2"]] //Net4.6.1 + this.VerifyParameterInfoAtStartOfMarker(fileContent,"(*Mark*)", expected) (* --- Parameter Info Systematic Tests ------------------------------------------------- *) diff --git a/vsintegration/tests/UnitTests/Tests.Build.fs b/vsintegration/tests/UnitTests/Tests.Build.fs index ecdf69f5cf3..b1b7228a16f 100644 --- a/vsintegration/tests/UnitTests/Tests.Build.fs +++ b/vsintegration/tests/UnitTests/Tests.Build.fs @@ -40,8 +40,8 @@ type MyLogger(f : string -> unit) = type FauxHostObject() = let mutable myFlags : string[] = null let mutable mySources : string[] = null - member x.Compile(compile:System.Converter, flags:string[], sources:string[]) = - myFlags <- flags + member x.Compile(compile:System.Func, flags:string[], sources:string[]) = + myFlags <- flags mySources <- sources 0 member x.Flags = myFlags @@ -77,7 +77,7 @@ type Build() = let p = tool.InternalGenerateFullPathToTool() Assert.Fail("should not succeed") with e -> - e.Message.AssertMatchesPattern("ToolPath is unknown; specify the path to fsc.exe as the ToolPath property.") + e.Message.AssertMatchesPattern("ToolPath is unknown; specify the path to the tool.") [] member public this.TestCodePage() = @@ -92,7 +92,8 @@ type Build() = "--warnaserror:76" + Environment.NewLine + "--fullpaths" + Environment.NewLine + "--flaterrors" + Environment.NewLine + - "--highentropyva-" + Environment.NewLine) + "--highentropyva-" + Environment.NewLine + + "--nocopyfsharpcore" + Environment.NewLine) cmd [] @@ -107,7 +108,8 @@ type Build() = "--warnaserror:76" + Environment.NewLine + "--fullpaths" + Environment.NewLine + "--flaterrors" + Environment.NewLine + - "--highentropyva-" + Environment.NewLine) + "--highentropyva-" + Environment.NewLine + + "--nocopyfsharpcore" + Environment.NewLine) cmd [] @@ -122,7 +124,8 @@ type Build() = "--warnaserror:76" + Environment.NewLine + "--fullpaths" + Environment.NewLine + "--flaterrors" + Environment.NewLine + - "--highentropyva-" + Environment.NewLine) + "--highentropyva-" + Environment.NewLine + + "--nocopyfsharpcore" + Environment.NewLine) cmd [] @@ -139,7 +142,8 @@ type Build() = "--warnaserror:76" + Environment.NewLine + "--fullpaths" + Environment.NewLine + "--flaterrors" + Environment.NewLine + - "--highentropyva-" + Environment.NewLine) + "--highentropyva-" + Environment.NewLine + + "--nocopyfsharpcore" + Environment.NewLine) cmd [] @@ -154,7 +158,8 @@ type Build() = "--warnaserror:76" + Environment.NewLine + "--fullpaths" + Environment.NewLine + "--flaterrors" + Environment.NewLine + - "--highentropyva-" + Environment.NewLine) + "--highentropyva-" + Environment.NewLine + + "--nocopyfsharpcore" + Environment.NewLine) cmd [] @@ -168,7 +173,8 @@ type Build() = "--warnaserror:76" + Environment.NewLine + "--fullpaths" + Environment.NewLine + "--flaterrors" + Environment.NewLine + - "--highentropyva-" + Environment.NewLine) + "--highentropyva-" + Environment.NewLine + + "--nocopyfsharpcore" + Environment.NewLine) cmd [] @@ -183,7 +189,8 @@ type Build() = "--warnaserror-:52,109" + Environment.NewLine + "--fullpaths" + Environment.NewLine + "--flaterrors" + Environment.NewLine + - "--highentropyva-" + Environment.NewLine) + "--highentropyva-" + Environment.NewLine + + "--nocopyfsharpcore" + Environment.NewLine) cmd [] @@ -198,7 +205,8 @@ type Build() = "--warnaserror:76" + Environment.NewLine + "--fullpaths" + Environment.NewLine + "--flaterrors" + Environment.NewLine + - "--highentropyva-" + Environment.NewLine) + "--highentropyva-" + Environment.NewLine + + "--nocopyfsharpcore" + Environment.NewLine) cmd [] @@ -213,7 +221,8 @@ type Build() = "--warnaserror:76" + Environment.NewLine + "--fullpaths" + Environment.NewLine + "--flaterrors" + Environment.NewLine + - "--highentropyva-" + Environment.NewLine) + "--highentropyva-" + Environment.NewLine + + "--nocopyfsharpcore" + Environment.NewLine) cmd [] @@ -228,7 +237,8 @@ type Build() = "--warnaserror:76" + Environment.NewLine + "--fullpaths" + Environment.NewLine + "--flaterrors" + Environment.NewLine + - "--highentropyva-" + Environment.NewLine) + "--highentropyva-" + Environment.NewLine + + "--nocopyfsharpcore" + Environment.NewLine) cmd [] @@ -243,7 +253,8 @@ type Build() = "--warnaserror:76" + Environment.NewLine + "--fullpaths" + Environment.NewLine + "--flaterrors" + Environment.NewLine + - "--highentropyva-" + Environment.NewLine) + "--highentropyva-" + Environment.NewLine + + "--nocopyfsharpcore" + Environment.NewLine) cmd [] @@ -258,7 +269,8 @@ type Build() = "--warnaserror:76" + Environment.NewLine + "--fullpaths" + Environment.NewLine + "--flaterrors" + Environment.NewLine + - "--highentropyva-" + Environment.NewLine) + "--highentropyva-" + Environment.NewLine + + "--nocopyfsharpcore" + Environment.NewLine) cmd [] @@ -272,7 +284,8 @@ type Build() = "--warnaserror:76" + Environment.NewLine + "--fullpaths" + Environment.NewLine + "--flaterrors" + Environment.NewLine + - "--highentropyva-" + Environment.NewLine) + "--highentropyva-" + Environment.NewLine + + "--nocopyfsharpcore" + Environment.NewLine) cmd [] @@ -287,7 +300,8 @@ type Build() = "--warnaserror:76" + Environment.NewLine + "--fullpaths" + Environment.NewLine + "--flaterrors" + Environment.NewLine + - "--highentropyva-" + Environment.NewLine) + "--highentropyva-" + Environment.NewLine + + "--nocopyfsharpcore" + Environment.NewLine) cmd [] @@ -302,6 +316,7 @@ type Build() = "--fullpaths" + Environment.NewLine + "--flaterrors" + Environment.NewLine + "--highentropyva-" + Environment.NewLine + + "--nocopyfsharpcore" + Environment.NewLine + "--yadda" + Environment.NewLine + "yadda" + Environment.NewLine) cmd @@ -318,7 +333,8 @@ type Build() = "--warnaserror:76" + Environment.NewLine + "--fullpaths" + Environment.NewLine + "--flaterrors" + Environment.NewLine + - "--highentropyva-" + Environment.NewLine) + "--highentropyva-" + Environment.NewLine + + "--nocopyfsharpcore" + Environment.NewLine) cmd [] @@ -333,7 +349,8 @@ type Build() = "--warnaserror:76" + Environment.NewLine + "--fullpaths" + Environment.NewLine + "--flaterrors" + Environment.NewLine + - "--highentropyva-" + Environment.NewLine) + "--highentropyva-" + Environment.NewLine + + "--nocopyfsharpcore" + Environment.NewLine) cmd [] @@ -348,7 +365,8 @@ type Build() = "--warnaserror:76" + Environment.NewLine + "--fullpaths" + Environment.NewLine + "--flaterrors" + Environment.NewLine + - "--highentropyva-" + Environment.NewLine) + "--highentropyva-" + Environment.NewLine + + "--nocopyfsharpcore" + Environment.NewLine) cmd [] @@ -363,7 +381,8 @@ type Build() = "--warnaserror:76" + Environment.NewLine + "--fullpaths" + Environment.NewLine + "--flaterrors" + Environment.NewLine + - "--highentropyva-" + Environment.NewLine) + "--highentropyva-" + Environment.NewLine + + "--nocopyfsharpcore" + Environment.NewLine) cmd [] @@ -379,7 +398,8 @@ type Build() = "--warnaserror:76" + Environment.NewLine + "--fullpaths" + Environment.NewLine + "--flaterrors" + Environment.NewLine + - "--highentropyva-" + Environment.NewLine) + "--highentropyva-" + Environment.NewLine + + "--nocopyfsharpcore" + Environment.NewLine) cmd [] @@ -395,7 +415,8 @@ type Build() = "--warnaserror:76" + Environment.NewLine + "--fullpaths" + Environment.NewLine + "--flaterrors" + Environment.NewLine + - "--highentropyva-" + Environment.NewLine) cmd + "--highentropyva-" + Environment.NewLine + + "--nocopyfsharpcore" + Environment.NewLine) cmd [] member public this.TestReferencePathWithSpaces() = @@ -410,7 +431,8 @@ type Build() = "--warnaserror:76" + Environment.NewLine + "--fullpaths" + Environment.NewLine + "--flaterrors" + Environment.NewLine + - "--highentropyva-" + Environment.NewLine) + "--highentropyva-" + Environment.NewLine + + "--nocopyfsharpcore" + Environment.NewLine) cmd [] @@ -425,7 +447,8 @@ type Build() = "--warnaserror:76" + Environment.NewLine + "--fullpaths" + Environment.NewLine + "--flaterrors" + Environment.NewLine + - "--highentropyva-" + Environment.NewLine) + "--highentropyva-" + Environment.NewLine + + "--nocopyfsharpcore" + Environment.NewLine) cmd [] @@ -442,6 +465,7 @@ type Build() = "--fullpaths" + Environment.NewLine + "--flaterrors" + Environment.NewLine + "--highentropyva-" + Environment.NewLine + + "--nocopyfsharpcore" + Environment.NewLine + src + Environment.NewLine + src + Environment.NewLine) cmd @@ -459,7 +483,8 @@ type Build() = "--warnaserror:76" + Environment.NewLine + "--fullpaths" + Environment.NewLine + "--flaterrors" + Environment.NewLine + - "--highentropyva-" + Environment.NewLine) + "--highentropyva-" + Environment.NewLine + + "--nocopyfsharpcore" + Environment.NewLine) cmd [] @@ -474,7 +499,8 @@ type Build() = "--warnaserror:76" + Environment.NewLine + "--fullpaths" + Environment.NewLine + "--flaterrors" + Environment.NewLine + - "--highentropyva-" + Environment.NewLine) + "--highentropyva-" + Environment.NewLine + + "--nocopyfsharpcore" + Environment.NewLine) cmd [] @@ -489,7 +515,8 @@ type Build() = "--warnaserror:76" + Environment.NewLine + "--fullpaths" + Environment.NewLine + "--flaterrors" + Environment.NewLine + - "--highentropyva-" + Environment.NewLine) + "--highentropyva-" + Environment.NewLine + + "--nocopyfsharpcore" + Environment.NewLine) cmd [] @@ -503,7 +530,8 @@ type Build() = "--utf8output" + Environment.NewLine + "--fullpaths" + Environment.NewLine + "--flaterrors" + Environment.NewLine + - "--highentropyva-" + Environment.NewLine) + "--highentropyva-" + Environment.NewLine + + "--nocopyfsharpcore" + Environment.NewLine) cmd [] @@ -517,7 +545,8 @@ type Build() = "--win32res:foo.res" + Environment.NewLine + "--fullpaths" + Environment.NewLine + "--flaterrors" + Environment.NewLine + - "--highentropyva-" + Environment.NewLine) + "--highentropyva-" + Environment.NewLine + + "--nocopyfsharpcore" + Environment.NewLine) cmd [] @@ -531,7 +560,8 @@ type Build() = "--win32manifest:foo.manifest" + Environment.NewLine + "--fullpaths" + Environment.NewLine + "--flaterrors" + Environment.NewLine + - "--highentropyva-" + Environment.NewLine) + "--highentropyva-" + Environment.NewLine + + "--nocopyfsharpcore" + Environment.NewLine) cmd [] @@ -544,7 +574,8 @@ type Build() = "--warnaserror:76" + Environment.NewLine + "--fullpaths" + Environment.NewLine + "--flaterrors" + Environment.NewLine + - "--highentropyva+" + Environment.NewLine) + "--highentropyva+" + Environment.NewLine + + "--nocopyfsharpcore" + Environment.NewLine) cmd [] @@ -558,7 +589,8 @@ type Build() = "--fullpaths" + Environment.NewLine + "--flaterrors" + Environment.NewLine + "--subsystemversion:6.02" + Environment.NewLine + - "--highentropyva-" + Environment.NewLine) + "--highentropyva-" + Environment.NewLine + + "--nocopyfsharpcore" + Environment.NewLine) cmd [] @@ -627,6 +659,7 @@ type Build() = "--flaterrors" + Environment.NewLine + "--subsystemversion:4.0" + Environment.NewLine + "--highentropyva-" + Environment.NewLine + + "--nocopyfsharpcore" + Environment.NewLine + "--yadda:yadda" + Environment.NewLine + "--other:internal quote" + Environment.NewLine + "blah" + Environment.NewLine + @@ -670,6 +703,7 @@ type Build() = "--flaterrors" "--subsystemversion:4.0" "--highentropyva-" + "--nocopyfsharpcore" "--yadda:yadda" "--other:internal quote" // note stripped internal quotes "blah" |] diff --git a/vsintegration/tests/UnitTests/VisualFSharp.UnitTests.fsproj b/vsintegration/tests/UnitTests/VisualFSharp.UnitTests.fsproj index 27b6d0224e3..310ebf78089 100644 --- a/vsintegration/tests/UnitTests/VisualFSharp.UnitTests.fsproj +++ b/vsintegration/tests/UnitTests/VisualFSharp.UnitTests.fsproj @@ -13,6 +13,8 @@ true true false + true + true @@ -160,6 +162,7 @@ + @@ -172,6 +175,23 @@ + + + + + + + + + + + + + + + + + From c6250eb035149a4972e271ed40d3336f647b5cc7 Mon Sep 17 00:00:00 2001 From: "Brett V. Forsgren" Date: Fri, 21 Dec 2018 12:21:39 -0800 Subject: [PATCH 137/160] [WIP] Fix signing (#6046) * fix assembly path for signing * don't unconditionally deploy the templates VSIX on build * ensure insertion manifest is written to the correct location * correct package version --- build.cmd | 8 +-- build/config/AssemblySignToolData.json | 66 +++++++++---------- build/targets/AssemblyVersions.props | 2 +- setup/Swix/Microsoft.FSharp.vsmanproj | 3 +- .../VisualFSharpTemplates.csproj | 1 - 5 files changed, 40 insertions(+), 40 deletions(-) diff --git a/build.cmd b/build.cmd index 389679d5ba4..274f0447da2 100644 --- a/build.cmd +++ b/build.cmd @@ -681,8 +681,8 @@ set asmvercheckpath=%~dp0tests\fsharpqa\testenv\src\AssemblyVersionCheck if "%BUILD_NET40%" == "1" ( echo #r @"%USERPROFILE%\.nuget\packages\Newtonsoft.Json\9.0.1\lib\net45\Newtonsoft.Json.dll">%asmvercheckpath%\assemblies.fsx - echo "%~dp0artifacts\bin\fsi\%BUILD_CONFIG%\net46\fsi.exe" "%asmvercheckpath%\AssemblyVersionCheck.fsx" -- "%~dp0build\config\AssemblySignToolData.json" "%~dp0artifacts\bin" - "%~dp0artifacts\bin\fsi\%BUILD_CONFIG%\net46\fsi.exe" "%asmvercheckpath%\AssemblyVersionCheck.fsx" -- "%~dp0build\config\AssemblySignToolData.json" "%~dp0artifacts\bin" + echo "%~dp0artifacts\bin\fsi\%BUILD_CONFIG%\net46\fsi.exe" "%asmvercheckpath%\AssemblyVersionCheck.fsx" -- "%~dp0build\config\AssemblySignToolData.json" "%~dp0artifacts" + "%~dp0artifacts\bin\fsi\%BUILD_CONFIG%\net46\fsi.exe" "%asmvercheckpath%\AssemblyVersionCheck.fsx" -- "%~dp0build\config\AssemblySignToolData.json" "%~dp0artifacts" if ERRORLEVEL 1 echo Error verifying assembly versions and commit hashes. && goto :failure ) @@ -692,8 +692,8 @@ if not "%SIGN_TYPE%" == "" ( echo %_msbuildexe% build\projects\Signing.proj /t:Restore %_msbuildexe% build\projects\Signing.proj /t:Restore - echo %_msbuildexe% build\projects\Signing.proj /t:DoSigning /p:SignType=%SIGN_TYPE% /p:Configuration=%BUILD_CONFIG% /p:BinaryBasePath=%~dp0artifacts\bin /p:ConfigFile=%~dp0build\config\AssemblySignToolData.json - %_msbuildexe% build\projects\Signing.proj /t:DoSigning /p:SignType=%SIGN_TYPE% /p:Configuration=%BUILD_CONFIG% /p:BinaryBasePath=%~dp0artifacts\bin /p:ConfigFile=%~dp0build\config\AssemblySignToolData.json + echo %_msbuildexe% build\projects\Signing.proj /t:DoSigning /p:SignType=%SIGN_TYPE% /p:Configuration=%BUILD_CONFIG% /p:BinaryBasePath=%~dp0artifacts /p:ConfigFile=%~dp0build\config\AssemblySignToolData.json + %_msbuildexe% build\projects\Signing.proj /t:DoSigning /p:SignType=%SIGN_TYPE% /p:Configuration=%BUILD_CONFIG% /p:BinaryBasePath=%~dp0artifacts /p:ConfigFile=%~dp0build\config\AssemblySignToolData.json if ERRORLEVEL 1 echo Error running sign tool && goto :failure ) diff --git a/build/config/AssemblySignToolData.json b/build/config/AssemblySignToolData.json index 3cd0f5b61c1..55163cb5b14 100644 --- a/build/config/AssemblySignToolData.json +++ b/build/config/AssemblySignToolData.json @@ -4,45 +4,45 @@ "certificate": "Microsoft", "strongName": "StrongName", "values": [ - "FSharp.Core\\*\\*\\FSharp.Core.dll", - "FSharp.Core\\*\\*\\*\\FSharp.Core.resources.dll", - "FSharp.Build\\*\\*\\FSharp.Build.dll", - "FSharp.Build\\*\\*\\*\\FSharp.Build.resources.dll", - "FSharp.Compiler.Private\\*\\*\\FSharp.Compiler.Private.dll", - "FSharp.Compiler.Private\\*\\*\\*\\FSharp.Compiler.Private.resources.dll", - "FSharp.Compiler.Server.Shared\\*\\*\\FSharp.Compiler.Server.Shared.dll", - "FSharp.Compiler.Interactive.Settings\\*\\*\\FSharp.Compiler.Interactive.Settings.dll", - "FSharp.Compiler.Interactive.Settings\\*\\*\\*\\FSharp.Compiler.Interactive.Settings.resources.dll", - "fsc\\*\\*\\fsc.exe", - "fsi\\*\\*\\fsi.exe", - "fsiAnyCpu\\*\\*\\fsiAnyCpu.exe", - "FSharp.VS.FSI\\*\\*\\FSharp.VS.FSI.dll", - "FSharp.VS.FSI\\*\\*\\*\\FSharp.VS.FSI.resources.dll", - "FSharp.LanguageService.Base\\*\\*\\FSharp.LanguageService.Base.dll", - "FSharp.LanguageService.Base\\*\\*\\*\\FSharp.LanguageService.Base.resources.dll", - "FSharp.LanguageService\\*\\*\\FSharp.LanguageService.dll", - "FSharp.LanguageService\\*\\*\\*\\FSharp.LanguageService.resources.dll", - "FSharp.UIResources\\*\\*\\FSharp.UIResources.dll", - "FSharp.UIResources\\*\\*\\*\\FSharp.UIResources.resources.dll", - "FSharp.Editor\\*\\*\\FSharp.Editor.dll", - "FSharp.Editor\\*\\*\\*\\FSharp.Editor.resources.dll", - "FSharp.ProjectSystem.Base\\*\\*\\FSharp.ProjectSystem.Base.dll", - "FSharp.ProjectSystem.Base\\*\\*\\*\\FSharp.ProjectSystem.Base.resources.dll", - "FSharp.ProjectSystem.PropertyPages\\*\\*\\FSharp.ProjectSystem.PropertyPages.dll", - "FSharp.ProjectSystem.PropertyPages\\*\\*\\*\\FSharp.ProjectSystem.PropertyPages.resources.dll", - "FSharp.ProjectSystem.FSharp\\*\\*\\FSharp.ProjectSystem.FSharp.dll", - "FSharp.ProjectSystem.FSharp\\*\\*\\*\\FSharp.ProjectSystem.FSharp.resources.dll", - "FSharp.PatternMatcher\\*\\*\\FSharp.PatternMatcher.dll" + "bin\\FSharp.Core\\*\\*\\FSharp.Core.dll", + "bin\\FSharp.Core\\*\\*\\*\\FSharp.Core.resources.dll", + "bin\\FSharp.Build\\*\\*\\FSharp.Build.dll", + "bin\\FSharp.Build\\*\\*\\*\\FSharp.Build.resources.dll", + "bin\\FSharp.Compiler.Private\\*\\*\\FSharp.Compiler.Private.dll", + "bin\\FSharp.Compiler.Private\\*\\*\\*\\FSharp.Compiler.Private.resources.dll", + "bin\\FSharp.Compiler.Server.Shared\\*\\*\\FSharp.Compiler.Server.Shared.dll", + "bin\\FSharp.Compiler.Interactive.Settings\\*\\*\\FSharp.Compiler.Interactive.Settings.dll", + "bin\\FSharp.Compiler.Interactive.Settings\\*\\*\\*\\FSharp.Compiler.Interactive.Settings.resources.dll", + "bin\\fsc\\*\\*\\fsc.exe", + "bin\\fsi\\*\\*\\fsi.exe", + "bin\\fsiAnyCpu\\*\\*\\fsiAnyCpu.exe", + "bin\\FSharp.VS.FSI\\*\\*\\FSharp.VS.FSI.dll", + "bin\\FSharp.VS.FSI\\*\\*\\*\\FSharp.VS.FSI.resources.dll", + "bin\\FSharp.LanguageService.Base\\*\\*\\FSharp.LanguageService.Base.dll", + "bin\\FSharp.LanguageService.Base\\*\\*\\*\\FSharp.LanguageService.Base.resources.dll", + "bin\\FSharp.LanguageService\\*\\*\\FSharp.LanguageService.dll", + "bin\\FSharp.LanguageService\\*\\*\\*\\FSharp.LanguageService.resources.dll", + "bin\\FSharp.UIResources\\*\\*\\FSharp.UIResources.dll", + "bin\\FSharp.UIResources\\*\\*\\*\\FSharp.UIResources.resources.dll", + "bin\\FSharp.Editor\\*\\*\\FSharp.Editor.dll", + "bin\\FSharp.Editor\\*\\*\\*\\FSharp.Editor.resources.dll", + "bin\\FSharp.PatternMatcher\\*\\*\\FSharp.PatternMatcher.dll", + "bin\\FSharp.PropertiesPages\\*\\*\\FSharp.ProjectSystem.PropertyPages.dll", + "bin\\FSharp.PropertiesPages\\*\\*\\*\\FSharp.ProjectSystem.PropertyPages.resources.dll", + "bin\\ProjectSystem\\*\\*\\FSharp.ProjectSystem.FSharp.dll", + "bin\\ProjectSystem\\*\\*\\*\\FSharp.ProjectSystem.FSharp.resources.dll", + "bin\\ProjectSystem.Base\\*\\*\\FSharp.ProjectSystem.Base.dll", + "bin\\ProjectSystem.Base\\*\\*\\*\\FSharp.ProjectSystem.Base.resources.dll" ] }, { "certificate": "VsixSHA2", "strongName": null, "values": [ - "VisualFSharpFull\\*\\*VisualFSharpFull.vsix", - "VisualFSharpTemplates\\*\\*\\VisualFSharpTemplate.vsix", - "..\\VSSetup\\*\\Insertion\\Microsoft.FSharp.Dependencies.vsix", - "..\\VSSetup\\*\\Insertion\\Microsoft.FSharp.VSIX.Full.Resources.*.vsix" + "bin\\VisualFSharpFull\\*\\*VisualFSharpFull.vsix", + "bin\\VisualFSharpTemplates\\*\\*\\VisualFSharpTemplate.vsix", + "VSSetup\\*\\Insertion\\Microsoft.FSharp.Dependencies.vsix", + "VSSetup\\*\\Insertion\\Microsoft.FSharp.VSIX.Full.Resources.*.vsix" ] } ], diff --git a/build/targets/AssemblyVersions.props b/build/targets/AssemblyVersions.props index 5ad08a25fb4..362c26a94a6 100644 --- a/build/targets/AssemblyVersions.props +++ b/build/targets/AssemblyVersions.props @@ -30,7 +30,7 @@ $(FSPackageVersion).0 15 - 8 + 9 $(VSMajorVersion).0 $(VSMajorVersion).$(VSMinorVersion).0.0 diff --git a/setup/Swix/Microsoft.FSharp.vsmanproj b/setup/Swix/Microsoft.FSharp.vsmanproj index ec9461e1137..6e6f7d4e7e9 100644 --- a/setup/Swix/Microsoft.FSharp.vsmanproj +++ b/setup/Swix/Microsoft.FSharp.vsmanproj @@ -6,7 +6,8 @@ true true - $(OutputPath)\Insertion + $(ArtifactsDir)\VSSetup\$(Configuration)\Insertion + $(OutputPath) $(FSharpPackageVersion) diff --git a/vsintegration/Vsix/VisualFSharpTemplates/VisualFSharpTemplates.csproj b/vsintegration/Vsix/VisualFSharpTemplates/VisualFSharpTemplates.csproj index 0267329af35..110fc964e1c 100644 --- a/vsintegration/Vsix/VisualFSharpTemplates/VisualFSharpTemplates.csproj +++ b/vsintegration/Vsix/VisualFSharpTemplates/VisualFSharpTemplates.csproj @@ -6,7 +6,6 @@ VisualFSharpTemplate Library Microsoft\FSharpTemplates - true From 6bed7c483195efb5882f633c59759e93dbd02c8d Mon Sep 17 00:00:00 2001 From: "Kevin Ransom (msft)" Date: Fri, 21 Dec 2018 14:34:10 -0800 Subject: [PATCH 138/160] Improve workflows (#6040) * Improve workflow * back to 32bit msbuild * move out nugets, change targets in makefile * Detect framework * Done * feedback --- FSharpBuild.Directory.Build.targets | 1 + FSharpTests.Directory.Build.props | 2 +- Makefile | 6 +-- build.cmd | 15 ++++-- build/targets/NGenOrCrossGen.targets | 36 +++++++++++++ fsharp.proj | 52 +++++++++++++++---- proto.proj | 10 +++- .../Microsoft.FSharp.Compiler.nuspec | 4 +- src/fsharp/fsc/fsc.fsproj | 1 + src/fsharp/fsi/fsi.fsproj | 5 +- tests/fsharp/test-framework.fs | 2 +- 11 files changed, 108 insertions(+), 26 deletions(-) create mode 100644 build/targets/NGenOrCrossGen.targets diff --git a/FSharpBuild.Directory.Build.targets b/FSharpBuild.Directory.Build.targets index ef7f82861c5..fa39d7498fd 100644 --- a/FSharpBuild.Directory.Build.targets +++ b/FSharpBuild.Directory.Build.targets @@ -34,6 +34,7 @@ + diff --git a/FSharpTests.Directory.Build.props b/FSharpTests.Directory.Build.props index d9fc35fc05d..46e9b6fb369 100644 --- a/FSharpTests.Directory.Build.props +++ b/FSharpTests.Directory.Build.props @@ -23,7 +23,7 @@ $(MSBuildThisFileDirectory)artifacts\toolset\dotnet dotnet.exe dotnet - $(MSBuildThisFileDirectory)artifacts\bin\fsi\$(Configuration)\netcoreapp2.0\fsi.exe + $(MSBuildThisFileDirectory)artifacts\bin\fsi\$(Configuration)\netcoreapp2.1\fsi.exe diff --git a/Makefile b/Makefile index e402025e0ef..14a5b0a8c07 100644 --- a/Makefile +++ b/Makefile @@ -37,13 +37,13 @@ build: proto restore $(DotNetExe) build -c $(Configuration) -f netstandard1.6 src/fsharp/FSharp.Compiler.Private/FSharp.Compiler.Private.fsproj $(DotNetExe) build -c $(Configuration) -f netcoreapp2.1 src/fsharp/fsc/fsc.fsproj $(DotNetExe) build -c $(Configuration) -f netstandard1.6 src/fsharp/FSharp.Compiler.Interactive.Settings/FSharp.Compiler.Interactive.Settings.fsproj - $(DotNetExe) build -c $(Configuration) -f netcoreapp2.0 src/fsharp/fsi/fsi.fsproj + $(DotNetExe) build -c $(Configuration) -f netcoreapp2.1 src/fsharp/fsi/fsi.fsproj $(DotNetExe) build -c $(Configuration) -f netcoreapp2.0 tests/FSharp.Core.UnitTests/FSharp.Core.UnitTests.fsproj $(DotNetExe) build -c $(Configuration) -f netcoreapp2.0 tests/FSharp.Build.UnitTests/FSharp.Build.UnitTests.fsproj test: build - $(DotNetExe) test -f netcoreapp2.0 -c $(Configuration) --no-restore --no-build tests/FSharp.Core.UnitTests/FSharp.Core.UnitTests.fsproj -l "trx;LogFileName=$(CURDIR)/tests/TestResults/FSharp.Core.UnitTests.coreclr.trx" - $(DotNetExe) test -f netcoreapp2.0 -c $(Configuration) --no-restore --no-build tests/FSharp.Build.UnitTests/FSharp.Build.UnitTests.fsproj -l "trx;LogFileName=$(CURDIR)/tests/TestResults/FSharp.Build.UnitTests.coreclr.trx" + $(DotNetExe) test -f netcoreapp2.1 -c $(Configuration) --no-restore --no-build tests/FSharp.Core.UnitTests/FSharp.Core.UnitTests.fsproj -l "trx;LogFileName=$(CURDIR)/tests/TestResults/FSharp.Core.UnitTests.coreclr.trx" + $(DotNetExe) test -f netcoreapp2.1 -c $(Configuration) --no-restore --no-build tests/FSharp.Build.UnitTests/FSharp.Build.UnitTests.fsproj -l "trx;LogFileName=$(CURDIR)/tests/TestResults/FSharp.Build.UnitTests.coreclr.trx" clean: rm -rf $(CURDIR)/artifacts diff --git a/build.cmd b/build.cmd index 274f0447da2..34a78774041 100644 --- a/build.cmd +++ b/build.cmd @@ -1,6 +1,5 @@ rem Copyright (c) Microsoft Corporation. All Rights Reserved. See License.txt in the project root for license information. @if "%_echo%"=="" echo off - setlocal enableDelayedExpansion :ARGUMENTS_VALIDATION @@ -66,6 +65,7 @@ set BUILD_FCS=0 set BUILD_CONFIG=Release set BUILD_DIAG= set BUILD_PUBLICSIGN=0 +set BUILD_FSHARP_PROJ=1 set TEST_NET40_COMPILERUNIT_SUITE=0 set TEST_NET40_COREUNIT_SUITE=0 @@ -464,10 +464,15 @@ if /i "%TEST_NET40_FSHARP_SUITE" == "1" ( ) rem Decide if Proto need building -if NOT EXIST Proto\net40\bin\fsc.exe ( +if NOT EXIST "%~dp0artifacts\bin\fsc\Proto\net46\fsc.exe" ( set BUILD_PROTO=1 ) +rem decide if FSharp.Proj needs building +if "%BUILD_NET40%"=="0" if "%BUILD_NET40_FSHARP_CORE%"=="0" if "%BUILD_CORECLR%"=="0" if "%BUILD_VS%"=="0" if "%BUILD_FCS%"=="0" if "%TEST_NET40_COMPILERUNIT_SUITE%"=="0" if "%TEST_NET40_COREUNIT_SUITE%"=="0" if "%TEST_NET40_FSHARP_SUITE%"=="0" if "%TEST_NET40_FSHARPQA_SUITE%"=="0" if "%TEST_CORECLR_COREUNIT_SUITE%"=="0" if "%TEST_CORECLR_FSHARP_SUITE%"=="0" if "%TEST_VS_IDEUNIT_SUITE%"=="0" if "%TEST_FCS%"=="0" if "%TEST_END_2_END%"=="0" if "%COPY_FSCOMP_RESOURCE_FOR_BUILD_FROM_SOURCES%"=="0" ( + set BUILD_FSHARP_PROJ=0 +) + rem rem This stops the dotnet cli from hunting around and rem finding the highest possible dotnet sdk version to use. @@ -483,7 +488,6 @@ echo BUILD_PROTO_WITH_CORECLR_LKG=%BUILD_PROTO_WITH_CORECLR_LKG% echo BUILD_NET40=%BUILD_NET40% echo BUILD_NET40_FSHARP_CORE=%BUILD_NET40_FSHARP_CORE% echo BUILD_CORECLR=%BUILD_CORECLR% -echo BUILD_FROMSOURCE=%BUILD_FROMSOURCE% echo BUILD_VS=%BUILD_VS% echo BUILD_FCS=%BUILD_FCS% echo BUILD_SETUP=%BUILD_SETUP% @@ -491,6 +495,8 @@ echo BUILD_NUGET=%BUILD_NUGET% echo BUILD_CONFIG=%BUILD_CONFIG% echo BUILD_PUBLICSIGN=%BUILD_PUBLICSIGN% echo BUILD_MICROBUILD=%BUILD_MICROBUILD% +echo BUILD_FROMSOURCE=%BUILD_FROMSOURCE% +echo BUILD_FSHARP_PROJ=%BUILD_FSHARP_PROJ% echo. echo PB_SKIPTESTS=%PB_SKIPTESTS% echo PB_RESTORESOURCE=%PB_RESTORESOURCE% @@ -665,7 +671,7 @@ if "%BUILD_PROTO%" == "1" ( echo ---------------- Done with SDK restore, starting build ------------------------ -if "%BUILD_PHASE%" == "1" ( +if "%BUILD_PHASE%" == "1" if "%BUILD_FSHARP_PROJ%" == "1" ( echo %_dotnetexe% restore fsharp.proj /p:Configuration=%BUILD_CONFIG% /bl:!logdir!\fsharp.proj.restore.binlog %_dotnetexe% restore fsharp.proj /p:Configuration=%BUILD_CONFIG% /bl:!logdir!\fsharp.proj.restore.binlog @@ -1072,6 +1078,7 @@ goto :success REM ------ exit ------------------------------------- :failure endlocal +@echo exit /b 1 :success diff --git a/build/targets/NGenOrCrossGen.targets b/build/targets/NGenOrCrossGen.targets new file mode 100644 index 00000000000..33dcaa3a63a --- /dev/null +++ b/build/targets/NGenOrCrossGen.targets @@ -0,0 +1,36 @@ + + + + + $(windir)\Microsoft.NET\Framework64\v4.0.30319\ngen.exe + $(windir)\Microsoft.NET\Framework\v4.0.30319\ngen.exe + + + + + + + + + + + + + + + + true + false + + + + diff --git a/fsharp.proj b/fsharp.proj index e695da391c9..59436e5a2e7 100644 --- a/fsharp.proj +++ b/fsharp.proj @@ -36,21 +36,50 @@ true + + + true + true + + - - - - - - - - - - - + + TargetFramework=netstandard1.6 + TargetFramework=net45 + + + TargetFramework=netstandard2.0 + TargetFramework=net46 + + + TargetFramework=netstandard1.6 + TargetFramework=net46 + + + TargetFramework=net46 + + + TargetFramework=netstandard1.6 + TargetFramework=net46 + + + TargetFramework=netcoreapp2.1 + TargetFramework=net46 + + + TargetFramework=netcoreapp2.1 + TargetFramework=net46 + + + TargetFramework=net46 + @@ -70,6 +99,7 @@ + diff --git a/proto.proj b/proto.proj index c3a704496ee..0974580af5a 100644 --- a/proto.proj +++ b/proto.proj @@ -7,8 +7,14 @@ - - + + TargetFramework=net46 + TargetFramework=netcoreapp2.1 + + + TargetFramework=net46 + TargetFramework=netcoreapp2.1 + diff --git a/src/fsharp/FSharp.Compiler.nuget/Microsoft.FSharp.Compiler.nuspec b/src/fsharp/FSharp.Compiler.nuget/Microsoft.FSharp.Compiler.nuspec index 87ef49f5521..f10712a641e 100644 --- a/src/fsharp/FSharp.Compiler.nuget/Microsoft.FSharp.Compiler.nuspec +++ b/src/fsharp/FSharp.Compiler.nuget/Microsoft.FSharp.Compiler.nuspec @@ -55,14 +55,14 @@ --> - + - + diff --git a/src/fsharp/fsc/fsc.fsproj b/src/fsharp/fsc/fsc.fsproj index 4bc9770e9e0..40f56a0627e 100644 --- a/src/fsharp/fsc/fsc.fsproj +++ b/src/fsharp/fsc/fsc.fsproj @@ -12,6 +12,7 @@ $(OtherFlags) --maxerrors:20 --extraoptimizationloops:1 true true + true diff --git a/src/fsharp/fsi/fsi.fsproj b/src/fsharp/fsi/fsi.fsproj index 6a4b7df15d5..5dbcac7557e 100644 --- a/src/fsharp/fsi/fsi.fsproj +++ b/src/fsharp/fsi/fsi.fsproj @@ -4,7 +4,7 @@ Exe - net46;netcoreapp2.0 + net46;netcoreapp2.1 .exe fsi $(NoWarn);45;55;62;75;1204 @@ -13,6 +13,7 @@ fsi.res true true + true @@ -45,7 +46,7 @@ - + diff --git a/tests/fsharp/test-framework.fs b/tests/fsharp/test-framework.fs index 85bc6319f19..85d462ffe47 100644 --- a/tests/fsharp/test-framework.fs +++ b/tests/fsharp/test-framework.fs @@ -164,7 +164,7 @@ let config configurationName envVars = let fsharpCompilerInteractiveSettingsArchitecture = "net46" #else let fscArchitecture = "netcoreapp2.1" - let fsiArchitecture = "netcoreapp2.0" + let fsiArchitecture = "netcoreapp2.1" let fsharpCoreArchitecture = "netstandard1.6" let fsharpBuildArchitecture = "netstandard2.0" let fsharpCompilerInteractiveSettingsArchitecture = "netstandard1.6" From 062d6f5bca450bd79931da64954c18d2785c38d9 Mon Sep 17 00:00:00 2001 From: "Kevin Ransom (msft)" Date: Fri, 21 Dec 2018 14:34:34 -0800 Subject: [PATCH 139/160] Fix: 5655 by removing FSharp.Core from VS/PublicAssembliesDirectory (#6039) --- setup/Swix/Microsoft.FSharp.Dependencies/Files.swr | 5 ----- 1 file changed, 5 deletions(-) diff --git a/setup/Swix/Microsoft.FSharp.Dependencies/Files.swr b/setup/Swix/Microsoft.FSharp.Dependencies/Files.swr index c1ec9568099..f927497e193 100644 --- a/setup/Swix/Microsoft.FSharp.Dependencies/Files.swr +++ b/setup/Swix/Microsoft.FSharp.Dependencies/Files.swr @@ -10,10 +10,5 @@ folder "InstallDir:MSBuild\Microsoft\VisualStudio\v$(VSGeneralVersion)\FSharp" file "Microsoft.FSharp.Overrides.NetSdk.targets" source="$(SetupShimsDir)\Microsoft.FSharp.Overrides.NetSdk.Shim.targets" file "Microsoft.FSharp.NetSdk.props" source="$(SetupShimsDir)\Microsoft.FSharp.NetSdk.Shim.props" -folder "InstallDir:Common7\IDE\PublicAssemblies" - file source="$(BinariesFolder)\FSharp.Core\$(Configuration)\net45\FSharp.Core.dll" vs.file.ngen=yes - file source="$(BinariesFolder)\FSharp.Core\$(Configuration)\net45\FSharp.Core.optdata" - file source="$(BinariesFolder)\FSharp.Core\$(Configuration)\net45\FSharp.Core.sigdata" - folder "InstallDir:Common7\Tools\VsDevCmd\Ext" file source="fsharp.bat" From e2902ee22c9b19832b2ceaf5c4f231ce1ce5d813 Mon Sep 17 00:00:00 2001 From: Eugene Auduchinok Date: Sat, 22 Dec 2018 03:41:23 +0300 Subject: [PATCH 140/160] Replace isModule with ModuleOrNamespaceKind in SynModuleOrNamespace (#6027) * Replace isModule with ModuleOrNamespaceKind in SymModuleOrNamespace * Fix structure tests * Review fixes --- src/fsharp/CompileOps.fs | 48 ++++--- src/fsharp/TypeChecker.fs | 8 +- src/fsharp/ast.fs | 22 ++- src/fsharp/fsi/fsi.fs | 2 +- src/fsharp/pars.fsy | 8 +- src/fsharp/service/ServiceAssemblyContent.fs | 3 +- src/fsharp/service/ServiceNavigation.fs | 14 +- src/fsharp/service/ServiceStructure.fs | 12 +- tests/service/StructureTests.fs | 138 ++++++++++--------- 9 files changed, 140 insertions(+), 115 deletions(-) diff --git a/src/fsharp/CompileOps.fs b/src/fsharp/CompileOps.fs index 2fb57789b81..1f98512bee8 100644 --- a/src/fsharp/CompileOps.fs +++ b/src/fsharp/CompileOps.fs @@ -3384,14 +3384,14 @@ let ComputeQualifiedNameOfFileFromUniquePath (m, p: string list) = QualifiedName let QualFileNameOfSpecs filename specs = match specs with - | [SynModuleOrNamespaceSig(modname, _, true, _, _, _, _, m)] -> QualFileNameOfModuleName m filename modname - | [SynModuleOrNamespaceSig(_, _, false, _, _, _, _, m)] -> QualFileNameOfFilename m filename + | [SynModuleOrNamespaceSig(modname, _, kind, _, _, _, _, m)] when kind.IsModule -> QualFileNameOfModuleName m filename modname + | [SynModuleOrNamespaceSig(_, _, kind, _, _, _, _, m)] when not kind.IsModule -> QualFileNameOfFilename m filename | _ -> QualFileNameOfFilename (mkRange filename pos0 pos0) filename let QualFileNameOfImpls filename specs = match specs with - | [SynModuleOrNamespace(modname, _, true, _, _, _, _, m)] -> QualFileNameOfModuleName m filename modname - | [SynModuleOrNamespace(_, _, false, _, _, _, _, m)] -> QualFileNameOfFilename m filename + | [SynModuleOrNamespace(modname, _, kind, _, _, _, _, m)] when kind.IsModule -> QualFileNameOfModuleName m filename modname + | [SynModuleOrNamespace(_, _, kind, _, _, _, _, m)] when not kind.IsModule -> QualFileNameOfFilename m filename | _ -> QualFileNameOfFilename (mkRange filename pos0 pos0) filename let PrepandPathToQualFileName x (QualifiedNameOfFile(q)) = ComputeQualifiedNameOfFileFromUniquePath (q.idRange, pathOfLid x@[q.idText]) @@ -3420,13 +3420,14 @@ let ComputeAnonModuleName check defaultNamespace filename (m: range) = let PostParseModuleImpl (_i, defaultNamespace, isLastCompiland, filename, impl) = match impl with - | ParsedImplFileFragment.NamedModule(SynModuleOrNamespace(lid, isRec, isModule, decls, xmlDoc, attribs, access, m)) -> + | ParsedImplFileFragment.NamedModule(SynModuleOrNamespace(lid, isRec, kind, decls, xmlDoc, attribs, access, m)) -> let lid = match lid with - | [id] when isModule && id.idText = MangledGlobalName -> error(Error(FSComp.SR.buildInvalidModuleOrNamespaceName(), id.idRange)) + | [id] when kind.IsModule && id.idText = MangledGlobalName -> + error(Error(FSComp.SR.buildInvalidModuleOrNamespaceName(), id.idRange)) | id :: rest when id.idText = MangledGlobalName -> rest | _ -> lid - SynModuleOrNamespace(lid, isRec, isModule, decls, xmlDoc, attribs, access, m) + SynModuleOrNamespace(lid, isRec, kind, decls, xmlDoc, attribs, access, m) | ParsedImplFileFragment.AnonModule (defs, m)-> let isLast, isExe = isLastCompiland @@ -3437,24 +3438,26 @@ let PostParseModuleImpl (_i, defaultNamespace, isLastCompiland, filename, impl) | _ -> errorR(Error(FSComp.SR.buildMultiFileRequiresNamespaceOrModule(), trimRangeToLine m)) let modname = ComputeAnonModuleName (not (isNil defs)) defaultNamespace filename (trimRangeToLine m) - SynModuleOrNamespace(modname, false, true, defs, PreXmlDoc.Empty, [], None, m) + SynModuleOrNamespace(modname, false, AnonModule, defs, PreXmlDoc.Empty, [], None, m) - | ParsedImplFileFragment.NamespaceFragment (lid, a, b, c, d, e, m)-> - let lid = + | ParsedImplFileFragment.NamespaceFragment (lid, a, kind, c, d, e, m)-> + let lid, kind = match lid with - | id :: rest when id.idText = MangledGlobalName -> rest - | _ -> lid - SynModuleOrNamespace(lid, a, b, c, d, e, None, m) + | id :: rest when id.idText = MangledGlobalName -> + rest, if List.isEmpty rest then GlobalNamespace else kind + | _ -> lid, kind + SynModuleOrNamespace(lid, a, kind, c, d, e, None, m) let PostParseModuleSpec (_i, defaultNamespace, isLastCompiland, filename, intf) = match intf with - | ParsedSigFileFragment.NamedModule(SynModuleOrNamespaceSig(lid, isRec, isModule, decls, xmlDoc, attribs, access, m)) -> + | ParsedSigFileFragment.NamedModule(SynModuleOrNamespaceSig(lid, isRec, kind, decls, xmlDoc, attribs, access, m)) -> let lid = match lid with - | [id] when isModule && id.idText = MangledGlobalName -> error(Error(FSComp.SR.buildInvalidModuleOrNamespaceName(), id.idRange)) + | [id] when kind.IsModule && id.idText = MangledGlobalName -> + error(Error(FSComp.SR.buildInvalidModuleOrNamespaceName(), id.idRange)) | id :: rest when id.idText = MangledGlobalName -> rest | _ -> lid - SynModuleOrNamespaceSig(lid, isRec, isModule, decls, xmlDoc, attribs, access, m) + SynModuleOrNamespaceSig(lid, isRec, NamedModule, decls, xmlDoc, attribs, access, m) | ParsedSigFileFragment.AnonModule (defs, m) -> let isLast, isExe = isLastCompiland @@ -3465,14 +3468,15 @@ let PostParseModuleSpec (_i, defaultNamespace, isLastCompiland, filename, intf) | _ -> errorR(Error(FSComp.SR.buildMultiFileRequiresNamespaceOrModule(), m)) let modname = ComputeAnonModuleName (not (isNil defs)) defaultNamespace filename (trimRangeToLine m) - SynModuleOrNamespaceSig(modname, false, true, defs, PreXmlDoc.Empty, [], None, m) + SynModuleOrNamespaceSig(modname, false, AnonModule, defs, PreXmlDoc.Empty, [], None, m) - | ParsedSigFileFragment.NamespaceFragment (lid, a, b, c, d, e, m)-> - let lid = + | ParsedSigFileFragment.NamespaceFragment (lid, a, kind, c, d, e, m)-> + let lid, kind = match lid with - | id :: rest when id.idText = MangledGlobalName -> rest - | _ -> lid - SynModuleOrNamespaceSig(lid, a, b, c, d, e, None, m) + | id :: rest when id.idText = MangledGlobalName -> + rest, if List.isEmpty rest then GlobalNamespace else kind + | _ -> lid, kind + SynModuleOrNamespaceSig(lid, a, kind, c, d, e, None, m) diff --git a/src/fsharp/TypeChecker.fs b/src/fsharp/TypeChecker.fs index 495e0d4c470..c55cd9e63b4 100755 --- a/src/fsharp/TypeChecker.fs +++ b/src/fsharp/TypeChecker.fs @@ -16713,7 +16713,7 @@ let rec TcSignatureElementNonMutRec cenv parent typeNames endm (env: TcEnv) synS return env - | SynModuleSigDecl.NamespaceFragment (SynModuleOrNamespaceSig(longId, isRec, isModule, defs, xml, attribs, vis, m)) -> + | SynModuleSigDecl.NamespaceFragment (SynModuleOrNamespaceSig(longId, isRec, kind, defs, xml, attribs, vis, m)) -> do for id in longId do CheckNamespaceModuleOrTypeName cenv.g id @@ -16725,7 +16725,7 @@ let rec TcSignatureElementNonMutRec cenv parent typeNames endm (env: TcEnv) synS // namespace [rec] A.B // module M = ... let enclosingNamespacePath, defs = - if isModule then + if kind.IsModule then let nsp, modName = List.frontAndBack longId let modDecl = [SynModuleSigDecl.NestedModule(ComponentInfo(attribs, [], [], [modName], xml, false, vis, m), false, defs, m)] nsp, modDecl @@ -17022,7 +17022,7 @@ let rec TcModuleOrNamespaceElementNonMutRec (cenv:cenv) parent typeNames scopem return ((fun modDefs -> modDefn :: modDefs), topAttrsNew), env, envAtEnd - | SynModuleDecl.NamespaceFragment(SynModuleOrNamespace(longId, isRec, isModule, defs, xml, attribs, vis, m)) -> + | SynModuleDecl.NamespaceFragment(SynModuleOrNamespace(longId, isRec, kind, defs, xml, attribs, vis, m)) -> if !progress then dprintn ("Typecheck implementation " + textOfLid longId) let endm = m.EndRange @@ -17037,7 +17037,7 @@ let rec TcModuleOrNamespaceElementNonMutRec (cenv:cenv) parent typeNames scopem // namespace [rec] A.B // module M = ... let enclosingNamespacePath, defs = - if isModule then + if kind.IsModule then let nsp, modName = List.frontAndBack longId let modDecl = [SynModuleDecl.NestedModule(ComponentInfo(attribs, [], [], [modName], xml, false, vis, m), false, defs, true, m)] nsp, modDecl diff --git a/src/fsharp/ast.fs b/src/fsharp/ast.fs index f7fbbdd6491..43b7aab87d1 100644 --- a/src/fsharp/ast.fs +++ b/src/fsharp/ast.fs @@ -1462,11 +1462,23 @@ and and SynModuleSigDecls = SynModuleSigDecl list -/// SynModuleOrNamespace(lid,isRec,isModule,decls,xmlDoc,attribs,SynAccess,m) +and + [] + SynModuleOrNamespaceKind = + | NamedModule + | AnonModule + | DeclaredNamespace + | GlobalNamespace + + member x.IsModule = + match x with + | NamedModule | AnonModule -> true + | _ -> false + and [] SynModuleOrNamespace = - | SynModuleOrNamespace of longId:LongIdent * isRecursive:bool * isModule:bool * decls:SynModuleDecls * xmlDoc:PreXmlDoc * attribs:SynAttributes * accessibility:SynAccess option * range:range + | SynModuleOrNamespace of longId:LongIdent * isRecursive:bool * kind:SynModuleOrNamespaceKind * decls:SynModuleDecls * xmlDoc:PreXmlDoc * attribs:SynAttributes * accessibility:SynAccess option * range:range member this.Range = match this with | SynModuleOrNamespace (range=m) -> m @@ -1474,7 +1486,7 @@ and and [] SynModuleOrNamespaceSig = - | SynModuleOrNamespaceSig of longId:LongIdent * isRecursive:bool * isModule:bool * SynModuleSigDecls * xmlDoc:PreXmlDoc * attribs:SynAttributes * accessibility:SynAccess option * range:range + | SynModuleOrNamespaceSig of longId:LongIdent * isRecursive:bool * kind:SynModuleOrNamespaceKind * SynModuleSigDecls * xmlDoc:PreXmlDoc * attribs:SynAttributes * accessibility:SynAccess option * range:range and [] ParsedHashDirective = @@ -1484,13 +1496,13 @@ and [] type ParsedImplFileFragment = | AnonModule of SynModuleDecls * range:range | NamedModule of SynModuleOrNamespace - | NamespaceFragment of longId:LongIdent * bool * bool * SynModuleDecls * xmlDoc:PreXmlDoc * SynAttributes * range:range + | NamespaceFragment of longId:LongIdent * bool * SynModuleOrNamespaceKind * SynModuleDecls * xmlDoc:PreXmlDoc * SynAttributes * range:range [] type ParsedSigFileFragment = | AnonModule of SynModuleSigDecls * range:range | NamedModule of SynModuleOrNamespaceSig - | NamespaceFragment of longId:LongIdent * bool * bool * SynModuleSigDecls * xmlDoc:PreXmlDoc * SynAttributes * range:range + | NamespaceFragment of longId:LongIdent * bool * SynModuleOrNamespaceKind * SynModuleSigDecls * xmlDoc:PreXmlDoc * SynAttributes * range:range [] type ParsedFsiInteraction = diff --git a/src/fsharp/fsi/fsi.fs b/src/fsharp/fsi/fsi.fs index b2df5102032..8190be40784 100644 --- a/src/fsharp/fsi/fsi.fs +++ b/src/fsharp/fsi/fsi.fs @@ -1154,7 +1154,7 @@ type internal FsiDynamicCompiler let i = nextFragmentId() let prefix = mkFragmentPath i let prefixPath = pathOfLid prefix - let impl = SynModuleOrNamespace(prefix,(*isRec*)false, (* isModule: *) true,defs,PreXmlDoc.Empty,[],None,rangeStdin) + let impl = SynModuleOrNamespace(prefix,(*isRec*)false, NamedModule,defs,PreXmlDoc.Empty,[],None,rangeStdin) let input = ParsedInput.ImplFile(ParsedImplFileInput(filename,true, ComputeQualifiedNameOfFileFromUniquePath (rangeStdin,prefixPath),[],[],[impl],(true (* isLastCompiland *), false (* isExe *)) )) let istate,tcEnvAtEndOfLastInput,declaredImpls = ProcessInputs (ctok, errorLogger, istate, [input], showTypes, true, isInteractiveItExpr, prefix) let tcState = istate.tcState diff --git a/src/fsharp/pars.fsy b/src/fsharp/pars.fsy index 9e75787d29f..25c8ce10a8c 100644 --- a/src/fsharp/pars.fsy +++ b/src/fsharp/pars.fsy @@ -675,14 +675,14 @@ fileModuleSpec: (fun (isRec2,path,_) -> if not (isNil path) then errorR(Error(FSComp.SR.parsNamespaceOrModuleNotBoth(),m2)) let lid = path@path2 - ParsedSigFileFragment.NamedModule(SynModuleOrNamespaceSig(lid, (isRec || isRec2), true, $4, xml,$1,vis,m))) } + ParsedSigFileFragment.NamedModule(SynModuleOrNamespaceSig(lid, (isRec || isRec2), NamedModule, $4, xml,$1,vis,m))) } | moduleSpfnsPossiblyEmptyBlock { let m = (rhs parseState 1) (fun (isRec, path, xml) -> match path with | [] -> ParsedSigFileFragment.AnonModule($1, m) - | _ -> ParsedSigFileFragment.NamespaceFragment(path, isRec, false, $1, xml,[],m)) } + | _ -> ParsedSigFileFragment.NamespaceFragment(path, isRec, DeclaredNamespace, $1, xml,[],m)) } moduleSpfnsPossiblyEmptyBlock: @@ -1097,14 +1097,14 @@ fileModuleImpl: (fun (isRec, path, _) -> if not (isNil path) then errorR(Error(FSComp.SR.parsNamespaceOrModuleNotBoth(),m2)) let lid = path@path2 - ParsedImplFileFragment.NamedModule(SynModuleOrNamespace(lid, (isRec || isRec2), true, $4, xml,$1,vis,m))) } + ParsedImplFileFragment.NamedModule(SynModuleOrNamespace(lid, (isRec || isRec2), NamedModule, $4, xml,$1,vis,m))) } | moduleDefnsOrExprPossiblyEmptyOrBlock { let m = (rhs parseState 1) (fun (isRec, path, xml) -> match path with | [] -> ParsedImplFileFragment.AnonModule($1,m) - | _ -> ParsedImplFileFragment.NamespaceFragment(path, isRec, false, $1, xml,[],m)) } + | _ -> ParsedImplFileFragment.NamespaceFragment(path, isRec, DeclaredNamespace, $1, xml,[],m)) } /* A collection/block of definitions or expressions making up a module or namespace, possibly empty */ diff --git a/src/fsharp/service/ServiceAssemblyContent.fs b/src/fsharp/service/ServiceAssemblyContent.fs index b85396c26e7..663ed82a941 100644 --- a/src/fsharp/service/ServiceAssemblyContent.fs +++ b/src/fsharp/service/ServiceAssemblyContent.fs @@ -914,8 +914,9 @@ module ParsedInput = let rec walkImplFileInput (ParsedImplFileInput(modules = moduleOrNamespaceList)) = List.iter (walkSynModuleOrNamespace []) moduleOrNamespaceList - and walkSynModuleOrNamespace (parent: LongIdent) (SynModuleOrNamespace(ident, _, isModule, decls, _, _, _, range)) = + and walkSynModuleOrNamespace (parent: LongIdent) (SynModuleOrNamespace(ident, _, kind, decls, _, _, _, range)) = if range.EndLine >= currentLine then + let isModule = kind.IsModule match isModule, parent, ident with | false, _, _ -> ns := Some (longIdentToIdents ident) // top level module with "inlined" namespace like Ns1.Ns2.TopModule diff --git a/src/fsharp/service/ServiceNavigation.fs b/src/fsharp/service/ServiceNavigation.fs index 24d83f532bd..e0e1feb1b32 100755 --- a/src/fsharp/service/ServiceNavigation.fs +++ b/src/fsharp/service/ServiceNavigation.fs @@ -270,7 +270,7 @@ module NavigationImpl = let items = // Show base name for this module only if it's not the root one let singleTopLevel = (modules.Length = 1) - modules |> List.collect (fun (SynModuleOrNamespace(id, _isRec, isModule, decls, _, _, access, m)) -> + modules |> List.collect (fun (SynModuleOrNamespace(id, _isRec, kind, decls, _, _, access, m)) -> let baseName = if (not singleTopLevel) then textOfLid id else "" // Find let bindings (for the right dropdown) let nested = processNestedDeclarations(decls) @@ -283,7 +283,7 @@ module NavigationImpl = | _ -> let decl = FSharpNavigationDeclarationItem.Create - (textOfLid id, (if isModule then ModuleFileDecl else NamespaceDecl), + (textOfLid id, (if kind.IsModule then ModuleFileDecl else NamespaceDecl), FSharpGlyph.Module, m, unionRangesChecked (rangeOfDecls nested) (moduleRange (rangeOfLid id) other), singleTopLevel, FSharpEnclosingEntityKind.Module, false, access), (addItemName(textOfLid id)), nested @@ -410,7 +410,7 @@ module NavigationImpl = let items = // Show base name for this module only if it's not the root one let singleTopLevel = (modules.Length = 1) - modules |> List.collect (fun (SynModuleOrNamespaceSig(id, _isRec, isModule, decls, _, _, access, m)) -> + modules |> List.collect (fun (SynModuleOrNamespaceSig(id, _isRec, kind, decls, _, _, access, m)) -> let baseName = if (not singleTopLevel) then textOfLid id else "" // Find let bindings (for the right dropdown) let nested = processNestedSigDeclarations(decls) @@ -420,7 +420,7 @@ module NavigationImpl = // Create explicitly - it can be 'single top level' thing that is hidden let decl = FSharpNavigationDeclarationItem.Create - (textOfLid id, (if isModule then ModuleFileDecl else NamespaceDecl), + (textOfLid id, (if kind.IsModule then ModuleFileDecl else NamespaceDecl), FSharpGlyph.Module, m, unionRangesChecked (rangeOfDecls nested) (moduleRange (rangeOfLid id) other), singleTopLevel, FSharpEnclosingEntityKind.Module, false, access), (addItemName(textOfLid id)), nested @@ -574,7 +574,8 @@ module NavigateTo = for item in moduleOrNamespaceList do walkSynModuleOrNamespaceSig item { Type = ContainerType.File; Name = fileName } - and walkSynModuleOrNamespaceSig (SynModuleOrNamespaceSig(lid, _, isModule, decls, _, _, _, _)) container = + and walkSynModuleOrNamespaceSig (SynModuleOrNamespaceSig(lid, _, kind, decls, _, _, _, _)) container = + let isModule = kind.IsModule if isModule then addModule lid true container let container = @@ -631,7 +632,8 @@ module NavigateTo = for item in moduleOrNamespaceList do walkSynModuleOrNamespace item container - and walkSynModuleOrNamespace(SynModuleOrNamespace(lid, _, isModule, decls, _, _, _, _)) container = + and walkSynModuleOrNamespace(SynModuleOrNamespace(lid, _, kind, decls, _, _, _, _)) container = + let isModule = kind.IsModule if isModule then addModule lid false container let container = diff --git a/src/fsharp/service/ServiceStructure.fs b/src/fsharp/service/ServiceStructure.fs index f225c87b6d0..a89afd44c54 100644 --- a/src/fsharp/service/ServiceStructure.fs +++ b/src/fsharp/service/ServiceStructure.fs @@ -610,14 +610,14 @@ module Structure = parseAttributes attrs | _ -> () - let parseModuleOrNamespace isScript (SynModuleOrNamespace (longId,_,isModule,decls,_,attribs,_,r)) = + let parseModuleOrNamespace (SynModuleOrNamespace (longId,_,kind,decls,_,attribs,_,r)) = parseAttributes attribs let idRange = longIdentRange longId let fullrange = Range.startToEnd idRange r let collapse = Range.endToEnd idRange r // do not return range for top level implicit module in scripts - if isModule && not isScript then + if kind = NamedModule then rcheck Scope.Module Collapse.Below fullrange collapse collectHashDirectives decls @@ -833,14 +833,14 @@ module Structure = List.iter parseModuleSigDeclaration decls | _ -> () - let parseModuleOrNamespaceSigs (SynModuleOrNamespaceSig(longId,_,isModule,decls,_,attribs,_,r)) = + let parseModuleOrNamespaceSigs (SynModuleOrNamespaceSig(longId,_,kind,decls,_,attribs,_,r)) = parseAttributes attribs let rangeEnd = lastModuleSigDeclRangeElse r decls let idrange = longIdentRange longId let fullrange = Range.startToEnd idrange rangeEnd let collapse = Range.endToEnd idrange rangeEnd - if isModule then + if kind.IsModule then rcheck Scope.Module Collapse.Below fullrange collapse collectSigHashDirectives decls @@ -848,8 +848,8 @@ module Structure = List.iter parseModuleSigDeclaration decls match parsedInput with - | ParsedInput.ImplFile (ParsedImplFileInput (modules = modules; isScript = isScript)) -> - modules |> List.iter (parseModuleOrNamespace isScript) + | ParsedInput.ImplFile (ParsedImplFileInput (modules = modules)) -> + modules |> List.iter parseModuleOrNamespace getCommentRanges sourceLines | ParsedInput.SigFile (ParsedSigFileInput (modules = moduleSigs)) -> List.iter parseModuleOrNamespaceSigs moduleSigs diff --git a/tests/service/StructureTests.fs b/tests/service/StructureTests.fs index d87c3c18e78..83f518f276f 100644 --- a/tests/service/StructureTests.fs +++ b/tests/service/StructureTests.fs @@ -60,7 +60,7 @@ let (=>) (source: string) (expectedRanges: (Range * Range) list) = reraise() [] -let ``empty file``() = "" => [ (1, 0, 2, 0), (1, 0, 2, 0) ] +let ``empty file``() = "" => [] [] let ``nested module``() = @@ -68,8 +68,7 @@ let ``nested module``() = module MyModule = () """ - => [ (1, 0, 4, 0), (1, 0, 4, 0) - (2, 0, 3, 6), (2, 15, 3, 6) ] + => [ (2, 0, 3, 6), (2, 15, 3, 6) ] [] let ``module with multiline function``() = @@ -78,8 +77,7 @@ module MyModule = let foo() = foo() """ - => [ (1, 0, 5, 0), (1, 0, 5, 0) - (2, 0, 4, 13), (2, 15, 4, 13) + => [ (2, 0, 4, 13), (2, 15, 4, 13) (3, 4, 4, 13), (3, 13, 4, 13) (3, 8, 4, 13), (3, 13, 4, 13) ] @@ -91,8 +89,7 @@ type Color = | Green | Blue """ - => [ (1, 0, 6, 0), (1, 0, 6, 0) - (2, 5, 5, 10), (2, 11, 5, 10) + => [ (2, 5, 5, 10), (2, 11, 5, 10) (3, 4, 5, 10), (3, 4, 5, 10) ] [] @@ -107,8 +104,7 @@ type Color = member __.Dispose() = (docEventListener :> IDisposable).Dispose() """ - => [ (1, 0, 10, 0), (1, 0, 10, 0) - (2, 5, 9, 55), (2, 11, 9, 55) + => [ (2, 5, 9, 55), (2, 11, 9, 55) (3, 4, 5, 10), (3, 4, 5, 10) (7, 4, 9, 55), (7, 25, 9, 55) (8, 15, 9, 55), (8, 27, 9, 55) @@ -128,8 +124,7 @@ type Color = (docEventListener :> IDisposable).Dispose() """ => - [ (1, 0, 11, 0), (1, 0, 11, 0) - (2, 5, 10, 55), (2, 11, 10, 55) + [ (2, 5, 10, 55), (2, 11, 10, 55) (3, 4, 4, 14), (3, 4, 4, 14) (3, 6, 4, 13), (3, 6, 4, 13) (8, 4, 10, 55), (8, 25, 10, 55) @@ -147,8 +142,7 @@ type Color() = // 2 foo() () // 8 """ - => [ (1, 0, 9, 0), (1, 0, 9, 0) - (2, 5, 8, 10), (2, 11, 8, 10) + => [ (2, 5, 8, 10), (2, 11, 8, 10) (3, 8, 4, 10), (3, 13, 4, 10) (6, 4, 8, 10), (6, 6, 8, 10) ] @@ -182,8 +176,7 @@ module MyModule = // 2 member __.Dispose() = (docEventListener :> IDisposable).Dispose() """ - => [ (1, 0, 28, 0), (1, 0, 28, 0) - (2, 0, 27, 63), (2, 15, 27, 63) + => [ (2, 0, 27, 63), (2, 15, 27, 63) (4, 4, 5, 10), (4, 13, 5, 10) (4, 8, 5, 10), (4, 13, 5, 10) (7, 9, 15, 59), (7, 15, 15, 59) @@ -228,8 +221,7 @@ open H open G open H """ - => [ (1, 0, 26, 6), (1, 0, 26, 6) - (2, 5, 3, 6), (2, 5, 3, 6) + => [ (2, 5, 3, 6), (2, 5, 3, 6) (5, 0, 19, 17), (5, 8, 19, 17) (8, 9, 9, 10), (8, 9, 9, 10) (11, 4, 14, 17), (11, 12, 14, 17) @@ -263,8 +255,7 @@ let x = 1 "c" #r "d" """ - => [ (1, 0, 23, 6), (1, 0, 23, 6) - (2, 3, 8, 6), (2, 3, 8, 6) + => [ (2, 3, 8, 6), (2, 3, 8, 6) (11, 3, 23, 6), (11, 3, 23, 6) ] [] @@ -277,8 +268,7 @@ let f x = // 2 () // 6 x // 7 """ - => [ (1, 0, 8, 0), (1, 0, 8, 0) - (2, 0, 7, 5), (2, 7, 7, 5) + => [ (2, 0, 7, 5), (2, 7, 7, 5) (2, 4, 7, 5), (2, 7, 7, 5) (3, 8, 6, 10), (3, 11, 6, 10) (4, 12, 5, 14), (4, 13, 5, 14) ] @@ -296,8 +286,7 @@ match None with // 2 let x = () // 9 () // 10 """ - => [ (1, 0, 11, 0), (1, 0, 11, 0) - (2, 0, 10, 10), (2, 15, 10, 10) + => [ (2, 0, 10, 10), (2, 15, 10, 10) (6, 4, 10, 10), (5, 6, 10, 10) (6, 4, 10, 10), (6, 19, 10, 10) (9, 8, 10, 10), (8, 10, 10, 10) ] @@ -317,8 +306,7 @@ async { // 2 () // 11 } // 12 """ - => [ (1, 0, 12, 1), (1, 0, 12, 1) - (2, 0, 12, 1), (2, 7, 12, 0) + => [ (2, 0, 12, 1), (2, 7, 12, 0) (3, 4, 11, 14), (3, 37, 11, 14) (7, 8, 11, 14), (6, 10, 11, 14) (7, 8, 11, 14), (7, 23, 11, 14) @@ -335,8 +323,7 @@ seq { // 2 yield () } // 7 } // 8 """ - => [ (1, 0, 8, 1), (1, 0, 8, 1) - (2, 0, 8, 1), (2, 5, 8, 0) + => [ (2, 0, 8, 1), (2, 5, 8, 0) (4, 8, 5, 10), (4, 11, 5, 10) (6, 4, 7, 18), (6, 4, 7, 18) (6, 11, 7, 18), (6, 16, 7, 17) ] @@ -348,8 +335,7 @@ let _ = [ 1; 2 3 ] """ - => [ (1, 0, 5, 0), (1, 0, 5, 0) - (2, 0, 4, 9), (2, 5, 4, 9) + => [ (2, 0, 4, 9), (2, 5, 4, 9) (2, 4, 4, 9), (2, 5, 4, 9) (3, 4, 4, 9), (3, 5, 4, 8) ] @@ -360,8 +346,7 @@ let _ = { new System.IDisposable with member __.Dispose() = () } """ - => [ (1, 0, 5, 0), (1, 0, 5, 0) - (2, 0, 4, 34), (2, 5, 4, 34) + => [ (2, 0, 4, 34), (2, 5, 4, 34) (2, 4, 4, 34), (2, 5, 4, 34) (3, 4, 4, 34), (3, 28, 4, 34) ] @@ -376,8 +361,7 @@ with _ -> // 5 () // 7 () // 8 """ - => [ (1, 0, 9, 0), (1, 0, 9, 0) - (2, 0, 5, 0), (2, 3, 5, 0) + => [ (2, 0, 5, 0), (2, 3, 5, 0) (2, 0, 8, 6), (2, 3, 8, 6) (3, 8, 4, 10), (3, 11, 4, 10) (5, 0, 8, 6), (5, 4, 8, 6) @@ -395,8 +379,7 @@ finally // 5 () // 7 () // 8 """ - => [ (1, 0, 9, 0), (1, 0, 9, 0) - (2, 0, 8, 6), (2, 3, 8, 6) + => [ (2, 0, 8, 6), (2, 3, 8, 6) (3, 8, 4, 10), (3, 11, 4, 10) (5, 0, 8, 6), (5, 7, 8, 6) (6, 8, 7, 10), (6, 11, 7, 10) ] @@ -413,8 +396,7 @@ else () () """ - => [ (1, 0, 10, 0), (1, 0, 10, 0) - (2, 0, 9, 6), (2, 7, 9, 6) + => [ (2, 0, 9, 6), (2, 7, 9, 6) (2, 8, 5, 6), (2, 12, 5, 6) (3, 8, 4, 10), (3, 11, 4, 10) (7, 8, 8, 10), (7, 11, 8, 10) ] @@ -426,8 +408,7 @@ let ``code quotation``() = "code" @> """ - => [ (1, 0, 4, 10), (1, 0, 4, 10) - (2, 0, 4, 10), (2, 2, 4, 8) ] + => [ (2, 0, 4, 10), (2, 2, 4, 8) ] [] let ``raw code quotation``() = @@ -436,8 +417,7 @@ let ``raw code quotation``() = "code" @@> """ - => [ (1, 0, 4, 11), (1, 0, 4, 11) - (2, 0, 4, 11), (2, 3, 4, 8) ] + => [ (2, 0, 4, 11), (2, 3, 4, 8) ] [] let ``match lambda aka function``() = @@ -446,8 +426,7 @@ function | 0 -> () () """ - => [ (1, 0, 5, 0), (1, 0, 5, 0) - (2, 0, 4, 10), (2, 8, 4, 10) + => [ (2, 0, 4, 10), (2, 8, 4, 10) (3, 8, 4, 10), (3, 3, 4, 10) ] [] @@ -458,8 +437,7 @@ let matchwith num = | 0 -> () () """ - => [ (1, 0, 6, 0), (1, 0, 6, 0) - (2, 0, 5, 13), (2, 17, 5, 13) + => [ (2, 0, 5, 13), (2, 17, 5, 13) (2, 4, 5, 13), (2, 17, 5, 13) (3, 4, 5, 13), (3, 18, 5, 13) (4, 11, 5, 13), (4, 7, 5, 13) ] @@ -471,8 +449,7 @@ for x = 100 downto 10 do () () """ - => [ (1, 0, 5, 0), (1, 0, 5, 0) - (2, 0, 4, 6), (2, 0, 4, 6) ] + => [ (2, 0, 4, 6), (2, 0, 4, 6) ] [] let ``for each``() = @@ -481,8 +458,7 @@ for x in 0 .. 100 -> () () """ - => [ (1, 0, 5, 0), (1, 0, 5, 0) - (2, 0, 4, 14), (2, 0, 4, 14) + => [ (2, 0, 4, 14), (2, 0, 4, 14) (2, 18, 4, 14), (2, 18, 4, 14) ] [] @@ -492,8 +468,7 @@ let ``tuple``() = , 322 , 123123 ) """ - => [ (1, 0, 4, 10), (1, 0, 4, 10) - (2, 2, 4, 8), (2, 2, 4, 8) ] + => [ (2, 2, 4, 8), (2, 2, 4, 8) ] [] let ``do!``() = @@ -502,8 +477,7 @@ do! printfn "allo" printfn "allo" """ - => [(1, 0, 5, 0), (1, 0, 5, 0) - (2, 0, 4, 18), (2, 3, 4, 18)] + => [ (2, 0, 4, 18), (2, 3, 4, 18) ] [] let ``cexpr yield yield!``() = @@ -517,11 +491,10 @@ cexpr{ } } """ - => [(1, 0, 9, 5), (1, 0, 9, 5) - (2, 0, 9, 5), (2, 6, 9, 4) - (3, 4, 8, 17), (3, 4, 8, 17) - (4, 8, 8, 17), (4, 14, 8, 16) - (5, 20, 7, 26), (5, 20, 7, 26)] + => [ (2, 0, 9, 5), (2, 6, 9, 4) + (3, 4, 8, 17), (3, 4, 8, 17) + (4, 8, 8, 17), (4, 14, 8, 16) + (5, 20, 7, 26), (5, 20, 7, 26) ] [] let ``XML doc comments``() = @@ -539,8 +512,7 @@ module M = /// Single line comment let f x = x """ - => [ (1, 0, 14, 0), (1, 0, 14, 0) - (2, 0, 3, 10), (2, 0, 3, 10) + => [ (2, 0, 3, 10), (2, 0, 3, 10) (4, 0, 13, 15), (4, 8, 13, 15) (5, 4, 6, 14), (5, 4, 6, 14) (7, 9, 11, 19), (7, 11, 11, 19) @@ -562,8 +534,7 @@ module M = // Single line comment let f x = x """ - => [ (1, 0, 14, 0), (1, 0, 14, 0) - (2, 0, 3, 9), (2, 0, 3, 9) + => [ (2, 0, 3, 9), (2, 0, 3, 9) (4, 0, 13, 15), (4, 8, 13, 15) (5, 4, 6, 13), (5, 4, 6, 13) (7, 9, 11, 19), (7, 11, 11, 19) @@ -582,8 +553,7 @@ let ``XML doc and regular comments in one block``() = /// Line 8 /// Line 9 """ - => [ (1, 0, 11, 0), (1, 0, 11, 0) - (2, 0, 3, 9), (2, 0, 3, 9) + => [ (2, 0, 3, 9), (2, 0, 3, 9) (4, 0, 5, 10), (4, 0, 5, 10) (7, 0, 10, 10), (7, 0, 10, 10) ] @@ -596,9 +566,45 @@ module M = 'c', 1) """ - => [ (1, 0, 7, 0), (1, 0, 7, 0) - (2, 0, 6, 14), (2, 8, 6, 14) + => [ (2, 0, 6, 14), (2, 8, 6, 14) (3, 4, 6, 14), (3, 9, 6, 14) (3, 8, 6, 14), (3, 9, 6, 14) (4, 8, 6, 14), (4, 25, 6, 14) (5, 12, 6, 13), (5, 12, 6, 13) ] + +[] +let ``Top level module`` () = + """ +module TopLevelModule + +module Nested = + let x = 123 +""" + => [ (2, 7, 5, 15), (2, 21, 5, 15) + (4, 0, 5, 15), (4, 13, 5, 15) ] + +[] +let ``Top level namespace`` () = + """ +namespace TopLevelNamespace.Another + +module Nested = + let x = 123 +""" + => [ (4, 0, 5, 15), (4, 13, 5, 15) ] + +[] +let ``Multiple namespaces`` () = + """ +namespace TopLevelNamespace.Another + +module Nested = + let x = 123 + +namespace AnotherTopLevel.Nested + +module NestedModule = + let x = 123 +""" + => [ (4, 0, 5, 15), (4, 13, 5, 15) + (9, 0, 10, 15), (9, 19, 10, 15) ] From 9b55eccd1bc83ed123c5ae08c577be5646861830 Mon Sep 17 00:00:00 2001 From: Eugene Auduchinok Date: Sat, 22 Dec 2018 05:50:15 +0300 Subject: [PATCH 141/160] Dive into types in type test expressions in AST visitor traverse (#5951) * Dive into types in type test expressions in AST visitor * Add test * Update VisualFSharp test * Update fsproj * Cleanup test --- .../FSharp.Compiler.Service.Tests.fsproj | 6 +++++ src/fsharp/service/ServiceParseTreeWalk.fs | 9 ++++--- tests/service/Common.fs | 17 ++++++------ tests/service/InteractiveCheckerTests.fs | 6 +---- tests/service/ServiceUntypedParseTests.fs | 14 +++++----- tests/service/StructureTests.fs | 26 ++++++++----------- tests/service/TreeVisitorTests.fs | 22 ++++++++++++++++ .../UnitTests/VisualFSharp.UnitTests.fsproj | 3 +++ 8 files changed, 64 insertions(+), 39 deletions(-) create mode 100644 tests/service/TreeVisitorTests.fs diff --git a/fcs/FSharp.Compiler.Service.Tests/FSharp.Compiler.Service.Tests.fsproj b/fcs/FSharp.Compiler.Service.Tests/FSharp.Compiler.Service.Tests.fsproj index abe71b6159a..9c3eb687c20 100644 --- a/fcs/FSharp.Compiler.Service.Tests/FSharp.Compiler.Service.Tests.fsproj +++ b/fcs/FSharp.Compiler.Service.Tests/FSharp.Compiler.Service.Tests.fsproj @@ -66,6 +66,12 @@ TokenizerTests.fs + + ServiceUntypedParseTests.fs + + + TreeVisitorTests.fs + Program.fs diff --git a/src/fsharp/service/ServiceParseTreeWalk.fs b/src/fsharp/service/ServiceParseTreeWalk.fs index 660528e03ee..14e08c9b2de 100755 --- a/src/fsharp/service/ServiceParseTreeWalk.fs +++ b/src/fsharp/service/ServiceParseTreeWalk.fs @@ -456,9 +456,12 @@ module public AstTraversal = dive synExpr2 synExpr2.Range traverseSynExpr dive synExpr3 synExpr3.Range traverseSynExpr] |> pick expr - | SynExpr.TypeTest(synExpr, _synType, _range) -> traverseSynExpr synExpr - | SynExpr.Upcast(synExpr, _synType, _range) -> traverseSynExpr synExpr - | SynExpr.Downcast(synExpr, _synType, _range) -> traverseSynExpr synExpr + | SynExpr.TypeTest(synExpr, synType, _range) + | SynExpr.Upcast(synExpr, synType, _range) + | SynExpr.Downcast(synExpr, synType, _range) -> + [dive synExpr synExpr.Range traverseSynExpr + dive synType synType.Range traverseSynType] + |> pick expr | SynExpr.InferredUpcast(synExpr, _range) -> traverseSynExpr synExpr | SynExpr.InferredDowncast(synExpr, _range) -> traverseSynExpr synExpr | SynExpr.Null(_range) -> None diff --git a/tests/service/Common.fs b/tests/service/Common.fs index 07c2484e70a..6999e97a2b2 100644 --- a/tests/service/Common.fs +++ b/tests/service/Common.fs @@ -195,17 +195,18 @@ let parseAndCheckScript (file, input) = | FSharpCheckFileAnswer.Succeeded(res) -> parseResult, res | res -> failwithf "Parsing did not finish... (%A)" res -let parseSourceCode (name: string, code: string) = - let location = Path.Combine(Path.GetTempPath(),"test"+string(hash (name, code))) - try Directory.CreateDirectory(location) |> ignore with _ -> () +let parseSource (source: string) = + let location = Path.GetTempFileName() + let filePath = Path.Combine(location, ".fs") + let dllPath = Path.Combine(location, ".dll") - let projPath = Path.Combine(location, name + ".fsproj") - let filePath = Path.Combine(location, name + ".fs") - let dllPath = Path.Combine(location, name + ".dll") let args = mkProjectCommandLineArgs(dllPath, [filePath]) let options, errors = checker.GetParsingOptionsFromCommandLineArgs(List.ofArray args) - let parseResults = checker.ParseFile(filePath, code, options) |> Async.RunSynchronously - parseResults.ParseTree + let parseResults = checker.ParseFile(filePath, source, options) |> Async.RunSynchronously + + match parseResults.ParseTree with + | Some parseTree -> parseTree + | None -> failwithf "Expected there to be a parse tree for source:\n%s" source /// Extract range info let tups (m:Range.range) = (m.StartLine, m.StartColumn), (m.EndLine, m.EndColumn) diff --git a/tests/service/InteractiveCheckerTests.fs b/tests/service/InteractiveCheckerTests.fs index fba9adcb639..136505b6dd2 100644 --- a/tests/service/InteractiveCheckerTests.fs +++ b/tests/service/InteractiveCheckerTests.fs @@ -54,11 +54,7 @@ let internal identsAndRanges (input: Ast.ParsedInput) = | Ast.ParsedInput.SigFile _ -> [] let internal parseAndExtractRanges code = - let file = "Test" - let result = parseSourceCode (file, code) - match result with - | Some tree -> tree |> identsAndRanges - | None -> failwith "fail to parse..." + parseSource code |> identsAndRanges let input = """ diff --git a/tests/service/ServiceUntypedParseTests.fs b/tests/service/ServiceUntypedParseTests.fs index d47acf69de2..ccda4f5bac4 100644 --- a/tests/service/ServiceUntypedParseTests.fs +++ b/tests/service/ServiceUntypedParseTests.fs @@ -40,14 +40,12 @@ let private (=>) (source: string) (expected: CompletionContext option) = match markerPos with | None -> failwithf "Marker '%s' was not found in the source code" Marker | Some markerPos -> - match parseSourceCode("C:\\test.fs", source) with - | None -> failwith "No parse tree" - | Some parseTree -> - let actual = UntypedParseImpl.TryGetCompletionContext(markerPos, parseTree, lines.[Line.toZ markerPos.Line]) - try Assert.AreEqual(expected, actual) - with e -> - printfn "ParseTree: %A" parseTree - reraise() + let parseTree = parseSource source + let actual = UntypedParseImpl.TryGetCompletionContext(markerPos, parseTree, lines.[Line.toZ markerPos.Line]) + try Assert.AreEqual(expected, actual) + with e -> + printfn "ParseTree: %A" parseTree + reraise() module AttributeCompletion = [] diff --git a/tests/service/StructureTests.fs b/tests/service/StructureTests.fs index 83f518f276f..c98027c4ca0 100644 --- a/tests/service/StructureTests.fs +++ b/tests/service/StructureTests.fs @@ -40,23 +40,19 @@ let (=>) (source: string) (expectedRanges: (Range * Range) list) = let getRange (r: range) = (r.StartLine, r.StartColumn, r.EndLine, r.EndColumn) - let ast = parseSourceCode(fileName, source) - + let tree = parseSource source try - match ast with - | Some tree -> - let actual = - Structure.getOutliningRanges lines tree - |> Seq.filter (fun sr -> sr.Range.StartLine <> sr.Range.EndLine) - |> Seq.map (fun sr -> getRange sr.Range, getRange sr.CollapseRange) - |> Seq.sort - |> List.ofSeq - let expected = List.sort expectedRanges - if actual <> expected then - failwithf "Expected %s, but was %s" (formatList expected) (formatList actual) - | None -> failwithf "Expected there to be a parse tree for source:\n%s" source + let actual = + Structure.getOutliningRanges lines tree + |> Seq.filter (fun sr -> sr.Range.StartLine <> sr.Range.EndLine) + |> Seq.map (fun sr -> getRange sr.Range, getRange sr.CollapseRange) + |> Seq.sort + |> List.ofSeq + let expected = List.sort expectedRanges + if actual <> expected then + failwithf "Expected %s, but was %s" (formatList expected) (formatList actual) with _ -> - printfn "AST:\n%+A" ast + printfn "AST:\n%+A" tree reraise() [] diff --git a/tests/service/TreeVisitorTests.fs b/tests/service/TreeVisitorTests.fs new file mode 100644 index 00000000000..e81d140011e --- /dev/null +++ b/tests/service/TreeVisitorTests.fs @@ -0,0 +1,22 @@ +module Tests.Service.TreeVisitorTests + +open FSharp.Compiler.Service.Tests.Common +open Microsoft.FSharp.Compiler.Range +open Microsoft.FSharp.Compiler.SourceCodeServices.AstTraversal +open NUnit.Framework + +[] +let ``Visit type test`` () = + let visitor = + { new AstVisitorBase<_>() with + member x.VisitExpr(_, _, defaultTraverse, expr) = defaultTraverse expr + member x.VisitType(_, _) = Some () } + + let source = "123 :? int" + let parseTree = parseSource source + + Traverse(mkPos 1 11, parseTree, visitor) + |> Option.defaultWith (fun _ -> failwith "Did not visit type") + + Traverse(mkPos 1 3, parseTree, visitor) + |> Option.iter (fun _ -> failwith "Should not visit type") diff --git a/vsintegration/tests/UnitTests/VisualFSharp.UnitTests.fsproj b/vsintegration/tests/UnitTests/VisualFSharp.UnitTests.fsproj index 310ebf78089..398eab56a43 100644 --- a/vsintegration/tests/UnitTests/VisualFSharp.UnitTests.fsproj +++ b/vsintegration/tests/UnitTests/VisualFSharp.UnitTests.fsproj @@ -109,6 +109,9 @@ CompilerService\UnusedOpensTests.fs + + CompilerService\TreeVisitorTests.fs + Roslyn\SyntacticColorizationServiceTests.fs From 4566e648e7357e3de5895fa0345e573b96257083 Mon Sep 17 00:00:00 2001 From: Avi Avni Date: Fri, 11 Jan 2019 19:17:41 +0200 Subject: [PATCH 142/160] remove allocations from jaro (#6050) * remove allocations from jaro * improve perforamce * fix build * remove string concat allocations from FilterPredictions * fix build * move to struct tuple and remove the concat completely * undo --- src/fsharp/ErrorResolutionHints.fs | 3 +- src/utils/EditDistance.fs | 64 ++++++++++++++++++------------ 2 files changed, 40 insertions(+), 27 deletions(-) diff --git a/src/fsharp/ErrorResolutionHints.fs b/src/fsharp/ErrorResolutionHints.fs index e674adb6f46..20bcb13fd21 100644 --- a/src/fsharp/ErrorResolutionHints.fs +++ b/src/fsharp/ErrorResolutionHints.fs @@ -43,6 +43,7 @@ let FilterPredictions (idText:string) (suggestionF:ErrorLogger.Suggestions) = name |> Seq.forall (fun c -> c <> ' ') if allSuggestions.Contains idText then [] else // some other parsing error occurred + let dotIdText = "." + idText allSuggestions |> Seq.choose (fun suggestion -> // Because beginning a name with _ is used both to indicate an unused @@ -53,7 +54,7 @@ let FilterPredictions (idText:string) (suggestionF:ErrorLogger.Suggestions) = let suggestion:string = demangle suggestion let suggestedText = suggestion.ToUpperInvariant() let similarity = EditDistance.JaroWinklerDistance uppercaseText suggestedText - if similarity >= highConfidenceThreshold || suggestion.EndsWithOrdinal("." + idText) then + if similarity >= highConfidenceThreshold || suggestion.EndsWithOrdinal(dotIdText) then Some(similarity, suggestion) elif similarity < minThresholdForSuggestions && suggestedText.Length > minStringLengthForThreshold then None diff --git a/src/utils/EditDistance.fs b/src/utils/EditDistance.fs index 6beac0c408f..503662400ff 100644 --- a/src/utils/EditDistance.fs +++ b/src/utils/EditDistance.fs @@ -23,33 +23,45 @@ let jaro (s1: string) (s2: string) = let matchRadius = let minLen = Math.Min(s1.Length, s2.Length) minLen / 2 + minLen % 2 - - // An inner function which recursively finds the number - // of matched characters within the radius. - let commonChars (chars1: string) (chars2: string) = - let result = ResizeArray(chars1.Length) - for i = 0 to chars1.Length - 1 do - let c = chars1.[i] - if existsInWin c chars2 i matchRadius then - result.Add c - result - - // The sets of common characters and their lengths as floats - let c1 = commonChars s1 s2 - let c2 = commonChars s2 s1 - let c1length = float c1.Count - let c2length = float c2.Count - + + let rec nextChar (s1:string) (s2:string) i c = + if i < s1.Length then + let c = s1.[i] + if not (existsInWin c s2 i matchRadius) then + nextChar s1 s2 (i + 1) c + else + struct (i, c) + else + struct (i, c) + + // The sets of common characters and their lengths as floats // The number of transpositions within the sets of common characters. - let transpositions = - let mutable mismatches = 0.0 - for i = 0 to (Math.Min(c1.Count, c2.Count)) - 1 do - if c1.[i] <> c2.[i] then - mismatches <- mismatches + 1.0 - - // If one common string is longer than the other - // each additional char counts as half a transposition - (mismatches + abs (c1length - c2length)) / 2.0 + let struct (transpositions, c1length, c2length) = + let rec loop i j mismatches c1length c2length = + if i < s1.Length && j < s2.Length then + let struct (ti, ci) = nextChar s1 s2 i ' ' + let struct (tj, cj) = nextChar s2 s1 j ' ' + if ci <> cj then + loop (ti + 1) (tj + 1) (mismatches + 1) (c1length + 1) (c2length + 1) + else + loop (ti + 1) (tj + 1) mismatches (c1length + 1) (c2length + 1) + else struct (i, j, mismatches, c1length, c2length) + + let struct (i, j, mismatches, c1length, c2length) = loop 0 0 0 0 0 + + let rec loop (s1:string) (s2:string) i length = + if i < s1.Length - 1 then + let c = s1.[i] + if existsInWin c s2 i matchRadius then + loop s1 s2 (i + 1) (length + 1) + else + loop s1 s2 (i + 1) length + else + length + let c1length = loop s1 s2 i c1length |> float + let c2length = loop s2 s1 j c2length |> float + + struct ((float mismatches + abs (c1length - c2length)) / 2.0, c1length, c2length) let tLength = Math.Max(c1length, c2length) From 0a72fe28e0252c6aa13b87dc8115111b93a53aa8 Mon Sep 17 00:00:00 2001 From: Don Syme Date: Fri, 11 Jan 2019 21:19:32 +0000 Subject: [PATCH 143/160] take tailcalls in debug mode (#6079) --- fcs/FSharp.Compiler.Service/FSharp.Compiler.Service.fsproj | 2 +- .../FSharp.Compiler.Private/FSharp.Compiler.Private.fsproj | 1 + src/fsharp/FSharp.Core/FSharp.Core.fsproj | 1 + 3 files changed, 3 insertions(+), 1 deletion(-) diff --git a/fcs/FSharp.Compiler.Service/FSharp.Compiler.Service.fsproj b/fcs/FSharp.Compiler.Service/FSharp.Compiler.Service.fsproj index c5357aab06b..55a43730801 100644 --- a/fcs/FSharp.Compiler.Service/FSharp.Compiler.Service.fsproj +++ b/fcs/FSharp.Compiler.Service/FSharp.Compiler.Service.fsproj @@ -17,7 +17,7 @@ $(OtherFlags) /warnon:1182 $(OtherFlags) --times $(NoWarn);44;62;69;65;54;61;75;62;9;2003;NU5125 - true + true true true diff --git a/src/fsharp/FSharp.Compiler.Private/FSharp.Compiler.Private.fsproj b/src/fsharp/FSharp.Compiler.Private/FSharp.Compiler.Private.fsproj index 46e8888f03b..2a38e3d10d1 100644 --- a/src/fsharp/FSharp.Compiler.Private/FSharp.Compiler.Private.fsproj +++ b/src/fsharp/FSharp.Compiler.Private/FSharp.Compiler.Private.fsproj @@ -13,6 +13,7 @@ $(OtherFlags) --warnon:1182 --maxerrors:20 --extraoptimizationloops:1 true true + true diff --git a/src/fsharp/FSharp.Core/FSharp.Core.fsproj b/src/fsharp/FSharp.Core/FSharp.Core.fsproj index ce9fa915f91..6ddda3f2e7e 100644 --- a/src/fsharp/FSharp.Core/FSharp.Core.fsproj +++ b/src/fsharp/FSharp.Core/FSharp.Core.fsproj @@ -14,6 +14,7 @@ $(DefineConstants);FSHARP_CORE BUILDING_WITH_LKG;$(DefineConstants) $(OtherFlags) --warnon:1182 --compiling-fslib --compiling-fslib-40 --maxerrors:20 --extraoptimizationloops:1 + true From 23c626d7e836bec49c34af70dd970413ea4b6dcd Mon Sep 17 00:00:00 2001 From: "Kevin Ransom (msft)" Date: Fri, 11 Jan 2019 16:12:56 -0800 Subject: [PATCH 144/160] Build a compiler dll with out a prerelease tag (#6082) --- build-nuget-packages.proj | 1 + build.cmd | 3 +-- fsharp.proj | 8 +++++++- src/fsharp/FSharp.Compiler.nuget/Directory.Build.props | 2 -- src/fsharp/FSharp.Compiler.nuget/Directory.Build.targets | 5 +++++ .../Microsoft.FSharp.Compiler.Prerelease.csproj | 8 ++++++++ .../Microsoft.FSharp.Compiler.csproj | 1 + .../FSharp.Compiler.nuget/Testing.FSharp.Compiler.csproj | 1 + 8 files changed, 24 insertions(+), 5 deletions(-) create mode 100644 src/fsharp/FSharp.Compiler.nuget/Microsoft.FSharp.Compiler.Prerelease.csproj diff --git a/build-nuget-packages.proj b/build-nuget-packages.proj index 37a64ed6535..8b279bd8a19 100644 --- a/build-nuget-packages.proj +++ b/build-nuget-packages.proj @@ -3,6 +3,7 @@ + diff --git a/build.cmd b/build.cmd index 34a78774041..a29dd5de7a3 100644 --- a/build.cmd +++ b/build.cmd @@ -162,7 +162,6 @@ if /i "%ARG%" == "net40" ( if /i "%ARG%" == "coreclr" ( set _autoselect=0 - set BUILD_PROTO_WITH_CORECLR_LKG=1 set BUILD_CORECLR=1 set BUILD_FROMSOURCE=1 ) @@ -237,7 +236,7 @@ if /i "%ARG%" == "nuget" ( set BUILD_PROTO=1 set BUILD_NET40_FSHARP_CORE=1 - set BUILD_PROTO_WITH_CORECLR_LKG=1 + set BUILD_NET40=1 set BUILD_CORECLR=1 set BUILD_NUGET=1 ) diff --git a/fsharp.proj b/fsharp.proj index 59436e5a2e7..92b37d547ee 100644 --- a/fsharp.proj +++ b/fsharp.proj @@ -11,6 +11,7 @@ false false false + false false false @@ -25,6 +26,7 @@ true true true + true true true @@ -98,8 +100,12 @@ - + + + + + diff --git a/src/fsharp/FSharp.Compiler.nuget/Directory.Build.props b/src/fsharp/FSharp.Compiler.nuget/Directory.Build.props index 68113d9e9ca..8093275dba0 100644 --- a/src/fsharp/FSharp.Compiler.nuget/Directory.Build.props +++ b/src/fsharp/FSharp.Compiler.nuget/Directory.Build.props @@ -6,8 +6,6 @@ netcoreapp2.1 Microsoft.FSharp.Compiler.nuspec - -rtm-$(NuGetPackageVersionSuffix) - $(FSPackageVersion)$(PreReleaseSuffix) diff --git a/src/fsharp/FSharp.Compiler.nuget/Directory.Build.targets b/src/fsharp/FSharp.Compiler.nuget/Directory.Build.targets index 7d885b518db..2721c93a906 100644 --- a/src/fsharp/FSharp.Compiler.nuget/Directory.Build.targets +++ b/src/fsharp/FSharp.Compiler.nuget/Directory.Build.targets @@ -1,5 +1,10 @@ + + -rtm-$(NuGetPackageVersionSuffix) + $(FSPackageVersion)$(PreReleaseSuffix) + + diff --git a/src/fsharp/FSharp.Compiler.nuget/Microsoft.FSharp.Compiler.Prerelease.csproj b/src/fsharp/FSharp.Compiler.nuget/Microsoft.FSharp.Compiler.Prerelease.csproj new file mode 100644 index 00000000000..692e5aba1b2 --- /dev/null +++ b/src/fsharp/FSharp.Compiler.nuget/Microsoft.FSharp.Compiler.Prerelease.csproj @@ -0,0 +1,8 @@ + + + + Microsoft.FSharp.Compiler + true + + + diff --git a/src/fsharp/FSharp.Compiler.nuget/Microsoft.FSharp.Compiler.csproj b/src/fsharp/FSharp.Compiler.nuget/Microsoft.FSharp.Compiler.csproj index eef53d7dc4e..abb19e418fe 100644 --- a/src/fsharp/FSharp.Compiler.nuget/Microsoft.FSharp.Compiler.csproj +++ b/src/fsharp/FSharp.Compiler.nuget/Microsoft.FSharp.Compiler.csproj @@ -2,6 +2,7 @@ Microsoft.FSharp.Compiler + false diff --git a/src/fsharp/FSharp.Compiler.nuget/Testing.FSharp.Compiler.csproj b/src/fsharp/FSharp.Compiler.nuget/Testing.FSharp.Compiler.csproj index 44a831fed38..aaee9c73942 100644 --- a/src/fsharp/FSharp.Compiler.nuget/Testing.FSharp.Compiler.csproj +++ b/src/fsharp/FSharp.Compiler.nuget/Testing.FSharp.Compiler.csproj @@ -2,6 +2,7 @@ Testing.FSharp.Compiler + true From 631401a1cc7c487a6b27486242ac7df3e77bd495 Mon Sep 17 00:00:00 2001 From: Phillip Carter Date: Fri, 11 Jan 2019 16:13:36 -0800 Subject: [PATCH 145/160] Do not get the absolute value of Map's hash code (#6072) Fixes #6068, where you could cause a `System.OverFlowException` by using a key and value that leads to calling `abs` on `Int32.MinValue`. This is invalid on .NET. The fix is to not call `abs`, since there's really no reason to make a hash code always positive. --- src/fsharp/FSharp.Core/map.fs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/fsharp/FSharp.Core/map.fs b/src/fsharp/FSharp.Core/map.fs index 8efc49a1a41..7ef250a0ee9 100644 --- a/src/fsharp/FSharp.Core/map.fs +++ b/src/fsharp/FSharp.Core/map.fs @@ -558,7 +558,7 @@ namespace Microsoft.FSharp.Collections for (KeyValue(x,y)) in this do res <- combineHash res (hash x) res <- combineHash res (Unchecked.hash y) - abs res + res override this.Equals(that) = match that with @@ -744,4 +744,4 @@ namespace Microsoft.FSharp.Collections let empty<'Key,'Value when 'Key : comparison> = Map<'Key,'Value>.Empty [] - let count (table:Map<_,_>) = table.Count \ No newline at end of file + let count (table:Map<_,_>) = table.Count From 03e8aa59d3a4a9d43a563b498d290d48583d4c01 Mon Sep 17 00:00:00 2001 From: Don Syme Date: Mon, 14 Jan 2019 19:09:31 +0000 Subject: [PATCH 146/160] Update DEVGUIDE.md (#6091) --- DEVGUIDE.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DEVGUIDE.md b/DEVGUIDE.md index b1b0d00cbf5..27a962341b6 100644 --- a/DEVGUIDE.md +++ b/DEVGUIDE.md @@ -237,7 +237,7 @@ If you change error messages you may need to update FSComp.fs in `src\buildfroms To do this, build the non-buildfromsource version of FSharp.Compiler.Private (src\fsharp\FSharp.Compiler.Private) then check its obj\ directory for `FSComp.fs` and manually copy that into the buildfromsource directory. .\build net40 - copy /y src\fsharp\FSharp.Compiler.Private\obj\release\net40\FSComp.* src\buildfromsource\FSharp.Compiler.Private\ + copy /y artifacts\obj\FSharp.Compiler.Private\Release\net46\FSComp.* src\buildfromsource\FSharp.Compiler.Private\ If your changes involve modifying the list of language keywords in any way, (e.g. when implementing a new keyword), the XLF localization files need to be synced with the corresponding resx files. This can be done automatically by running From eb75fcc5a4b451b8250709e282a9be84c9ae92e5 Mon Sep 17 00:00:00 2001 From: Don Syme Date: Mon, 14 Jan 2019 19:48:25 +0000 Subject: [PATCH 147/160] Fix de-duplication of module names (#6086) * possible fix for signature issue * fix de-duplication --- src/fsharp/CompileOps.fs | 51 ++++---- src/fsharp/CompileOps.fsi | 7 +- src/fsharp/TypeChecker.fs | 4 +- src/fsharp/fsc.fs | 10 +- src/fsharp/range.fs | 2 +- src/fsharp/service/IncrementalBuild.fs | 158 +++++++++++++----------- src/fsharp/service/IncrementalBuild.fsi | 5 +- src/fsharp/service/service.fs | 13 +- 8 files changed, 136 insertions(+), 114 deletions(-) diff --git a/src/fsharp/CompileOps.fs b/src/fsharp/CompileOps.fs index 1f98512bee8..6fa771ab959 100644 --- a/src/fsharp/CompileOps.fs +++ b/src/fsharp/CompileOps.fs @@ -3520,34 +3520,37 @@ let PostParseModuleSpecs (defaultNamespace, filename, isLastCompiland, ParsedSig ParsedInput.SigFile(ParsedSigFileInput(filename, qualName, scopedPragmas, hashDirectives, specs)) +type ModuleNamesDict = Map> + /// Checks if a module name is already given and deduplicates the name if needed. -let DeduplicateModuleName (moduleNamesDict:IDictionary>) (paths: Set) path (qualifiedNameOfFile: QualifiedNameOfFile) = - let count = if paths.Contains path then paths.Count else paths.Count + 1 - moduleNamesDict.[qualifiedNameOfFile.Text] <- Set.add path paths - let id = qualifiedNameOfFile.Id - if count = 1 then qualifiedNameOfFile else QualifiedNameOfFile(Ident(id.idText + "___" + count.ToString(), id.idRange)) +let DeduplicateModuleName (moduleNamesDict:ModuleNamesDict) fileName (qualNameOfFile: QualifiedNameOfFile) = + let path = Path.GetDirectoryName fileName + let path = if FileSystem.IsPathRootedShim path then try FileSystem.GetFullPathShim path with _ -> path else path + match moduleNamesDict.TryGetValue qualNameOfFile.Text with + | true, paths -> + if paths.ContainsKey path then + paths.[path], moduleNamesDict + else + let count = paths.Count + 1 + let id = qualNameOfFile.Id + let qualNameOfFileT = if count = 1 then qualNameOfFile else QualifiedNameOfFile(Ident(id.idText + "___" + count.ToString(), id.idRange)) + let moduleNamesDictT = moduleNamesDict.Add(qualNameOfFile.Text, paths.Add(path, qualNameOfFileT)) + qualNameOfFileT, moduleNamesDictT + | _ -> + let moduleNamesDictT = moduleNamesDict.Add(qualNameOfFile.Text, Map.empty.Add(path, qualNameOfFile)) + qualNameOfFile, moduleNamesDictT /// Checks if a ParsedInput is using a module name that was already given and deduplicates the name if needed. -let DeduplicateParsedInputModuleName (moduleNamesDict:IDictionary>) input = +let DeduplicateParsedInputModuleName (moduleNamesDict: ModuleNamesDict) input = match input with - | ParsedInput.ImplFile (ParsedImplFileInput.ParsedImplFileInput(fileName, isScript, qualifiedNameOfFile, scopedPragmas, hashDirectives, modules, (isLastCompiland, isExe))) -> - let path = Path.GetDirectoryName fileName - match moduleNamesDict.TryGetValue qualifiedNameOfFile.Text with - | true, paths -> - let qualifiedNameOfFile = DeduplicateModuleName moduleNamesDict paths path qualifiedNameOfFile - ParsedInput.ImplFile(ParsedImplFileInput.ParsedImplFileInput(fileName, isScript, qualifiedNameOfFile, scopedPragmas, hashDirectives, modules, (isLastCompiland, isExe))) - | _ -> - moduleNamesDict.[qualifiedNameOfFile.Text] <- Set.singleton path - input - | ParsedInput.SigFile (ParsedSigFileInput.ParsedSigFileInput(fileName, qualifiedNameOfFile, scopedPragmas, hashDirectives, modules)) -> - let path = Path.GetDirectoryName fileName - match moduleNamesDict.TryGetValue qualifiedNameOfFile.Text with - | true, paths -> - let qualifiedNameOfFile = DeduplicateModuleName moduleNamesDict paths path qualifiedNameOfFile - ParsedInput.SigFile (ParsedSigFileInput.ParsedSigFileInput(fileName, qualifiedNameOfFile, scopedPragmas, hashDirectives, modules)) - | _ -> - moduleNamesDict.[qualifiedNameOfFile.Text] <- Set.singleton path - input + | ParsedInput.ImplFile (ParsedImplFileInput.ParsedImplFileInput(fileName, isScript, qualNameOfFile, scopedPragmas, hashDirectives, modules, (isLastCompiland, isExe))) -> + let qualNameOfFileT, moduleNamesDictT = DeduplicateModuleName moduleNamesDict fileName qualNameOfFile + let inputT = ParsedInput.ImplFile(ParsedImplFileInput.ParsedImplFileInput(fileName, isScript, qualNameOfFileT, scopedPragmas, hashDirectives, modules, (isLastCompiland, isExe))) + inputT, moduleNamesDictT + | ParsedInput.SigFile (ParsedSigFileInput.ParsedSigFileInput(fileName, qualNameOfFile, scopedPragmas, hashDirectives, modules)) -> + let qualNameOfFileT, moduleNamesDictT = DeduplicateModuleName moduleNamesDict fileName qualNameOfFile + let inputT = ParsedInput.SigFile (ParsedSigFileInput.ParsedSigFileInput(fileName, qualNameOfFileT, scopedPragmas, hashDirectives, modules)) + inputT, moduleNamesDictT let ParseInput (lexer, errorLogger:ErrorLogger, lexbuf:UnicodeLexing.Lexbuf, defaultNamespace, filename, isLastCompiland) = // The assert below is almost ok, but it fires in two cases: diff --git a/src/fsharp/CompileOps.fsi b/src/fsharp/CompileOps.fsi index eb371fa5927..897f772633d 100755 --- a/src/fsharp/CompileOps.fsi +++ b/src/fsharp/CompileOps.fsi @@ -59,12 +59,13 @@ val ComputeQualifiedNameOfFileFromUniquePath: range * string list -> Ast.Qualifi val PrependPathToInput: Ast.Ident list -> Ast.ParsedInput -> Ast.ParsedInput -/// Checks if a module name is already given and deduplicates the name if needed. -val DeduplicateModuleName: IDictionary> -> Set -> string -> Ast.QualifiedNameOfFile -> Ast.QualifiedNameOfFile +/// State used to de-deuplicate module names along a list of file names +type ModuleNamesDict = Map> /// Checks if a ParsedInput is using a module name that was already given and deduplicates the name if needed. -val DeduplicateParsedInputModuleName: IDictionary> -> Ast.ParsedInput -> Ast.ParsedInput +val DeduplicateParsedInputModuleName: ModuleNamesDict -> Ast.ParsedInput -> Ast.ParsedInput * ModuleNamesDict +/// Parse a single input (A signature file or implementation file) val ParseInput: (UnicodeLexing.Lexbuf -> Parser.token) * ErrorLogger * UnicodeLexing.Lexbuf * string option * string * isLastCompiland:(bool * bool) -> Ast.ParsedInput //---------------------------------------------------------------------------- diff --git a/src/fsharp/TypeChecker.fs b/src/fsharp/TypeChecker.fs index c55cd9e63b4..a78405bfb6e 100755 --- a/src/fsharp/TypeChecker.fs +++ b/src/fsharp/TypeChecker.fs @@ -10060,7 +10060,7 @@ and TcMethodApplication | CallerLineNumber, _ when typeEquiv cenv.g currCalledArgTy cenv.g.int_ty -> emptyPreBinder, Expr.Const(Const.Int32(mMethExpr.StartLine), mMethExpr, currCalledArgTy) | CallerFilePath, _ when typeEquiv cenv.g currCalledArgTy cenv.g.string_ty -> - emptyPreBinder, Expr.Const(Const.String(System.IO.Path.GetFullPath(mMethExpr.FileName)), mMethExpr, currCalledArgTy) + emptyPreBinder, Expr.Const(Const.String(FileSystem.GetFullPathShim(mMethExpr.FileName)), mMethExpr, currCalledArgTy) | CallerMemberName, Some(callerName) when (typeEquiv cenv.g currCalledArgTy cenv.g.string_ty) -> emptyPreBinder, Expr.Const(Const.String(callerName), mMethExpr, currCalledArgTy) | _ -> @@ -10099,7 +10099,7 @@ and TcMethodApplication let lineExpr = Expr.Const(Const.Int32(mMethExpr.StartLine), mMethExpr, calledNonOptTy) emptyPreBinder, mkUnionCaseExpr(mkSomeCase cenv.g, [calledNonOptTy], [lineExpr], mMethExpr) | CallerFilePath, _ when typeEquiv cenv.g calledNonOptTy cenv.g.string_ty -> - let filePathExpr = Expr.Const(Const.String(System.IO.Path.GetFullPath(mMethExpr.FileName)), mMethExpr, calledNonOptTy) + let filePathExpr = Expr.Const(Const.String(FileSystem.GetFullPathShim(mMethExpr.FileName)), mMethExpr, calledNonOptTy) emptyPreBinder, mkUnionCaseExpr(mkSomeCase cenv.g, [calledNonOptTy], [filePathExpr], mMethExpr) | CallerMemberName, Some(callerName) when typeEquiv cenv.g calledNonOptTy cenv.g.string_ty -> let memberNameExpr = Expr.Const(Const.String(callerName), mMethExpr, calledNonOptTy) diff --git a/src/fsharp/fsc.fs b/src/fsharp/fsc.fs index b19c3b280ab..f3117e16e86 100644 --- a/src/fsharp/fsc.fs +++ b/src/fsharp/fsc.fs @@ -1773,11 +1773,9 @@ let main0(ctok, argv, legacyReferenceResolver, bannerAlreadyPrinted, reduceMemor errorRecoveryNoRange e exiter.Exit 1 - let inputs = - // Deduplicate module names - let moduleNamesDict = ConcurrentDictionary>() - inputs - |> List.map (fun (input,x) -> DeduplicateParsedInputModuleName moduleNamesDict input,x) + let inputs, _ = + (Map.empty, inputs) + ||> List.mapFold (fun state (input,x) -> let inputT, stateT = DeduplicateParsedInputModuleName state input in (inputT,x), stateT) if tcConfig.parseOnly then exiter.Exit 0 if not tcConfig.continueAfterParseFailure then @@ -2036,7 +2034,7 @@ let main4 dynamicAssemblyCreator (Args (ctok, tcConfig, tcImports: TcImports, t DoesNotRequireCompilerThreadTokenAndCouldPossiblyBeMadeConcurrent ctok - let pdbfile = pdbfile |> Option.map (tcConfig.MakePathAbsolute >> Path.GetFullPath) + let pdbfile = pdbfile |> Option.map (tcConfig.MakePathAbsolute >> FileSystem.GetFullPathShim) let normalizeAssemblyRefs (aref:ILAssemblyRef) = match tcImports.TryFindDllInfo (ctok, Range.rangeStartup, aref.Name, lookupOnly=false) with diff --git a/src/fsharp/range.fs b/src/fsharp/range.fs index 7f31e032a9f..b68de583d97 100755 --- a/src/fsharp/range.fs +++ b/src/fsharp/range.fs @@ -197,7 +197,7 @@ type range(code1:int64, code2: int64) = let mkRange f b e = // remove relative parts from full path - let normalizedFilePath = if Path.IsPathRooted f then try Path.GetFullPath f with _ -> f else f + let normalizedFilePath = if FileSystem.IsPathRootedShim f then try FileSystem.GetFullPathShim f with _ -> f else f range (fileIndexOfFile normalizedFilePath, b, e) let mkFileIndexRange fi b e = range (fi, b, e) diff --git a/src/fsharp/service/IncrementalBuild.fs b/src/fsharp/service/IncrementalBuild.fs index 37c4b16bf21..f5d0141b32e 100755 --- a/src/fsharp/service/IncrementalBuild.fs +++ b/src/fsharp/service/IncrementalBuild.fs @@ -55,15 +55,16 @@ module internal IncrementalBuild = /// Get the Id for the given ScalarBuildRule. member x.Id = match x with - | ScalarInput(id, _) ->id - | ScalarDemultiplex(id, _, _, _) ->id - | ScalarMap(id, _, _, _) ->id + | ScalarInput(id, _) -> id + | ScalarDemultiplex(id, _, _, _) -> id + | ScalarMap(id, _, _, _) -> id + /// Get the Name for the givenScalarExpr. member x.Name = match x with - | ScalarInput(_, n) ->n - | ScalarDemultiplex(_, n, _, _) ->n - | ScalarMap(_, n, _, _) ->n + | ScalarInput(_, n) -> n + | ScalarDemultiplex(_, n, _, _) -> n + | ScalarMap(_, n, _, _) -> n /// A build rule with a vector of outputs and VectorBuildRule = @@ -1034,6 +1035,7 @@ type TypeCheckAccumulator = /// Accumulated 'open' declarations, last file first tcOpenDeclarationsRev: OpenDeclaration[] list + topAttribs:TopAttribs option /// Result of checking most recent file, if any @@ -1043,6 +1045,9 @@ type TypeCheckAccumulator = tcDependencyFiles: string list + /// Disambiguation table for module names + tcModuleNamesDict: ModuleNamesDict + /// Accumulated errors, last file first tcErrorsRev:(PhasedDiagnostic * FSharpErrorSeverity)[] list } @@ -1125,10 +1130,17 @@ type PartialCheckResults = /// Kept in a stack so that each incremental update shares storage with previous files TcOpenDeclarationsRev: OpenDeclaration[] list + /// Disambiguation table for module names + ModuleNamesDict: ModuleNamesDict + TcDependencyFiles: string list + TopAttribs: TopAttribs option + TimeStamp: DateTime + LatestImplementationFile: TypedImplFile option + LastestCcuSigForFile: ModuleOrNamespaceType option } member x.TcErrors = Array.concat (List.rev x.TcErrorsRev) @@ -1146,6 +1158,7 @@ type PartialCheckResults = TcOpenDeclarationsRev = tcAcc.tcOpenDeclarationsRev TcDependencyFiles = tcAcc.tcDependencyFiles TopAttribs = tcAcc.topAttribs + ModuleNamesDict = tcAcc.tcModuleNamesDict TimeStamp = timestamp LatestImplementationFile = tcAcc.latestImplFile LastestCcuSigForFile = tcAcc.latestCcuSigForFile } @@ -1175,7 +1188,9 @@ type RawFSharpAssemblyDataBackedByLanguageService (tcConfig, tcGlobals, tcState: yield (ccuName, (fun () -> r.GetBytes())) ] let autoOpenAttrs = topAttrs.assemblyAttrs |> List.choose (List.singleton >> TryFindFSharpStringAttribute tcGlobals tcGlobals.attrib_AutoOpenAttribute) + let ivtAttrs = topAttrs.assemblyAttrs |> List.choose (List.singleton >> TryFindFSharpStringAttribute tcGlobals tcGlobals.attrib_InternalsVisibleToAttribute) + interface IRawFSharpAssemblyData with member __.GetAutoOpenAttributes(_ilg) = autoOpenAttrs member __.GetInternalsVisibleToAttributes(_ilg) = ivtAttrs @@ -1246,6 +1261,7 @@ type IncrementalBuilder(tcGlobals, frameworkTcImports, nonFrameworkAssemblyInput let assertNotDisposed() = if disposed then System.Diagnostics.Debug.Assert(false, "IncrementalBuild object has already been disposed!") + let mutable referenceCount = 0 //---------------------------------------------------- @@ -1258,14 +1274,9 @@ type IncrementalBuilder(tcGlobals, frameworkTcImports, nonFrameworkAssemblyInput assertNotDisposed() cache.GetFileTimeStamp filename - // Deduplicate module names - let moduleNamesDict = ConcurrentDictionary>() - /// This is a build task function that gets placed into the build rules as the computation for a VectorMap /// - /// Parse the given files and return the given inputs. This function is expected to be - /// able to be called with a subset of sourceFiles and return the corresponding subset of - /// parsed inputs. + /// Parse the given file and return the given input. let ParseTask ctok (sourceRange:range, filename:string, isLastCompiland) = assertNotDisposed() DoesNotRequireCompilerThreadTokenAndCouldPossiblyBeMadeConcurrent ctok @@ -1278,9 +1289,8 @@ type IncrementalBuilder(tcGlobals, frameworkTcImports, nonFrameworkAssemblyInput IncrementalBuilderEventTesting.MRU.Add(IncrementalBuilderEventTesting.IBEParsed filename) let input = ParseOneInputFile(tcConfig, lexResourceManager, [], filename , isLastCompiland, errorLogger, (*retryLocked*)true) fileParsed.Trigger (filename) - let result = Option.map (DeduplicateParsedInputModuleName moduleNamesDict) input - result, sourceRange, filename, errorLogger.GetErrors () + input, sourceRange, filename, errorLogger.GetErrors () with exn -> let msg = sprintf "unexpected failure in IncrementalFSharpBuild.Parse\nerror = %s" (exn.ToString()) System.Diagnostics.Debug.Assert(false, msg) @@ -1357,7 +1367,8 @@ type IncrementalBuilder(tcGlobals, frameworkTcImports, nonFrameworkAssemblyInput latestImplFile=None latestCcuSigForFile=None tcDependencyFiles=basicDependencies - tcErrorsRev = [ initialErrors ] } + tcErrorsRev = [ initialErrors ] + tcModuleNamesDict = Map.empty } return tcAcc } /// This is a build task function that gets placed into the build rules as the computation for a Vector.ScanLeft @@ -1378,6 +1389,8 @@ type IncrementalBuilder(tcGlobals, frameworkTcImports, nonFrameworkAssemblyInput let sink = TcResultsSinkImpl(tcAcc.tcGlobals) let hadParseErrors = not (Array.isEmpty parseErrors) + let input, moduleNamesDict = DeduplicateParsedInputModuleName tcAcc.tcModuleNamesDict input + let! (tcEnvAtEndOfFile, topAttribs, implFile, ccuSigForFile), tcState = TypeCheckOneInputEventually ((fun () -> hadParseErrors || errorLogger.ErrorCount > 0), @@ -1406,6 +1419,7 @@ type IncrementalBuilder(tcGlobals, frameworkTcImports, nonFrameworkAssemblyInput tcSymbolUsesRev=tcSymbolUses :: tcAcc.tcSymbolUsesRev tcOpenDeclarationsRev = sink.GetOpenDeclarations() :: tcAcc.tcOpenDeclarationsRev tcErrorsRev = newErrors :: tcAcc.tcErrorsRev + tcModuleNamesDict = moduleNamesDict tcDependencyFiles = filename :: tcAcc.tcDependencyFiles } } @@ -1448,55 +1462,55 @@ type IncrementalBuilder(tcGlobals, frameworkTcImports, nonFrameworkAssemblyInput TypeCheckMultipleInputsFinish (results, finalAcc.tcState) let ilAssemRef, tcAssemblyDataOpt, tcAssemblyExprOpt = - try - // TypeCheckClosedInputSetFinish fills in tcState.Ccu but in incremental scenarios we don't want this, - // so we make this temporary here - let oldContents = tcState.Ccu.Deref.Contents - try - let tcState, tcAssemblyExpr = TypeCheckClosedInputSetFinish (mimpls, tcState) - - // Compute the identity of the generated assembly based on attributes, options etc. - // Some of this is duplicated from fsc.fs - let ilAssemRef = - let publicKey = - try - let signingInfo = Driver.ValidateKeySigningAttributes (tcConfig, tcGlobals, topAttrs) - match Driver.GetStrongNameSigner signingInfo with - | None -> None - | Some s -> Some (PublicKey.KeyAsToken(s.PublicKey)) - with e -> - errorRecoveryNoRange e - None - let locale = TryFindFSharpStringAttribute tcGlobals (tcGlobals.FindSysAttrib "System.Reflection.AssemblyCultureAttribute") topAttrs.assemblyAttrs - let assemVerFromAttrib = - TryFindFSharpStringAttribute tcGlobals (tcGlobals.FindSysAttrib "System.Reflection.AssemblyVersionAttribute") topAttrs.assemblyAttrs - |> Option.bind (fun v -> try Some (parseILVersion v) with _ -> None) - let ver = - match assemVerFromAttrib with - | None -> tcConfig.version.GetVersionInfo(tcConfig.implicitIncludeDir) - | Some v -> v - ILAssemblyRef.Create(assemblyName, None, publicKey, false, Some ver, locale) - - let tcAssemblyDataOpt = + try + // TypeCheckClosedInputSetFinish fills in tcState.Ccu but in incremental scenarios we don't want this, + // so we make this temporary here + let oldContents = tcState.Ccu.Deref.Contents try - // Assemblies containing type provider components can not successfully be used via cross-assembly references. - // We return 'None' for the assembly portion of the cross-assembly reference - let hasTypeProviderAssemblyAttrib = - topAttrs.assemblyAttrs |> List.exists (fun (Attrib(tcref, _, _, _, _, _, _)) -> tcref.CompiledRepresentationForNamedType.BasicQualifiedName = typeof.FullName) - if tcState.CreatesGeneratedProvidedTypes || hasTypeProviderAssemblyAttrib then - None - else - Some (RawFSharpAssemblyDataBackedByLanguageService (tcConfig, tcGlobals, tcState, outfile, topAttrs, assemblyName, ilAssemRef) :> IRawFSharpAssemblyData) - - with e -> - errorRecoveryNoRange e - None - ilAssemRef, tcAssemblyDataOpt, Some tcAssemblyExpr - finally - tcState.Ccu.Deref.Contents <- oldContents - with e -> - errorRecoveryNoRange e - mkSimpleAssemblyRef assemblyName, None, None + let tcState, tcAssemblyExpr = TypeCheckClosedInputSetFinish (mimpls, tcState) + + // Compute the identity of the generated assembly based on attributes, options etc. + // Some of this is duplicated from fsc.fs + let ilAssemRef = + let publicKey = + try + let signingInfo = Driver.ValidateKeySigningAttributes (tcConfig, tcGlobals, topAttrs) + match Driver.GetStrongNameSigner signingInfo with + | None -> None + | Some s -> Some (PublicKey.KeyAsToken(s.PublicKey)) + with e -> + errorRecoveryNoRange e + None + let locale = TryFindFSharpStringAttribute tcGlobals (tcGlobals.FindSysAttrib "System.Reflection.AssemblyCultureAttribute") topAttrs.assemblyAttrs + let assemVerFromAttrib = + TryFindFSharpStringAttribute tcGlobals (tcGlobals.FindSysAttrib "System.Reflection.AssemblyVersionAttribute") topAttrs.assemblyAttrs + |> Option.bind (fun v -> try Some (parseILVersion v) with _ -> None) + let ver = + match assemVerFromAttrib with + | None -> tcConfig.version.GetVersionInfo(tcConfig.implicitIncludeDir) + | Some v -> v + ILAssemblyRef.Create(assemblyName, None, publicKey, false, Some ver, locale) + + let tcAssemblyDataOpt = + try + // Assemblies containing type provider components can not successfully be used via cross-assembly references. + // We return 'None' for the assembly portion of the cross-assembly reference + let hasTypeProviderAssemblyAttrib = + topAttrs.assemblyAttrs |> List.exists (fun (Attrib(tcref, _, _, _, _, _, _)) -> tcref.CompiledRepresentationForNamedType.BasicQualifiedName = typeof.FullName) + if tcState.CreatesGeneratedProvidedTypes || hasTypeProviderAssemblyAttrib then + None + else + Some (RawFSharpAssemblyDataBackedByLanguageService (tcConfig, tcGlobals, tcState, outfile, topAttrs, assemblyName, ilAssemRef) :> IRawFSharpAssemblyData) + + with e -> + errorRecoveryNoRange e + None + ilAssemRef, tcAssemblyDataOpt, Some tcAssemblyExpr + finally + tcState.Ccu.Deref.Contents <- oldContents + with e -> + errorRecoveryNoRange e + mkSimpleAssemblyRef assemblyName, None, None let finalAccWithErrors = { finalAcc with @@ -1561,9 +1575,9 @@ type IncrementalBuilder(tcGlobals, frameworkTcImports, nonFrameworkAssemblyInput member this.IncrementUsageCount() = assertNotDisposed() System.Threading.Interlocked.Increment(&referenceCount) |> ignore - { new System.IDisposable with member x.Dispose() = this.DecrementUsageCount() } + { new System.IDisposable with member __.Dispose() = this.DecrementUsageCount() } - member this.DecrementUsageCount() = + member __.DecrementUsageCount() = assertNotDisposed() let currentValue = System.Threading.Interlocked.Decrement(&referenceCount) if currentValue = 0 then @@ -1573,11 +1587,17 @@ type IncrementalBuilder(tcGlobals, frameworkTcImports, nonFrameworkAssemblyInput member __.IsAlive = referenceCount > 0 member __.TcConfig = tcConfig + member __.FileParsed = fileParsed.Publish + member __.BeforeFileChecked = beforeFileChecked.Publish + member __.FileChecked = fileChecked.Publish + member __.ProjectChecked = projectChecked.Publish + member __.ImportedCcusInvalidated = importsInvalidated.Publish + member __.AllDependenciesDeprecated = allDependencies #if !NO_EXTENSIONTYPING @@ -1622,7 +1642,7 @@ type IncrementalBuilder(tcGlobals, frameworkTcImports, nonFrameworkAssemblyInput | (*first file*) 0 -> IncrementalBuild.IsReady cache (Target(initialTcAccNode, None)) partialBuild | _ -> IncrementalBuild.IsReady cache (Target(tcStatesNode, Some (slotOfFile-1))) partialBuild - member builder.GetCheckResultsBeforeSlotInProject (ctok: CompilationThreadToken, slotOfFile) = + member __.GetCheckResultsBeforeSlotInProject (ctok: CompilationThreadToken, slotOfFile) = cancellable { let cache = TimeStampCache(defaultTimeStamp) let! result = @@ -1652,9 +1672,6 @@ type IncrementalBuilder(tcGlobals, frameworkTcImports, nonFrameworkAssemblyInput member builder.GetCheckResultsAfterLastFileInProject (ctok: CompilationThreadToken) = builder.GetCheckResultsBeforeSlotInProject(ctok, builder.GetSlotsCount()) - member builder.DeduplicateParsedInputModuleNameInProject (input) = - DeduplicateParsedInputModuleName moduleNamesDict input - member __.GetCheckResultsAndImplementationsForProject(ctok: CompilationThreadToken) = cancellable { let cache = TimeStampCache(defaultTimeStamp) @@ -1861,10 +1878,11 @@ type IncrementalBuilder(tcGlobals, frameworkTcImports, nonFrameworkAssemblyInput return builderOpt, diagnostics } + static member KeepBuilderAlive (builderOpt: IncrementalBuilder option) = match builderOpt with | Some builder -> builder.IncrementUsageCount() | None -> { new System.IDisposable with member __.Dispose() = () } - member builder.IsBeingKeptAliveApartFromCacheEntry = (referenceCount >= 2) + member __.IsBeingKeptAliveApartFromCacheEntry = (referenceCount >= 2) diff --git a/src/fsharp/service/IncrementalBuild.fsi b/src/fsharp/service/IncrementalBuild.fsi index b6b64a7ffd0..29c7a03a454 100755 --- a/src/fsharp/service/IncrementalBuild.fsi +++ b/src/fsharp/service/IncrementalBuild.fsi @@ -55,6 +55,9 @@ type internal PartialCheckResults = /// Represents open declarations TcOpenDeclarationsRev: OpenDeclaration[] list + /// Disambiguation table for module names + ModuleNamesDict: ModuleNamesDict + TcDependencyFiles: string list /// Represents the collected attributes to apply to the module of assuembly generates @@ -151,8 +154,6 @@ type internal IncrementalBuilder = // TODO: make this an Eventually (which can be scheduled) or an Async (which can be cancelled) member GetCheckResultsAndImplementationsForProject : CompilationThreadToken -> Cancellable - member DeduplicateParsedInputModuleNameInProject: Ast.ParsedInput -> Ast.ParsedInput - /// Get the logical time stamp that is associated with the output of the project if it were gully built immediately member GetLogicalTimeStampForProject: TimeStampCache * CompilationThreadToken -> DateTime diff --git a/src/fsharp/service/service.fs b/src/fsharp/service/service.fs index d8eb7442b4a..f4694cdfaf5 100644 --- a/src/fsharp/service/service.fs +++ b/src/fsharp/service/service.fs @@ -1624,6 +1624,7 @@ module internal Parser = tcGlobals: TcGlobals, tcImports: TcImports, tcState: TcState, + moduleNamesDict: ModuleNamesDict, loadClosure: LoadClosure option, // These are the errors and warnings seen by the background compiler for the entire antecedent backgroundDiagnostics: (PhasedDiagnostic * FSharpErrorSeverity)[], @@ -1727,6 +1728,9 @@ module internal Parser = async { try let checkForErrors() = (parseResults.ParseHadErrors || errHandler.ErrorCount > 0) + + let parsedMainInput, _moduleNamesDict = DeduplicateParsedInputModuleName moduleNamesDict parsedMainInput + // Typecheck is potentially a long running operation. We chop it up here with an Eventually continuation and, at each slice, give a chance // for the client to claim the result as obsolete and have the typecheck abort. @@ -2605,7 +2609,7 @@ type BackgroundCompiler(legacyReferenceResolver, projectCacheSize, keepAssemblyC let loadClosure = scriptClosureCacheLock.AcquireLock (fun ltok -> scriptClosureCache.TryGet (ltok, options)) let! tcErrors, tcFileResult = Parser.CheckOneFile(parseResults, source, fileName, options.ProjectFileName, tcPrior.TcConfig, tcPrior.TcGlobals, tcPrior.TcImports, - tcPrior.TcState, loadClosure, tcPrior.TcErrors, reactorOps, (fun () -> builder.IsAlive), textSnapshotInfo, userOpName) + tcPrior.TcState, tcPrior.ModuleNamesDict, loadClosure, tcPrior.TcErrors, reactorOps, (fun () -> builder.IsAlive), textSnapshotInfo, userOpName) let parsingOptions = FSharpParsingOptions.FromTcConfig(tcPrior.TcConfig, Array.ofList builder.SourceFiles, options.UseScriptResolutionRules) let checkAnswer = MakeCheckFileAnswer(fileName, tcFileResult, options, builder, Array.ofList tcPrior.TcDependencyFiles, creationErrors, parseResults.Errors, tcErrors) bc.RecordTypeCheckFileInProjectResults(fileName, options, parsingOptions, parseResults, fileVersion, tcPrior.TimeStamp, Some checkAnswer, source) @@ -2686,9 +2690,7 @@ type BackgroundCompiler(legacyReferenceResolver, projectCacheSize, keepAssemblyC | _ -> Trace.TraceInformation("FCS: {0}.{1} ({2})", userOpName, "CheckFileInProject.CacheMiss", filename) let! tcPrior = execWithReactorAsync <| fun ctok -> builder.GetCheckResultsBeforeFileInProject (ctok, filename) - let parseTreeOpt = parseResults.ParseTree |> Option.map builder.DeduplicateParsedInputModuleNameInProject - let parseResultsAterDeDuplication = FSharpParseFileResults(parseResults.Errors, parseTreeOpt, parseResults.ParseHadErrors, parseResults.DependencyFiles) - let! checkAnswer = bc.CheckOneFileImpl(parseResultsAterDeDuplication, source, filename, options, textSnapshotInfo, fileVersion, builder, tcPrior, creationErrors, userOpName) + let! checkAnswer = bc.CheckOneFileImpl(parseResults, source, filename, options, textSnapshotInfo, fileVersion, builder, tcPrior, creationErrors, userOpName) return checkAnswer finally bc.ImplicitlyStartCheckProjectInBackground(options, userOpName) @@ -2731,7 +2733,6 @@ type BackgroundCompiler(legacyReferenceResolver, projectCacheSize, keepAssemblyC // Do the parsing. let parsingOptions = FSharpParsingOptions.FromTcConfig(builder.TcConfig, Array.ofList (builder.SourceFiles), options.UseScriptResolutionRules) let parseErrors, parseTreeOpt, anyErrors = Parser.parseFile (source, filename, parsingOptions, userOpName) - let parseTreeOpt = parseTreeOpt |> Option.map builder.DeduplicateParsedInputModuleNameInProject let parseResults = FSharpParseFileResults(parseErrors, parseTreeOpt, anyErrors, builder.AllDependenciesDeprecated) let! checkResults = bc.CheckOneFileImpl(parseResults, source, filename, options, textSnapshotInfo, fileVersion, builder, tcPrior, creationErrors, userOpName) @@ -3331,7 +3332,7 @@ type FsiInteractiveChecker(legacyReferenceResolver, reactorOps: IReactorOperatio CompileOptions.ParseCompilerOptions (ignore, fsiCompilerOptions, [ ]) let loadClosure = LoadClosure.ComputeClosureOfScriptText(ctok, legacyReferenceResolver, defaultFSharpBinariesDir, filename, source, CodeContext.Editing, tcConfig.useSimpleResolution, tcConfig.useFsiAuxLib, new Lexhelp.LexResourceManager(), applyCompilerOptions, assumeDotNetFramework, tryGetMetadataSnapshot=(fun _ -> None), reduceMemoryUsage=reduceMemoryUsage) - let! tcErrors, tcFileResult = Parser.CheckOneFile(parseResults, source, filename, "project", tcConfig, tcGlobals, tcImports, tcState, Some loadClosure, backgroundDiagnostics, reactorOps, (fun () -> true), None, userOpName) + let! tcErrors, tcFileResult = Parser.CheckOneFile(parseResults, source, filename, "project", tcConfig, tcGlobals, tcImports, tcState, Map.empty, Some loadClosure, backgroundDiagnostics, reactorOps, (fun () -> true), None, userOpName) return match tcFileResult with From 4753edd9e8f1653b91567efa3d883bf8e9da876d Mon Sep 17 00:00:00 2001 From: Don Syme Date: Mon, 14 Jan 2019 21:04:53 +0000 Subject: [PATCH 148/160] potential fix for 5932 (#6070) * poss fix * poss fix * Update range.fs * Update range.fs * fix build * docs and limit fix * Update src/fsharp/range.fs Co-Authored-By: dsyme * Update range.fs --- src/fsharp/range.fs | 150 +++++++++++++++++++++++++++-------- src/fsharp/range.fsi | 87 ++++++++++++++++++-- tests/service/EditorTests.fs | 6 ++ 3 files changed, 204 insertions(+), 39 deletions(-) diff --git a/src/fsharp/range.fs b/src/fsharp/range.fs index b68de583d97..4e97edc2b37 100755 --- a/src/fsharp/range.fs +++ b/src/fsharp/range.fs @@ -5,7 +5,6 @@ module Microsoft.FSharp.Compiler.Range open System open System.IO -open System.Collections.Generic open System.Collections.Concurrent open Microsoft.FSharp.Core.Printf open Microsoft.FSharp.Compiler.AbstractIL.Internal.Library @@ -16,17 +15,20 @@ type FileIndex = int32 [] let columnBitCount = 20 + [] let lineBitCount = 31 let posBitCount = lineBitCount + columnBitCount -let _ = assert (posBitCount <= 64) + let posColumnMask = mask64 0 columnBitCount + let lineColumnMask = mask64 columnBitCount lineBitCount [] [] type pos(code:int64) = + new (l, c) = let l = max 0 l let c = max 0 c @@ -35,63 +37,80 @@ type pos(code:int64) = pos p member p.Line = int32 (uint64 code >>> columnBitCount) + member p.Column = int32 (code &&& posColumnMask) member r.Encoding = code + static member EncodingSize = posBitCount + static member Decode (code:int64) : pos = pos code + override p.Equals(obj) = match obj with :? pos as p2 -> code = p2.Encoding | _ -> false + override p.GetHashCode() = hash code + override p.ToString() = sprintf "(%d,%d)" p.Line p.Column [] let fileIndexBitCount = 24 + [] let startColumnBitCount = columnBitCount // 20 + [] let endColumnBitCount = columnBitCount // 20 [] let startLineBitCount = lineBitCount // 31 + [] let heightBitCount = 27 + [] let isSyntheticBitCount = 1 -#if DEBUG -let _ = assert (fileIndexBitCount + startColumnBitCount + endColumnBitCount <= 64) -let _ = assert (startLineBitCount + heightBitCount + isSyntheticBitCount <= 64) -#endif - + [] let fileIndexShift = 0 + [] let startColumnShift = 24 + [] let endColumnShift = 44 [] let startLineShift = 0 + [] let heightShift = 31 + [] let isSyntheticShift = 58 - [] let fileIndexMask = 0b0000000000000000000000000000000000000000111111111111111111111111L + [] let startColumnMask = 0b0000000000000000000011111111111111111111000000000000000000000000L + [] let endColumnMask = 0b1111111111111111111100000000000000000000000000000000000000000000L [] let startLineMask = 0b0000000000000000000000000000000001111111111111111111111111111111L + [] let heightMask = 0b0000001111111111111111111111111110000000000000000000000000000000L + [] let isSyntheticMask = 0b0000010000000000000000000000000000000000000000000000000000000000L #if DEBUG +let _ = assert (posBitCount <= 64) +let _ = assert (fileIndexBitCount + startColumnBitCount + endColumnBitCount <= 64) +let _ = assert (startLineBitCount + heightBitCount + isSyntheticBitCount <= 64) + let _ = assert (startColumnShift = fileIndexShift + fileIndexBitCount) let _ = assert (endColumnShift = startColumnShift + startColumnBitCount) @@ -106,24 +125,64 @@ let _ = assert (endColumnMask = mask64 endColumnShift endColumnBitCount) let _ = assert (isSyntheticMask = mask64 isSyntheticShift isSyntheticBitCount) #endif -// This is just a standard unique-index table +/// Removes relative parts from any full paths +let normalizeFilePath (filePath: string) = + try + if FileSystem.IsPathRootedShim filePath then + FileSystem.GetFullPathShim filePath + else + filePath + with _ -> filePath + +/// A unique-index table for file names. type FileIndexTable() = let indexToFileTable = new ResizeArray<_>(11) let fileToIndexTable = new ConcurrentDictionary() - member t.FileToIndex f = - let mutable res = 0 - let ok = fileToIndexTable.TryGetValue(f, &res) - if ok then res - else + + // Note: we should likely adjust this code to always normalize. However some testing (and possibly some + // product behaviour) appears to be sensitive to error messages reporting un-normalized file names. + // Currently all names going through 'mkRange' get normalized, while this going through just 'fileIndexOfFile' + // do not. Also any file names which are not put into ranges at all are non-normalized. + // + // TO move forward we should eventually introduce a new type NormalizedFileName that tracks this invariant. + member t.FileToIndex normalize filePath = + match fileToIndexTable.TryGetValue(filePath) with + | true, idx -> idx + | _ -> + + // Try again looking for a normalized entry. + let normalizedFilePath = if normalize then normalizeFilePath filePath else filePath + match fileToIndexTable.TryGetValue(normalizedFilePath) with + | true, idx -> + // Record the non-normalized entry if necessary + if filePath <> normalizedFilePath then + lock fileToIndexTable (fun () -> + fileToIndexTable.[filePath] <- idx) + + // Return the index + idx + + | _ -> lock fileToIndexTable (fun () -> - let n = indexToFileTable.Count in - indexToFileTable.Add(f) - fileToIndexTable.[f] <- n - n) + // Get the new index + let idx = indexToFileTable.Count + + // Record the normalized entry + indexToFileTable.Add normalizedFilePath + fileToIndexTable.[normalizedFilePath] <- idx + + // Record the non-normalized entry if necessary + if filePath <> normalizedFilePath then + fileToIndexTable.[filePath] <- idx + + // Return the index + idx) member t.IndexToFile n = - (if n < 0 then failwithf "fileOfFileIndex: negative argument: n = %d\n" n) - (if n >= indexToFileTable.Count then failwithf "fileOfFileIndex: invalid argument: n = %d\n" n) + if n < 0 then + failwithf "fileOfFileIndex: negative argument: n = %d\n" n + if n >= indexToFileTable.Count then + failwithf "fileOfFileIndex: invalid argument: n = %d\n" n indexToFileTable.[n] let maxFileIndex = pown32 fileIndexBitCount @@ -133,8 +192,11 @@ let maxFileIndex = pown32 fileIndexBitCount let fileIndexTable = new FileIndexTable() // If we exceed the maximum number of files we'll start to report incorrect file names -let fileIndexOfFile f = fileIndexTable.FileToIndex(f) % maxFileIndex -let fileOfFileIndex n = fileIndexTable.IndexToFile(n) +let fileIndexOfFileAux normalize f = fileIndexTable.FileToIndex normalize f % maxFileIndex + +let fileIndexOfFile filePath = fileIndexOfFileAux false filePath + +let fileOfFileIndex idx = fileIndexTable.IndexToFile idx let mkPos l c = pos (l, c) @@ -158,19 +220,31 @@ type range(code1:int64, code2: int64) = new (fidx, b:pos, e:pos) = range(fidx, b.Line, b.Column, e.Line, e.Column) member r.StartLine = int32((code2 &&& startLineMask) >>> startLineShift) + member r.StartColumn = int32((code1 &&& startColumnMask) >>> startColumnShift) + member r.EndLine = int32((code2 &&& heightMask) >>> heightShift) + r.StartLine + member r.EndColumn = int32((code1 &&& endColumnMask) >>> endColumnShift) + member r.IsSynthetic = int32((code2 &&& isSyntheticMask) >>> isSyntheticShift) <> 0 + member r.Start = pos (r.StartLine, r.StartColumn) + member r.End = pos (r.EndLine, r.EndColumn) + member r.FileIndex = int32(code1 &&& fileIndexMask) + member m.StartRange = range (m.FileIndex, m.Start, m.Start) + member m.EndRange = range (m.FileIndex, m.End, m.End) + member r.FileName = fileOfFileIndex r.FileIndex + member r.MakeSynthetic() = range(code1, code2 ||| isSyntheticMask) member r.Code1 = code1 + member r.Code2 = code2 #if DEBUG @@ -195,30 +269,28 @@ type range(code1:int64, code2: int64) = override r.ToString() = sprintf "%s (%d,%d--%d,%d) IsSynthetic=%b" r.FileName r.StartLine r.StartColumn r.EndLine r.EndColumn r.IsSynthetic -let mkRange f b e = - // remove relative parts from full path - let normalizedFilePath = if FileSystem.IsPathRootedShim f then try FileSystem.GetFullPathShim f with _ -> f else f - range (fileIndexOfFile normalizedFilePath, b, e) +let mkRange filePath startPos endPos = range (fileIndexOfFileAux true filePath, startPos, endPos) -let mkFileIndexRange fi b e = range (fi, b, e) +let mkFileIndexRange fileIndex startPos endPos = range (fileIndex, startPos, endPos) -(* end representation, start derived ops *) - let posOrder = Order.orderOn (fun (p:pos) -> p.Line, p.Column) (Pair.order (Int32.order, Int32.order)) -(* rangeOrder: not a total order, but enough to sort on ranges *) + +/// rangeOrder: not a total order, but enough to sort on ranges let rangeOrder = Order.orderOn (fun (r:range) -> r.FileName, r.Start) (Pair.order (String.order, posOrder)) let outputPos (os:TextWriter) (m:pos) = fprintf os "(%d,%d)" m.Line m.Column + let outputRange (os:TextWriter) (m:range) = fprintf os "%s%a-%a" m.FileName outputPos m.Start outputPos m.End -let boutputPos os (m:pos) = bprintf os "(%d,%d)" m.Line m.Column -let boutputRange os (m:range) = bprintf os "%s%a-%a" m.FileName boutputPos m.Start boutputPos m.End let posGt (p1:pos) (p2:pos) = (p1.Line > p2.Line || (p1.Line = p2.Line && p1.Column > p2.Column)) + let posEq (p1:pos) (p2:pos) = (p1.Line = p2.Line && p1.Column = p2.Column) + let posGeq p1 p2 = posEq p1 p2 || posGt p1 p2 + let posLt p1 p2 = posGt p2 p1 -// This is deliberately written in an allocation-free way, i.e. m1.Start, m1.End etc. are not called +/// This is deliberately written in an allocation-free way, i.e. m1.Start, m1.End etc. are not called let unionRanges (m1:range) (m2:range) = if m1.FileIndex <> m2.FileIndex then m2 else let b = @@ -242,9 +314,13 @@ let rangeBeforePos (m1:range) p = posGeq p m1.End let rangeN filename line = mkRange filename (mkPos line 0) (mkPos line 0) + let pos0 = mkPos 1 0 + let range0 = rangeN "unknown" 1 + let rangeStartup = rangeN "startup" 1 + let rangeCmdArgs = rangeN "commandLineArgs" 0 let trimRangeToLine (r:range) = @@ -258,6 +334,7 @@ let trimRangeToLine (r:range) = (* For Diagnostics *) let stringOfPos (pos:pos) = sprintf "(%d,%d)" pos.Line pos.Column + let stringOfRange (r:range) = sprintf "%s%s-%s" r.FileName (stringOfPos r.Start) (stringOfPos r.End) #if CHECK_LINE0_TYPES // turn on to check that we correctly transform zero-based line counts to one-based line counts @@ -272,17 +349,22 @@ type Pos01 = Line0 * int type Range01 = Pos01 * Pos01 module Line = + // Visual Studio uses line counts starting at 0, F# uses them starting at 1 let fromZ (line:Line0) = int line+1 + let toZ (line:int) : Line0 = LanguagePrimitives.Int32WithMeasure(line - 1) module Pos = + let fromZ (line:Line0) idx = mkPos (Line.fromZ line) idx - let toZ (p:pos) = (Line.toZ p.Line, p.Column) + let toZ (p:pos) = (Line.toZ p.Line, p.Column) module Range = + let toZ (m:range) = Pos.toZ m.Start, Pos.toZ m.End + let toFileZ (m:range) = m.FileName, toZ m diff --git a/src/fsharp/range.fsi b/src/fsharp/range.fsi index 5b3ea1e24d7..d4ef8be800f 100755 --- a/src/fsharp/range.fsi +++ b/src/fsharp/range.fsi @@ -10,44 +10,86 @@ open Microsoft.FSharp.Compiler.AbstractIL.Internal open Microsoft.FSharp.Compiler -(* we keep a global tables of filenames that we can reference by integers *) +/// An index into a global tables of filenames type FileIndex = int32 -val fileIndexOfFile : string -> FileIndex + +/// Convert a file path to an index +val fileIndexOfFile : filePath: string -> FileIndex + +/// Convert an index into a file path val fileOfFileIndex : FileIndex -> string +/// Represents a position in a file [] type pos = + + /// The line number for the position member Line : int + + /// The column number for the position member Column : int + /// The encoding of the position as a 64-bit integer member Encoding : int64 + + /// Decode a position fro a 64-bit integer static member Decode : int64 -> pos + /// The maximum number of bits needed to store an encoded position static member EncodingSize : int /// Create a position for the given line and column val mkPos : line:int -> column:int -> pos +/// Ordering on positions val posOrder : IComparer +/// Represents a range within a known file [] type range = + + /// The start line of the range member StartLine : int + + /// The start column of the range member StartColumn : int + + /// The line number for the end position of the range member EndLine : int + + /// The column number for the end position of the range member EndColumn : int + + /// The start position of the range member Start : pos + + /// The end position of the range member End : pos + + /// The empty range that is located at the start position of the range member StartRange: range + + /// The empty range that is located at the end position of the range member EndRange: range + + /// The file index for the range member FileIndex : int + + /// The file name for the file of the range member FileName : string + /// Synthetic marks ranges which are produced by intermediate compilation phases. This /// bit signifies that the range covers something that should not be visible to language /// service operations like dot-completion. member IsSynthetic : bool + + /// Convert a range to be synthetic member MakeSynthetic : unit -> range + + /// Convert a range to string member ToShortString : unit -> string + + /// The range where all values are zero static member Zero : range /// This view of range marks uses file indexes explicitly @@ -56,34 +98,61 @@ val mkFileIndexRange : FileIndex -> pos -> pos -> range /// This view hides the use of file indexes and just uses filenames val mkRange : string -> pos -> pos -> range +/// Reduce a range so it only covers a line val trimRangeToLine : range -> range /// not a total order, but enough to sort on ranges val rangeOrder : IComparer +/// Output a position val outputPos : System.IO.TextWriter -> pos -> unit + +/// Output a range val outputRange : System.IO.TextWriter -> range -> unit -val boutputPos : StringBuilder -> pos -> unit -val boutputRange : StringBuilder -> range -> unit +/// Compare positions for less-than val posLt : pos -> pos -> bool + +/// Compare positions for greater-than val posGt : pos -> pos -> bool + +/// Compare positions for equality val posEq : pos -> pos -> bool + +/// Compare positions for greater-than-or-equal-to val posGeq : pos -> pos -> bool +/// Union two ranges, taking their first occurring start position and last occurring end position val unionRanges : range -> range -> range + +/// Test to see if one range contains another range val rangeContainsRange : range -> range -> bool + +/// Test to see if a range contains a position val rangeContainsPos : range -> pos -> bool + +/// Test to see if a range occurs fully before a position val rangeBeforePos : range -> pos -> bool +/// Make a dummy range for a file val rangeN : string -> int -> range + +/// The zero position val pos0 : pos + +/// The zero range val range0 : range + +/// A range associated with a dummy file called "startup" val rangeStartup : range + +/// A range associated with a dummy file for the command line arguments val rangeCmdArgs : range -(* For diagnostics *) +/// Convert a position to a string val stringOfPos : pos -> string + +/// Convert a range to a string val stringOfRange : range -> string /// Represents a line number when using zero-based line counting (used by Visual Studio) @@ -98,22 +167,30 @@ type Line0 = int /// Represents a position using zero-based line counting (used by Visual Studio) type Pos01 = Line0 * int + /// Represents a range using zero-based line counting (used by Visual Studio) type Range01 = Pos01 * Pos01 module Line = + /// Convert a line number from zero-based line counting (used by Visual Studio) to one-based line counting (used internally in the F# compiler and in F# error messages) val fromZ : Line0 -> int + /// Convert a line number from one-based line counting (used internally in the F# compiler and in F# error messages) to zero-based line counting (used by Visual Studio) val toZ : int -> Line0 module Pos = + /// Convert a position from zero-based line counting (used by Visual Studio) to one-based line counting (used internally in the F# compiler and in F# error messages) val fromZ : line:Line0 -> column:int -> pos + /// Convert a position from one-based line counting (used internally in the F# compiler and in F# error messages) to zero-based line counting (used by Visual Studio) val toZ : pos -> Pos01 module Range = + /// Convert a range from one-based line counting (used internally in the F# compiler and in F# error messages) to zero-based line counting (used by Visual Studio) val toZ : range -> Range01 + + /// Convert a range from one-based line counting (used internally in the F# compiler and in F# error messages) to zero-based line counting (used by Visual Studio) val toFileZ : range -> string * Range01 diff --git a/tests/service/EditorTests.fs b/tests/service/EditorTests.fs index 6579a72cc1b..81e66a7c20c 100644 --- a/tests/service/EditorTests.fs +++ b/tests/service/EditorTests.fs @@ -63,6 +63,12 @@ let ``Intro test`` () = let identToken = FSharpTokenTag.IDENT // let projectOptions = checker.GetProjectOptionsFromScript(file, input) |> Async.RunSynchronously + // So we check that the messages are the same + for msg in typeCheckResults.Errors do + printfn "Got an error, hopefully with the right text: %A" msg + + printfn "typeCheckResults.Errors.Length = %d" typeCheckResults.Errors.Length + // We only expect one reported error. However, // on Unix, using filenames like /home/user/Test.fsx gives a second copy of all parse errors due to the // way the load closure for scripts is generated. So this returns two identical errors From 642e9e060dbb2249ff98071bc2dda3a87256f402 Mon Sep 17 00:00:00 2001 From: Jakub Majocha Date: Tue, 15 Jan 2019 00:41:50 +0100 Subject: [PATCH 149/160] Update DEVGUIDE.md (#6095) Correct paths to vsix --- DEVGUIDE.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/DEVGUIDE.md b/DEVGUIDE.md index 27a962341b6..f7a8531cd2d 100644 --- a/DEVGUIDE.md +++ b/DEVGUIDE.md @@ -167,12 +167,12 @@ components installed in that VS installation. You can revert this step by disab For **Debug**, uninstall then reinstall: VSIXInstaller.exe /u:"VisualFSharp" - VSIXInstaller.exe debug\net40\bin\VisualFSharpFull.vsix + VSIXInstaller.exe artifacts\bin\VisualFSharpFull\Debug\net46\VisualFSharpFull.vsix For **Release**, uninstall then reinstall: VSIXInstaller.exe /u:"VisualFSharp" - VSIXInstaller.exe release\net40\bin\VisualFSharpFull.vsix + VSIXInstaller.exe artifacts\bin\VisualFSharpFull\Release\net46\VisualFSharpFull.vsix Restart Visual Studio, it should now be running your freshly-built Visual F# IDE Tools with updated F# Interactive. From 9630c0bcf5154710a11d1288a403f33f59ac41bc Mon Sep 17 00:00:00 2001 From: "Kevin Ransom (msft)" Date: Tue, 15 Jan 2019 10:50:44 -0800 Subject: [PATCH 150/160] Fix build for FsiAnyCPU (#6100) --- src/fsharp/fsiAnyCpu/fsiAnyCpu.fsproj | 1 + 1 file changed, 1 insertion(+) diff --git a/src/fsharp/fsiAnyCpu/fsiAnyCpu.fsproj b/src/fsharp/fsiAnyCpu/fsiAnyCpu.fsproj index cd767c1dfe2..200bd6d40a3 100644 --- a/src/fsharp/fsiAnyCpu/fsiAnyCpu.fsproj +++ b/src/fsharp/fsiAnyCpu/fsiAnyCpu.fsproj @@ -29,6 +29,7 @@ + From fde0e550bc1bb26941b06bc41f5334093f8fde15 Mon Sep 17 00:00:00 2001 From: "Kevin Ransom (msft)" Date: Tue, 15 Jan 2019 17:42:30 -0800 Subject: [PATCH 151/160] Ensure end-2-end tests run (#6106) --- .../BasicProvider/TestBasicProvider.cmd | 32 ++++++++++++------- .../ComboProvider/TestComboProvider.cmd | 32 ++++++++++++------- 2 files changed, 40 insertions(+), 24 deletions(-) diff --git a/tests/EndToEndBuildTests/BasicProvider/TestBasicProvider.cmd b/tests/EndToEndBuildTests/BasicProvider/TestBasicProvider.cmd index 7d8475c39c3..5967d1f29ff 100644 --- a/tests/EndToEndBuildTests/BasicProvider/TestBasicProvider.cmd +++ b/tests/EndToEndBuildTests/BasicProvider/TestBasicProvider.cmd @@ -16,17 +16,20 @@ rem Test it with both desktop and coreclr compilers rem if not '%NUGET_PACKAGES%' == '' rd %NUGET_PACKAGES%\BasicProvider /s /q +taskkill /F /IM dotnet.exe -@echo %__scriptpath%..\..\..\tools\dotnet20\dotnet.exe pack BasicProvider\BasicProvider.fsproj -o %~dp0artifacts -c release -v minimal -p:FSharpTestCompilerVersion=net40 -%__scriptpath%..\..\..\tools\dotnet20\dotnet.exe pack BasicProvider\BasicProvider.fsproj -o %~dp0artifacts -c release -v minimal -p:FSharpTestCompilerVersion=net40 +@echo %__scriptpath%..\..\..\artifacts\toolset\dotnet\dotnet.exe pack BasicProvider\BasicProvider.fsproj -o %~dp0artifacts -c release -v minimal -p:FSharpTestCompilerVersion=net40 +%__scriptpath%..\..\..\artifacts\toolset\dotnet\dotnet.exe pack BasicProvider\BasicProvider.fsproj -o %~dp0artifacts -c release -v minimal -p:FSharpTestCompilerVersion=net40 @if ERRORLEVEL 1 echo Error: TestBasicProvider failed && goto :failure -@echo %__scriptpath%..\..\..\tools\dotnet20\dotnet.exe test BasicProvider.Tests\BasicProvider.Tests.fsproj -c release -v minimal -p:TestTargetFramework=net461 -p:FSharpTestCompilerVersion=net40 -%__scriptpath%..\..\..\tools\dotnet20\dotnet.exe test BasicProvider.Tests\BasicProvider.Tests.fsproj -c release -v minimal -p:TestTargetFramework=net461 -p:FSharpTestCompilerVersion=net40 +@echo %__scriptpath%..\..\..\artifacts\toolset\dotnet\dotnet.exe test BasicProvider.Tests\BasicProvider.Tests.fsproj -c release -v minimal -p:TestTargetFramework=net461 -p:FSharpTestCompilerVersion=net40 +%__scriptpath%..\..\..\artifacts\toolset\dotnet\dotnet.exe test BasicProvider.Tests\BasicProvider.Tests.fsproj -c release -v minimal -p:TestTargetFramework=net461 -p:FSharpTestCompilerVersion=net40 @if ERRORLEVEL 1 echo Error: TestBasicProvider failed && goto :failure -@echo %__scriptpath%..\..\..\tools\dotnet20\dotnet.exe test BasicProvider.Tests\BasicProvider.Tests.fsproj -c release -v minimal -p:TestTargetFramework=netcoreapp2.0 -p:FSharpTestCompilerVersion=coreclr -%__scriptpath%..\..\..\tools\dotnet20\dotnet.exe test BasicProvider.Tests\BasicProvider.Tests.fsproj -c release -v minimal -p:TestTargetFramework=netcoreapp2.0 -p:FSharpTestCompilerVersion=coreclr +taskkill /F /IM dotnet.exe + +@echo %__scriptpath%..\..\..\artifacts\toolset\dotnet\dotnet.exe test BasicProvider.Tests\BasicProvider.Tests.fsproj -c release -v minimal -p:TestTargetFramework=netcoreapp2.0 -p:FSharpTestCompilerVersion=coreclr +%__scriptpath%..\..\..\artifacts\toolset\dotnet\dotnet.exe test BasicProvider.Tests\BasicProvider.Tests.fsproj -c release -v minimal -p:TestTargetFramework=netcoreapp2.0 -p:FSharpTestCompilerVersion=coreclr @if ERRORLEVEL 1 echo Error: TestBasicProvider failed && goto :failure rem @@ -34,17 +37,22 @@ rem Build typeprovider package with coreclr compiler rem Test it with both desktop and coreclr compilers rem if not '%NUGET_PACKAGES%' == '' rd %NUGET_PACKAGES%\BasicProvider /s /q +taskkill /F /IM dotnet.exe -@echo %__scriptpath%..\..\..\tools\dotnet20\dotnet.exe pack BasicProvider\BasicProvider.fsproj -o %~dp0artifacts -c release -v minimal -p:FSharpTestCompilerVersion=coreclr -%__scriptpath%..\..\..\tools\dotnet20\dotnet.exe pack BasicProvider\BasicProvider.fsproj -o %~dp0artifacts -c release -v minimal -p:FSharpTestCompilerVersion=coreclr +@echo %__scriptpath%..\..\..\artifacts\toolset\dotnet\dotnet.exe pack BasicProvider\BasicProvider.fsproj -o %~dp0artifacts -c release -v minimal -p:FSharpTestCompilerVersion=coreclr +%__scriptpath%..\..\..\artifacts\toolset\dotnet\dotnet.exe pack BasicProvider\BasicProvider.fsproj -o %~dp0artifacts -c release -v minimal -p:FSharpTestCompilerVersion=coreclr @if ERRORLEVEL 1 echo Error: TestBasicProvider failed && goto :failure -@echo%__scriptpath%..\..\..\tools\dotnet20\dotnet.exe test BasicProvider.Tests\BasicProvider.Tests.fsproj -c release -v minimal -p:TestTargetFramework=net461 -p:FSharpTestCompilerVersion=net40 -%__scriptpath%..\..\..\tools\dotnet20\dotnet.exe test BasicProvider.Tests\BasicProvider.Tests.fsproj -c release -v minimal -p:TestTargetFramework=net461 -p:FSharpTestCompilerVersion=net40 +taskkill /F /IM dotnet.exe + +@echo%__scriptpath%..\..\..\artifacts\toolset\dotnet\dotnet.exe test BasicProvider.Tests\BasicProvider.Tests.fsproj -c release -v minimal -p:TestTargetFramework=net461 -p:FSharpTestCompilerVersion=net40 +%__scriptpath%..\..\..\artifacts\toolset\dotnet\dotnet.exe test BasicProvider.Tests\BasicProvider.Tests.fsproj -c release -v minimal -p:TestTargetFramework=net461 -p:FSharpTestCompilerVersion=net40 @if ERRORLEVEL 1 echo Error: TestBasicProvider failed && goto :failure -@echo %__scriptpath%..\..\..\tools\dotnet20\dotnet.exe test BasicProvider.Tests\BasicProvider.Tests.fsproj -c release -v minimal -p:TestTargetFramework=netcoreapp2.0 -p:FSharpTestCompilerVersion=coreclr -%__scriptpath%..\..\..\tools\dotnet20\dotnet.exe test BasicProvider.Tests\BasicProvider.Tests.fsproj -c release -v minimal -p:TestTargetFramework=netcoreapp2.0 -p:FSharpTestCompilerVersion=coreclr +taskkill /F /IM dotnet.exe + +@echo %__scriptpath%..\..\..\artifacts\toolset\dotnet\dotnet.exe test BasicProvider.Tests\BasicProvider.Tests.fsproj -c release -v minimal -p:TestTargetFramework=netcoreapp2.0 -p:FSharpTestCompilerVersion=coreclr +%__scriptpath%..\..\..\artifacts\toolset\dotnet\dotnet.exe test BasicProvider.Tests\BasicProvider.Tests.fsproj -c release -v minimal -p:TestTargetFramework=netcoreapp2.0 -p:FSharpTestCompilerVersion=coreclr @if ERRORLEVEL 1 echo Error: TestBasicProvider failed && goto :failure :success diff --git a/tests/EndToEndBuildTests/ComboProvider/TestComboProvider.cmd b/tests/EndToEndBuildTests/ComboProvider/TestComboProvider.cmd index ccd8c4d2e3b..031d09b926c 100644 --- a/tests/EndToEndBuildTests/ComboProvider/TestComboProvider.cmd +++ b/tests/EndToEndBuildTests/ComboProvider/TestComboProvider.cmd @@ -15,17 +15,20 @@ rem Test it with both desktop and coreclr compilers rem if not '%NUGET_PACKAGES%' == '' rd %NUGET_PACKAGES%\ComboProvider /s /q +taskkill /F /IM dotnet.exe -@echo %__scriptpath%..\..\..\tools\dotnet20\dotnet.exe pack ComboProvider\ComboProvider\ComboProvider.fsproj -o %~dp0artifacts -c release -v minimal -p:FSharpTestCompilerVersion=net40 -%__scriptpath%..\..\..\tools\dotnet20\dotnet.exe pack ComboProvider\ComboProvider\ComboProvider.fsproj -o %~dp0artifacts -c release -v minimal -p:FSharpTestCompilerVersion=net40 +@echo %__scriptpath%..\..\..\artifacts\toolset\dotnet\dotnet.exe pack ComboProvider\ComboProvider\ComboProvider.fsproj -o %~dp0artifacts -c release -v minimal -p:FSharpTestCompilerVersion=net40 +%__scriptpath%..\..\..\artifacts\toolset\dotnet\dotnet.exe pack ComboProvider\ComboProvider\ComboProvider.fsproj -o %~dp0artifacts -c release -v minimal -p:FSharpTestCompilerVersion=net40 @if ERRORLEVEL 1 echo Error: ComboProvider failed && goto :failure -@echo %__scriptpath%..\..\..\tools\dotnet20\dotnet.exe test ComboProvider\ComboProvider.Tests\ComboProvider.Tests.fsproj -c release -v minimal -p:TestTargetFramework=net461 -p:FSharpTestCompilerVersion=net40 -%__scriptpath%..\..\..\tools\dotnet20\dotnet.exe test ComboProvider\ComboProvider.Tests\ComboProvider.Tests.fsproj -c release -v minimal -p:TestTargetFramework=net461 -p:FSharpTestCompilerVersion=net40 +@echo %__scriptpath%..\..\..\artifacts\toolset\dotnet\dotnet.exe test ComboProvider\ComboProvider.Tests\ComboProvider.Tests.fsproj -c release -v minimal -p:TestTargetFramework=net461 -p:FSharpTestCompilerVersion=net40 +%__scriptpath%..\..\..\artifacts\toolset\dotnet\dotnet.exe test ComboProvider\ComboProvider.Tests\ComboProvider.Tests.fsproj -c release -v minimal -p:TestTargetFramework=net461 -p:FSharpTestCompilerVersion=net40 @if ERRORLEVEL 1 echo Error: ComboProvider failed && goto :failure -@echo %__scriptpath%..\..\..\tools\dotnet20\dotnet.exe test ComboProvider\ComboProvider.Tests\ComboProvider.Tests.fsproj -c release -v minimal -p:TestTargetFramework=netcoreapp2.0 -p:FSharpTestCompilerVersion=coreclr -%__scriptpath%..\..\..\tools\dotnet20\dotnet.exe test ComboProvider\ComboProvider.Tests\ComboProvider.Tests.fsproj -c release -v minimal -p:TestTargetFramework=netcoreapp2.0 -p:FSharpTestCompilerVersion=coreclr +taskkill /F /IM dotnet.exe + +@echo %__scriptpath%..\..\..\artifacts\toolset\dotnet\dotnet.exe test ComboProvider\ComboProvider.Tests\ComboProvider.Tests.fsproj -c release -v minimal -p:TestTargetFramework=netcoreapp2.0 -p:FSharpTestCompilerVersion=coreclr +%__scriptpath%..\..\..\artifacts\toolset\dotnet\dotnet.exe test ComboProvider\ComboProvider.Tests\ComboProvider.Tests.fsproj -c release -v minimal -p:TestTargetFramework=netcoreapp2.0 -p:FSharpTestCompilerVersion=coreclr @if ERRORLEVEL 1 echo Error: ComboProviderProvider failed && goto :failure rem @@ -33,17 +36,22 @@ rem Build typeprovider package with coreclr compiler rem Test it with both desktop and coreclr compilers rem if not '%NUGET_PACKAGES%' == '' rd %NUGET_PACKAGES%\ComboProvider /s /q +taskkill /F /IM dotnet.exe -@echo %__scriptpath%..\..\..\tools\dotnet20\dotnet.exe pack ComboProvider\ComboProvider\ComboProvider.fsproj -o %~dp0artifacts -c release -v minimal -p:FSharpTestCompilerVersion=coreclr -%__scriptpath%..\..\..\tools\dotnet20\dotnet.exe pack ComboProvider\ComboProvider\ComboProvider.fsproj -o %~dp0artifacts -c release -v minimal -p:FSharpTestCompilerVersion=coreclr +@echo %__scriptpath%..\..\..\artifacts\toolset\dotnet\dotnet.exe pack ComboProvider\ComboProvider\ComboProvider.fsproj -o %~dp0artifacts -c release -v minimal -p:FSharpTestCompilerVersion=coreclr +%__scriptpath%..\..\..\artifacts\toolset\dotnet\dotnet.exe pack ComboProvider\ComboProvider\ComboProvider.fsproj -o %~dp0artifacts -c release -v minimal -p:FSharpTestCompilerVersion=coreclr @if ERRORLEVEL 1 echo Error: ComboProviderProvider failed && goto :failure -@echo%__scriptpath%..\..\..\tools\dotnet20\dotnet.exe test ComboProvider\ComboProvider.Tests\ComboProvider.Tests.fsproj -c release -v minimal -p:TestTargetFramework=net461 -p:FSharpTestCompilerVersion=net40 -%__scriptpath%..\..\..\tools\dotnet20\dotnet.exe test ComboProvider\ComboProvider.Tests\ComboProvider.Tests.fsproj -c release -v minimal -p:TestTargetFramework=net461 -p:FSharpTestCompilerVersion=net40 +taskkill /F /IM dotnet.exe + +@echo%__scriptpath%..\..\..\artifacts\toolset\dotnet\dotnet.exe test ComboProvider\ComboProvider.Tests\ComboProvider.Tests.fsproj -c release -v minimal -p:TestTargetFramework=net461 -p:FSharpTestCompilerVersion=net40 +%__scriptpath%..\..\..\artifacts\toolset\dotnet\dotnet.exe test ComboProvider\ComboProvider.Tests\ComboProvider.Tests.fsproj -c release -v minimal -p:TestTargetFramework=net461 -p:FSharpTestCompilerVersion=net40 @if ERRORLEVEL 1 echo Error: TestBasicProvider failed && goto :failure -@echo %__scriptpath%..\..\..\tools\dotnet20\dotnet.exe test ComboProvider\ComboProvider.Tests\ComboProvider.Tests.fsproj -v minimal -p:TestTargetFramework=netcoreapp2.0 -p:FSharpTestCompilerVersion=coreclr -%__scriptpath%..\..\..\tools\dotnet20\dotnet.exe test ComboProvider\ComboProvider.Tests\ComboProvider.Tests.fsproj -c release -v minimal -p:TestTargetFramework=netcoreapp2.0 -p:FSharpTestCompilerVersion=coreclr +taskkill /F /IM dotnet.exe + +@echo %__scriptpath%..\..\..\artifacts\toolset\dotnet\dotnet.exe test ComboProvider\ComboProvider.Tests\ComboProvider.Tests.fsproj -v minimal -p:TestTargetFramework=netcoreapp2.0 -p:FSharpTestCompilerVersion=coreclr +%__scriptpath%..\..\..\artifacts\toolset\dotnet\dotnet.exe test ComboProvider\ComboProvider.Tests\ComboProvider.Tests.fsproj -c release -v minimal -p:TestTargetFramework=netcoreapp2.0 -p:FSharpTestCompilerVersion=coreclr @if ERRORLEVEL 1 echo Error: ComboProvider failed && goto :failure :success From 056141a37adfa3a67661100eecb330c68011921a Mon Sep 17 00:00:00 2001 From: Eugene Auduchinok Date: Wed, 16 Jan 2019 20:49:34 +0300 Subject: [PATCH 152/160] Add isRecursive field name to SynModuleDecl.Let (#6115) --- src/fsharp/ast.fs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/fsharp/ast.fs b/src/fsharp/ast.fs index 43b7aab87d1..22b960d18c6 100644 --- a/src/fsharp/ast.fs +++ b/src/fsharp/ast.fs @@ -1409,7 +1409,7 @@ and SynModuleDecl = | ModuleAbbrev of ident:Ident * longId:LongIdent * range:range | NestedModule of SynComponentInfo * isRecursive:bool * SynModuleDecls * bool * range:range - | Let of bool * SynBinding list * range:range + | Let of isRecursive:bool * SynBinding list * range:range | DoExpr of SequencePointInfoForBinding * SynExpr * range:range | Types of SynTypeDefn list * range:range | Exception of SynExceptionDefn * range:range From e2af5537685eefef4eafc64f7f1ff28edeeda06a Mon Sep 17 00:00:00 2001 From: "Kevin Ransom (msft)" Date: Wed, 16 Jan 2019 09:52:14 -0800 Subject: [PATCH 153/160] Update FSharp Core version to 4.5.5 (#6112) --- build/targets/AssemblyVersions.props | 2 +- src/FSharpSource.Settings.targets | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/build/targets/AssemblyVersions.props b/build/targets/AssemblyVersions.props index 10784c9c0d1..b307b747716 100644 --- a/build/targets/AssemblyVersions.props +++ b/build/targets/AssemblyVersions.props @@ -21,7 +21,7 @@ 4.5.0.0 4.5 - 4.5.3 + 4.5.5 10.2.3.0 10.2.3 10.2 diff --git a/src/FSharpSource.Settings.targets b/src/FSharpSource.Settings.targets index 9887505a1f0..e229fc935f3 100644 --- a/src/FSharpSource.Settings.targets +++ b/src/FSharpSource.Settings.targets @@ -22,7 +22,7 @@ 4.5.0.0 4.5 - 4.5.3 + 4.5.5 10.2.3.0 10.2.3 10.2 From 2b2a641b99afc4853884e133eb2be69fc3673b7f Mon Sep 17 00:00:00 2001 From: "Kevin Ransom (msft)" Date: Wed, 16 Jan 2019 10:02:09 -0800 Subject: [PATCH 154/160] -nr=false works better (#6113) --- .../BasicProvider/TestBasicProvider.cmd | 31 +++++++------------ .../ComboProvider/TestComboProvider.cmd | 31 +++++++------------ 2 files changed, 24 insertions(+), 38 deletions(-) diff --git a/tests/EndToEndBuildTests/BasicProvider/TestBasicProvider.cmd b/tests/EndToEndBuildTests/BasicProvider/TestBasicProvider.cmd index 5967d1f29ff..56af32e144b 100644 --- a/tests/EndToEndBuildTests/BasicProvider/TestBasicProvider.cmd +++ b/tests/EndToEndBuildTests/BasicProvider/TestBasicProvider.cmd @@ -18,18 +18,16 @@ rem if not '%NUGET_PACKAGES%' == '' rd %NUGET_PACKAGES%\BasicProvider /s /q taskkill /F /IM dotnet.exe -@echo %__scriptpath%..\..\..\artifacts\toolset\dotnet\dotnet.exe pack BasicProvider\BasicProvider.fsproj -o %~dp0artifacts -c release -v minimal -p:FSharpTestCompilerVersion=net40 -%__scriptpath%..\..\..\artifacts\toolset\dotnet\dotnet.exe pack BasicProvider\BasicProvider.fsproj -o %~dp0artifacts -c release -v minimal -p:FSharpTestCompilerVersion=net40 +@echo %__scriptpath%..\..\..\artifacts\toolset\dotnet\dotnet.exe pack BasicProvider\BasicProvider.fsproj -o %~dp0artifacts -c release -v minimal -p:FSharpTestCompilerVersion=net40 -nr=false +%__scriptpath%..\..\..\artifacts\toolset\dotnet\dotnet.exe pack BasicProvider\BasicProvider.fsproj -o %~dp0artifacts -c release -v minimal -p:FSharpTestCompilerVersion=net40 -nr=false @if ERRORLEVEL 1 echo Error: TestBasicProvider failed && goto :failure -@echo %__scriptpath%..\..\..\artifacts\toolset\dotnet\dotnet.exe test BasicProvider.Tests\BasicProvider.Tests.fsproj -c release -v minimal -p:TestTargetFramework=net461 -p:FSharpTestCompilerVersion=net40 -%__scriptpath%..\..\..\artifacts\toolset\dotnet\dotnet.exe test BasicProvider.Tests\BasicProvider.Tests.fsproj -c release -v minimal -p:TestTargetFramework=net461 -p:FSharpTestCompilerVersion=net40 +@echo %__scriptpath%..\..\..\artifacts\toolset\dotnet\dotnet.exe test BasicProvider.Tests\BasicProvider.Tests.fsproj -c release -v minimal -p:TestTargetFramework=net461 -p:FSharpTestCompilerVersion=net40 -nr=false +%__scriptpath%..\..\..\artifacts\toolset\dotnet\dotnet.exe test BasicProvider.Tests\BasicProvider.Tests.fsproj -c release -v minimal -p:TestTargetFramework=net461 -p:FSharpTestCompilerVersion=net40 -nr=false @if ERRORLEVEL 1 echo Error: TestBasicProvider failed && goto :failure -taskkill /F /IM dotnet.exe - -@echo %__scriptpath%..\..\..\artifacts\toolset\dotnet\dotnet.exe test BasicProvider.Tests\BasicProvider.Tests.fsproj -c release -v minimal -p:TestTargetFramework=netcoreapp2.0 -p:FSharpTestCompilerVersion=coreclr -%__scriptpath%..\..\..\artifacts\toolset\dotnet\dotnet.exe test BasicProvider.Tests\BasicProvider.Tests.fsproj -c release -v minimal -p:TestTargetFramework=netcoreapp2.0 -p:FSharpTestCompilerVersion=coreclr +@echo %__scriptpath%..\..\..\artifacts\toolset\dotnet\dotnet.exe test BasicProvider.Tests\BasicProvider.Tests.fsproj -c release -v minimal -p:TestTargetFramework=netcoreapp2.0 -p:FSharpTestCompilerVersion=coreclr -nr=false +%__scriptpath%..\..\..\artifacts\toolset\dotnet\dotnet.exe test BasicProvider.Tests\BasicProvider.Tests.fsproj -c release -v minimal -p:TestTargetFramework=netcoreapp2.0 -p:FSharpTestCompilerVersion=coreclr -nr=false @if ERRORLEVEL 1 echo Error: TestBasicProvider failed && goto :failure rem @@ -37,22 +35,17 @@ rem Build typeprovider package with coreclr compiler rem Test it with both desktop and coreclr compilers rem if not '%NUGET_PACKAGES%' == '' rd %NUGET_PACKAGES%\BasicProvider /s /q -taskkill /F /IM dotnet.exe -@echo %__scriptpath%..\..\..\artifacts\toolset\dotnet\dotnet.exe pack BasicProvider\BasicProvider.fsproj -o %~dp0artifacts -c release -v minimal -p:FSharpTestCompilerVersion=coreclr -%__scriptpath%..\..\..\artifacts\toolset\dotnet\dotnet.exe pack BasicProvider\BasicProvider.fsproj -o %~dp0artifacts -c release -v minimal -p:FSharpTestCompilerVersion=coreclr +@echo %__scriptpath%..\..\..\artifacts\toolset\dotnet\dotnet.exe pack BasicProvider\BasicProvider.fsproj -o %~dp0artifacts -c release -v minimal -p:FSharpTestCompilerVersion=coreclr -nr=false +%__scriptpath%..\..\..\artifacts\toolset\dotnet\dotnet.exe pack BasicProvider\BasicProvider.fsproj -o %~dp0artifacts -c release -v minimal -p:FSharpTestCompilerVersion=coreclr -nr=false @if ERRORLEVEL 1 echo Error: TestBasicProvider failed && goto :failure -taskkill /F /IM dotnet.exe - -@echo%__scriptpath%..\..\..\artifacts\toolset\dotnet\dotnet.exe test BasicProvider.Tests\BasicProvider.Tests.fsproj -c release -v minimal -p:TestTargetFramework=net461 -p:FSharpTestCompilerVersion=net40 -%__scriptpath%..\..\..\artifacts\toolset\dotnet\dotnet.exe test BasicProvider.Tests\BasicProvider.Tests.fsproj -c release -v minimal -p:TestTargetFramework=net461 -p:FSharpTestCompilerVersion=net40 +@echo%__scriptpath%..\..\..\artifacts\toolset\dotnet\dotnet.exe test BasicProvider.Tests\BasicProvider.Tests.fsproj -c release -v minimal -p:TestTargetFramework=net461 -p:FSharpTestCompilerVersion=net40 -nr=false +%__scriptpath%..\..\..\artifacts\toolset\dotnet\dotnet.exe test BasicProvider.Tests\BasicProvider.Tests.fsproj -c release -v minimal -p:TestTargetFramework=net461 -p:FSharpTestCompilerVersion=net40 -nr=false @if ERRORLEVEL 1 echo Error: TestBasicProvider failed && goto :failure -taskkill /F /IM dotnet.exe - -@echo %__scriptpath%..\..\..\artifacts\toolset\dotnet\dotnet.exe test BasicProvider.Tests\BasicProvider.Tests.fsproj -c release -v minimal -p:TestTargetFramework=netcoreapp2.0 -p:FSharpTestCompilerVersion=coreclr -%__scriptpath%..\..\..\artifacts\toolset\dotnet\dotnet.exe test BasicProvider.Tests\BasicProvider.Tests.fsproj -c release -v minimal -p:TestTargetFramework=netcoreapp2.0 -p:FSharpTestCompilerVersion=coreclr +@echo %__scriptpath%..\..\..\artifacts\toolset\dotnet\dotnet.exe test BasicProvider.Tests\BasicProvider.Tests.fsproj -c release -v minimal -p:TestTargetFramework=netcoreapp2.0 -p:FSharpTestCompilerVersion=coreclr -nr=false +%__scriptpath%..\..\..\artifacts\toolset\dotnet\dotnet.exe test BasicProvider.Tests\BasicProvider.Tests.fsproj -c release -v minimal -p:TestTargetFramework=netcoreapp2.0 -p:FSharpTestCompilerVersion=coreclr -nr=false @if ERRORLEVEL 1 echo Error: TestBasicProvider failed && goto :failure :success diff --git a/tests/EndToEndBuildTests/ComboProvider/TestComboProvider.cmd b/tests/EndToEndBuildTests/ComboProvider/TestComboProvider.cmd index 031d09b926c..74035032e29 100644 --- a/tests/EndToEndBuildTests/ComboProvider/TestComboProvider.cmd +++ b/tests/EndToEndBuildTests/ComboProvider/TestComboProvider.cmd @@ -17,18 +17,16 @@ rem if not '%NUGET_PACKAGES%' == '' rd %NUGET_PACKAGES%\ComboProvider /s /q taskkill /F /IM dotnet.exe -@echo %__scriptpath%..\..\..\artifacts\toolset\dotnet\dotnet.exe pack ComboProvider\ComboProvider\ComboProvider.fsproj -o %~dp0artifacts -c release -v minimal -p:FSharpTestCompilerVersion=net40 -%__scriptpath%..\..\..\artifacts\toolset\dotnet\dotnet.exe pack ComboProvider\ComboProvider\ComboProvider.fsproj -o %~dp0artifacts -c release -v minimal -p:FSharpTestCompilerVersion=net40 +@echo %__scriptpath%..\..\..\artifacts\toolset\dotnet\dotnet.exe pack ComboProvider\ComboProvider\ComboProvider.fsproj -o %~dp0artifacts -c release -v minimal -p:FSharpTestCompilerVersion=net40 -nr=false +%__scriptpath%..\..\..\artifacts\toolset\dotnet\dotnet.exe pack ComboProvider\ComboProvider\ComboProvider.fsproj -o %~dp0artifacts -c release -v minimal -p:FSharpTestCompilerVersion=net40 -nr=false @if ERRORLEVEL 1 echo Error: ComboProvider failed && goto :failure -@echo %__scriptpath%..\..\..\artifacts\toolset\dotnet\dotnet.exe test ComboProvider\ComboProvider.Tests\ComboProvider.Tests.fsproj -c release -v minimal -p:TestTargetFramework=net461 -p:FSharpTestCompilerVersion=net40 -%__scriptpath%..\..\..\artifacts\toolset\dotnet\dotnet.exe test ComboProvider\ComboProvider.Tests\ComboProvider.Tests.fsproj -c release -v minimal -p:TestTargetFramework=net461 -p:FSharpTestCompilerVersion=net40 +@echo %__scriptpath%..\..\..\artifacts\toolset\dotnet\dotnet.exe test ComboProvider\ComboProvider.Tests\ComboProvider.Tests.fsproj -c release -v minimal -p:TestTargetFramework=net461 -p:FSharpTestCompilerVersion=net40 -nr=false +%__scriptpath%..\..\..\artifacts\toolset\dotnet\dotnet.exe test ComboProvider\ComboProvider.Tests\ComboProvider.Tests.fsproj -c release -v minimal -p:TestTargetFramework=net461 -p:FSharpTestCompilerVersion=net40 -nr=false @if ERRORLEVEL 1 echo Error: ComboProvider failed && goto :failure -taskkill /F /IM dotnet.exe - -@echo %__scriptpath%..\..\..\artifacts\toolset\dotnet\dotnet.exe test ComboProvider\ComboProvider.Tests\ComboProvider.Tests.fsproj -c release -v minimal -p:TestTargetFramework=netcoreapp2.0 -p:FSharpTestCompilerVersion=coreclr -%__scriptpath%..\..\..\artifacts\toolset\dotnet\dotnet.exe test ComboProvider\ComboProvider.Tests\ComboProvider.Tests.fsproj -c release -v minimal -p:TestTargetFramework=netcoreapp2.0 -p:FSharpTestCompilerVersion=coreclr +@echo %__scriptpath%..\..\..\artifacts\toolset\dotnet\dotnet.exe test ComboProvider\ComboProvider.Tests\ComboProvider.Tests.fsproj -c release -v minimal -p:TestTargetFramework=netcoreapp2.0 -p:FSharpTestCompilerVersion=coreclr -nr=false +%__scriptpath%..\..\..\artifacts\toolset\dotnet\dotnet.exe test ComboProvider\ComboProvider.Tests\ComboProvider.Tests.fsproj -c release -v minimal -p:TestTargetFramework=netcoreapp2.0 -p:FSharpTestCompilerVersion=coreclr -nr=false @if ERRORLEVEL 1 echo Error: ComboProviderProvider failed && goto :failure rem @@ -36,22 +34,17 @@ rem Build typeprovider package with coreclr compiler rem Test it with both desktop and coreclr compilers rem if not '%NUGET_PACKAGES%' == '' rd %NUGET_PACKAGES%\ComboProvider /s /q -taskkill /F /IM dotnet.exe -@echo %__scriptpath%..\..\..\artifacts\toolset\dotnet\dotnet.exe pack ComboProvider\ComboProvider\ComboProvider.fsproj -o %~dp0artifacts -c release -v minimal -p:FSharpTestCompilerVersion=coreclr -%__scriptpath%..\..\..\artifacts\toolset\dotnet\dotnet.exe pack ComboProvider\ComboProvider\ComboProvider.fsproj -o %~dp0artifacts -c release -v minimal -p:FSharpTestCompilerVersion=coreclr +@echo %__scriptpath%..\..\..\artifacts\toolset\dotnet\dotnet.exe pack ComboProvider\ComboProvider\ComboProvider.fsproj -o %~dp0artifacts -c release -v minimal -p:FSharpTestCompilerVersion=coreclr -nr=false +%__scriptpath%..\..\..\artifacts\toolset\dotnet\dotnet.exe pack ComboProvider\ComboProvider\ComboProvider.fsproj -o %~dp0artifacts -c release -v minimal -p:FSharpTestCompilerVersion=coreclr -nr=false @if ERRORLEVEL 1 echo Error: ComboProviderProvider failed && goto :failure -taskkill /F /IM dotnet.exe - -@echo%__scriptpath%..\..\..\artifacts\toolset\dotnet\dotnet.exe test ComboProvider\ComboProvider.Tests\ComboProvider.Tests.fsproj -c release -v minimal -p:TestTargetFramework=net461 -p:FSharpTestCompilerVersion=net40 -%__scriptpath%..\..\..\artifacts\toolset\dotnet\dotnet.exe test ComboProvider\ComboProvider.Tests\ComboProvider.Tests.fsproj -c release -v minimal -p:TestTargetFramework=net461 -p:FSharpTestCompilerVersion=net40 +@echo%__scriptpath%..\..\..\artifacts\toolset\dotnet\dotnet.exe test ComboProvider\ComboProvider.Tests\ComboProvider.Tests.fsproj -c release -v minimal -p:TestTargetFramework=net461 -p:FSharpTestCompilerVersion=net40 -nr=false +%__scriptpath%..\..\..\artifacts\toolset\dotnet\dotnet.exe test ComboProvider\ComboProvider.Tests\ComboProvider.Tests.fsproj -c release -v minimal -p:TestTargetFramework=net461 -p:FSharpTestCompilerVersion=net40 -nr=false @if ERRORLEVEL 1 echo Error: TestBasicProvider failed && goto :failure -taskkill /F /IM dotnet.exe - -@echo %__scriptpath%..\..\..\artifacts\toolset\dotnet\dotnet.exe test ComboProvider\ComboProvider.Tests\ComboProvider.Tests.fsproj -v minimal -p:TestTargetFramework=netcoreapp2.0 -p:FSharpTestCompilerVersion=coreclr -%__scriptpath%..\..\..\artifacts\toolset\dotnet\dotnet.exe test ComboProvider\ComboProvider.Tests\ComboProvider.Tests.fsproj -c release -v minimal -p:TestTargetFramework=netcoreapp2.0 -p:FSharpTestCompilerVersion=coreclr +@echo %__scriptpath%..\..\..\artifacts\toolset\dotnet\dotnet.exe test ComboProvider\ComboProvider.Tests\ComboProvider.Tests.fsproj -v minimal -p:TestTargetFramework=netcoreapp2.0 -p:FSharpTestCompilerVersion=coreclr -nr=false +%__scriptpath%..\..\..\artifacts\toolset\dotnet\dotnet.exe test ComboProvider\ComboProvider.Tests\ComboProvider.Tests.fsproj -c release -v minimal -p:TestTargetFramework=netcoreapp2.0 -p:FSharpTestCompilerVersion=coreclr -nr=false @if ERRORLEVEL 1 echo Error: ComboProvider failed && goto :failure :success From 0bea66adc2b9596c946a5723a7afef0c3a1f95c1 Mon Sep 17 00:00:00 2001 From: Eugene Auduchinok Date: Wed, 16 Jan 2019 21:13:56 +0300 Subject: [PATCH 155/160] Always emit conditional attributes in FCS (#6004) * Always emit conditional attributes in FCS (fixes #3890) * Add test * Cleanup test * Add internal compiler switch, emit conditional method calls * Update test * Make noConditionalErasure lowercase --- src/fsharp/CompileOps.fs | 15 +++++++++++++-- src/fsharp/CompileOps.fsi | 3 +++ src/fsharp/CompileOptions.fs | 9 +++++---- src/fsharp/TypeChecker.fs | 13 ++++++------- src/fsharp/TypeChecker.fsi | 4 ++-- tests/service/Symbols.fs | 25 ++++++++++++++++++++++++- 6 files changed, 53 insertions(+), 16 deletions(-) diff --git a/src/fsharp/CompileOps.fs b/src/fsharp/CompileOps.fs index 6fa771ab959..830a08bf2f4 100644 --- a/src/fsharp/CompileOps.fs +++ b/src/fsharp/CompileOps.fs @@ -2356,6 +2356,8 @@ type TcConfigBuilder = mutable tryGetMetadataSnapshot : ILReaderTryGetMetadataSnapshot mutable internalTestSpanStackReferring : bool + + mutable noConditionalErasure : bool } static member Initial = @@ -2493,6 +2495,7 @@ type TcConfigBuilder = shadowCopyReferences = false tryGetMetadataSnapshot = (fun _ -> None) internalTestSpanStackReferring = false + noConditionalErasure = false } static member CreateNew(legacyReferenceResolver, defaultFSharpBinariesDir, reduceMemoryUsage, implicitIncludeDir, @@ -2954,6 +2957,8 @@ type TcConfig private (data : TcConfigBuilder, validate:bool) = member x.shadowCopyReferences = data.shadowCopyReferences member x.tryGetMetadataSnapshot = data.tryGetMetadataSnapshot member x.internalTestSpanStackReferring = data.internalTestSpanStackReferring + member x.noConditionalErasure = data.noConditionalErasure + static member Create(builder, validate) = use unwindBuildPhase = PushThreadBuildPhaseUntilUnwind BuildPhase.Parameter TcConfig(builder, validate) @@ -5447,9 +5452,12 @@ let TypeCheckOneInputEventually (checkForErrors, tcConfig:TcConfig, tcImports:Tc if Zset.contains qualNameOfFile tcState.tcsRootImpls then errorR(Error(FSComp.SR.buildImplementationAlreadyGivenDetail(qualNameOfFile.Text), m)) + let conditionalDefines = + if tcConfig.noConditionalErasure then None else Some (tcConfig.conditionalCompilationDefines) + // Typecheck the signature file let! (tcEnv, sigFileType, createsGeneratedProvidedTypes) = - TypeCheckOneSigFile (tcGlobals, tcState.tcsNiceNameGen, amap, tcState.tcsCcu, checkForErrors, tcConfig.conditionalCompilationDefines, tcSink, tcConfig.internalTestSpanStackReferring) tcState.tcsTcSigEnv file + TypeCheckOneSigFile (tcGlobals, tcState.tcsNiceNameGen, amap, tcState.tcsCcu, checkForErrors, conditionalDefines, tcSink, tcConfig.internalTestSpanStackReferring) tcState.tcsTcSigEnv file let rootSigs = Zmap.add qualNameOfFile sigFileType tcState.tcsRootSigs @@ -5484,9 +5492,12 @@ let TypeCheckOneInputEventually (checkForErrors, tcConfig:TcConfig, tcImports:Tc let tcImplEnv = tcState.tcsTcImplEnv + let conditionalDefines = + if tcConfig.noConditionalErasure then None else Some (tcConfig.conditionalCompilationDefines) + // Typecheck the implementation file let! topAttrs, implFile, _implFileHiddenType, tcEnvAtEnd, createsGeneratedProvidedTypes = - TypeCheckOneImplFile (tcGlobals, tcState.tcsNiceNameGen, amap, tcState.tcsCcu, checkForErrors, tcConfig.conditionalCompilationDefines, tcSink, tcConfig.internalTestSpanStackReferring) tcImplEnv rootSigOpt file + TypeCheckOneImplFile (tcGlobals, tcState.tcsNiceNameGen, amap, tcState.tcsCcu, checkForErrors, conditionalDefines, tcSink, tcConfig.internalTestSpanStackReferring) tcImplEnv rootSigOpt file let hadSig = rootSigOpt.IsSome let implFileSigType = SigTypeOfImplFile implFile diff --git a/src/fsharp/CompileOps.fsi b/src/fsharp/CompileOps.fsi index 897f772633d..9ee74ee9930 100755 --- a/src/fsharp/CompileOps.fsi +++ b/src/fsharp/CompileOps.fsi @@ -367,6 +367,9 @@ type TcConfigBuilder = /// if true - 'let mutable x = Span.Empty', the value 'x' is a stack referring span. Used for internal testing purposes only until we get true stack spans. mutable internalTestSpanStackReferring : bool + + /// Prevent erasure of conditional attributes and methods so tooling is able analyse them. + mutable noConditionalErasure: bool } static member Initial: TcConfigBuilder diff --git a/src/fsharp/CompileOptions.fs b/src/fsharp/CompileOptions.fs index 6ae18644dea..344c0e1412a 100644 --- a/src/fsharp/CompileOptions.fs +++ b/src/fsharp/CompileOptions.fs @@ -848,8 +848,8 @@ let testFlag tcConfigB = | str -> warning(Error(FSComp.SR.optsUnknownArgumentToTheTestSwitch(str),rangeCmdArgs))), None, None) -// not shown in fsc.exe help, no warning on use, motivation is for use from VS -let vsSpecificFlags (tcConfigB: TcConfigBuilder) = +// Not shown in fsc.exe help, no warning on use, motivation is for use from tooling. +let editorSpecificFlags (tcConfigB: TcConfigBuilder) = [ CompilerOption("vserrors", tagNone, OptionUnit (fun () -> tcConfigB.errorStyle <- ErrorStyle.VSErrors), None, None) CompilerOption("validate-type-providers", tagNone, OptionUnit (id), None, None) // preserved for compatibility's sake, no longer has any effect CompilerOption("LCID", tagInt, OptionInt ignore, None, None) @@ -857,7 +857,8 @@ let vsSpecificFlags (tcConfigB: TcConfigBuilder) = CompilerOption("sqmsessionguid", tagNone, OptionString ignore, None, None) CompilerOption("gccerrors", tagNone, OptionUnit (fun () -> tcConfigB.errorStyle <- ErrorStyle.GccErrors), None, None) CompilerOption("exename", tagNone, OptionString (fun s -> tcConfigB.exename <- Some(s)), None, None) - CompilerOption("maxerrors", tagInt, OptionInt (fun n -> tcConfigB.maxErrors <- n), None, None) ] + CompilerOption("maxerrors", tagInt, OptionInt (fun n -> tcConfigB.maxErrors <- n), None, None) + CompilerOption("noconditionalerasure", tagNone, OptionUnit (fun () -> tcConfigB.noConditionalErasure <- true), None, None) ] let internalFlags (tcConfigB:TcConfigBuilder) = [ @@ -896,7 +897,7 @@ let internalFlags (tcConfigB:TcConfigBuilder) = CompilerOption("alwayscallvirt",tagNone,OptionSwitch(callVirtSwitch tcConfigB),Some(InternalCommandLineOption("alwayscallvirt",rangeCmdArgs)), None) CompilerOption("nodebugdata",tagNone, OptionUnit (fun () -> tcConfigB.noDebugData<-true),Some(InternalCommandLineOption("--nodebugdata",rangeCmdArgs)), None) testFlag tcConfigB ] @ - vsSpecificFlags tcConfigB @ + editorSpecificFlags tcConfigB @ [ CompilerOption("jit", tagNone, OptionSwitch (jitoptimizeSwitch tcConfigB), Some(InternalCommandLineOption("jit", rangeCmdArgs)), None) CompilerOption("localoptimize", tagNone, OptionSwitch(localoptimizeSwitch tcConfigB),Some(InternalCommandLineOption("localoptimize", rangeCmdArgs)), None) CompilerOption("splitting", tagNone, OptionSwitch(splittingSwitch tcConfigB),Some(InternalCommandLineOption("splitting", rangeCmdArgs)), None) diff --git a/src/fsharp/TypeChecker.fs b/src/fsharp/TypeChecker.fs index a78405bfb6e..d9bdb7e52e3 100755 --- a/src/fsharp/TypeChecker.fs +++ b/src/fsharp/TypeChecker.fs @@ -504,8 +504,8 @@ type cenv = /// Used to resolve names nameResolver: NameResolver - /// The set of active conditional defines - conditionalDefines: string list + /// The set of active conditional defines. The value is None when conditional erasure is disabled in tooling. + conditionalDefines: string list option isInternalTestSpanStackReferring: bool } @@ -3004,8 +3004,8 @@ let BuildPossiblyConditionalMethodCall cenv env isMutable m isProp minfo valUseF let conditionalCallDefineOpt = TryFindMethInfoStringAttribute cenv.g m cenv.g.attrib_ConditionalAttribute minfo - match conditionalCallDefineOpt with - | Some d when not (List.contains d cenv.conditionalDefines) -> + match conditionalCallDefineOpt, cenv.conditionalDefines with + | Some d, Some defines when not (List.contains d defines) -> // Methods marked with 'Conditional' must return 'unit' UnifyTypes cenv env m cenv.g.unit_ty (minfo.GetFSharpReturnTy(cenv.amap, m, minst)) @@ -10828,11 +10828,10 @@ and TcAttribute canFail cenv (env: TcEnv) attrTgt (synAttr: SynAttribute) = let conditionalCallDefineOpt = TryFindTyconRefStringAttribute cenv.g mAttr cenv.g.attrib_ConditionalAttribute tcref - match conditionalCallDefineOpt with - | Some d when not (List.contains d cenv.conditionalDefines) -> + match conditionalCallDefineOpt, cenv.conditionalDefines with + | Some d, Some defines when not (List.contains d defines) -> [], false | _ -> - // REVIEW: take notice of inherited? let validOn, _inherited = let validOnDefault = 0x7fff diff --git a/src/fsharp/TypeChecker.fsi b/src/fsharp/TypeChecker.fsi index 3f84e1992fc..aae09544998 100644 --- a/src/fsharp/TypeChecker.fsi +++ b/src/fsharp/TypeChecker.fsi @@ -39,14 +39,14 @@ val EmptyTopAttrs : TopAttribs val CombineTopAttrs : TopAttribs -> TopAttribs -> TopAttribs val TypeCheckOneImplFile : - TcGlobals * NiceNameGenerator * ImportMap * CcuThunk * (unit -> bool) * ConditionalDefines * NameResolution.TcResultsSink * bool + TcGlobals * NiceNameGenerator * ImportMap * CcuThunk * (unit -> bool) * ConditionalDefines option * NameResolution.TcResultsSink * bool -> TcEnv -> Tast.ModuleOrNamespaceType option -> ParsedImplFileInput -> Eventually val TypeCheckOneSigFile : - TcGlobals * NiceNameGenerator * ImportMap * CcuThunk * (unit -> bool) * ConditionalDefines * NameResolution.TcResultsSink * bool + TcGlobals * NiceNameGenerator * ImportMap * CcuThunk * (unit -> bool) * ConditionalDefines option * NameResolution.TcResultsSink * bool -> TcEnv -> ParsedSigFileInput -> Eventually diff --git a/tests/service/Symbols.fs b/tests/service/Symbols.fs index 8b5749f0546..da2a7795577 100644 --- a/tests/service/Symbols.fs +++ b/tests/service/Symbols.fs @@ -100,4 +100,27 @@ module Mod2 = mod1val1.XmlDocSig |> shouldEqual "P:Mod1.val1" mod2func2.XmlDocSig |> shouldEqual "M:Mod1.Mod2.func2" - \ No newline at end of file + +module Attributes = + [] + let ``Emit conditional attributes`` () = + let source = """ +open System +open System.Diagnostics + +[] +type FooAttribute() = + inherit Attribute() + +[] +let x = 123 +""" + let fileName, options = mkTestFileAndOptions source [| "--noconditionalerasure" |] + let _, checkResults = parseAndCheckFile fileName source options + + checkResults.GetAllUsesOfAllSymbolsInFile() + |> Async.RunSynchronously + |> Array.tryFind (fun su -> su.Symbol.DisplayName = "x") + |> Option.orElseWith (fun _ -> failwith "Could not get symbol") + |> Option.map (fun su -> su.Symbol :?> FSharpMemberOrFunctionOrValue) + |> Option.iter (fun symbol -> symbol.Attributes.Count |> shouldEqual 1) From de04e29e1becf043c1338adfe8231d41006e0de8 Mon Sep 17 00:00:00 2001 From: "Kevin Ransom (msft)" Date: Thu, 17 Jan 2019 10:35:38 -0800 Subject: [PATCH 156/160] Apparently NuGetId is no longer a thing (#6122) --- .../FSharp.ProjectSystem.Base/Project/ProjectSystem.Base.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vsintegration/src/FSharp.ProjectSystem.Base/Project/ProjectSystem.Base.csproj b/vsintegration/src/FSharp.ProjectSystem.Base/Project/ProjectSystem.Base.csproj index 48032c8e15b..12b5cc8d49e 100644 --- a/vsintegration/src/FSharp.ProjectSystem.Base/Project/ProjectSystem.Base.csproj +++ b/vsintegration/src/FSharp.ProjectSystem.Base/Project/ProjectSystem.Base.csproj @@ -78,7 +78,7 @@ We require a reference to Microsoft.VisualStudio.Shell.14.0.dll, but that causes some issues with duplicate type names. The ~hack~ fix is to include the package reference and ensure the Aliases metadata gets set afterwards. --> - + From 75849745ab2c089dec0a596ebbf2f02c7d5763a6 Mon Sep 17 00:00:00 2001 From: Chet Husk Date: Thu, 17 Jan 2019 17:21:15 -0600 Subject: [PATCH 157/160] TcSymbolUseData cleanup per #6084 (#6089) * chunkify TcSymbolUseData * move LOH size out to a constant * do chunking and mapping together to reduce allocations * clarify comment around GC impacts * add comment informing others of the potential for LOH allocations --- src/absil/illib.fs | 49 ++++++++++++++++++++++++++++++++++- src/fsharp/NameResolution.fs | 21 ++++++++++----- src/fsharp/NameResolution.fsi | 4 +-- src/fsharp/service/service.fs | 6 +++-- 4 files changed, 68 insertions(+), 12 deletions(-) diff --git a/src/absil/illib.fs b/src/absil/illib.fs index 69b0030f910..44261606387 100644 --- a/src/absil/illib.fs +++ b/src/absil/illib.fs @@ -41,6 +41,10 @@ let inline isNonNull x = not (isNull x) let inline nonNull msg x = if isNull x then failwith ("null: " + msg) else x let inline (===) x y = LanguagePrimitives.PhysicalEquality x y +/// Per the docs the threshold for the Large Object Heap is 85000 bytes: https://docs.microsoft.com/en-us/dotnet/standard/garbage-collection/large-object-heap#how-an-object-ends-up-on-the-large-object-heap-and-how-gc-handles-them +/// We set the limit to slightly under that to allow for some 'slop' +let LOH_SIZE_THRESHOLD_BYTES = 84_900 + //--------------------------------------------------------------------- // Library: ReportTime //--------------------------------------------------------------------- @@ -91,7 +95,7 @@ module Order = let toFunction (pxOrder: IComparer<'U>) x y = pxOrder.Compare(x,y) //------------------------------------------------------------------------- -// Library: arrays,lists,options +// Library: arrays,lists,options,resizearrays //------------------------------------------------------------------------- module Array = @@ -432,6 +436,49 @@ module List = let existsSquared f xss = xss |> List.exists (fun xs -> xs |> List.exists (fun x -> f x)) let mapiFoldSquared f z xss = mapFoldSquared f z (xss |> mapiSquared (fun i j x -> (i,j,x))) +module ResizeArray = + + /// Split a ResizeArray into an array of smaller chunks. + /// This requires `items/chunkSize` Array copies of length `chunkSize` if `items/chunkSize % 0 = 0`, + /// otherwise `items/chunkSize + 1` Array copies. + let chunkBySize chunkSize f (items: ResizeArray<'t>) = + // we could use Seq.chunkBySize here, but that would involve many enumerator.MoveNext() calls that we can sidestep with a bit of math + let itemCount = items.Count + if itemCount = 0 + then [||] + else + let chunksCount = + match itemCount / chunkSize with + | n when itemCount % chunkSize = 0 -> n + | n -> n + 1 // any remainder means we need an additional chunk to store it + + [| for index in 0..chunksCount-1 do + let startIndex = index * chunkSize + let takeCount = min (itemCount - startIndex) chunkSize + + let holder = Array.zeroCreate takeCount + // we take a bounds-check hit here on each access. + // other alternatives here include + // * iterating across an IEnumerator (incurs MoveNext penalty) + // * doing a block copy using `List.CopyTo(index, array, index, count)` (requires more copies to do the mapping) + // none are significantly better. + for i in 0 .. takeCount - 1 do + holder.[i] <- f items.[i] + yield holder |] + + /// Split a large ResizeArray into a series of array chunks that are each under the Large Object Heap limit. + /// This is done to help prevent a stop-the-world collection of the single large array, instead allowing for a greater + /// probability of smaller collections. Stop-the-world is still possible, just less likely. + let mapToSmallArrayChunks f (inp: ResizeArray<'t>) = + let itemSizeBytes = sizeof<'t> + // rounding down here is good because it ensures we don't go over + let maxArrayItemCount = LOH_SIZE_THRESHOLD_BYTES / itemSizeBytes + + /// chunk the provided input into arrays that are smaller than the LOH limit + /// in order to prevent long-term storage of those values + chunkBySize maxArrayItemCount f inp + + /// Because FSharp.Compiler.Service is a library that will target FSharp.Core 4.5.2 for the forseeable future, /// we need to stick these functions in this module rather than using the module functions for ValueOption /// that come after FSharp.Core 4.5.2. diff --git a/src/fsharp/NameResolution.fs b/src/fsharp/NameResolution.fs index 43c15418490..9434740d314 100644 --- a/src/fsharp/NameResolution.fs +++ b/src/fsharp/NameResolution.fs @@ -1212,7 +1212,7 @@ let GetNestedTypesOfType (ad, ncenv:NameResolver, optFilter, staticResInfo, chec //------------------------------------------------------------------------- /// Represents the kind of the occurrence when reporting a name in name resolution -[] +[] type ItemOccurence = /// This is a binding / declaration of the item | Binding @@ -1496,17 +1496,24 @@ type TcSymbolUseData = /// This is a memory-critical data structure - allocations of this data structure and its immediate contents /// is one of the highest memory long-lived data structures in typical uses of IDEs. Not many of these objects /// are allocated (one per file), but they are large because the allUsesOfAllSymbols array is large. -type TcSymbolUses(g, capturedNameResolutions : ResizeArray, formatSpecifierLocations: (range * int)[]) = - +type TcSymbolUses(g, capturedNameResolutions : ResizeArray, formatSpecifierLocations: (range * int)[]) = + // Make sure we only capture the information we really need to report symbol uses - let allUsesOfSymbols = [| for cnr in capturedNameResolutions -> { Item=cnr.Item; ItemOccurence=cnr.ItemOccurence; DisplayEnv=cnr.DisplayEnv; Range=cnr.Range } |] + let allUsesOfSymbols = + capturedNameResolutions + |> ResizeArray.mapToSmallArrayChunks (fun cnr -> { Item=cnr.Item; ItemOccurence=cnr.ItemOccurence; DisplayEnv=cnr.DisplayEnv; Range=cnr.Range }) + let capturedNameResolutions = () do ignore capturedNameResolutions // don't capture this! member this.GetUsesOfSymbol(item) = - [| for symbolUse in allUsesOfSymbols do - if protectAssemblyExploration false (fun () -> ItemsAreEffectivelyEqual g item symbolUse.Item) then - yield symbolUse |] + // This member returns what is potentially a very large array, which may approach the size constraints of the Large Object Heap. + // This is unlikely in practice, though, because we filter down the set of all symbol uses to those specifically for the given `item`. + // Consequently we have a much lesser chance of ending up with an array large enough to be promoted to the LOH. + [| for symbolUseChunk in allUsesOfSymbols do + for symbolUse in symbolUseChunk do + if protectAssemblyExploration false (fun () -> ItemsAreEffectivelyEqual g item symbolUse.Item) then + yield symbolUse |] member this.AllUsesOfSymbols = allUsesOfSymbols diff --git a/src/fsharp/NameResolution.fsi b/src/fsharp/NameResolution.fsi index 10fe03ff0b1..a302e22ef17 100755 --- a/src/fsharp/NameResolution.fsi +++ b/src/fsharp/NameResolution.fsi @@ -240,7 +240,7 @@ type TypeNameResolutionInfo = static member ResolveToTypeRefs : TypeNameResolutionStaticArgsInfo -> TypeNameResolutionInfo /// Represents the kind of the occurrence when reporting a name in name resolution -[] +[] type internal ItemOccurence = | Binding | Use @@ -319,7 +319,7 @@ type internal TcSymbolUses = member GetUsesOfSymbol : Item -> TcSymbolUseData[] /// All the uses of all items within the file - member AllUsesOfSymbols : TcSymbolUseData[] + member AllUsesOfSymbols : TcSymbolUseData[][] /// Get the locations of all the printf format specifiers in the file member GetFormatSpecifierLocationsAndArity : unit -> (range * int)[] diff --git a/src/fsharp/service/service.fs b/src/fsharp/service/service.fs index f4694cdfaf5..7fbc49c1f39 100644 --- a/src/fsharp/service/service.fs +++ b/src/fsharp/service/service.fs @@ -1917,7 +1917,8 @@ type FSharpCheckProjectResults(projectFileName:string, tcConfigOption, keepAssem let cenv = SymbolEnv(tcGlobals, thisCcu, Some ccuSig, tcImports) [| for r in tcSymbolUses do - for symbolUse in r.AllUsesOfSymbols do + for symbolUseChunk in r.AllUsesOfSymbols do + for symbolUse in symbolUseChunk do if symbolUse.ItemOccurence <> ItemOccurence.RelatedText then let symbol = FSharpSymbol.Create(cenv, symbolUse.Item) yield FSharpSymbolUse(tcGlobals, symbolUse.DisplayEnv, symbol, symbolUse.ItemOccurence, symbolUse.Range) |] @@ -2111,7 +2112,8 @@ type FSharpCheckFileResults(filename: string, errors: FSharpErrorInfo[], scopeOp (fun () -> [| |]) (fun scope -> let cenv = scope.SymbolEnv - [| for symbolUse in scope.ScopeSymbolUses.AllUsesOfSymbols do + [| for symbolUseChunk in scope.ScopeSymbolUses.AllUsesOfSymbols do + for symbolUse in symbolUseChunk do if symbolUse.ItemOccurence <> ItemOccurence.RelatedText then let symbol = FSharpSymbol.Create(cenv, symbolUse.Item) yield FSharpSymbolUse(scope.TcGlobals, symbolUse.DisplayEnv, symbol, symbolUse.ItemOccurence, symbolUse.Range) |]) From 12e4d2aa1f04f0042ded75432e275c8375282bca Mon Sep 17 00:00:00 2001 From: Don Syme Date: Mon, 21 Jan 2019 16:24:26 +0000 Subject: [PATCH 158/160] add some docs (#6138) * add some docs * more docs * more docs * more docs/spacing * more docs/spacing * more docs/spacing --- src/fsharp/IlxGen.fs | 2 +- src/fsharp/Optimizer.fs | 12 +- src/fsharp/SignatureConformance.fs | 4 +- src/fsharp/TastOps.fs | 84 +- src/fsharp/TastOps.fsi | 1168 +++++++++++++++++++++------- src/fsharp/TypeChecker.fs | 2 +- 6 files changed, 957 insertions(+), 315 deletions(-) diff --git a/src/fsharp/IlxGen.fs b/src/fsharp/IlxGen.fs index 9bd796db143..d027afabeb5 100644 --- a/src/fsharp/IlxGen.fs +++ b/src/fsharp/IlxGen.fs @@ -764,7 +764,7 @@ let StorageForVal m v eenv = try eenv.valsInScope.[v] with :? KeyNotFoundException -> assert false - errorR(Error(FSComp.SR.ilUndefinedValue(showL(vspecAtBindL v)),m)) + errorR(Error(FSComp.SR.ilUndefinedValue(showL(valAtBindL v)),m)) notlazy (Arg 668(* random value for post-hoc diagnostic analysis on generated tree *) ) v.Force() diff --git a/src/fsharp/Optimizer.fs b/src/fsharp/Optimizer.fs index b97e6b7da7a..5e345822675 100644 --- a/src/fsharp/Optimizer.fs +++ b/src/fsharp/Optimizer.fs @@ -976,11 +976,11 @@ let AbstractLazyModulInfoByHiding isAssemblyBoundary mhi = // Under those checks, the further hidden* checks may be subsumed (meaning, not required anymore). let hiddenTycon, hiddenTyconRepr, hiddenVal, hiddenRecdField, hiddenUnionCase = - Zset.memberOf mhi.mhiTycons, - Zset.memberOf mhi.mhiTyconReprs, - Zset.memberOf mhi.mhiVals, - Zset.memberOf mhi.mhiRecdFields, - Zset.memberOf mhi.mhiUnionCases + Zset.memberOf mhi.HiddenTycons, + Zset.memberOf mhi.HiddenTyconReprs, + Zset.memberOf mhi.HiddenVals, + Zset.memberOf mhi.HiddenRecdFields, + Zset.memberOf mhi.HiddenUnionCases let rec abstractExprInfo ivalue = match ivalue with @@ -3229,7 +3229,7 @@ and OptimizeModuleExpr cenv env x = not (ValueIsUsedOrHasEffect cenv (fun () -> fvs.FreeLocals) (bind, binfo)) && // Check the thing is hidden by the signature (if any) - hidden.mhiVals.Contains bind.Var && + hidden.HiddenVals.Contains bind.Var && // Check the thing is not compiled as a static field or property, since reflected definitions and other reflective stuff might need it not (IsCompiledAsStaticProperty cenv.g bind.Var)) diff --git a/src/fsharp/SignatureConformance.fs b/src/fsharp/SignatureConformance.fs index ed5c04da71f..ac0c23e9709 100644 --- a/src/fsharp/SignatureConformance.fs +++ b/src/fsharp/SignatureConformance.fs @@ -37,8 +37,8 @@ type Checker(g, amap, denv, remapInfo: SignatureRepackageInfo, checkingSig) = // Used when checking attributes. let sigToImplRemap = let remap = Remap.Empty - let remap = (remapInfo.mrpiEntities,remap) ||> List.foldBack (fun (implTcref ,signTcref) acc -> addTyconRefRemap signTcref implTcref acc) - let remap = (remapInfo.mrpiVals ,remap) ||> List.foldBack (fun (implValRef,signValRef) acc -> addValRemap signValRef.Deref implValRef.Deref acc) + let remap = (remapInfo.RepackagedEntities,remap) ||> List.foldBack (fun (implTcref ,signTcref) acc -> addTyconRefRemap signTcref implTcref acc) + let remap = (remapInfo.RepackagedVals ,remap) ||> List.foldBack (fun (implValRef,signValRef) acc -> addValRemap signValRef.Deref implValRef.Deref acc) remap // For all attributable elements (types, modules, exceptions, record fields, unions, parameters, generic type parameters) diff --git a/src/fsharp/TastOps.fs b/src/fsharp/TastOps.fs index 19414aa5f5b..23242b1aff6 100644 --- a/src/fsharp/TastOps.fs +++ b/src/fsharp/TastOps.fs @@ -3442,7 +3442,7 @@ module DebugPrint = begin let rec MemberL (v:Val) (membInfo:ValMemberInfo) = (aboveListL [ wordL(tagText "compiled_name! = ") ^^ wordL (tagText v.CompiledName) ; wordL(tagText "membInfo-slotsig! = ") ^^ listL slotSigL membInfo.ImplementedSlotSigs ]) - and vspecAtBindL v = + and valAtBindL v = let vL = valL v in let mutL = (if v.IsMutable then wordL(tagText "mutable") ++ vL else vL) mutL --- (aboveListL (List.concat [[wordL(tagText ":") ^^ typeL v.Type]; @@ -3512,7 +3512,7 @@ module DebugPrint = begin then emptyL else let iimplsLs = iimpls |> List.map (fun (ty, _, _) -> wordL(tagText "interface") --- typeL ty) - let adhocLs = adhoc |> List.map (fun vref -> vspecAtBindL vref.Deref) + let adhocLs = adhoc |> List.map (fun vref -> valAtBindL vref.Deref) (wordL(tagText "with") @@-- aboveListL (iimplsLs @ adhocLs)) @@ wordL(tagText "end") let layoutUnionCaseArgTypes argtys = sepListL (wordL(tagText "*")) (List.map typeL argtys) @@ -3559,7 +3559,7 @@ module DebugPrint = begin let vsprs = tycon.MembersOfFSharpTyconSorted |> List.filter (fun v -> v.IsDispatchSlot) - |> List.map (fun vref -> vspecAtBindL vref.Deref) + |> List.map (fun vref -> valAtBindL vref.Deref) let vals = tycon.TrueFieldsAsList |> List.map (fun f -> (if f.IsStatic then wordL(tagText "static") else emptyL) ^^ wordL(tagText "val") ^^ layoutRecdField f) let alldecls = inherits @ vsprs @ vals let emptyMeasure = match tycon.TypeOrMeasureKind with TyparKind.Measure -> isNil alldecls | _ -> false @@ -3590,7 +3590,7 @@ module DebugPrint = begin //-------------------------------------------------------------------------- and bindingL (TBind(v, repr, _)) = - vspecAtBindL v --- (wordL(tagText "=") ^^ exprL repr) + valAtBindL v --- (wordL(tagText "=") ^^ exprL repr) and exprL expr = exprWrapL false expr and atomL expr = exprWrapL true expr // true means bracket if needed to be atomic expr @@ -3628,11 +3628,11 @@ module DebugPrint = begin | ThenDoSeq -> "; (*ThenDo*)" ((exprL x0 ^^ rightL (tagText flag)) @@ exprL x1) |> wrap | Expr.Lambda(_, _, baseValOpt, argvs, body, _, _) -> - let formalsL = spaceListL (List.map vspecAtBindL argvs) in + let formalsL = spaceListL (List.map valAtBindL argvs) in let bindingL = match baseValOpt with | None -> wordL(tagText "lam") ^^ formalsL ^^ rightL(tagText ".") - | Some basev -> wordL(tagText "lam") ^^ (leftL(tagText "base=") ^^ vspecAtBindL basev) --- formalsL ^^ rightL(tagText ".") in + | Some basev -> wordL(tagText "lam") ^^ (leftL(tagText "base=") ^^ valAtBindL basev) --- formalsL ^^ rightL(tagText ".") in (bindingL ++ exprL body) |> wrap | Expr.TyLambda(_, argtyvs, body, _, _) -> ((wordL(tagText "LAM") ^^ spaceListL (List.map typarL argtyvs) ^^ rightL(tagText ".")) ++ exprL body) |> wrap @@ -3727,7 +3727,7 @@ module DebugPrint = begin | Expr.Obj (_lambdaId, ty, basev, ccall, overrides, iimpls, _) -> wordL(tagText "OBJ:") ^^ aboveListL [typeL ty; exprL ccall; - optionL vspecAtBindL basev; + optionL valAtBindL basev; aboveListL (List.map overrideL overrides); aboveListL (List.map iimplL iimpls)] @@ -3812,7 +3812,7 @@ module DebugPrint = begin and tmethodL (TObjExprMethod(TSlotSig(nm, _, _, _, _, _), _, tps, vs, e, _)) = (wordL(tagText "TObjExprMethod") --- (wordL (tagText nm)) ^^ wordL(tagText "=")) -- (wordL(tagText "METH-LAM") --- angleBracketListL (List.map typarL tps) ^^ rightL(tagText ".")) --- - (wordL(tagText "meth-lam") --- tupleL (List.map (List.map vspecAtBindL >> tupleL) vs) ^^ rightL(tagText ".")) --- + (wordL(tagText "meth-lam") --- tupleL (List.map (List.map valAtBindL >> tupleL) vs) ^^ rightL(tagText ".")) --- (atomL e) and overrideL tmeth = wordL(tagText "with") ^^ tmethodL tmeth and iimplL (ty, tmeths) = wordL(tagText "impl") ^^ aboveListL (typeL ty :: List.map tmethodL tmeths) @@ -3850,33 +3850,33 @@ let SigTypeOfImplFile (TImplFile(_, _, mexpr, _, _, _)) = mexpr.Type //-------------------------------------------------------------------------- type SignatureRepackageInfo = - { mrpiVals : (ValRef * ValRef) list; - mrpiEntities: (TyconRef * TyconRef) list } + { RepackagedVals : (ValRef * ValRef) list; + RepackagedEntities: (TyconRef * TyconRef) list } - member remapInfo.ImplToSigMapping = { TypeEquivEnv.Empty with EquivTycons = TyconRefMap.OfList remapInfo.mrpiEntities } - static member Empty = { mrpiVals = []; mrpiEntities= [] } + member remapInfo.ImplToSigMapping = { TypeEquivEnv.Empty with EquivTycons = TyconRefMap.OfList remapInfo.RepackagedEntities } + static member Empty = { RepackagedVals = []; RepackagedEntities= [] } type SignatureHidingInfo = - { mhiTycons : Zset; - mhiTyconReprs : Zset; - mhiVals : Zset; - mhiRecdFields : Zset; - mhiUnionCases : Zset } + { HiddenTycons : Zset; + HiddenTyconReprs : Zset; + HiddenVals : Zset; + HiddenRecdFields : Zset; + HiddenUnionCases : Zset } static member Empty = - { mhiTycons = Zset.empty tyconOrder; - mhiTyconReprs = Zset.empty tyconOrder; - mhiVals = Zset.empty valOrder; - mhiRecdFields = Zset.empty recdFieldRefOrder; - mhiUnionCases = Zset.empty unionCaseRefOrder } + { HiddenTycons = Zset.empty tyconOrder; + HiddenTyconReprs = Zset.empty tyconOrder; + HiddenVals = Zset.empty valOrder; + HiddenRecdFields = Zset.empty recdFieldRefOrder; + HiddenUnionCases = Zset.empty unionCaseRefOrder } let addValRemap v v' tmenv = { tmenv with valRemap= tmenv.valRemap.Add v (mkLocalValRef v') } let mkRepackageRemapping mrpi = - { valRemap = ValMap.OfList (mrpi.mrpiVals |> List.map (fun (vref, x) -> vref.Deref, x)); + { valRemap = ValMap.OfList (mrpi.RepackagedVals |> List.map (fun (vref, x) -> vref.Deref, x)); tpinst = emptyTyparInst; - tyconRefRemap = TyconRefMap.OfList mrpi.mrpiEntities + tyconRefRemap = TyconRefMap.OfList mrpi.RepackagedEntities removeTraitSolutions = false } //-------------------------------------------------------------------------- @@ -3888,18 +3888,18 @@ let accEntityRemap (msigty:ModuleOrNamespaceType) (entity:Entity) (mrpi, mhi) = match sigtyconOpt with | None -> // The type constructor is not present in the signature. Hence it is hidden. - let mhi = { mhi with mhiTycons = Zset.add entity mhi.mhiTycons } + let mhi = { mhi with HiddenTycons = Zset.add entity mhi.HiddenTycons } (mrpi, mhi) | Some sigtycon -> // The type constructor is in the signature. Hence record the repackage entry let sigtcref = mkLocalTyconRef sigtycon let tcref = mkLocalTyconRef entity - let mrpi = { mrpi with mrpiEntities = ((tcref, sigtcref) :: mrpi.mrpiEntities) } + let mrpi = { mrpi with RepackagedEntities = ((tcref, sigtcref) :: mrpi.RepackagedEntities) } // OK, now look for hidden things let mhi = if (match entity.TypeReprInfo with TNoRepr -> false | _ -> true) && (match sigtycon.TypeReprInfo with TNoRepr -> true | _ -> false) then // The type representation is absent in the signature, hence it is hidden - { mhi with mhiTyconReprs = Zset.add entity mhi.mhiTyconReprs } + { mhi with HiddenTyconReprs = Zset.add entity mhi.HiddenTyconReprs } else // The type representation is present in the signature. // Find the fields that have been hidden or which were non-public anyway. @@ -3912,7 +3912,7 @@ let accEntityRemap (msigty:ModuleOrNamespaceType) (entity:Entity) (mrpi, mhi) = | _ -> // The field is not in the signature. Hence it is regarded as hidden. let rfref = tcref.MakeNestedRecdFieldRef rfield - { mhi with mhiRecdFields = Zset.add rfref mhi.mhiRecdFields }) + { mhi with HiddenRecdFields = Zset.add rfref mhi.HiddenRecdFields }) entity.AllFieldsArray |> List.foldBack (fun (ucase:UnionCase) mhi -> match sigtycon.GetUnionCaseByName ucase.DisplayName with @@ -3922,7 +3922,7 @@ let accEntityRemap (msigty:ModuleOrNamespaceType) (entity:Entity) (mrpi, mhi) = | _ -> // The constructor is not in the signature. Hence it is regarded as hidden. let ucref = tcref.MakeNestedUnionCaseRef ucase - { mhi with mhiUnionCases = Zset.add ucref mhi.mhiUnionCases }) + { mhi with HiddenUnionCases = Zset.add ucref mhi.HiddenUnionCases }) (entity.UnionCasesAsList) (mrpi, mhi) @@ -3931,13 +3931,13 @@ let accSubEntityRemap (msigty:ModuleOrNamespaceType) (entity:Entity) (mrpi, mhi) match sigtyconOpt with | None -> // The type constructor is not present in the signature. Hence it is hidden. - let mhi = { mhi with mhiTycons = Zset.add entity mhi.mhiTycons } + let mhi = { mhi with HiddenTycons = Zset.add entity mhi.HiddenTycons } (mrpi, mhi) | Some sigtycon -> // The type constructor is in the signature. Hence record the repackage entry let sigtcref = mkLocalTyconRef sigtycon let tcref = mkLocalTyconRef entity - let mrpi = { mrpi with mrpiEntities = ((tcref, sigtcref) :: mrpi.mrpiEntities) } + let mrpi = { mrpi with RepackagedEntities = ((tcref, sigtcref) :: mrpi.RepackagedEntities) } (mrpi, mhi) let valLinkageAEquiv g aenv (v1:Val) (v2:Val) = @@ -3955,11 +3955,11 @@ let accValRemap g aenv (msigty:ModuleOrNamespaceType) (implVal:Val) (mrpi, mhi) match sigValOpt with | None -> if verbose then dprintf "accValRemap, hide = %s#%d\n" implVal.LogicalName implVal.Stamp - let mhi = { mhi with mhiVals = Zset.add implVal mhi.mhiVals } + let mhi = { mhi with HiddenVals = Zset.add implVal mhi.HiddenVals } (mrpi, mhi) | Some (sigVal:Val) -> // The value is in the signature. Add the repackage entry. - let mrpi = { mrpi with mrpiVals = (vref, mkLocalValRef sigVal) :: mrpi.mrpiVals } + let mrpi = { mrpi with RepackagedVals = (vref, mkLocalValRef sigVal) :: mrpi.RepackagedVals } (mrpi, mhi) let getCorrespondingSigTy nm (msigty:ModuleOrNamespaceType) = @@ -4053,9 +4053,9 @@ let ComputeRemappingFromImplementationToSignature g mdef msigty = let accTyconHidingInfoAtAssemblyBoundary (tycon:Tycon) mhi = if not (canAccessFromEverywhere tycon.Accessibility) then // The type constructor is not public, hence hidden at the assembly boundary. - { mhi with mhiTycons = Zset.add tycon mhi.mhiTycons } + { mhi with HiddenTycons = Zset.add tycon mhi.HiddenTycons } elif not (canAccessFromEverywhere tycon.TypeReprAccessibility) then - { mhi with mhiTyconReprs = Zset.add tycon mhi.mhiTyconReprs } + { mhi with HiddenTyconReprs = Zset.add tycon mhi.HiddenTyconReprs } else mhi |> Array.foldBack @@ -4063,7 +4063,7 @@ let accTyconHidingInfoAtAssemblyBoundary (tycon:Tycon) mhi = if not (canAccessFromEverywhere rfield.Accessibility) then let tcref = mkLocalTyconRef tycon let rfref = tcref.MakeNestedRecdFieldRef rfield - { mhi with mhiRecdFields = Zset.add rfref mhi.mhiRecdFields } + { mhi with HiddenRecdFields = Zset.add rfref mhi.HiddenRecdFields } else mhi) tycon.AllFieldsArray |> List.foldBack @@ -4071,7 +4071,7 @@ let accTyconHidingInfoAtAssemblyBoundary (tycon:Tycon) mhi = if not (canAccessFromEverywhere ucase.Accessibility) then let tcref = mkLocalTyconRef tycon let ucref = tcref.MakeNestedUnionCaseRef ucase - { mhi with mhiUnionCases = Zset.add ucref mhi.mhiUnionCases } + { mhi with HiddenUnionCases = Zset.add ucref mhi.HiddenUnionCases } else mhi) (tycon.UnionCasesAsList) @@ -4086,7 +4086,7 @@ let accValHidingInfoAtAssemblyBoundary (vspec:Val) mhi = // anything that's not a module or member binding gets assembly visibility not vspec.IsMemberOrModuleBinding then // The value is not public, hence hidden at the assembly boundary. - { mhi with mhiVals = Zset.add vspec mhi.mhiVals } + { mhi with HiddenVals = Zset.add vspec mhi.HiddenVals } else mhi @@ -4121,10 +4121,10 @@ let IsHidden setF accessF remapF debugF = if verbose then dprintf "IsHidden, #mrmi = %d, %s = %b\n" mrmi.Length (showL (debugF x)) res; res -let IsHiddenTycon mrmi x = IsHidden (fun mhi -> mhi.mhiTycons) (fun tc -> tc.Accessibility) (fun rpi x -> (remapTyconRef rpi.tyconRefRemap (mkLocalTyconRef x)).Deref) DebugPrint.tyconL mrmi x -let IsHiddenTyconRepr mrmi x = IsHidden (fun mhi -> mhi.mhiTyconReprs) (fun v -> v.TypeReprAccessibility) (fun rpi x -> (remapTyconRef rpi.tyconRefRemap (mkLocalTyconRef x)).Deref) DebugPrint.tyconL mrmi x -let IsHiddenVal mrmi x = IsHidden (fun mhi -> mhi.mhiVals) (fun v -> v.Accessibility) (fun rpi x -> (remapValRef rpi (mkLocalValRef x)).Deref) DebugPrint.valL mrmi x -let IsHiddenRecdField mrmi x = IsHidden (fun mhi -> mhi.mhiRecdFields) (fun rfref -> rfref.RecdField.Accessibility) (fun rpi x -> remapRecdFieldRef rpi.tyconRefRemap x) DebugPrint.recdFieldRefL mrmi x +let IsHiddenTycon mrmi x = IsHidden (fun mhi -> mhi.HiddenTycons) (fun tc -> tc.Accessibility) (fun rpi x -> (remapTyconRef rpi.tyconRefRemap (mkLocalTyconRef x)).Deref) DebugPrint.tyconL mrmi x +let IsHiddenTyconRepr mrmi x = IsHidden (fun mhi -> mhi.HiddenTyconReprs) (fun v -> v.TypeReprAccessibility) (fun rpi x -> (remapTyconRef rpi.tyconRefRemap (mkLocalTyconRef x)).Deref) DebugPrint.tyconL mrmi x +let IsHiddenVal mrmi x = IsHidden (fun mhi -> mhi.HiddenVals) (fun v -> v.Accessibility) (fun rpi x -> (remapValRef rpi (mkLocalValRef x)).Deref) DebugPrint.valL mrmi x +let IsHiddenRecdField mrmi x = IsHidden (fun mhi -> mhi.HiddenRecdFields) (fun rfref -> rfref.RecdField.Accessibility) (fun rpi x -> remapRecdFieldRef rpi.tyconRefRemap x) DebugPrint.recdFieldRefL mrmi x //-------------------------------------------------------------------------- diff --git a/src/fsharp/TastOps.fsi b/src/fsharp/TastOps.fsi index 0731970c195..badacfda0ea 100755 --- a/src/fsharp/TastOps.fsi +++ b/src/fsharp/TastOps.fsi @@ -3,26 +3,18 @@ /// Defines derived expression manipulation and construction functions. module internal Microsoft.FSharp.Compiler.Tastops -open System.Text open System.Collections.Generic open Internal.Utilities open Microsoft.FSharp.Compiler.AbstractIL open Microsoft.FSharp.Compiler.AbstractIL.IL open Microsoft.FSharp.Compiler.AbstractIL.Internal -open Microsoft.FSharp.Compiler.AbstractIL.Internal.Library open Microsoft.FSharp.Compiler open Microsoft.FSharp.Compiler.Range open Microsoft.FSharp.Compiler.Rational open Microsoft.FSharp.Compiler.Ast -open Microsoft.FSharp.Compiler.ErrorLogger open Microsoft.FSharp.Compiler.Tast open Microsoft.FSharp.Compiler.TcGlobals open Microsoft.FSharp.Compiler.Layout -open Microsoft.FSharp.Compiler.Lib - -#if !NO_EXTENSIONTYPING -open Microsoft.FSharp.Compiler.ExtensionTyping -#endif //------------------------------------------------------------------------- // Type equivalence @@ -42,10 +34,6 @@ val measureEquiv : TcGlobals -> Measure -> Measure -> bool /// Reduce a type to its more anonical form subject to an erasure flag, inference equations and abbreviations val stripTyEqnsWrtErasure: Erasure -> TcGlobals -> TType -> TType -//------------------------------------------------------------------------- -// Build common types -//------------------------------------------------------------------------- - /// Build a function type val mkFunTy : TType -> TType -> TType @@ -77,139 +65,232 @@ val stripExpr : Expr -> Expr /// Get the values for a set of bindings val valsOfBinds : Bindings -> Vals -val (|ExprValWithPossibleTypeInst|_|) : Expr -> (ValRef * ValUseFlag * TType list * range) option -//------------------------------------------------------------------------- -// Build decision trees imperatively -//------------------------------------------------------------------------- +/// Look for a use of an F# value, possibly including application of a generic thing to a set of type arguments +val (|ExprValWithPossibleTypeInst|_|) : Expr -> (ValRef * ValUseFlag * TType list * range) option +/// Build decision trees imperatively type MatchBuilder = + + /// Create a new builder new : SequencePointInfoForBinding * range -> MatchBuilder + + /// Add a new destination target member AddTarget : DecisionTreeTarget -> int + + /// Add a new destination target that is an expression result member AddResultTarget : Expr * SequencePointInfoForTarget -> DecisionTree + + /// Finish the targets member CloseTargets : unit -> DecisionTreeTarget list - member Close : DecisionTree * range * TType -> Expr -//------------------------------------------------------------------------- -// Make some special decision graphs -//------------------------------------------------------------------------- + /// Build the overall expression + member Close : DecisionTree * range * TType -> Expr +/// Add an if-then-else boolean conditional node into a decision tree val mkBoolSwitch : range -> Expr -> DecisionTree -> DecisionTree -> DecisionTree + +/// Build a conditional expression val primMkCond : SequencePointInfoForBinding -> SequencePointInfoForTarget -> SequencePointInfoForTarget -> range -> TType -> Expr -> Expr -> Expr -> Expr + +/// Build a conditional expression val mkCond : SequencePointInfoForBinding -> SequencePointInfoForTarget -> range -> TType -> Expr -> Expr -> Expr -> Expr + +/// Build a conditional expression that checks for non-nullness val mkNonNullCond : TcGlobals -> range -> TType -> Expr -> Expr -> Expr -> Expr -val mkIfThen : TcGlobals -> range -> Expr -> Expr -> Expr -//------------------------------------------------------------------------- -// Generate new locals -//------------------------------------------------------------------------- +/// Build an if-then statement +val mkIfThen : TcGlobals -> range -> Expr -> Expr -> Expr +/// Build an expression corresponding to the use of a value /// Note: try to use exprForValRef or the expression returned from mkLocal instead of this. val exprForVal : range -> Val -> Expr + +/// Build an expression corresponding to the use of a reference to a value val exprForValRef : range -> ValRef -> Expr -/// Return the local and an expression to reference it +/// Make a new local value and build an expression to reference it val mkLocal : range -> string -> TType -> Val * Expr + +/// Make a new compiler-generated local value and build an expression to reference it val mkCompGenLocal : range -> string -> TType -> Val * Expr + +/// Make a new mutable compiler-generated local value and build an expression to reference it val mkMutableCompGenLocal : range -> string -> TType -> Val * Expr -val mkCompGenLocalAndInvisbleBind : TcGlobals -> string -> range -> Expr -> Val * Expr * Binding -//------------------------------------------------------------------------- -// Make lambdas -//------------------------------------------------------------------------- +/// Make a new mutable compiler-generated local value, 'let' bind it to an expression +/// 'invisibly' (no sequence point etc.), and build an expression to reference it +val mkCompGenLocalAndInvisbleBind : TcGlobals -> string -> range -> Expr -> Val * Expr * Binding +/// Build a lambda expression taking multiple values val mkMultiLambda : range -> Val list -> Expr * TType -> Expr + +/// Rebuild a lambda during an expression tree traversal val rebuildLambda : range -> Val option -> Val option -> Val list -> Expr * TType -> Expr + +/// Build a lambda expression taking a single value val mkLambda : range -> Val -> Expr * TType -> Expr + +/// Build a generic lambda expression (type abstraction) val mkTypeLambda : range -> Typars -> Expr * TType -> Expr + +/// Build an object expression val mkObjExpr : TType * Val option * Expr * ObjExprMethod list * (TType * ObjExprMethod list) list * Range.range -> Expr + +/// Build an type-chose expression, indicating that a local free choice of a type variable val mkTypeChoose : range -> Typars -> Expr -> Expr + +/// Build an iterated (curried) lambda expression val mkLambdas : range -> Typars -> Val list -> Expr * TType -> Expr + +/// Build an iterated (tupled+curried) lambda expression val mkMultiLambdasCore : range -> Val list list -> Expr * TType -> Expr * TType + +/// Build an iterated generic (type abstraction + tupled+curried) lambda expression val mkMultiLambdas : range -> Typars -> Val list list -> Expr * TType -> Expr + +/// Build a lambda expression that corresponds to the implementation of a member val mkMemberLambdas : range -> Typars -> Val option -> Val option -> Val list list -> Expr * TType -> Expr +/// Build a 'while' loop expression val mkWhile : TcGlobals -> SequencePointInfoForWhileLoop * SpecialWhileLoopMarker * Expr * Expr * range -> Expr + +/// Build a 'for' loop expression val mkFor : TcGlobals -> SequencePointInfoForForLoop * Val * Expr * ForLoopStyle * Expr * Expr * range -> Expr + +/// Build a 'try/with' expression val mkTryWith : TcGlobals -> Expr * (* filter val *) Val * (* filter expr *) Expr * (* handler val *) Val * (* handler expr *) Expr * range * TType * SequencePointInfoForTry * SequencePointInfoForWith -> Expr -val mkTryFinally: TcGlobals -> Expr * Expr * range * TType * SequencePointInfoForTry * SequencePointInfoForFinally -> Expr -//------------------------------------------------------------------------- -// Make let/letrec -//------------------------------------------------------------------------- - +/// Build a 'try/finally' expression +val mkTryFinally: TcGlobals -> Expr * Expr * range * TType * SequencePointInfoForTry * SequencePointInfoForFinally -> Expr -// Generate a user-level let-bindings +/// Build a user-level value binding val mkBind : SequencePointInfoForBinding -> Val -> Expr -> Binding + +/// Build a user-level let-binding val mkLetBind : range -> Binding -> Expr -> Expr + +/// Build a user-level value sequence of let bindings val mkLetsBind : range -> Binding list -> Expr -> Expr + +/// Build a user-level value sequence of let bindings val mkLetsFromBindings : range -> Bindings -> Expr -> Expr + +/// Build a user-level let expression val mkLet : SequencePointInfoForBinding -> range -> Val -> Expr -> Expr -> Expr + +/// Make a binding that binds a function value to a lambda taking multiple arguments val mkMultiLambdaBind : Val -> SequencePointInfoForBinding -> range -> Typars -> Val list list -> Expr * TType -> Binding // Compiler generated bindings may involve a user variable. // Compiler generated bindings may give rise to a sequence point if they are part of // an SPAlways expression. Compiler generated bindings can arise from for example, inlining. val mkCompGenBind : Val -> Expr -> Binding + +/// Make a set of bindings that bind compiler generated values to corresponding expressions. +/// Compiler-generated bindings do not give rise to a sequence point in debugging. val mkCompGenBinds : Val list -> Exprs -> Bindings + +/// Make a let-expression that locally binds a compiler-generated value to an expression. +/// Compiler-generated bindings do not give rise to a sequence point in debugging. val mkCompGenLet : range -> Val -> Expr -> Expr -> Expr + +/// Make a let-expression that locally binds a compiler-generated value to an expression, where the expression +/// is returned by the given continuation. Compiler-generated bindings do not give rise to a sequence point in debugging. val mkCompGenLetIn: range -> string -> TType -> Expr -> (Val * Expr -> Expr) -> Expr -// Invisible bindings are never given a sequence point and should never have side effects +/// Make a let-expression that locally binds a value to an expression in an "invisible" way. +/// Invisible bindings are not given a sequence point and should not have side effects. val mkInvisibleLet : range -> Val -> Expr -> Expr -> Expr + +/// Make a binding that binds a value to an expression in an "invisible" way. +/// Invisible bindings are not given a sequence point and should not have side effects. val mkInvisibleBind : Val -> Expr -> Binding + +/// Make a set of bindings that bind values to expressions in an "invisible" way. +/// Invisible bindings are not given a sequence point and should not have side effects. val mkInvisibleBinds : Vals -> Exprs -> Bindings + +/// Make a let-rec expression that locally binds values to expressions where self-reference back to the values is possible. val mkLetRecBinds : range -> Bindings -> Expr -> Expr -//------------------------------------------------------------------------- -// Generalization/inference helpers -//------------------------------------------------------------------------- - /// TypeScheme (generalizedTypars, tauTy) /// /// generalizedTypars -- the truly generalized type parameters /// tauTy -- the body of the generalized type. A 'tau' type is one with its type parameters stripped off. type TypeScheme = TypeScheme of Typars * TType +/// Make the right-hand side of a generalized binding, incorporating the generalized generic parameters from the type +/// scheme into the right-hand side as type generalizations. val mkGenericBindRhs : TcGlobals -> range -> Typars -> TypeScheme -> Expr -> Expr -val isBeingGeneralized : Typar -> TypeScheme -> bool -//------------------------------------------------------------------------- -// Make lazy and/or -//------------------------------------------------------------------------- +/// Test if the type parameter is one of those being generalized by a type scheme. +val isBeingGeneralized : Typar -> TypeScheme -> bool +/// Make the expression corresponding to 'expr1 && expr2' val mkLazyAnd : TcGlobals -> range -> Expr -> Expr -> Expr + +/// Make the expression corresponding to 'expr1 || expr2' val mkLazyOr : TcGlobals -> range -> Expr -> Expr -> Expr + +/// Make a byref type val mkByrefTy : TcGlobals -> TType -> TType + +/// Make a byref type with a in/out kind inference parameter val mkByrefTyWithInference : TcGlobals -> TType -> TType -> TType + +/// Make a in-byref type with a in kind parameter val mkInByrefTy : TcGlobals -> TType -> TType -val mkOutByrefTy : TcGlobals -> TType -> TType -//------------------------------------------------------------------------- -// Make construction operations -//------------------------------------------------------------------------- +/// Make an out-byref type with an out kind parameter +val mkOutByrefTy : TcGlobals -> TType -> TType +/// Make an expression that constructs a union case, e.g. 'Some(expr)' val mkUnionCaseExpr : UnionCaseRef * TypeInst * Exprs * range -> Expr + +/// Make an expression that constructs an exception value val mkExnExpr : TyconRef * Exprs * range -> Expr + +/// Make an expression that is IL assembly code val mkAsmExpr : ILInstr list * TypeInst * Exprs * TTypes * range -> Expr + +/// Make an expression that coerces one expression to another type val mkCoerceExpr : Expr * TType * range * TType -> Expr -val mkReraise : range -> TType -> Expr -val mkReraiseLibCall : TcGlobals -> TType -> range -> Expr +/// Make an expression that re-raises an exception +val mkReraise : range -> TType -> Expr -//------------------------------------------------------------------------- -// Make projection operations -//------------------------------------------------------------------------- +/// Make an expression that re-raises an exception via a library call +val mkReraiseLibCall : TcGlobals -> TType -> range -> Expr +/// Make an expression that gets an item from a tuple val mkTupleFieldGet : TcGlobals -> TupInfo * Expr * TypeInst * int * range -> Expr + +/// Make an expression that gets an item from an anonymous record val mkAnonRecdFieldGet : TcGlobals -> AnonRecdTypeInfo * Expr * TypeInst * int * range -> Expr + +/// Make an expression that gets an item from an anonymous record (via the address of the value if it is a struct) val mkAnonRecdFieldGetViaExprAddr : AnonRecdTypeInfo * Expr * TypeInst * int * range -> Expr + +/// Make an expression that gets an instance field from a record or class (via the address of the value if it is a struct) val mkRecdFieldGetViaExprAddr : Expr * RecdFieldRef * TypeInst * range -> Expr + +/// Make an expression that gets the address of an instance field from a record or class (via the address of the value if it is a struct) val mkRecdFieldGetAddrViaExprAddr : readonly: bool * Expr * RecdFieldRef * TypeInst * range -> Expr + +/// Make an expression that gets a static field from a record or class val mkStaticRecdFieldGet : RecdFieldRef * TypeInst * range -> Expr + +/// Make an expression that sets a static field in a record or class val mkStaticRecdFieldSet : RecdFieldRef * TypeInst * Expr * range -> Expr + +/// Make an expression that gets the address of a static field in a record or class val mkStaticRecdFieldGetAddr : readonly: bool * RecdFieldRef * TypeInst * range -> Expr + +/// Make an expression that sets an instance the field of a record or class (via the address of the value if it is a struct) val mkRecdFieldSetViaExprAddr : Expr * RecdFieldRef * TypeInst * Expr * range -> Expr + +/// Make an expression that gets the tag of a union value (via the address of the value if it is a struct) val mkUnionCaseTagGetViaExprAddr : Expr * TyconRef * TypeInst * range -> Expr /// Make a 'TOp.UnionCaseProof' expression, which proves a union value is over a particular case (used only for ref-unions, not struct-unions) @@ -238,9 +319,13 @@ val mkUnionCaseFieldSet : Expr * UnionCaseRef * TypeInst * int * E /// Like mkUnionCaseFieldGetUnprovenViaExprAddr, but for struct-unions, the input should be a copy of the expression. val mkUnionCaseFieldGetUnproven : TcGlobals -> Expr * UnionCaseRef * TypeInst * int * range -> Expr +/// Make an expression that gets an instance field from an F# exception value val mkExnCaseFieldGet : Expr * TyconRef * int * range -> Expr + +/// Make an expression that sets an instance field in an F# exception value val mkExnCaseFieldSet : Expr * TyconRef * int * Expr * range -> Expr +/// Make an expression that gets the address of an element in an array val mkArrayElemAddress : TcGlobals -> readonly: bool * ILReadonly * bool * ILArrayShape * TType * Expr list * range -> Expr //------------------------------------------------------------------------- @@ -272,49 +357,60 @@ val mkGetTupleItemN : TcGlobals -> range -> int -> ILType -> bool -> Expr -> TTy /// Evaluate the TupInfo to work out if it is a struct or a ref. Currently this is very simple /// but TupInfo may later be used carry variables that infer structness. val evalTupInfoIsStruct : TupInfo -> bool + +/// Evaluate the AnonRecdTypeInfo to work out if it is a struct or a ref. val evalAnonInfoIsStruct : AnonRecdTypeInfo -> bool /// If it is a tuple type, ensure it's outermost type is a .NET tuple type, otherwise leave unchanged val convertToTypeWithMetadataIfPossible : TcGlobals -> TType -> TType - -//------------------------------------------------------------------------- -// Take the address of an expression, or force it into a mutable local. Any allocated -// mutable local may need to be kept alive over a larger expression, hence we return -// a wrapping function that wraps "let mutable loc = Expr in ..." around a larger -// expression. -//------------------------------------------------------------------------- - +/// An exception representing a warning for a defensive copy of an immutable struct exception DefensiveCopyWarning of string * range + type Mutates = AddressOfOp | DefinitelyMutates | PossiblyMutates | NeverMutates + +/// Helper to take the address of an expression val mkExprAddrOfExprAux : TcGlobals -> bool -> bool -> Mutates -> Expr -> ValRef option -> range -> (Val * Expr) option * Expr * bool * bool -val mkExprAddrOfExpr : TcGlobals -> bool -> bool -> Mutates -> Expr -> ValRef option -> range -> (Expr -> Expr) * Expr * bool * bool -//------------------------------------------------------------------------- -// Tables keyed on values and/or type parameters -//------------------------------------------------------------------------- +/// Take the address of an expression, or force it into a mutable local. Any allocated +/// mutable local may need to be kept alive over a larger expression, hence we return +/// a wrapping function that wraps "let mutable loc = Expr in ..." around a larger +/// expression. +val mkExprAddrOfExpr : TcGlobals -> bool -> bool -> Mutates -> Expr -> ValRef option -> range -> (Expr -> Expr) * Expr * bool * bool /// Maps Val to T, based on stamps [] type ValMap<'T> = + member Contents : StampMap<'T> + member Item : Val -> 'T with get + member TryFind : Val -> 'T option + member ContainsVal : Val -> bool + member Add : Val -> 'T -> ValMap<'T> + member Remove : Val -> ValMap<'T> + member IsEmpty : bool + static member Empty : ValMap<'T> + static member OfList : (Val * 'T) list -> ValMap<'T> /// Mutable data structure mapping Val's to T based on stamp keys [] type ValHash<'T> = + member Values : seq<'T> + member TryFind : Val -> 'T option + member Add : Val * 'T -> unit - static member Create : unit -> ValHash<'T> + static member Create : unit -> ValHash<'T> /// Maps Val's to list of T based on stamp keys [] @@ -332,97 +428,126 @@ type ValMultiMap<'T> = static member Empty : ValMultiMap<'T> +/// Maps type parameters to entries based on stamp keys [] -/// Maps Typar to T based on stamp keys type TyparMap<'T> = + /// Get the entry for the given type parameter member Item : Typar -> 'T with get + /// Determine is the map contains an entry for the given type parameter member ContainsKey : Typar -> bool + /// Try to find the entry for the given type parameter member TryFind : Typar -> 'T option + /// Make a new map, containing a new entry for the given type parameter member Add : Typar * 'T -> TyparMap<'T> + /// The empty map static member Empty : TyparMap<'T> -[] /// Maps TyconRef to T based on stamp keys +[] type TyconRefMap<'T> = + /// Get the entry for the given type definition member Item : TyconRef -> 'T with get + /// Try to find the entry for the given type definition member TryFind : TyconRef -> 'T option + /// Determine is the map contains an entry for the given type definition member ContainsKey : TyconRef -> bool + /// Make a new map, containing a new entry for the given type definition member Add : TyconRef -> 'T -> TyconRefMap<'T> + /// Remove the entry for the given type definition, if any member Remove : TyconRef -> TyconRefMap<'T> + /// Determine if the map is empty member IsEmpty : bool + /// The empty map static member Empty : TyconRefMap<'T> + /// Make a new map, containing entries for the given type definitions static member OfList : (TyconRef * 'T) list -> TyconRefMap<'T> /// Maps TyconRef to list of T based on stamp keys [] type TyconRefMultiMap<'T> = + /// Fetch the entries for the given type definition member Find : TyconRef -> 'T list + /// Make a new map, containing a new entry for the given type definition member Add : TyconRef * 'T -> TyconRefMultiMap<'T> + /// The empty map static member Empty : TyconRefMultiMap<'T> + /// Make a new map, containing a entries for the given type definitions static member OfList : (TyconRef * 'T) list -> TyconRefMultiMap<'T> -//------------------------------------------------------------------------- -// Orderings on Tycon, Val, RecdFieldRef, Typar -//------------------------------------------------------------------------- +/// An ordering for value definitions, based on stamp +val valOrder: IComparer -val valOrder : IComparer -val tyconOrder : IComparer -val recdFieldRefOrder : IComparer -val typarOrder : IComparer +/// An ordering for type definitions, based on stamp +val tyconOrder: IComparer -//------------------------------------------------------------------------- -// Equality on Tycon and Val -//------------------------------------------------------------------------- +/// An ordering for record fields, based on stamp +val recdFieldRefOrder: IComparer +/// An ordering for type parameters, based on stamp +val typarOrder: IComparer + +/// Equality for type definition references val tyconRefEq : TcGlobals -> TyconRef -> TyconRef -> bool + +/// Equality for value references val valRefEq : TcGlobals -> ValRef -> ValRef -> bool //------------------------------------------------------------------------- // Operations on types: substitution //------------------------------------------------------------------------- +/// Represents an instantiation where types replace type parameters type TyparInst = (Typar * TType) list +/// Represents an instantiation where type definition references replace other type definition references type TyconRefRemap = TyconRefMap + +/// Represents an instantiation where value references replace other value references type ValRemap = ValMap +/// Represents a combination of substitutions/instantiations where things replace other things during remapping [] type Remap = - { tpinst : TyparInst; - valRemap: ValRemap; - tyconRefRemap : TyconRefRemap; + { tpinst : TyparInst + valRemap: ValRemap + tyconRefRemap : TyconRefRemap removeTraitSolutions: bool } static member Empty : Remap val addTyconRefRemap : TyconRef -> TyconRef -> Remap -> Remap -val addValRemap : Val -> Val -> Remap -> Remap +val addValRemap : Val -> Val -> Remap -> Remap val mkTyparInst : Typars -> TTypes -> TyparInst + val mkTyconRefInst : TyconRef -> TypeInst -> TyparInst + val emptyTyparInst : TyparInst val instType : TyparInst -> TType -> TType + val instTypes : TyparInst -> TypeInst -> TypeInst + val instTyparConstraints : TyparInst -> TyparConstraint list -> TyparConstraint list + val instTrait : TyparInst -> TraitConstraintInfo -> TraitConstraintInfo //------------------------------------------------------------------------- @@ -430,8 +555,11 @@ val instTrait : TyparInst -> TraitConstraintInfo -> TraitConstraint //------------------------------------------------------------------------- val generalizeTypars : Typars -> TypeInst + val generalizeTyconRef : TyconRef -> TTypes * TType + val generalizedTyconRef : TyconRef -> TType + val mkTyparToTyparRenaming : Typars -> Typars -> TyparInst * TTypes //------------------------------------------------------------------------- @@ -439,12 +567,16 @@ val mkTyparToTyparRenaming : Typars -> Typars -> TyparInst * TTypes //------------------------------------------------------------------------- val reduceTyconRefAbbrev : TyconRef -> TypeInst -> TType + val reduceTyconRefMeasureableOrProvided : TcGlobals -> TyconRef -> TypeInst -> TType + val reduceTyconRefAbbrevMeasureable : TyconRef -> Measure /// set bool to 'true' to allow shortcutting of type parameter equation chains during stripping val stripTyEqnsA : TcGlobals -> bool -> TType -> TType + val stripTyEqns : TcGlobals -> TType -> TType + val stripTyEqnsAndMeasureEqns : TcGlobals -> TType -> TType val tryNormalizeMeasureInType : TcGlobals -> TType -> TType @@ -455,7 +587,9 @@ val tryNormalizeMeasureInType : TcGlobals -> TType -> TType /// See through F# exception abbreviations val stripExnEqns : TyconRef -> Tycon + val recdFieldsOfExnDefRef : TyconRef -> RecdField list + val recdFieldTysOfExnDefRef : TyconRef -> TType list //------------------------------------------------------------------------- @@ -464,63 +598,102 @@ val recdFieldTysOfExnDefRef : TyconRef -> TType list //------------------------------------------------------------------------- val destForallTy : TcGlobals -> TType -> Typars * TType + val destFunTy : TcGlobals -> TType -> TType * TType + val destAnyTupleTy : TcGlobals -> TType -> TupInfo * TTypes + val destRefTupleTy : TcGlobals -> TType -> TTypes + val destStructTupleTy : TcGlobals -> TType -> TTypes + val destTyparTy : TcGlobals -> TType -> Typar + val destAnyParTy : TcGlobals -> TType -> Typar + val destMeasureTy : TcGlobals -> TType -> Measure + val tryDestForallTy : TcGlobals -> TType -> Typars * TType val isFunTy : TcGlobals -> TType -> bool + val isForallTy : TcGlobals -> TType -> bool + val isAnyTupleTy : TcGlobals -> TType -> bool + val isRefTupleTy : TcGlobals -> TType -> bool + val isStructTupleTy : TcGlobals -> TType -> bool + val isStructAnonRecdTy : TcGlobals -> TType -> bool + val isAnonRecdTy : TcGlobals -> TType -> bool + val isUnionTy : TcGlobals -> TType -> bool + val isReprHiddenTy : TcGlobals -> TType -> bool + val isFSharpObjModelTy : TcGlobals -> TType -> bool + val isRecdTy : TcGlobals -> TType -> bool + val isFSharpStructOrEnumTy : TcGlobals -> TType -> bool + val isFSharpEnumTy : TcGlobals -> TType -> bool + val isTyparTy : TcGlobals -> TType -> bool + val isAnyParTy : TcGlobals -> TType -> bool + val tryAnyParTy : TcGlobals -> TType -> ValueOption + val tryAnyParTyOption : TcGlobals -> TType -> Typar option + val isMeasureTy : TcGlobals -> TType -> bool val mkAppTy : TyconRef -> TypeInst -> TType val mkProvenUnionCaseTy : UnionCaseRef -> TypeInst -> TType + val isProvenUnionCaseTy : TType -> bool val isAppTy : TcGlobals -> TType -> bool + val tryAppTy : TcGlobals -> TType -> ValueOption + val destAppTy : TcGlobals -> TType -> TyconRef * TypeInst + val tcrefOfAppTy : TcGlobals -> TType -> TyconRef + val tryDestAppTy : TcGlobals -> TType -> ValueOption + val tryDestTyparTy : TcGlobals -> TType -> ValueOption + val tryDestFunTy : TcGlobals -> TType -> ValueOption<(TType * TType)> + val tryDestAnonRecdTy : TcGlobals -> TType -> ValueOption + val argsOfAppTy : TcGlobals -> TType -> TypeInst + val mkInstForAppTy : TcGlobals -> TType -> TyparInst /// Try to get a TyconRef for a type without erasing type abbreviations val tryNiceEntityRefOfTy : TType -> ValueOption -val tryNiceEntityRefOfTyOption : TType -> TyconRef option +val tryNiceEntityRefOfTyOption : TType -> TyconRef option val domainOfFunTy : TcGlobals -> TType -> TType + val rangeOfFunTy : TcGlobals -> TType -> TType + val stripFunTy : TcGlobals -> TType -> TType list * TType + val stripFunTyN : TcGlobals -> int -> TType -> TType list * TType val applyForallTy : TcGlobals -> TType -> TypeInst -> TType val tryDestAnyTupleTy : TcGlobals -> TType -> TupInfo * TType list + val tryDestRefTupleTy : TcGlobals -> TType -> TType list //------------------------------------------------------------------------- @@ -535,7 +708,9 @@ val actualTysOfUnionCaseFields : TyparInst -> UnionCaseRef -> TType list val actualTysOfInstanceRecdFields : TyparInst -> TyconRef -> TType list val actualTyOfRecdField : TyparInst -> RecdField -> TType + val actualTyOfRecdFieldRef : RecdFieldRef -> TypeInst -> TType + val actualTyOfRecdFieldForTycon : Tycon -> TypeInst -> RecdField -> TType //------------------------------------------------------------------------- @@ -545,14 +720,21 @@ val actualTyOfRecdFieldForTycon : Tycon -> TypeInst -> RecdField -> TType //------------------------------------------------------------------------- type UncurriedArgInfos = (TType * ArgReprInfo) list + type CurriedArgInfos = UncurriedArgInfos list val destTopForallTy : TcGlobals -> ValReprInfo -> TType -> Typars * TType + val GetTopTauTypeInFSharpForm : TcGlobals -> ArgReprInfo list list -> TType -> range -> CurriedArgInfos * TType + val GetTopValTypeInFSharpForm : TcGlobals -> ValReprInfo -> TType -> range -> Typars * CurriedArgInfos * TType * ArgReprInfo + val IsCompiledAsStaticProperty : TcGlobals -> Val -> bool + val IsCompiledAsStaticPropertyWithField : TcGlobals -> Val -> bool + val GetTopValTypeInCompiledForm : TcGlobals -> ValReprInfo -> TType -> range -> Typars * CurriedArgInfos * TType option * ArgReprInfo + val GetFSharpViewOfReturnType : TcGlobals -> TType option -> TType val NormalizeDeclaredTyparsForEquiRecursiveInference : TcGlobals -> Typars -> Typars @@ -568,40 +750,58 @@ val applyTys : TcGlobals -> TType -> TType list * 'T list -> TType //------------------------------------------------------------------------- val emptyFreeTypars : FreeTypars + val unionFreeTypars : FreeTypars -> FreeTypars -> FreeTypars val emptyFreeTycons : FreeTycons + val unionFreeTycons : FreeTycons -> FreeTycons -> FreeTycons val emptyFreeTyvars : FreeTyvars + val isEmptyFreeTyvars : FreeTyvars -> bool + val unionFreeTyvars : FreeTyvars -> FreeTyvars -> FreeTyvars val emptyFreeLocals : FreeLocals + val unionFreeLocals : FreeLocals -> FreeLocals -> FreeLocals type FreeVarOptions val CollectLocalsNoCaching : FreeVarOptions + val CollectTyparsNoCaching : FreeVarOptions + val CollectTyparsAndLocalsNoCaching : FreeVarOptions + val CollectTyparsAndLocals : FreeVarOptions + val CollectLocals : FreeVarOptions + val CollectTypars : FreeVarOptions + val CollectAllNoCaching : FreeVarOptions + val CollectAll : FreeVarOptions val accFreeInTypes : FreeVarOptions -> TType list -> FreeTyvars -> FreeTyvars + val accFreeInType : FreeVarOptions -> TType -> FreeTyvars -> FreeTyvars + val accFreeInTypars : FreeVarOptions -> Typars -> FreeTyvars -> FreeTyvars val freeInType : FreeVarOptions -> TType -> FreeTyvars + val freeInTypes : FreeVarOptions -> TType list -> FreeTyvars + val freeInVal : FreeVarOptions -> Val -> FreeTyvars // This one puts free variables in canonical left-to-right order. val freeInTypeLeftToRight : TcGlobals -> bool -> TType -> Typars + val freeInTypesLeftToRight : TcGlobals -> bool -> TType list -> Typars + val freeInTypesLeftToRightSkippingConstraints : TcGlobals -> TType list -> Typars val freeInModuleTy: ModuleOrNamespaceType -> FreeTyvars @@ -614,25 +814,39 @@ val isDimensionless : TcGlobals -> TType -> bool [] type TypeEquivEnv = - { EquivTypars: TyparMap; + { EquivTypars: TyparMap EquivTycons: TyconRefRemap } static member Empty : TypeEquivEnv + member BindEquivTypars : Typars -> Typars -> TypeEquivEnv + static member FromTyparInst : TyparInst -> TypeEquivEnv + static member FromEquivTypars : Typars -> Typars -> TypeEquivEnv val traitsAEquivAux : Erasure -> TcGlobals -> TypeEquivEnv -> TraitConstraintInfo -> TraitConstraintInfo -> bool + val traitsAEquiv : TcGlobals -> TypeEquivEnv -> TraitConstraintInfo -> TraitConstraintInfo -> bool + val typarConstraintsAEquivAux : Erasure -> TcGlobals -> TypeEquivEnv -> TyparConstraint -> TyparConstraint -> bool + val typarConstraintsAEquiv : TcGlobals -> TypeEquivEnv -> TyparConstraint -> TyparConstraint -> bool + val typarsAEquiv : TcGlobals -> TypeEquivEnv -> Typars -> Typars -> bool + val typeAEquivAux : Erasure -> TcGlobals -> TypeEquivEnv -> TType -> TType -> bool + val typeAEquiv : TcGlobals -> TypeEquivEnv -> TType -> TType -> bool + val returnTypesAEquivAux : Erasure -> TcGlobals -> TypeEquivEnv -> TType option -> TType option -> bool + val returnTypesAEquiv : TcGlobals -> TypeEquivEnv -> TType option -> TType option -> bool + val tcrefAEquiv : TcGlobals -> TypeEquivEnv -> TyconRef -> TyconRef -> bool + val valLinkageAEquiv : TcGlobals -> TypeEquivEnv -> Val -> Val -> bool + val anonInfoEquiv : AnonRecdTypeInfo -> AnonRecdTypeInfo -> bool //------------------------------------------------------------------------- @@ -650,11 +864,17 @@ val getErasedTypes : TcGlobals -> TType -> TType list //------------------------------------------------------------------------- val MeasurePower : Measure -> int -> Measure + val ListMeasureVarOccsWithNonZeroExponents : Measure -> (Typar * Rational) list + val ListMeasureConOccsWithNonZeroExponents : TcGlobals -> bool -> Measure -> (TyconRef * Rational) list + val ProdMeasures : Measure list -> Measure + val MeasureVarExponent : Typar -> Measure -> Rational + val MeasureExprConExponent : TcGlobals -> bool -> TyconRef -> Measure -> Rational + val normalizeMeasure : TcGlobals -> Measure -> Measure @@ -663,19 +883,26 @@ val normalizeMeasure : TcGlobals -> Measure -> Measure //------------------------------------------------------------------------- val GetTypeOfMemberInFSharpForm : TcGlobals -> ValRef -> Typars * CurriedArgInfos * TType * ArgReprInfo + val GetTypeOfMemberInMemberForm : TcGlobals -> ValRef -> Typars * CurriedArgInfos * TType option * ArgReprInfo + val GetTypeOfIntrinsicMemberInCompiledForm : TcGlobals -> ValRef -> Typars * CurriedArgInfos * TType option * ArgReprInfo + val GetMemberTypeInMemberForm : TcGlobals -> MemberFlags -> ValReprInfo -> TType -> range -> Typars * CurriedArgInfos * TType option * ArgReprInfo /// Returns (parentTypars,memberParentTypars,memberMethodTypars,memberToParentInst,tinst) val PartitionValTyparsForApparentEnclosingType : TcGlobals -> Val -> (Typars * Typars * Typars * TyparInst * TType list) option + /// Returns (parentTypars,memberParentTypars,memberMethodTypars,memberToParentInst,tinst) val PartitionValTypars : TcGlobals -> Val -> (Typars * Typars * Typars * TyparInst * TType list) option + /// Returns (parentTypars,memberParentTypars,memberMethodTypars,memberToParentInst,tinst) val PartitionValRefTypars : TcGlobals -> ValRef -> (Typars * Typars * Typars * TyparInst * TType list) option val ReturnTypeOfPropertyVal : TcGlobals -> Val -> TType + val ArgInfosOfPropertyVal : TcGlobals -> Val -> UncurriedArgInfos + val ArgInfosOfMember: TcGlobals -> ValRef -> CurriedArgInfos val GetMemberCallInfo : TcGlobals -> ValRef * ValUseFlag -> int * bool * bool * bool * bool * bool * bool * bool @@ -686,68 +913,95 @@ val GetMemberCallInfo : TcGlobals -> ValRef * ValUseFlag -> int * bool * bool * type TyparConstraintsWithTypars = (Typar * TyparConstraint) list - module PrettyTypes = + val NeedsPrettyTyparName : Typar -> bool + val NewPrettyTypars : TyparInst -> Typars -> string list -> Typars * TyparInst + val PrettyTyparNames : (Typar -> bool) -> string list -> Typars -> string list + val PrettifyType : TcGlobals -> TType -> TType * TyparConstraintsWithTypars + val PrettifyInstAndTyparsAndType : TcGlobals -> TyparInst * Typars * TType -> (TyparInst * Typars * TType) * TyparConstraintsWithTypars + val PrettifyTypePair : TcGlobals -> TType * TType -> (TType * TType) * TyparConstraintsWithTypars + val PrettifyTypes : TcGlobals -> TTypes -> TTypes * TyparConstraintsWithTypars + val PrettifyInst : TcGlobals -> TyparInst -> TyparInst * TyparConstraintsWithTypars + val PrettifyInstAndType : TcGlobals -> TyparInst * TType -> (TyparInst * TType) * TyparConstraintsWithTypars + val PrettifyInstAndTypes : TcGlobals -> TyparInst * TTypes -> (TyparInst * TTypes) * TyparConstraintsWithTypars + val PrettifyInstAndSig : TcGlobals -> TyparInst * TTypes * TType -> (TyparInst * TTypes * TType) * TyparConstraintsWithTypars + val PrettifyCurriedTypes : TcGlobals -> TType list list -> TType list list * TyparConstraintsWithTypars + val PrettifyCurriedSigTypes : TcGlobals -> TType list list * TType -> (TType list list * TType) * TyparConstraintsWithTypars + val PrettifyInstAndUncurriedSig : TcGlobals -> TyparInst * UncurriedArgInfos * TType -> (TyparInst * UncurriedArgInfos * TType) * TyparConstraintsWithTypars + val PrettifyInstAndCurriedSig : TcGlobals -> TyparInst * TTypes * CurriedArgInfos * TType -> (TyparInst * TTypes * CurriedArgInfos * TType) * TyparConstraintsWithTypars [] type DisplayEnv = - { includeStaticParametersInTypeNames : bool; - openTopPathsSorted: Lazy; - openTopPathsRaw: string list list; - shortTypeNames: bool; - suppressNestedTypes: bool; - maxMembers : int option; - showObsoleteMembers: bool; - showHiddenMembers: bool; - showTyparBinding: bool; - showImperativeTyparAnnotations: bool; - suppressInlineKeyword:bool; - suppressMutableKeyword:bool; - showMemberContainers: bool; - shortConstraints:bool; - useColonForReturnType:bool; - showAttributes: bool; - showOverrides:bool; - showConstraintTyparAnnotations:bool; - abbreviateAdditionalConstraints: bool; + { includeStaticParametersInTypeNames : bool + openTopPathsSorted: Lazy + openTopPathsRaw: string list list + shortTypeNames: bool + suppressNestedTypes: bool + maxMembers : int option + showObsoleteMembers: bool + showHiddenMembers: bool + showTyparBinding: bool + showImperativeTyparAnnotations: bool + suppressInlineKeyword:bool + suppressMutableKeyword:bool + showMemberContainers: bool + shortConstraints:bool + useColonForReturnType:bool + showAttributes: bool + showOverrides:bool + showConstraintTyparAnnotations:bool + abbreviateAdditionalConstraints: bool showTyparDefaultConstraints: bool g: TcGlobals contextAccessibility: Accessibility generatedValueLayout:(Val -> layout option) } + member SetOpenPaths: string list list -> DisplayEnv + static member Empty: TcGlobals -> DisplayEnv member AddAccessibility : Accessibility -> DisplayEnv + member AddOpenPath : string list -> DisplayEnv + member AddOpenModuleOrNamespace : ModuleOrNamespaceRef -> DisplayEnv val tagEntityRefName: xref: EntityRef -> name: string -> StructuredFormat.TaggedText /// Return the full text for an item as we want it displayed to the user as a fully qualified entity val fullDisplayTextOfModRef : ModuleOrNamespaceRef -> string + val fullDisplayTextOfParentOfModRef : ModuleOrNamespaceRef -> ValueOption + val fullDisplayTextOfValRef : ValRef -> string + val fullDisplayTextOfValRefAsLayout : ValRef -> StructuredFormat.Layout + val fullDisplayTextOfTyconRef : TyconRef -> string + val fullDisplayTextOfTyconRefAsLayout : TyconRef -> StructuredFormat.Layout + val fullDisplayTextOfExnRef : TyconRef -> string + val fullDisplayTextOfExnRefAsLayout : TyconRef -> StructuredFormat.Layout + val fullDisplayTextOfUnionCaseRef : UnionCaseRef -> string + val fullDisplayTextOfRecdFieldRef : RecdFieldRef -> string val ticksAndArgCountTextOfTyconRef : TyconRef -> string @@ -758,22 +1012,23 @@ val qualifiedMangledNameOfTyconRef : TyconRef -> string -> string val trimPathByDisplayEnv : DisplayEnv -> string list -> string val prefixOfStaticReq : TyparStaticReq -> string + val prefixOfRigidTypar : Typar -> string /// Utilities used in simplifying types for visual presentation module SimplifyTypes = + type TypeSimplificationInfo = - { singletons : Typar Zset; - inplaceConstraints : Zmap; - postfixConstraints : TyparConstraintsWithTypars; } + { singletons : Typar Zset + inplaceConstraints : Zmap + postfixConstraints : TyparConstraintsWithTypars } + val typeSimplificationInfo0 : TypeSimplificationInfo - val CollectInfo : bool -> TType list -> TyparConstraintsWithTypars -> TypeSimplificationInfo -//------------------------------------------------------------------------- -// -//------------------------------------------------------------------------- + val CollectInfo : bool -> TType list -> TyparConstraintsWithTypars -> TypeSimplificationInfo val superOfTycon : TcGlobals -> Tycon -> TType + val abstractSlotValsOfTycons : Tycon list -> Val list //------------------------------------------------------------------------- @@ -781,11 +1036,15 @@ val abstractSlotValsOfTycons : Tycon list -> Val list //------------------------------------------------------------------------- val emptyFreeVars : FreeVars + val unionFreeVars : FreeVars -> FreeVars -> FreeVars val accFreeInTargets : FreeVarOptions -> DecisionTreeTarget array -> FreeVars -> FreeVars + val accFreeInExprs : FreeVarOptions -> Exprs -> FreeVars -> FreeVars + val accFreeInSwitchCases : FreeVarOptions -> DecisionTreeCase list -> DecisionTree option -> FreeVars -> FreeVars + val accFreeInDecisionTree : FreeVarOptions -> DecisionTree -> FreeVars -> FreeVars /// Get the free variables in a module definition. @@ -797,277 +1056,382 @@ val freeInExpr : FreeVarOptions -> Expr -> FreeVars /// Get the free variables in the right hand side of a binding. val freeInBindingRhs : FreeVarOptions -> Binding -> FreeVars +/// Check if a set of free type variables are all public val freeTyvarsAllPublic : FreeTyvars -> bool -val freeVarsAllPublic : FreeVars -> bool -//------------------------------------------------------------------------- -// Mark/range/position information from expressions -//------------------------------------------------------------------------- +/// Check if a set of free variables are all public +val freeVarsAllPublic : FreeVars -> bool +/// Get the mark/range/position information from an expression type Expr with member Range : range -//------------------------------------------------------------------------- -// type-of operations on the expression tree -//------------------------------------------------------------------------- - +/// Compute the type of an expression from the expression itself val tyOfExpr : TcGlobals -> Expr -> TType -//------------------------------------------------------------------------- -// Top expressions to implement top types -//------------------------------------------------------------------------- - +/// A flag to govern whether arity inference should be type-directed or syntax-directed when +/// inferring an arity from a lambda expression. [] -type AllowTypeDirectedDetupling = Yes | No +type AllowTypeDirectedDetupling = + | Yes + | No +/// Given a (curried) lambda expression, pull off its arguments val stripTopLambda : Expr * TType -> Typars * Val list list * Expr * TType + +/// Given a lambda expression, extract the ValReprInfo for its arguments and other details val InferArityOfExpr : TcGlobals -> AllowTypeDirectedDetupling -> TType -> Attribs list list -> Attribs -> Expr -> ValReprInfo + +/// Given a lambda binding, extract the ValReprInfo for its arguments and other details val InferArityOfExprBinding : TcGlobals -> AllowTypeDirectedDetupling -> Val -> Expr -> ValReprInfo -//------------------------------------------------------------------------- -// Copy expressions and types -//------------------------------------------------------------------------- - +/// Mutate a value to indicate it should be considered a local rather than a module-bound definition // REVIEW: this mutation should not be needed val setValHasNoArity : Val -> Val +/// Indicate what should happen to value definitions when copying expressions type ValCopyFlag = | CloneAll | CloneAllAndMarkExprValsAsCompilerGenerated - // OnlyCloneExprVals is a nasty setting to reuse the cloning logic in a mode where all - // Tycon and "module/member" Val objects keep their identity, but the Val objects for all Expr bindings - // are cloned. This is used to 'fixup' the TAST created by tlr.fs - // - // This is a fragile mode of use. It's not really clear why TLR needs to create a "bad" expression tree that - // reuses Val objects as multiple value bindings, and its been the cause of several subtle bugs. + + /// OnlyCloneExprVals is a nasty setting to reuse the cloning logic in a mode where all + /// Tycon and "module/member" Val objects keep their identity, but the Val objects for all Expr bindings + /// are cloned. This is used to 'fixup' the TAST created by tlr.fs + /// + /// This is a fragile mode of use. It's not really clear why TLR needs to create a "bad" expression tree that + /// reuses Val objects as multiple value bindings, and its been the cause of several subtle bugs. | OnlyCloneExprVals +/// Remap a reference to a type definition using the given remapping substitution val remapTyconRef : TyconRefRemap -> TyconRef -> TyconRef + +/// Remap a reference to a union case using the given remapping substitution val remapUnionCaseRef : TyconRefRemap -> UnionCaseRef -> UnionCaseRef + +/// Remap a reference to a record field using the given remapping substitution val remapRecdFieldRef : TyconRefRemap -> RecdFieldRef -> RecdFieldRef + +/// Remap a reference to a value using the given remapping substitution val remapValRef : Remap -> ValRef -> ValRef + +/// Remap an expression using the given remapping substitution val remapExpr : TcGlobals -> ValCopyFlag -> Remap -> Expr -> Expr + +/// Remap an attribute using the given remapping substitution val remapAttrib : TcGlobals -> Remap -> Attrib -> Attrib + +/// Remap a (possible generic) type using the given remapping substitution val remapPossibleForallTy : TcGlobals -> Remap -> TType -> TType + +/// Copy an entire module or namespace type using the given copying flags val copyModuleOrNamespaceType : TcGlobals -> ValCopyFlag -> ModuleOrNamespaceType -> ModuleOrNamespaceType + +/// Copy an entire expression using the given copying flags val copyExpr : TcGlobals -> ValCopyFlag -> Expr -> Expr + +/// Copy an entire implementation file using the given copying flags val copyImplFile : TcGlobals -> ValCopyFlag -> TypedImplFile -> TypedImplFile + +/// Copy a method slot signature, including new generic type parameters if the slot signature represents a generic method val copySlotSig : SlotSig -> SlotSig + +/// Instantiate the generic type parameters in a method slot signature, building a new one val instSlotSig : TyparInst -> SlotSig -> SlotSig -val instExpr : TcGlobals -> TyparInst -> Expr -> Expr -//------------------------------------------------------------------------- -// Build the remapping that corresponds to a module meeting its signature -// and also report the set of tycons, tycon representations and values hidden in the process. -//------------------------------------------------------------------------- +/// Instantiate the generic type parameters in an expression, building a new one +val instExpr : TcGlobals -> TyparInst -> Expr -> Expr +/// The remapping that corresponds to a module meeting its signature +/// and also report the set of tycons, tycon representations and values hidden in the process. type SignatureRepackageInfo = - { mrpiVals: (ValRef * ValRef) list; - mrpiEntities: (TyconRef * TyconRef) list } + { /// The list of corresponding values + RepackagedVals: (ValRef * ValRef) list + + /// The list of corresponding modules, namespacea and type definitions + RepackagedEntities: (TyconRef * TyconRef) list } + /// The empty table static member Empty : SignatureRepackageInfo +/// A set of tables summarizing the items hidden by a signature type SignatureHidingInfo = - { mhiTycons : Zset; - mhiTyconReprs : Zset; - mhiVals : Zset; - mhiRecdFields : Zset; - mhiUnionCases : Zset } + { HiddenTycons: Zset + HiddenTyconReprs: Zset + HiddenVals: Zset + HiddenRecdFields: Zset + HiddenUnionCases: Zset } + + /// The empty table representing no hiding static member Empty : SignatureHidingInfo -val ComputeRemappingFromInferredSignatureToExplicitSignature : TcGlobals -> ModuleOrNamespaceType -> ModuleOrNamespaceType -> SignatureRepackageInfo * SignatureHidingInfo +/// Compute the remapping information implied by a signature being inferred for a particular implementation val ComputeRemappingFromImplementationToSignature : TcGlobals -> ModuleOrNamespaceExpr -> ModuleOrNamespaceType -> SignatureRepackageInfo * SignatureHidingInfo + +/// Compute the remapping information implied by an explicit signature being given for an inferred signature +val ComputeRemappingFromInferredSignatureToExplicitSignature : TcGlobals -> ModuleOrNamespaceType -> ModuleOrNamespaceType -> SignatureRepackageInfo * SignatureHidingInfo + +/// Compute the hiding information that corresponds to the hiding applied at an assembly boundary val ComputeHidingInfoAtAssemblyBoundary : ModuleOrNamespaceType -> SignatureHidingInfo -> SignatureHidingInfo + val mkRepackageRemapping : SignatureRepackageInfo -> Remap +/// Wrap one module or namespace implementation in a 'namespace N' outer wrapper val wrapModuleOrNamespaceExprInNamespace : Ident -> CompilationPath -> ModuleOrNamespaceExpr -> ModuleOrNamespaceExpr + +/// Wrap one module or namespace definition in a 'namespace N' outer wrapper val wrapModuleOrNamespaceTypeInNamespace : Ident -> CompilationPath -> ModuleOrNamespaceType -> ModuleOrNamespaceType * ModuleOrNamespace + +/// Wrap one module or namespace definition in a 'module M = ..' outer wrapper val wrapModuleOrNamespaceType : Ident -> CompilationPath -> ModuleOrNamespaceType -> ModuleOrNamespace +/// Given an implementation, fetch its recorded signature val SigTypeOfImplFile : TypedImplFile -> ModuleOrNamespaceType -//------------------------------------------------------------------------- -// Given a list of top-most signatures that together constrain the public compilation units -// of an assembly, compute a remapping that converts local references to non-local references. -// This remapping must be applied to all pickled expressions and types -// exported from the assembly. -//------------------------------------------------------------------------- - - +/// Given a namespace, module or type definition, try to produce a reference to that entity. val tryRescopeEntity : CcuThunk -> Entity -> ValueOption + +/// Given a value definition, try to produce a reference to that value. Fails for local values. val tryRescopeVal : CcuThunk -> Remap -> Val -> ValueOption +/// Make the substitution (remapping) table for viewing a module or namespace 'from the outside' +/// +/// Given the top-most signatures constrains the public compilation units +/// of an assembly, compute a remapping that converts local references to non-local references. +/// This remapping must be applied to all pickled expressions and types +/// exported from the assembly. val MakeExportRemapping : CcuThunk -> ModuleOrNamespace -> Remap + +/// Make a remapping table for viewing a module or namespace 'from the outside' val ApplyExportRemappingToEntity : TcGlobals -> Remap -> ModuleOrNamespace -> ModuleOrNamespace -/// Query SignatureRepackageInfo +/// Determine if a type definition is hidden by a signature val IsHiddenTycon : (Remap * SignatureHidingInfo) list -> Tycon -> bool + +/// Determine if the representation of a type definition is hidden by a signature val IsHiddenTyconRepr : (Remap * SignatureHidingInfo) list -> Tycon -> bool + +/// Determine if a member, function or value is hidden by a signature val IsHiddenVal : (Remap * SignatureHidingInfo) list -> Val -> bool -val IsHiddenRecdField : (Remap * SignatureHidingInfo) list -> RecdFieldRef -> bool -//------------------------------------------------------------------------- -// Adjust marks in expressions -//------------------------------------------------------------------------- +/// Determine if a record field is hidden by a signature +val IsHiddenRecdField : (Remap * SignatureHidingInfo) list -> RecdFieldRef -> bool +/// Adjust marks in expressions, replacing all marks by thegiven mark. +/// Used when inlining. val remarkExpr : range -> Expr -> Expr - -//------------------------------------------------------------------------- -// Make applications -//------------------------------------------------------------------------- +/// Build the application of a (possibly generic, possibly curried) function value to a set of type and expression arguments val primMkApp : (Expr * TType) -> TypeInst -> Exprs -> range -> Expr + +/// Build the application of a (possibly generic, possibly curried) function value to a set of type and expression arguments. +/// Reduce the application via let-bindings if the function value is a lambda expression. val mkApps : TcGlobals -> (Expr * TType) * TType list list * Exprs * range -> Expr + +/// Build the application of a generic construct to a set of type arguments. +/// Reduce the application via substitution if the function value is a typed lambda expression. val mkTyAppExpr : range -> Expr * TType -> TType list -> Expr +/// Build an expression to mutate a local /// localv <- e val mkValSet : range -> ValRef -> Expr -> Expr + +/// Build an expression to mutate the contents of a local pointer /// *localv_ptr = e val mkAddrSet : range -> ValRef -> Expr -> Expr + +/// Build an expression to dereference a local pointer /// *localv_ptr val mkAddrGet : range -> ValRef -> Expr + +/// Build an expression to take the address of a local /// &localv val mkValAddr : range -> readonly: bool -> ValRef -> Expr -//------------------------------------------------------------------------- -// Note these take the address of the record expression if it is a struct, and -// apply a type instantiation if it is a first-class polymorphic record field. -//------------------------------------------------------------------------- - +/// Build an exression representing the read of an instance class or record field. +/// First take the address of the record expression if it is a struct. val mkRecdFieldGet : TcGlobals -> Expr * RecdFieldRef * TypeInst * range -> Expr -//------------------------------------------------------------------------- -// Get the targets used in a decision graph (for reporting warnings) -//------------------------------------------------------------------------- - +/// Accumulate the targets actually used in a decision graph (for reporting warnings) val accTargetsOfDecisionTree : DecisionTree -> int list -> int list -//------------------------------------------------------------------------- -// Optimizations on decision graphs -//------------------------------------------------------------------------- - +/// Make a 'match' expression applying some peep-hole optimizations along the way, e.g to +/// pre-decide the branch taken at compile-time. val mkAndSimplifyMatch : SequencePointInfoForBinding -> range -> range -> TType -> DecisionTree -> DecisionTreeTarget list -> Expr +/// Make a 'match' expression without applying any peep-hole optimizations. val primMkMatch : SequencePointInfoForBinding * range * DecisionTree * DecisionTreeTarget array * range * TType -> Expr -//------------------------------------------------------------------------- -// Work out what things on the r.h.s. of a let rec need to be fixed up -//------------------------------------------------------------------------- - +/// Work out what things on the right-han-side of a 'let rec' recursive binding need to be fixed up val IterateRecursiveFixups : TcGlobals -> Val option -> (Val option -> Expr -> (Expr -> Expr) -> Expr -> unit) -> Expr * (Expr -> Expr) -> Expr -> unit -//------------------------------------------------------------------------- -// From lambdas taking multiple variables to lambdas taking a single variable -// of tuple type. -//------------------------------------------------------------------------- - +/// Given a lambda expression taking multiple variables, build a corresponding lambda taking a tuple val MultiLambdaToTupledLambda : TcGlobals -> Val list -> Expr -> Val * Expr -val AdjustArityOfLambdaBody : TcGlobals -> int -> Val list -> Expr -> Val list * Expr -//------------------------------------------------------------------------- -// Make applications, doing beta reduction by introducing let-bindings -//------------------------------------------------------------------------- +/// Given a lambda expression, adjust it to have be one or two lambda expressions (fun a -> (fun b -> ...)) +/// where the first has the given arity. +val AdjustArityOfLambdaBody : TcGlobals -> int -> Val list -> Expr -> Val list * Expr +/// Make an application expression, doing beta reduction by introducing let-bindings val MakeApplicationAndBetaReduce : TcGlobals -> Expr * TType * TypeInst list * Exprs * range -> Expr +/// COmbine two static-resolution requirements on a type parameter val JoinTyparStaticReq : TyparStaticReq -> TyparStaticReq -> TyparStaticReq -//------------------------------------------------------------------------- -// More layout - this is for debugging -//------------------------------------------------------------------------- +/// Layout for internal compiler debugging purposes module DebugPrint = + /// A global flag indicating whether debug output should include ranges val layoutRanges : bool ref + + /// Convert a type to a string for debugging purposes val showType : TType -> string + + /// Convert an expression to a string for debugging purposes val showExpr : Expr -> string + /// Debug layout for a reference to a value val valRefL : ValRef -> layout + + /// Debug layout for a reference to a union case val unionCaseRefL : UnionCaseRef -> layout - val vspecAtBindL : Val -> layout + + /// Debug layout for an value definition at its binding site + val valAtBindL : Val -> layout + + /// Debug layout for an integer val intL : int -> layout + + /// Debug layout for a value definition val valL : Val -> layout + + /// Debug layout for a type parameter definition val typarDeclL : Typar -> layout + + /// Debug layout for a trait constraint val traitL : TraitConstraintInfo -> layout + + /// Debug layout for a type parameter val typarL : Typar -> layout + + /// Debug layout for a set of type parameters val typarsL : Typars -> layout + + /// Debug layout for a type val typeL : TType -> layout + + /// Debug layout for a method slot signature val slotSigL : SlotSig -> layout + + /// Debug layout for the type signature of a module or namespace definition val entityTypeL : ModuleOrNamespaceType -> layout + + /// Debug layout for a module or namespace definition val entityL : ModuleOrNamespace -> layout + + /// Debug layout for the type of a value val typeOfValL : Val -> layout + + /// Debug layout for a binding of an expression to a value val bindingL : Binding -> layout + + /// Debug layout for an expression val exprL : Expr -> layout + + /// Debug layout for a type definition val tyconL : Tycon -> layout + + /// Debug layout for a decision tree val decisionTreeL : DecisionTree -> layout + + /// Debug layout for an implementation file val implFileL : TypedImplFile -> layout + + /// Debug layout for a list of implementation files val implFilesL : TypedImplFile list -> layout - val recdFieldRefL : RecdFieldRef -> layout -//------------------------------------------------------------------------- -// Fold on expressions -//------------------------------------------------------------------------- + /// Debug layout for class and record fields + val recdFieldRefL : RecdFieldRef -> layout +/// A set of function parameters (visitor) for folding over expressions type ExprFolder<'State> = - { exprIntercept : ('State -> Expr -> 'State) -> 'State -> Expr -> 'State option; - valBindingSiteIntercept : 'State -> bool * Val -> 'State; - nonRecBindingsIntercept : 'State -> Binding -> 'State; - recBindingsIntercept : 'State -> Bindings -> 'State; - dtreeIntercept : 'State -> DecisionTree -> 'State; - targetIntercept : ('State -> Expr -> 'State) -> 'State -> DecisionTreeTarget -> 'State option; - tmethodIntercept : ('State -> Expr -> 'State) -> 'State -> ObjExprMethod -> 'State option;} + { exprIntercept : ('State -> Expr -> 'State) -> 'State -> Expr -> 'State option + valBindingSiteIntercept : 'State -> bool * Val -> 'State + nonRecBindingsIntercept : 'State -> Binding -> 'State + recBindingsIntercept : 'State -> Bindings -> 'State + dtreeIntercept : 'State -> DecisionTree -> 'State + targetIntercept : ('State -> Expr -> 'State) -> 'State -> DecisionTreeTarget -> 'State option + tmethodIntercept : ('State -> Expr -> 'State) -> 'State -> ObjExprMethod -> 'State option} + +/// The empty set of actions for folding over expressions val ExprFolder0 : ExprFolder<'State> + +/// Fold over all the expressions in an implementation file val FoldImplFile: ExprFolder<'State> -> ('State -> TypedImplFile -> 'State) + +/// Fold over all the expressions in an expression val FoldExpr : ExprFolder<'State> -> ('State -> Expr -> 'State) #if DEBUG +/// Extract some statistics from an expression val ExprStats : Expr -> string #endif -//------------------------------------------------------------------------- -// Make some common types -//------------------------------------------------------------------------- - +/// Build a nativeptr type val mkNativePtrTy : TcGlobals -> TType -> TType + +/// Build a 'voidptr' type val mkVoidPtrTy : TcGlobals -> TType + +/// Build a single-dimensional array type val mkArrayType : TcGlobals -> TType -> TType + +/// Determine is a type is an option type val isOptionTy : TcGlobals -> TType -> bool + +/// Take apart an option type val destOptionTy : TcGlobals -> TType -> TType + +/// Try to take apart an option type val tryDestOptionTy : TcGlobals -> TType -> ValueOption +/// Determine if a type is a System.Linq.Expression type val isLinqExpressionTy : TcGlobals -> TType -> bool -val destLinqExpressionTy : TcGlobals -> TType -> TType -val tryDestLinqExpressionTy : TcGlobals -> TType -> TType option -(* -val isQuoteExprTy : TcGlobals -> TType -> bool -val destQuoteExprTy : TcGlobals -> TType -> TType -val tryDestQuoteExprTy : TcGlobals -> TType -> TType option -*) +/// Take apart a System.Linq.Expression type +val destLinqExpressionTy : TcGlobals -> TType -> TType -//------------------------------------------------------------------------- -// Primitives associated with compiling the IEvent idiom to .NET events -//------------------------------------------------------------------------- +/// Try to take apart a System.Linq.Expression type +val tryDestLinqExpressionTy : TcGlobals -> TType -> TType option +/// Determine if a type is an IDelegateEvent type val isIDelegateEventType : TcGlobals -> TType -> bool + +/// Take apart an IDelegateEvent type val destIDelegateEventType : TcGlobals -> TType -> TType + +/// Build an IEvent type val mkIEventType : TcGlobals -> TType -> TType -> TType + +/// Build an IObservable type val mkIObservableType : TcGlobals -> TType -> TType -val mkIObserverType : TcGlobals -> TType -> TType -//------------------------------------------------------------------------- -// Primitives associated with printf format string parsing -//------------------------------------------------------------------------- +/// Build an IObserver type +val mkIObserverType : TcGlobals -> TType -> TType +/// Build an Lazy type val mkLazyTy : TcGlobals -> TType -> TType + +/// Build an PrintFormat type val mkPrintfFormatTy : TcGlobals -> TType -> TType -> TType -> TType -> TType -> TType //------------------------------------------------------------------------- // Classify types //------------------------------------------------------------------------- +/// Represents metadata extracted from a nominal type type TypeDefMetadata = | ILTypeMetadata of TILObjectReprData | FSharpOrArrayOrByrefOrTupleOrExnTypeMetadata @@ -1075,43 +1439,94 @@ type TypeDefMetadata = | ProvidedTypeMetadata of TProvidedTypeInfo #endif +/// Extract metadata from a type definition val metadataOfTycon : Tycon -> TypeDefMetadata + +/// Extract metadata from a type val metadataOfTy : TcGlobals -> TType -> TypeDefMetadata -val isStringTy : TcGlobals -> TType -> bool -val isListTy : TcGlobals -> TType -> bool -val isILAppTy : TcGlobals -> TType -> bool -val isArrayTy : TcGlobals -> TType -> bool -val isArray1DTy : TcGlobals -> TType -> bool -val destArrayTy : TcGlobals -> TType -> TType -val destListTy : TcGlobals -> TType -> TType +/// Determine if a type is the System.String type +val isStringTy : TcGlobals -> TType -> bool + +/// Determine if a type is an F# list type +val isListTy : TcGlobals -> TType -> bool + +/// Determine if a type is a nominal .NET type +val isILAppTy : TcGlobals -> TType -> bool + +/// Determine if a type is any kind of array type +val isArrayTy : TcGlobals -> TType -> bool + +/// Determine if a type is a single-dimensional array type +val isArray1DTy : TcGlobals -> TType -> bool + +/// Get the element type of an array type +val destArrayTy : TcGlobals -> TType -> TType + +/// Get the element type of an F# list type +val destListTy : TcGlobals -> TType -> TType -val mkArrayTy : TcGlobals -> int -> TType -> range -> TType -val isArrayTyconRef : TcGlobals -> TyconRef -> bool +/// Build an array type of the given rank +val mkArrayTy : TcGlobals -> int -> TType -> range -> TType + +/// Check if a type definition is one of the artifical type definitions used for array types of different ranks +val isArrayTyconRef : TcGlobals -> TyconRef -> bool + +/// Determine the rank of one of the artifical type definitions used for array types val rankOfArrayTyconRef : TcGlobals -> TyconRef -> int -val isUnitTy : TcGlobals -> TType -> bool -val isObjTy : TcGlobals -> TType -> bool -val isVoidTy : TcGlobals -> TType -> bool +/// Determine if a type is the F# unit type +val isUnitTy : TcGlobals -> TType -> bool + +/// Determine if a type is the System.Object type +val isObjTy : TcGlobals -> TType -> bool + +/// Determine if a type is the System.Void type +val isVoidTy : TcGlobals -> TType -> bool /// Get the element type of an array type -val destArrayTy : TcGlobals -> TType -> TType +val destArrayTy : TcGlobals -> TType -> TType + /// Get the rank of an array type val rankOfArrayTy : TcGlobals -> TType -> int -val isInterfaceTyconRef : TyconRef -> bool +/// Determine if a reference to a type definition is an interface type +val isInterfaceTyconRef : TyconRef -> bool + +/// Determine if a type is a delegate type +val isDelegateTy : TcGlobals -> TType -> bool + +/// Determine if a type is an interface type +val isInterfaceTy : TcGlobals -> TType -> bool -val isDelegateTy : TcGlobals -> TType -> bool -val isInterfaceTy : TcGlobals -> TType -> bool -val isRefTy : TcGlobals -> TType -> bool -val isSealedTy : TcGlobals -> TType -> bool -val isComInteropTy : TcGlobals -> TType -> bool -val underlyingTypeOfEnumTy : TcGlobals -> TType -> TType -val normalizeEnumTy : TcGlobals -> TType -> TType +/// Determine if a type is a FSharpRef type +val isRefTy : TcGlobals -> TType -> bool + +/// Determine if a type is a sealed type +val isSealedTy : TcGlobals -> TType -> bool + +/// Determine if a type is a ComInterop type +val isComInteropTy : TcGlobals -> TType -> bool + +/// Determine the underlying type of an enum type (normally int32) +val underlyingTypeOfEnumTy : TcGlobals -> TType -> TType + +/// If the input type is an enum type, then convert to its underlying type, otherwise return the input type +val normalizeEnumTy : TcGlobals -> TType -> TType + +/// Determine if a type is a struct type val isStructTy : TcGlobals -> TType -> bool + +/// Determine if a type is an unmanaged type val isUnmanagedTy : TcGlobals -> TType -> bool + +/// Determine if a type is a class type val isClassTy : TcGlobals -> TType -> bool + +/// Determine if a type is an enum type val isEnumTy : TcGlobals -> TType -> bool + +/// Determine if a type is a struct, record or union type val isStructRecordOrUnionTyconTy : TcGlobals -> TType -> bool /// For "type Class as self", 'self' is fixed up after initialization. To support this, @@ -1119,9 +1534,16 @@ val isStructRecordOrUnionTyconTy : TcGlobals -> TType -> bool /// returns the underlying type. val StripSelfRefCell : TcGlobals * ValBaseOrThisInfo * TType -> TType +/// An active pattern to determine if a type is a nominal type, possibly instantiated val (|AppTy|_|) : TcGlobals -> TType -> (TyconRef * TType list) option + +/// An active pattern to match System.Nullable types val (|NullableTy|_|) : TcGlobals -> TType -> TType option + +/// An active pattern to transform System.Nullable types to their input, otherwise leave the input unchanged val (|StripNullableTy|) : TcGlobals -> TType -> TType + +/// Matches any byref type, yielding the target type val (|ByrefTy|_|) : TcGlobals -> TType -> TType option //------------------------------------------------------------------------- @@ -1129,35 +1551,53 @@ val (|ByrefTy|_|) : TcGlobals -> TType -> TType option //------------------------------------------------------------------------- val IsUnionTypeWithNullAsTrueValue: TcGlobals -> Tycon -> bool + val TyconHasUseNullAsTrueValueAttribute : TcGlobals -> Tycon -> bool + val CanHaveUseNullAsTrueValueAttribute : TcGlobals -> Tycon -> bool + val MemberIsCompiledAsInstance : TcGlobals -> TyconRef -> bool -> ValMemberInfo -> Attribs -> bool + val ValSpecIsCompiledAsInstance : TcGlobals -> Val -> bool + val ValRefIsCompiledAsInstanceMember : TcGlobals -> ValRef -> bool + val ModuleNameIsMangled : TcGlobals -> Attribs -> bool val CompileAsEvent : TcGlobals -> Attribs -> bool val TypeNullIsExtraValue : TcGlobals -> range -> TType -> bool + val TypeNullIsTrueValue : TcGlobals -> TType -> bool + val TypeNullNotLiked : TcGlobals -> range -> TType -> bool + val TypeNullNever : TcGlobals -> TType -> bool val TypeSatisfiesNullConstraint : TcGlobals -> range -> TType -> bool + val TypeHasDefaultValue : TcGlobals -> range -> TType -> bool val isAbstractTycon : Tycon -> bool val isUnionCaseRefDefinitelyMutable : UnionCaseRef -> bool + val isRecdOrUnionOrStructTyconRefDefinitelyMutable : TyconRef -> bool + val isExnDefinitelyMutable : TyconRef -> bool + val isUnionCaseFieldMutable : TcGlobals -> UnionCaseRef -> int -> bool + val isExnFieldMutable : TyconRef -> int -> bool + val isRecdOrStructTyconRefReadOnly: TcGlobals -> range -> TyconRef -> bool + val isRecdOrStructTyconRefAssumedImmutable: TcGlobals -> TyconRef -> bool + val isRecdOrStructTyReadOnly: TcGlobals -> range -> TType -> bool val useGenuineField : Tycon -> RecdField -> bool + val ComputeFieldName : Tycon -> RecdField -> string //------------------------------------------------------------------------- @@ -1165,6 +1605,7 @@ val ComputeFieldName : Tycon -> RecdField -> string //------------------------------------------------------------------------- val slotSigHasVoidReturnTy : SlotSig -> bool + val actualReturnTyOfSlotSig : TypeInst -> TypeInst -> SlotSig -> TType option val returnTyOfMethod : TcGlobals -> ObjExprMethod -> TType option @@ -1174,25 +1615,37 @@ val returnTyOfMethod : TcGlobals -> ObjExprMethod -> TType option //------------------------------------------------------------------------- val mkRefCell : TcGlobals -> range -> TType -> Expr -> Expr + val mkRefCellGet : TcGlobals -> range -> TType -> Expr -> Expr + val mkRefCellSet : TcGlobals -> range -> TType -> Expr -> Expr -> Expr + val mkLazyDelayed : TcGlobals -> range -> TType -> Expr -> Expr -val mkLazyForce : TcGlobals -> range -> TType -> Expr -> Expr +val mkLazyForce : TcGlobals -> range -> TType -> Expr -> Expr val mkRefCellContentsRef : TcGlobals -> RecdFieldRef + val isRefCellTy : TcGlobals -> TType -> bool + val destRefCellTy : TcGlobals -> TType -> TType + val mkRefCellTy : TcGlobals -> TType -> TType val mkSeqTy : TcGlobals -> TType -> TType + val mkIEnumeratorTy : TcGlobals -> TType -> TType + val mkListTy : TcGlobals -> TType -> TType + val mkOptionTy : TcGlobals -> TType -> TType + val mkNoneCase : TcGlobals -> UnionCaseRef + val mkSomeCase : TcGlobals -> UnionCaseRef val mkNil : TcGlobals -> range -> TType -> Expr + val mkCons : TcGlobals -> TType -> Expr -> Expr -> Expr //------------------------------------------------------------------------- @@ -1200,17 +1653,29 @@ val mkCons : TcGlobals -> TType -> Expr -> Expr -> Expr //------------------------------------------------------------------------- val mkSequential : SequencePointInfoForSeq -> range -> Expr -> Expr -> Expr + val mkCompGenSequential : range -> Expr -> Expr -> Expr + val mkSequentials : SequencePointInfoForSeq -> TcGlobals -> range -> Exprs -> Expr + val mkRecordExpr : TcGlobals -> RecordConstructionInfo * TyconRef * TypeInst * RecdFieldRef list * Exprs * range -> Expr + val mkUnbox : TType -> Expr -> range -> Expr + val mkBox : TType -> Expr -> range -> Expr + val mkIsInst : TType -> Expr -> range -> Expr + val mkNull : range -> TType -> Expr + val mkNullTest : TcGlobals -> range -> Expr -> Expr -> Expr -> Expr + val mkNonNullTest : TcGlobals -> range -> Expr -> Expr + val mkIsInstConditional : TcGlobals -> range -> TType -> Expr -> Val -> Expr -> Expr -> Expr + val mkThrow : range -> TType -> Expr -> Expr + val mkGetArg0 : range -> TType -> Expr val mkDefault : range * TType -> Expr @@ -1218,18 +1683,31 @@ val mkDefault : range * TType -> Expr val isThrow : Expr -> bool val mkString : TcGlobals -> range -> string -> Expr + val mkBool : TcGlobals -> range -> bool -> Expr + val mkByte : TcGlobals -> range -> byte -> Expr + val mkUInt16 : TcGlobals -> range -> uint16 -> Expr + val mkTrue : TcGlobals -> range -> Expr + val mkFalse : TcGlobals -> range -> Expr + val mkUnit : TcGlobals -> range -> Expr + val mkInt32 : TcGlobals -> range -> int32 -> Expr + val mkInt : TcGlobals -> range -> int -> Expr + val mkZero : TcGlobals -> range -> Expr + val mkOne : TcGlobals -> range -> Expr + val mkTwo : TcGlobals -> range -> Expr + val mkMinusOne : TcGlobals -> range -> Expr + val destInt32 : Expr -> int32 option //------------------------------------------------------------------------- @@ -1237,8 +1715,11 @@ val destInt32 : Expr -> int32 option //------------------------------------------------------------------------- val isQuotedExprTy : TcGlobals -> TType -> bool + val destQuotedExprTy : TcGlobals -> TType -> TType + val mkQuotedExprTy : TcGlobals -> TType -> TType + val mkRawQuotedExprTy : TcGlobals -> TType //------------------------------------------------------------------------- @@ -1246,9 +1727,13 @@ val mkRawQuotedExprTy : TcGlobals -> TType //------------------------------------------------------------------------- val mspec_Type_GetTypeFromHandle : TcGlobals -> ILMethodSpec + val fspec_Missing_Value : TcGlobals -> ILFieldSpec + val mkInitializeArrayMethSpec: TcGlobals -> ILMethodSpec + val mkByteArrayTy : TcGlobals -> TType + val mkInvalidCastExnNewobj: TcGlobals -> ILInstr @@ -1259,122 +1744,207 @@ val mkInvalidCastExnNewobj: TcGlobals -> ILInstr val mkCallNewFormat : TcGlobals -> range -> TType -> TType -> TType -> TType -> TType -> Expr -> Expr val mkCallUnbox : TcGlobals -> range -> TType -> Expr -> Expr + val mkCallGetGenericComparer : TcGlobals -> range -> Expr + val mkCallGetGenericEREqualityComparer : TcGlobals -> range -> Expr + val mkCallGetGenericPEREqualityComparer : TcGlobals -> range -> Expr val mkCallUnboxFast : TcGlobals -> range -> TType -> Expr -> Expr + val canUseUnboxFast : TcGlobals -> range -> TType -> bool val mkCallDispose : TcGlobals -> range -> TType -> Expr -> Expr + val mkCallSeq : TcGlobals -> range -> TType -> Expr -> Expr val mkCallTypeTest : TcGlobals -> range -> TType -> Expr -> Expr + val canUseTypeTestFast : TcGlobals -> TType -> bool val mkCallTypeOf : TcGlobals -> range -> TType -> Expr + val mkCallTypeDefOf : TcGlobals -> range -> TType -> Expr val mkCallCreateInstance : TcGlobals -> range -> TType -> Expr + val mkCallCreateEvent : TcGlobals -> range -> TType -> TType -> Expr -> Expr -> Expr -> Expr + val mkCallArrayLength : TcGlobals -> range -> TType -> Expr -> Expr + val mkCallArrayGet : TcGlobals -> range -> TType -> Expr -> Expr -> Expr + val mkCallArray2DGet : TcGlobals -> range -> TType -> Expr -> Expr -> Expr -> Expr + val mkCallArray3DGet : TcGlobals -> range -> TType -> Expr -> Expr -> Expr -> Expr -> Expr + val mkCallArray4DGet : TcGlobals -> range -> TType -> Expr -> Expr -> Expr -> Expr -> Expr -> Expr + val mkCallArraySet : TcGlobals -> range -> TType -> Expr -> Expr -> Expr -> Expr + val mkCallArray2DSet : TcGlobals -> range -> TType -> Expr -> Expr -> Expr -> Expr -> Expr + val mkCallArray3DSet : TcGlobals -> range -> TType -> Expr -> Expr -> Expr -> Expr -> Expr -> Expr + val mkCallArray4DSet : TcGlobals -> range -> TType -> Expr -> Expr -> Expr -> Expr -> Expr -> Expr -> Expr val mkCallHash : TcGlobals -> range -> TType -> Expr -> Expr + val mkCallBox : TcGlobals -> range -> TType -> Expr -> Expr + val mkCallIsNull : TcGlobals -> range -> TType -> Expr -> Expr + val mkCallIsNotNull : TcGlobals -> range -> TType -> Expr -> Expr + val mkCallRaise : TcGlobals -> range -> TType -> Expr -> Expr val mkCallGenericComparisonWithComparerOuter : TcGlobals -> range -> TType -> Expr -> Expr -> Expr -> Expr + val mkCallGenericEqualityEROuter : TcGlobals -> range -> TType -> Expr -> Expr -> Expr + val mkCallGenericEqualityWithComparerOuter : TcGlobals -> range -> TType -> Expr -> Expr -> Expr -> Expr + val mkCallGenericHashWithComparerOuter : TcGlobals -> range -> TType -> Expr -> Expr -> Expr val mkCallEqualsOperator : TcGlobals -> range -> TType -> Expr -> Expr -> Expr + val mkCallNotEqualsOperator : TcGlobals -> range -> TType -> Expr -> Expr -> Expr + val mkCallLessThanOperator : TcGlobals -> range -> TType -> Expr -> Expr -> Expr + val mkCallLessThanOrEqualsOperator : TcGlobals -> range -> TType -> Expr -> Expr -> Expr + val mkCallGreaterThanOperator : TcGlobals -> range -> TType -> Expr -> Expr -> Expr + val mkCallGreaterThanOrEqualsOperator : TcGlobals -> range -> TType -> Expr -> Expr -> Expr val mkCallAdditionOperator : TcGlobals -> range -> TType -> Expr -> Expr -> Expr + val mkCallSubtractionOperator : TcGlobals -> range -> TType -> Expr -> Expr -> Expr + val mkCallMultiplyOperator : TcGlobals -> range -> TType -> Expr -> Expr -> Expr + val mkCallDivisionOperator : TcGlobals -> range -> TType -> Expr -> Expr -> Expr + val mkCallModulusOperator : TcGlobals -> range -> TType -> Expr -> Expr -> Expr + val mkCallBitwiseAndOperator : TcGlobals -> range -> TType -> Expr -> Expr -> Expr + val mkCallBitwiseOrOperator : TcGlobals -> range -> TType -> Expr -> Expr -> Expr + val mkCallBitwiseXorOperator : TcGlobals -> range -> TType -> Expr -> Expr -> Expr + val mkCallShiftLeftOperator : TcGlobals -> range -> TType -> Expr -> Expr -> Expr + val mkCallShiftRightOperator : TcGlobals -> range -> TType -> Expr -> Expr -> Expr val mkCallUnaryNegOperator : TcGlobals -> range -> TType -> Expr -> Expr + val mkCallUnaryNotOperator : TcGlobals -> range -> TType -> Expr -> Expr val mkCallAdditionChecked : TcGlobals -> range -> TType -> Expr -> Expr -> Expr + val mkCallSubtractionChecked : TcGlobals -> range -> TType -> Expr -> Expr -> Expr + val mkCallMultiplyChecked : TcGlobals -> range -> TType -> Expr -> Expr -> Expr + val mkCallUnaryNegChecked : TcGlobals -> range -> TType -> Expr -> Expr val mkCallToByteChecked : TcGlobals -> range -> TType -> Expr -> Expr + val mkCallToSByteChecked : TcGlobals -> range -> TType -> Expr -> Expr + val mkCallToInt16Checked : TcGlobals -> range -> TType -> Expr -> Expr + val mkCallToUInt16Checked : TcGlobals -> range -> TType -> Expr -> Expr + val mkCallToIntChecked : TcGlobals -> range -> TType -> Expr -> Expr + val mkCallToInt32Checked : TcGlobals -> range -> TType -> Expr -> Expr + val mkCallToUInt32Checked : TcGlobals -> range -> TType -> Expr -> Expr + val mkCallToInt64Checked : TcGlobals -> range -> TType -> Expr -> Expr + val mkCallToUInt64Checked : TcGlobals -> range -> TType -> Expr -> Expr + val mkCallToIntPtrChecked : TcGlobals -> range -> TType -> Expr -> Expr + val mkCallToUIntPtrChecked : TcGlobals -> range -> TType -> Expr -> Expr val mkCallToByteOperator : TcGlobals -> range -> TType -> Expr -> Expr + val mkCallToSByteOperator : TcGlobals -> range -> TType -> Expr -> Expr + val mkCallToInt16Operator : TcGlobals -> range -> TType -> Expr -> Expr + val mkCallToUInt16Operator : TcGlobals -> range -> TType -> Expr -> Expr + val mkCallToIntOperator : TcGlobals -> range -> TType -> Expr -> Expr + val mkCallToInt32Operator : TcGlobals -> range -> TType -> Expr -> Expr + val mkCallToUInt32Operator : TcGlobals -> range -> TType -> Expr -> Expr + val mkCallToInt64Operator : TcGlobals -> range -> TType -> Expr -> Expr + val mkCallToUInt64Operator : TcGlobals -> range -> TType -> Expr -> Expr + val mkCallToSingleOperator : TcGlobals -> range -> TType -> Expr -> Expr + val mkCallToDoubleOperator : TcGlobals -> range -> TType -> Expr -> Expr + val mkCallToIntPtrOperator : TcGlobals -> range -> TType -> Expr -> Expr + val mkCallToUIntPtrOperator : TcGlobals -> range -> TType -> Expr -> Expr val mkCallToCharOperator : TcGlobals -> range -> TType -> Expr -> Expr + val mkCallToEnumOperator : TcGlobals -> range -> TType -> Expr -> Expr val mkCallDeserializeQuotationFSharp20Plus : TcGlobals -> range -> Expr -> Expr -> Expr -> Expr -> Expr + val mkCallDeserializeQuotationFSharp40Plus : TcGlobals -> range -> Expr -> Expr -> Expr -> Expr -> Expr -> Expr + val mkCallCastQuotation : TcGlobals -> range -> TType -> Expr -> Expr + val mkCallLiftValueWithName : TcGlobals -> range -> TType -> string -> Expr -> Expr + val mkCallLiftValueWithDefn : TcGlobals -> range -> TType -> Expr -> Expr + val mkCallSeqCollect : TcGlobals -> range -> TType -> TType -> Expr -> Expr -> Expr + val mkCallSeqUsing : TcGlobals -> range -> TType -> TType -> Expr -> Expr -> Expr + val mkCallSeqDelay : TcGlobals -> range -> TType -> Expr -> Expr + val mkCallSeqAppend : TcGlobals -> range -> TType -> Expr -> Expr -> Expr + val mkCallSeqFinally : TcGlobals -> range -> TType -> Expr -> Expr -> Expr + val mkCallSeqGenerated : TcGlobals -> range -> TType -> Expr -> Expr -> Expr + val mkCallSeqOfFunctions : TcGlobals -> range -> TType -> TType -> Expr -> Expr -> Expr -> Expr + val mkCallSeqToArray : TcGlobals -> range -> TType -> Expr -> Expr + val mkCallSeqToList : TcGlobals -> range -> TType -> Expr -> Expr + val mkCallSeqMap : TcGlobals -> range -> TType -> TType -> Expr -> Expr -> Expr + val mkCallSeqSingleton : TcGlobals -> range -> TType -> Expr -> Expr + val mkCallSeqEmpty : TcGlobals -> range -> TType -> Expr + val mkILAsmCeq : TcGlobals -> range -> Expr -> Expr -> Expr + val mkILAsmClt : TcGlobals -> range -> Expr -> Expr -> Expr val mkCallFailInit : TcGlobals -> range -> Expr + val mkCallFailStaticInit : TcGlobals -> range -> Expr + val mkCallCheckThis : TcGlobals -> range -> TType -> Expr -> Expr val mkCase : DecisionTreeTest * DecisionTree -> DecisionTreeCase @@ -1382,13 +1952,17 @@ val mkCase : DecisionTreeTest * DecisionTree -> DecisionTreeCase val mkCallQuoteToLinqLambdaExpression : TcGlobals -> range -> TType -> Expr -> Expr val mkCallGetQuerySourceAsEnumerable : TcGlobals -> range -> TType -> TType -> Expr -> Expr + val mkCallNewQuerySource : TcGlobals -> range -> TType -> TType -> Expr -> Expr val mkArray : TType * Exprs * range -> Expr val mkStaticCall_String_Concat2 : TcGlobals -> range -> Expr -> Expr -> Expr + val mkStaticCall_String_Concat3 : TcGlobals -> range -> Expr -> Expr -> Expr -> Expr + val mkStaticCall_String_Concat4 : TcGlobals -> range -> Expr -> Expr -> Expr -> Expr -> Expr + val mkStaticCall_String_Concat_Array : TcGlobals -> range -> Expr -> Expr //------------------------------------------------------------------------- @@ -1397,8 +1971,11 @@ val mkStaticCall_String_Concat_Array : TcGlobals -> range -> Expr -> Expr //------------------------------------------------------------------------- val mkDecr : TcGlobals -> range -> Expr -> Expr + val mkIncr : TcGlobals -> range -> Expr -> Expr + val mkLdlen : TcGlobals -> range -> Expr -> Expr + val mkLdelem : TcGlobals -> range -> TType -> Expr -> Expr -> Expr //------------------------------------------------------------------------- @@ -1406,18 +1983,29 @@ val mkLdelem : TcGlobals -> range -> TType -> Expr -> Expr -> Expr //------------------------------------------------------------------------- val TryDecodeILAttribute : TcGlobals -> ILTypeRef -> ILAttributes -> (ILAttribElem list * ILAttributeNamedArg list) option + val TryFindILAttribute : BuiltinAttribInfo -> ILAttributes -> bool + val TryFindILAttributeOpt : BuiltinAttribInfo option -> ILAttributes -> bool val IsMatchingFSharpAttribute : TcGlobals -> BuiltinAttribInfo -> Attrib -> bool + val IsMatchingFSharpAttributeOpt : TcGlobals -> BuiltinAttribInfo option -> Attrib -> bool + val HasFSharpAttribute : TcGlobals -> BuiltinAttribInfo -> Attribs -> bool + val HasFSharpAttributeOpt : TcGlobals -> BuiltinAttribInfo option -> Attribs -> bool + val TryFindFSharpAttribute : TcGlobals -> BuiltinAttribInfo -> Attribs -> Attrib option + val TryFindFSharpAttributeOpt : TcGlobals -> BuiltinAttribInfo option -> Attribs -> Attrib option + val TryFindFSharpBoolAttribute : TcGlobals -> BuiltinAttribInfo -> Attribs -> bool option + val TryFindFSharpBoolAttributeAssumeFalse : TcGlobals -> BuiltinAttribInfo -> Attribs -> bool option + val TryFindFSharpStringAttribute : TcGlobals -> BuiltinAttribInfo -> Attribs -> string option + val TryFindFSharpInt32Attribute : TcGlobals -> BuiltinAttribInfo -> Attribs -> int32 option /// Try to find a specific attribute on a type definition, where the attribute accepts a string argument. @@ -1438,19 +2026,29 @@ val TryFindAttributeUsageAttribute : TcGlobals -> range -> TyconRef -> bool opti /// returns Some(assemblyName) for success val TryDecodeTypeProviderAssemblyAttr : ILGlobals -> ILAttribute -> string option #endif + val IsSignatureDataVersionAttr : ILAttribute -> bool + val TryFindAutoOpenAttr : IL.ILGlobals -> ILAttribute -> string option + val TryFindInternalsVisibleToAttr : IL.ILGlobals -> ILAttribute -> string option -val IsMatchingSignatureDataVersionAttr : IL.ILGlobals -> ILVersionInfo -> ILAttribute -> bool +val IsMatchingSignatureDataVersionAttr : IL.ILGlobals -> ILVersionInfo -> ILAttribute -> bool val mkCompilationMappingAttr : TcGlobals -> int -> ILAttribute val mkCompilationMappingAttrWithSeqNum : TcGlobals -> int -> int -> ILAttribute + + val mkCompilationMappingAttrWithVariantNumAndSeqNum : TcGlobals -> int -> int -> int -> ILAttribute + val mkCompilationMappingAttrForQuotationResource : TcGlobals -> string * ILTypeRef list -> ILAttribute + val mkCompilationArgumentCountsAttr : TcGlobals -> int list -> ILAttribute + val mkCompilationSourceNameAttr : TcGlobals -> string -> ILAttribute + val mkSignatureDataVersionAttr : TcGlobals -> ILVersionInfo -> ILAttribute + val mkCompilerGeneratedAttr : TcGlobals -> int -> ILAttribute //------------------------------------------------------------------------- @@ -1458,16 +2056,23 @@ val mkCompilerGeneratedAttr : TcGlobals -> int -> ILAtt //------------------------------------------------------------------------- val isInByrefTy : TcGlobals -> TType -> bool + val isOutByrefTy : TcGlobals -> TType -> bool + val isByrefTy : TcGlobals -> TType -> bool val isNativePtrTy : TcGlobals -> TType -> bool + val destByrefTy : TcGlobals -> TType -> TType + val destNativePtrTy : TcGlobals -> TType -> TType val isByrefTyconRef : TcGlobals -> TyconRef -> bool + val isByrefLikeTyconRef : TcGlobals -> range -> TyconRef -> bool + val isSpanLikeTyconRef : TcGlobals -> range -> TyconRef -> bool + val isByrefLikeTy : TcGlobals -> range -> TType -> bool /// Check if the type is a byref-like but not a byref. @@ -1478,33 +2083,37 @@ val isSpanLikeTy : TcGlobals -> range -> TType -> bool //------------------------------------------------------------------------- val isRefTupleExpr : Expr -> bool + val tryDestRefTupleExpr : Expr -> Exprs val mkAnyTupledTy : TcGlobals -> TupInfo -> TType list -> TType + val mkAnyTupled : TcGlobals -> range -> TupInfo -> Exprs -> TType list -> Expr + val mkRefTupled : TcGlobals -> range -> Exprs -> TType list -> Expr + val mkRefTupledNoTypes : TcGlobals -> range -> Exprs -> Expr + val mkRefTupledTy : TcGlobals -> TType list -> TType + val mkRefTupledVarsTy : TcGlobals -> Val list -> TType -val mkRefTupledVars : TcGlobals -> range -> Val list -> Expr -val mkMethodTy : TcGlobals -> TType list list -> TType -> TType +val mkRefTupledVars : TcGlobals -> range -> Val list -> Expr -//------------------------------------------------------------------------- -// Anonymous records -//------------------------------------------------------------------------- +val mkMethodTy : TcGlobals -> TType list list -> TType -> TType val mkAnyAnonRecdTy : TcGlobals -> AnonRecdTypeInfo -> TType list -> TType -val mkAnonRecd : TcGlobals -> range -> AnonRecdTypeInfo -> Exprs -> TType list -> Expr -//------------------------------------------------------------------------- -// -//------------------------------------------------------------------------- +val mkAnonRecd : TcGlobals -> range -> AnonRecdTypeInfo -> Exprs -> TType list -> Expr val AdjustValForExpectedArity : TcGlobals -> range -> ValRef -> ValUseFlag -> ValReprInfo -> Expr * TType + val AdjustValToTopVal : Val -> ParentRef -> ValReprInfo -> unit + val LinearizeTopMatch : TcGlobals -> ParentRef -> Expr -> Expr + val AdjustPossibleSubsumptionExpr : TcGlobals -> Expr -> Exprs -> (Expr * Exprs) option + val NormalizeAndAdjustPossibleSubsumptionExprs : TcGlobals -> Expr -> Expr //------------------------------------------------------------------------- @@ -1514,28 +2123,35 @@ val NormalizeAndAdjustPossibleSubsumptionExprs : TcGlobals -> Expr -> Expr val buildAccessPath : CompilationPath option -> string val XmlDocArgsEnc : TcGlobals -> Typars * Typars -> TType list -> string + val XmlDocSigOfVal : TcGlobals -> string -> Val -> string + val XmlDocSigOfUnionCase : (string list -> string) + val XmlDocSigOfField : (string list -> string) + val XmlDocSigOfProperty : (string list -> string) + val XmlDocSigOfTycon : (string list -> string) + val XmlDocSigOfSubModul : (string list -> string) + val XmlDocSigOfEntity : EntityRef -> string //--------------------------------------------------------------------------- // Resolve static optimizations //------------------------------------------------------------------------- + type StaticOptimizationAnswer = | Yes = 1y | No = -1y | Unknown = 0y + val DecideStaticOptimizations : TcGlobals -> StaticOptimization list -> StaticOptimizationAnswer -val mkStaticOptimizationExpr : TcGlobals -> StaticOptimization list * Expr * Expr * range -> Expr -//--------------------------------------------------------------------------- -// Build for loops -//------------------------------------------------------------------------- +val mkStaticOptimizationExpr : TcGlobals -> StaticOptimization list * Expr * Expr * range -> Expr +/// Build for loops val mkFastForLoop : TcGlobals -> SequencePointInfoForForLoop * range * Val * Expr * bool * Expr * Expr -> Expr //--------------------------------------------------------------------------- @@ -1546,12 +2162,15 @@ type ActivePatternElemRef with member Name : string val TryGetActivePatternInfo : ValRef -> PrettyNaming.ActivePatternInfo option + val mkChoiceCaseRef : TcGlobals -> range -> int -> int -> UnionCaseRef type PrettyNaming.ActivePatternInfo with + member Names : string list member ResultType : TcGlobals -> range -> TType list -> TType + member OverallType : TcGlobals -> range -> TType -> TType list -> TType val doesActivePatternHaveFreeTypars : TcGlobals -> ValRef -> bool @@ -1562,61 +2181,84 @@ val doesActivePatternHaveFreeTypars : TcGlobals -> ValRef -> bool [] type ExprRewritingEnv = - {PreIntercept: ((Expr -> Expr) -> Expr -> Expr option) option; - PostTransform: Expr -> Expr option; - PreInterceptBinding: ((Expr -> Expr) -> Binding -> Binding option) option; - IsUnderQuotations: bool } + { PreIntercept: ((Expr -> Expr) -> Expr -> Expr option) option + PostTransform: Expr -> Expr option + PreInterceptBinding: ((Expr -> Expr) -> Binding -> Binding option) option + IsUnderQuotations: bool } val RewriteExpr : ExprRewritingEnv -> Expr -> Expr + val RewriteImplFile : ExprRewritingEnv -> TypedImplFile -> TypedImplFile val IsGenericValWithGenericContraints: TcGlobals -> Val -> bool type Entity with + member HasInterface : TcGlobals -> TType -> bool + member HasOverride : TcGlobals -> string -> TType list -> bool + member HasMember : TcGlobals -> string -> TType list -> bool type EntityRef with + member HasInterface : TcGlobals -> TType -> bool + member HasOverride : TcGlobals -> string -> TType list -> bool + member HasMember : TcGlobals -> string -> TType list -> bool val (|AttribBitwiseOrExpr|_|) : TcGlobals -> Expr -> (Expr * Expr) option + val (|EnumExpr|_|) : TcGlobals -> Expr -> Expr option + val (|TypeOfExpr|_|) : TcGlobals -> Expr -> TType option + val (|TypeDefOfExpr|_|) : TcGlobals -> Expr -> TType option val EvalLiteralExprOrAttribArg: TcGlobals -> Expr -> Expr + val EvaledAttribExprEquality : TcGlobals -> Expr -> Expr -> bool + val IsSimpleSyntacticConstantExpr: TcGlobals -> Expr -> bool val (|ConstToILFieldInit|_|): Const -> ILFieldInit option val (|ExtractAttribNamedArg|_|) : string -> AttribNamedArg list -> AttribExpr option + val (|AttribInt32Arg|_|) : AttribExpr -> int32 option + val (|AttribInt16Arg|_|) : AttribExpr -> int16 option + val (|AttribBoolArg|_|) : AttribExpr -> bool option + val (|AttribStringArg|_|) : AttribExpr -> string option + val (|Int32Expr|_|) : Expr -> int32 option /// Determines types that are potentially known to satisfy the 'comparable' constraint and returns /// a set of residual types that must also satisfy the constraint val (|SpecialComparableHeadType|_|) : TcGlobals -> TType -> TType list option + val (|SpecialEquatableHeadType|_|) : TcGlobals -> TType -> TType list option + val (|SpecialNotEquatableHeadType|_|) : TcGlobals -> TType -> unit option type OptimizeForExpressionOptions = OptimizeIntRangesOnly | OptimizeAllForExpressions + val DetectAndOptimizeForExpression : TcGlobals -> OptimizeForExpressionOptions -> Expr -> Expr val TryEliminateDesugaredConstants : TcGlobals -> range -> Const -> Expr option val MemberIsExplicitImpl : TcGlobals -> ValMemberInfo -> bool + val ValIsExplicitImpl : TcGlobals -> Val -> bool + val ValRefIsExplicitImpl : TcGlobals -> ValRef -> bool val (|LinearMatchExpr|_|) : Expr -> (SequencePointInfoForBinding * range * DecisionTree * DecisionTreeTarget * Expr * SequencePointInfoForTarget * range * TType) option + val rebuildLinearMatchExpr : (SequencePointInfoForBinding * range * DecisionTree * DecisionTreeTarget * Expr * SequencePointInfoForTarget * range * TType) -> Expr val mkCoerceIfNeeded : TcGlobals -> tgtTy: TType -> srcTy: TType -> Expr -> Expr diff --git a/src/fsharp/TypeChecker.fs b/src/fsharp/TypeChecker.fs index d9bdb7e52e3..a20b3743ca1 100755 --- a/src/fsharp/TypeChecker.fs +++ b/src/fsharp/TypeChecker.fs @@ -17387,7 +17387,7 @@ let CheckModuleSignature g cenv m denvAtEnd rootSigOpt implFileTypePriorToSig im // Compute the remapping from implementation to signature let remapInfo , _ = ComputeRemappingFromInferredSignatureToExplicitSignature cenv.g implFileTypePriorToSig sigFileType - let aenv = { TypeEquivEnv.Empty with EquivTycons = TyconRefMap.OfList remapInfo.mrpiEntities } + let aenv = { TypeEquivEnv.Empty with EquivTycons = TyconRefMap.OfList remapInfo.RepackagedEntities } if not (SignatureConformance.Checker(cenv.g, cenv.amap, denv, remapInfo, true).CheckSignature aenv (mkLocalModRef implFileSpecPriorToSig) sigFileType) then ( // We can just raise 'ReportedError' since CheckModuleOrNamespace raises its own error From 41891aa7c26e09967053e11c869a5c451664b63a Mon Sep 17 00:00:00 2001 From: "Brett V. Forsgren" Date: Wed, 23 Jan 2019 18:04:08 -0800 Subject: [PATCH 159/160] save and publish log from package publishing step (#6141) save and publish log from package publishing step --- .gitignore | 5 +- .vsts-signed.yaml | 54 +- Makefile | 7 +- NuGet.Config | 9 + PublishToBlob.proj | 19 +- build.cmd | 4 - eng/common/CIBuild.cmd | 2 + eng/common/PublishBuildAssets.cmd | 3 + eng/common/PublishToPackageFeed.proj | 37 ++ eng/common/README.md | 28 + eng/common/build.ps1 | 133 +++++ eng/common/build.sh | 213 ++++++++ eng/common/cibuild.sh | 16 + eng/common/cross/android/arm/toolchain.cmake | 41 ++ .../cross/android/arm64/toolchain.cmake | 42 ++ eng/common/cross/arm/sources.list.bionic | 11 + eng/common/cross/arm/sources.list.jessie | 3 + eng/common/cross/arm/sources.list.trusty | 11 + eng/common/cross/arm/sources.list.vivid | 11 + eng/common/cross/arm/sources.list.wily | 11 + eng/common/cross/arm/sources.list.xenial | 11 + eng/common/cross/arm/sources.list.zesty | 11 + eng/common/cross/arm/trusty-lttng-2.4.patch | 71 +++ eng/common/cross/arm/trusty.patch | 97 ++++ eng/common/cross/arm64/sources.list.bionic | 11 + eng/common/cross/arm64/sources.list.trusty | 11 + eng/common/cross/arm64/sources.list.vivid | 11 + eng/common/cross/arm64/sources.list.wily | 11 + eng/common/cross/arm64/sources.list.xenial | 11 + eng/common/cross/arm64/sources.list.zesty | 11 + eng/common/cross/armel/sources.list.jessie | 3 + eng/common/cross/armel/tizen-build-rootfs.sh | 44 ++ eng/common/cross/armel/tizen-fetch.sh | 171 ++++++ eng/common/cross/armel/tizen/tizen-dotnet.ks | 50 ++ eng/common/cross/armel/tizen/tizen.patch | 18 + eng/common/cross/build-android-rootfs.sh | 137 +++++ eng/common/cross/build-rootfs.sh | 210 ++++++++ eng/common/cross/toolchain.cmake | 138 +++++ eng/common/cross/x86/sources.list.bionic | 11 + eng/common/cross/x86/sources.list.trusty | 11 + eng/common/cross/x86/sources.list.vivid | 11 + eng/common/cross/x86/sources.list.wily | 11 + eng/common/cross/x86/sources.list.xenial | 11 + eng/common/darc-init.ps1 | 32 ++ eng/common/darc-init.sh | 38 ++ eng/common/helixpublish.proj | 26 + eng/common/init-tools-native.cmd | 3 + eng/common/init-tools-native.ps1 | 128 +++++ eng/common/init-tools-native.sh | 145 +++++ eng/common/msbuild.ps1 | 27 + eng/common/msbuild.sh | 58 ++ eng/common/native/CommonLibrary.psm1 | 358 ++++++++++++ eng/common/native/common-library.sh | 168 ++++++ eng/common/native/install-cmake.sh | 117 ++++ eng/common/native/install-tool.ps1 | 130 +++++ eng/common/sdk-task.ps1 | 74 +++ eng/common/templates/job/job.yml | 205 +++++++ .../templates/job/publish-build-assets.yml | 63 +++ eng/common/templates/jobs/jobs.yml | 77 +++ eng/common/templates/phases/base.yml | 130 +++++ .../templates/phases/publish-build-assets.yml | 46 ++ eng/common/templates/steps/build-reason.yml | 12 + eng/common/templates/steps/helix-publish.yml | 51 ++ eng/common/templates/steps/run-on-unix.yml | 7 + eng/common/templates/steps/run-on-windows.yml | 7 + .../steps/run-script-ifequalelse.yml | 33 ++ eng/common/templates/steps/send-to-helix.yml | 81 +++ eng/common/templates/steps/telemetry-end.yml | 63 +++ .../templates/steps/telemetry-start.yml | 154 ++++++ eng/common/tools.ps1 | 508 ++++++++++++++++++ eng/common/tools.sh | 319 +++++++++++ fcs/build.fsx | 2 +- global.json | 9 + packages.config | 4 + 74 files changed, 4793 insertions(+), 24 deletions(-) create mode 100644 eng/common/CIBuild.cmd create mode 100644 eng/common/PublishBuildAssets.cmd create mode 100644 eng/common/PublishToPackageFeed.proj create mode 100644 eng/common/README.md create mode 100644 eng/common/build.ps1 create mode 100755 eng/common/build.sh create mode 100755 eng/common/cibuild.sh create mode 100644 eng/common/cross/android/arm/toolchain.cmake create mode 100644 eng/common/cross/android/arm64/toolchain.cmake create mode 100644 eng/common/cross/arm/sources.list.bionic create mode 100644 eng/common/cross/arm/sources.list.jessie create mode 100644 eng/common/cross/arm/sources.list.trusty create mode 100644 eng/common/cross/arm/sources.list.vivid create mode 100644 eng/common/cross/arm/sources.list.wily create mode 100644 eng/common/cross/arm/sources.list.xenial create mode 100644 eng/common/cross/arm/sources.list.zesty create mode 100644 eng/common/cross/arm/trusty-lttng-2.4.patch create mode 100644 eng/common/cross/arm/trusty.patch create mode 100644 eng/common/cross/arm64/sources.list.bionic create mode 100644 eng/common/cross/arm64/sources.list.trusty create mode 100644 eng/common/cross/arm64/sources.list.vivid create mode 100644 eng/common/cross/arm64/sources.list.wily create mode 100644 eng/common/cross/arm64/sources.list.xenial create mode 100644 eng/common/cross/arm64/sources.list.zesty create mode 100644 eng/common/cross/armel/sources.list.jessie create mode 100755 eng/common/cross/armel/tizen-build-rootfs.sh create mode 100755 eng/common/cross/armel/tizen-fetch.sh create mode 100644 eng/common/cross/armel/tizen/tizen-dotnet.ks create mode 100644 eng/common/cross/armel/tizen/tizen.patch create mode 100755 eng/common/cross/build-android-rootfs.sh create mode 100755 eng/common/cross/build-rootfs.sh create mode 100644 eng/common/cross/toolchain.cmake create mode 100644 eng/common/cross/x86/sources.list.bionic create mode 100644 eng/common/cross/x86/sources.list.trusty create mode 100644 eng/common/cross/x86/sources.list.vivid create mode 100644 eng/common/cross/x86/sources.list.wily create mode 100644 eng/common/cross/x86/sources.list.xenial create mode 100644 eng/common/darc-init.ps1 create mode 100755 eng/common/darc-init.sh create mode 100644 eng/common/helixpublish.proj create mode 100644 eng/common/init-tools-native.cmd create mode 100644 eng/common/init-tools-native.ps1 create mode 100755 eng/common/init-tools-native.sh create mode 100644 eng/common/msbuild.ps1 create mode 100755 eng/common/msbuild.sh create mode 100644 eng/common/native/CommonLibrary.psm1 create mode 100755 eng/common/native/common-library.sh create mode 100755 eng/common/native/install-cmake.sh create mode 100644 eng/common/native/install-tool.ps1 create mode 100644 eng/common/sdk-task.ps1 create mode 100644 eng/common/templates/job/job.yml create mode 100644 eng/common/templates/job/publish-build-assets.yml create mode 100644 eng/common/templates/jobs/jobs.yml create mode 100644 eng/common/templates/phases/base.yml create mode 100644 eng/common/templates/phases/publish-build-assets.yml create mode 100644 eng/common/templates/steps/build-reason.yml create mode 100644 eng/common/templates/steps/helix-publish.yml create mode 100644 eng/common/templates/steps/run-on-unix.yml create mode 100644 eng/common/templates/steps/run-on-windows.yml create mode 100644 eng/common/templates/steps/run-script-ifequalelse.yml create mode 100644 eng/common/templates/steps/send-to-helix.yml create mode 100644 eng/common/templates/steps/telemetry-end.yml create mode 100644 eng/common/templates/steps/telemetry-start.yml create mode 100644 eng/common/tools.ps1 create mode 100755 eng/common/tools.sh create mode 100644 global.json create mode 100644 packages.config diff --git a/.gitignore b/.gitignore index 28d53ff4e47..418b3677b36 100644 --- a/.gitignore +++ b/.gitignore @@ -1,10 +1,9 @@ # output location artifacts/ -/tests/scripts/current +packages/ -# auto-generated during the build -global.json +/tests/scripts/current # Patches that may have been generated by scripts. # (These aren't generally useful to commit directly; if anything, they should be applied.) diff --git a/.vsts-signed.yaml b/.vsts-signed.yaml index 25d7642cf09..823ac20297a 100644 --- a/.vsts-signed.yaml +++ b/.vsts-signed.yaml @@ -1,10 +1,17 @@ +variables: +- name: PB_PublishBlobFeedUrl + value: https://dotnetfeed.blob.core.windows.net/dotnet-core/index.json +- group: DotNet-Blob-Feed +- name: PB_PublishBlobFeedKey + value: $(dotnetfeed-storage-access-key-1) + jobs: - job: Full_Signed pool: name: VSEng-MicroBuildVS2017 timeoutInMinutes: 300 variables: - MSBuildConfiguration: 'Release' + BuildConfiguration: 'Release' steps: # Install Signing Plugin - task: ms-vseng.MicroBuildTasks.30666190-6959-11e5-9f96-f56098202fef.MicroBuildSigningPlugin@1 @@ -29,15 +36,44 @@ jobs: displayName: Publish nightly package to MyGet inputs: scriptName: 'setup\publish-assets.ps1' - arguments: '-binariesPath artifacts\bin -configuration $(MSBuildConfiguration) -branchName $(Build.SourceBranch) -apiKey $(FSharp.MyGetApiKey)' + arguments: '-binariesPath artifacts\bin -configuration $(BuildConfiguration) -branchName $(Build.SourceBranch) -apiKey $(FSharp.MyGetApiKey)' condition: and(succeeded(), contains(variables['PB_PublishType'], 'myget')) - # Publish packages to Azure Blob Storage + # Package publish + - task: CmdLine@1 + displayName: Restore package publishing + inputs: + filename: '.nuget\NuGet.exe' + arguments: 'restore packages.config -PackagesDirectory packages -Source https://dotnetfeed.blob.core.windows.net/dotnet-core/index.json' + condition: and(succeeded(), contains(variables['PB_PublishType'], 'blob')) - task: MSBuild@1 displayName: Publish packages to Azure Blob Storage inputs: solution: PublishToBlob.proj - msbuildArguments: '/t:Build /p:ExpectedFeedUrl=$(PB_PublishBlobFeedUrl) /p:AccountKey=$(PB_PublishBlobFeedKey) /p:ManifestBranch=$(SourceBranch) /p:ManifestCommit=$(SourceVersion) /p:ManifestBuildId=$(OfficialBuildId)' + msbuildArguments: '/t:Build /p:Configuration=$(BuildConfiguration) /p:ExpectedFeedUrl=$(PB_PublishBlobFeedUrl) /p:AccountKey=$(PB_PublishBlobFeedKey) /p:ManifestRepouri=$(Build.Repository.Uri) /p:ManifestBranch=$(Build.SourceBranch) /p:ManifestCommit=$(Build.SourceVersion) /p:ManifestBuildId=$(Build.BuildNumber) /bl:$(Build.SourcesDirectory)/artifacts/log/$(BuildConfiguration)/pub/publish.binlog' + condition: and(succeeded(), contains(variables['PB_PublishType'], 'blob')) + - task: PublishBuildArtifacts@1 + displayName: Publish publishing bin log + inputs: + PathtoPublish: '$(Build.SourcesDirectory)/artifacts/log/$(BuildConfiguration)/pub' + ArtifactName: 'Publish_bin_log' + publishLocation: Container + continueOnError: true + condition: and(succeeded(), contains(variables['PB_PublishType'], 'blob')) + - task: CopyFiles@2 + displayName: Gather Asset Manifests + inputs: + SourceFolder: '$(Build.SourcesDirectory)/artifacts/log/$(BuildConfiguration)/AssetManifest' + TargetFolder: '$(Build.StagingDirectory)/AssetManifests' + continueOnError: true + condition: and(succeeded(), contains(variables['PB_PublishType'], 'blob')) + - task: PublishBuildArtifacts@1 + displayName: Push Asset Manifests + inputs: + PathtoPublish: '$(Build.StagingDirectory)/AssetManifests' + PublishLocation: Container + ArtifactName: AssetManifests + continueOnError: true condition: and(succeeded(), contains(variables['PB_PublishType'], 'blob')) # Create static drop @@ -69,7 +105,7 @@ jobs: - task: ms-vseng.MicroBuildTasks.4305a8de-ba66-4d8b-b2d1-0dc4ecbbf5e8.MicroBuildUploadVstsDropFolder@1 displayName: Upload VSTS Drop inputs: - DropFolder: '$(Build.SourcesDirectory)\artifacts\VSSetup\$(MSBuildConfiguration)\Insertion' + DropFolder: '$(Build.SourcesDirectory)\artifacts\VSSetup\$(BuildConfiguration)\Insertion' condition: and(succeeded(), contains(variables['PB_PublishType'], 'vsts')) # Execute cleanup tasks @@ -94,3 +130,11 @@ jobs: sourcePath: '$(DropRoot)\$(Build.DefinitionName)\$(Build.SourceBranchName)\$(Build.BuildNumber)\SymStore' usePat: false condition: and(succeeded(), contains(variables['PB_PublishType'], 'symweb')) + +- template: /eng/common/templates/job/publish-build-assets.yml + parameters: + dependsOn: + - Full_Signed + pool: + vmImage: vs2017-win2016 + enablePublishBuildArtifacts: true diff --git a/Makefile b/Makefile index 14a5b0a8c07..dfb567b394b 100644 --- a/Makefile +++ b/Makefile @@ -8,10 +8,7 @@ all: proto restore build test tools: $(CURDIR)/scripts/dotnet-install.sh --version $(DotNetVersion) --install-dir "$(DotNetToolPath)" -global.json: tools - echo { \"sdk\": { \"version\": \"$(DotNetVersion)\" } }>global.json - -proto: global.json +proto: tools $(DotNetExe) build-server shutdown $(DotNetExe) restore src/buildtools/buildtools.proj $(DotNetExe) restore src/fsharp/FSharp.Build/FSharp.Build.fsproj @@ -20,7 +17,7 @@ proto: global.json $(DotNetExe) build src/fsharp/FSharp.Build/FSharp.Build.fsproj -f netstandard2.0 -c Proto $(DotNetExe) build src/fsharp/fsc/fsc.fsproj -f netcoreapp2.1 -c Proto -restore: global.json +restore: $(DotNetExe) restore src/fsharp/FSharp.Core/FSharp.Core.fsproj $(DotNetExe) restore src/fsharp/FSharp.Build/FSharp.Build.fsproj $(DotNetExe) restore src/fsharp/FSharp.Compiler.Private/FSharp.Compiler.Private.fsproj diff --git a/NuGet.Config b/NuGet.Config index 6efc7f7b978..fdf6d3eda46 100644 --- a/NuGet.Config +++ b/NuGet.Config @@ -3,4 +3,13 @@ + + + + + + + + + diff --git a/PublishToBlob.proj b/PublishToBlob.proj index 71fbfad44ed..21e8ec6eb6f 100644 --- a/PublishToBlob.proj +++ b/PublishToBlob.proj @@ -10,26 +10,33 @@ Microsoft.DotNet.Build.Tasks.Feed - 2.1.0-prerelease-02419-02 + 2.2.0-beta.19066.1 - - + + + + $(MSBuildThisFileDirectory)artifacts\log\$(Configuration)\ + AnyCPU + $(Platform) + $(ArtifactsLogDir)AssetManifest\$(OS)-$(PlatformName).xml + + + AssetManifestPath="$(AssetManifestFilePath)" /> diff --git a/build.cmd b/build.cmd index a29dd5de7a3..7a7ce4fe0ff 100644 --- a/build.cmd +++ b/build.cmd @@ -613,10 +613,6 @@ if not exist %_ngenexe% echo Error: Could not find ngen.exe. && goto :failure echo ---------------- Done with prepare, starting package restore ---------------- -:: create a global.json -set /p DOTNET_TOOLS_VERSION=<"%~dp0DotnetCLIToolsVersion.txt" -echo { "sdk": { "version": "%DOTNET_TOOLS_VERSION%" } }>global.json - :: Restore the Tools directory call "%~dp0init-tools.cmd" set _dotnetexe=%~dp0artifacts\toolset\dotnet\dotnet.exe diff --git a/eng/common/CIBuild.cmd b/eng/common/CIBuild.cmd new file mode 100644 index 00000000000..56c2f25ac22 --- /dev/null +++ b/eng/common/CIBuild.cmd @@ -0,0 +1,2 @@ +@echo off +powershell -ExecutionPolicy ByPass -NoProfile -command "& """%~dp0Build.ps1""" -restore -build -test -sign -pack -publish -ci %*" \ No newline at end of file diff --git a/eng/common/PublishBuildAssets.cmd b/eng/common/PublishBuildAssets.cmd new file mode 100644 index 00000000000..3c6e4ff829d --- /dev/null +++ b/eng/common/PublishBuildAssets.cmd @@ -0,0 +1,3 @@ +@echo off +powershell -ExecutionPolicy ByPass -NoProfile -command "& """%~dp0sdk-task.ps1""" -msbuildEngine dotnet -restore -projects PublishBuildAssets.proj -ci %*" +exit /b %ErrorLevel% diff --git a/eng/common/PublishToPackageFeed.proj b/eng/common/PublishToPackageFeed.proj new file mode 100644 index 00000000000..7dc478d981f --- /dev/null +++ b/eng/common/PublishToPackageFeed.proj @@ -0,0 +1,37 @@ + + + + netcoreapp2.1 + + + + + + + + + + + + + + + + + + diff --git a/eng/common/README.md b/eng/common/README.md new file mode 100644 index 00000000000..ff49c371527 --- /dev/null +++ b/eng/common/README.md @@ -0,0 +1,28 @@ +# Don't touch this folder + + uuuuuuuuuuuuuuuuuuuu + u" uuuuuuuuuuuuuuuuuu "u + u" u$$$$$$$$$$$$$$$$$$$$u "u + u" u$$$$$$$$$$$$$$$$$$$$$$$$u "u + u" u$$$$$$$$$$$$$$$$$$$$$$$$$$$$u "u + u" u$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$u "u + u" u$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$u "u + $ $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ $ + $ $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ $ + $ $$$" ... "$... ...$" ... "$$$ ... "$$$ $ + $ $$$u `"$$$$$$$ $$$ $$$$$ $$ $$$ $$$ $ + $ $$$$$$uu "$$$$ $$$ $$$$$ $$ """ u$$$ $ + $ $$$""$$$ $$$$ $$$u "$$$" u$$ $$$$$$$$ $ + $ $$$$....,$$$$$..$$$$$....,$$$$..$$$$$$$$ $ + $ $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ $ + "u "$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$" u" + "u "$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$" u" + "u "$$$$$$$$$$$$$$$$$$$$$$$$$$$$" u" + "u "$$$$$$$$$$$$$$$$$$$$$$$$" u" + "u "$$$$$$$$$$$$$$$$$$$$" u" + "u """""""""""""""""" u" + """""""""""""""""""" + +!!! Changes made in this directory are subject to being overwritten by automation !!! + +The files in this directory are shared by all Arcade repos and managed by automation. If you need to make changes to these files, open an issue or submit a pull request to https://github.com/dotnet/arcade first. diff --git a/eng/common/build.ps1 b/eng/common/build.ps1 new file mode 100644 index 00000000000..8279dc71339 --- /dev/null +++ b/eng/common/build.ps1 @@ -0,0 +1,133 @@ +[CmdletBinding(PositionalBinding=$false)] +Param( + [string][Alias('c')]$configuration = "Debug", + [string] $projects, + [string][Alias('v')]$verbosity = "minimal", + [string] $msbuildEngine = $null, + [bool] $warnAsError = $true, + [bool] $nodeReuse = $true, + [switch][Alias('r')]$restore, + [switch] $deployDeps, + [switch][Alias('b')]$build, + [switch] $rebuild, + [switch] $deploy, + [switch] $test, + [switch] $integrationTest, + [switch] $performanceTest, + [switch] $sign, + [switch] $pack, + [switch] $publish, + [switch][Alias('bl')]$binaryLog, + [switch] $ci, + [switch] $prepareMachine, + [switch] $help, + [Parameter(ValueFromRemainingArguments=$true)][String[]]$properties +) + +. $PSScriptRoot\tools.ps1 + +function Print-Usage() { + Write-Host "Common settings:" + Write-Host " -configuration Build configuration: 'Debug' or 'Release' (short: -c)" + Write-Host " -verbosity Msbuild verbosity: q[uiet], m[inimal], n[ormal], d[etailed], and diag[nostic] (short: -v)" + Write-Host " -binaryLog Output binary log (short: -bl)" + Write-Host " -help Print help and exit" + Write-Host "" + + Write-Host "Actions:" + Write-Host " -restore Restore dependencies (short: -r)" + Write-Host " -build Build solution (short: -b)" + Write-Host " -rebuild Rebuild solution" + Write-Host " -deploy Deploy built VSIXes" + Write-Host " -deployDeps Deploy dependencies (e.g. VSIXes for integration tests)" + Write-Host " -test Run all unit tests in the solution" + Write-Host " -pack Package build outputs into NuGet packages and Willow components" + Write-Host " -integrationTest Run all integration tests in the solution" + Write-Host " -performanceTest Run all performance tests in the solution" + Write-Host " -sign Sign build outputs" + Write-Host " -publish Publish artifacts (e.g. symbols)" + Write-Host "" + + Write-Host "Advanced settings:" + Write-Host " -projects Semi-colon delimited list of sln/proj's to build. Globbing is supported (*.sln)" + Write-Host " -ci Set when running on CI server" + Write-Host " -prepareMachine Prepare machine for CI run" + Write-Host " -msbuildEngine Msbuild engine to use to run build ('dotnet', 'vs', or unspecified)." + Write-Host "" + Write-Host "Command line arguments not listed above are passed thru to msbuild." + Write-Host "The above arguments can be shortened as much as to be unambiguous (e.g. -co for configuration, -t for test, etc.)." +} + +function InitializeCustomToolset { + if (-not $restore) { + return + } + + $script = Join-Path $EngRoot "restore-toolset.ps1" + + if (Test-Path $script) { + . $script + } +} + +function Build { + $toolsetBuildProj = InitializeToolset + InitializeCustomToolset + + $bl = if ($binaryLog) { "/bl:" + (Join-Path $LogDir "Build.binlog") } else { "" } + + if ($projects) { + # Re-assign properties to a new variable because PowerShell doesn't let us append properties directly for unclear reasons. + # Explicitly set the type as string[] because otherwise PowerShell would make this char[] if $properties is empty. + [string[]] $msbuildArgs = $properties + $msbuildArgs += "/p:Projects=$projects" + $properties = $msbuildArgs + } + + MSBuild $toolsetBuildProj ` + $bl ` + /p:Configuration=$configuration ` + /p:RepoRoot=$RepoRoot ` + /p:Restore=$restore ` + /p:DeployDeps=$deployDeps ` + /p:Build=$build ` + /p:Rebuild=$rebuild ` + /p:Deploy=$deploy ` + /p:Test=$test ` + /p:Pack=$pack ` + /p:IntegrationTest=$integrationTest ` + /p:PerformanceTest=$performanceTest ` + /p:Sign=$sign ` + /p:Publish=$publish ` + /p:ContinuousIntegrationBuild=$ci ` + @properties +} + +try { + if ($help -or (($properties -ne $null) -and ($properties.Contains("/help") -or $properties.Contains("/?")))) { + Print-Usage + exit 0 + } + + if ($ci) { + $binaryLog = $true + $nodeReuse = $false + } + + # Import custom tools configuration, if present in the repo. + # Note: Import in global scope so that the script set top-level variables without qualification. + $configureToolsetScript = Join-Path $EngRoot "configure-toolset.ps1" + if (Test-Path $configureToolsetScript) { + . $configureToolsetScript + } + + Build +} +catch { + Write-Host $_ + Write-Host $_.Exception + Write-Host $_.ScriptStackTrace + ExitWithExitCode 1 +} + +ExitWithExitCode 0 diff --git a/eng/common/build.sh b/eng/common/build.sh new file mode 100755 index 00000000000..4fe8b41ed70 --- /dev/null +++ b/eng/common/build.sh @@ -0,0 +1,213 @@ +#!/usr/bin/env bash + +# Stop script if unbound variable found (use ${var:-} if intentional) +set -u + +# Stop script if command returns non-zero exit code. +# Prevents hidden errors caused by missing error code propagation. +set -e + +usage() +{ + echo "Common settings:" + echo " --configuration Build configuration: 'Debug' or 'Release' (short: --c)" + echo " --verbosity Msbuild verbosity: q[uiet], m[inimal], n[ormal], d[etailed], and diag[nostic] (short: -v)" + echo " --binaryLog Create MSBuild binary log (short: -bl)" + echo "" + echo "Actions:" + echo " --restore Restore dependencies (short: -r)" + echo " --build Build all projects (short: -b)" + echo " --rebuild Rebuild all projects" + echo " --test Run all unit tests (short: -t)" + echo " --sign Sign build outputs" + echo " --publish Publish artifacts (e.g. symbols)" + echo " --pack Package build outputs into NuGet packages and Willow components" + echo " --help Print help and exit (short: -h)" + echo "" + echo "Advanced settings:" + echo " --projects Project or solution file(s) to build" + echo " --ci Set when running on CI server" + echo " --prepareMachine Prepare machine for CI run, clean up processes after build" + echo " --nodeReuse Sets nodereuse msbuild parameter ('true' or 'false')" + echo " --warnAsError Sets warnaserror msbuild parameter ('true' or 'false')" + echo "" + echo "Command line arguments starting with '/p:' are passed through to MSBuild." +} + +source="${BASH_SOURCE[0]}" + +# resolve $source until the file is no longer a symlink +while [[ -h "$source" ]]; do + scriptroot="$( cd -P "$( dirname "$source" )" && pwd )" + source="$(readlink "$source")" + # if $source was a relative symlink, we need to resolve it relative to the path where the + # symlink file was located + [[ $source != /* ]] && source="$scriptroot/$source" +done +scriptroot="$( cd -P "$( dirname "$source" )" && pwd )" + +restore=false +build=false +rebuild=false +test=false +pack=false +publish=false +integration_test=false +performance_test=false +sign=false +public=false +ci=false + +warn_as_error=true +node_reuse=true +binary_log=false + +projects='' +configuration='Debug' +prepare_machine=false +verbosity='minimal' +properties='' + +while [[ $# > 0 ]]; do + opt="$(echo "$1" | awk '{print tolower($0)}')" + case "$opt" in + --help|-h) + usage + exit 0 + ;; + --configuration|-c) + configuration=$2 + shift + ;; + --verbosity|-v) + verbosity=$2 + shift + ;; + --binarylog|-bl) + binary_log=true + ;; + --restore|-r) + restore=true + ;; + --build|-b) + build=true + ;; + --rebuild) + rebuild=true + ;; + --pack) + pack=true + ;; + --test|-t) + test=true + ;; + --integrationtest) + integration_test=true + ;; + --performancetest) + performance_test=true + ;; + --sign) + sign=true + ;; + --publish) + publish=true + ;; + --preparemachine) + prepare_machine=true + ;; + --projects) + projects=$2 + shift + ;; + --ci) + ci=true + ;; + --warnaserror) + warn_as_error=$2 + shift + ;; + --nodereuse) + node_reuse=$2 + shift + ;; + /p:*) + properties="$properties $1" + ;; + /m:*) + properties="$properties $1" + ;; + /bl:*) + properties="$properties $1" + ;; + *) + echo "Invalid argument: $1" + usage + exit 1 + ;; + esac + + shift +done + +if [[ "$ci" == true ]]; then + binary_log=true + node_reuse=false +fi + +. "$scriptroot/tools.sh" + +function InitializeCustomToolset { + local script="$eng_root/restore-toolset.sh" + + if [[ -a "$script" ]]; then + . "$script" + fi +} + +function Build { + InitializeToolset + InitializeCustomToolset + + if [[ ! -z "$projects" ]]; then + properties="$properties /p:Projects=$projects" + fi + + local bl="" + if [[ "$binary_log" == true ]]; then + bl="/bl:\"$log_dir/Build.binlog\"" + fi + + MSBuild $_InitializeToolset \ + $bl \ + /p:Configuration=$configuration \ + /p:RepoRoot="$repo_root" \ + /p:Restore=$restore \ + /p:Build=$build \ + /p:Rebuild=$rebuild \ + /p:Test=$test \ + /p:Pack=$pack \ + /p:IntegrationTest=$integration_test \ + /p:PerformanceTest=$performance_test \ + /p:Sign=$sign \ + /p:Publish=$publish \ + /p:ContinuousIntegrationBuild=$ci \ + $properties + + ExitWithExitCode 0 +} + +# Import custom tools configuration, if present in the repo. +configure_toolset_script="$eng_root/configure-toolset.sh" +if [[ -a "$configure_toolset_script" ]]; then + . "$configure_toolset_script" +fi + +# TODO: https://github.com/dotnet/arcade/issues/1468 +# Temporary workaround to avoid breaking change. +# Remove once repos are updated. +if [[ -n "${useInstalledDotNetCli:-}" ]]; then + use_installed_dotnet_cli="$useInstalledDotNetCli" +fi + +Build diff --git a/eng/common/cibuild.sh b/eng/common/cibuild.sh new file mode 100755 index 00000000000..1a02c0dec8f --- /dev/null +++ b/eng/common/cibuild.sh @@ -0,0 +1,16 @@ +#!/usr/bin/env bash + +source="${BASH_SOURCE[0]}" + +# resolve $SOURCE until the file is no longer a symlink +while [[ -h $source ]]; do + scriptroot="$( cd -P "$( dirname "$source" )" && pwd )" + source="$(readlink "$source")" + + # if $source was a relative symlink, we need to resolve it relative to the path where + # the symlink file was located + [[ $source != /* ]] && source="$scriptroot/$source" +done +scriptroot="$( cd -P "$( dirname "$source" )" && pwd )" + +. "$scriptroot/build.sh" --restore --build --test --pack --publish --ci $@ \ No newline at end of file diff --git a/eng/common/cross/android/arm/toolchain.cmake b/eng/common/cross/android/arm/toolchain.cmake new file mode 100644 index 00000000000..a7e1c73501b --- /dev/null +++ b/eng/common/cross/android/arm/toolchain.cmake @@ -0,0 +1,41 @@ +set(CROSS_NDK_TOOLCHAIN $ENV{ROOTFS_DIR}/../) +set(CROSS_ROOTFS ${CROSS_NDK_TOOLCHAIN}/sysroot) +set(CLR_CMAKE_PLATFORM_ANDROID "Android") + +set(CMAKE_SYSTEM_NAME Linux) +set(CMAKE_SYSTEM_VERSION 1) +set(CMAKE_SYSTEM_PROCESSOR arm) + +## Specify the toolchain +set(TOOLCHAIN "arm-linux-androideabi") +set(CMAKE_PREFIX_PATH ${CROSS_NDK_TOOLCHAIN}) +set(TOOLCHAIN_PREFIX ${TOOLCHAIN}-) + +find_program(CMAKE_C_COMPILER ${TOOLCHAIN_PREFIX}clang) +find_program(CMAKE_CXX_COMPILER ${TOOLCHAIN_PREFIX}clang++) +find_program(CMAKE_ASM_COMPILER ${TOOLCHAIN_PREFIX}clang) +find_program(CMAKE_AR ${TOOLCHAIN_PREFIX}ar) +find_program(CMAKE_LD ${TOOLCHAIN_PREFIX}ar) +find_program(CMAKE_OBJCOPY ${TOOLCHAIN_PREFIX}objcopy) +find_program(CMAKE_OBJDUMP ${TOOLCHAIN_PREFIX}objdump) + +add_compile_options(--sysroot=${CROSS_ROOTFS}) +add_compile_options(-fPIE) +add_compile_options(-mfloat-abi=soft) +include_directories(SYSTEM ${CROSS_NDK_TOOLCHAIN}/include/c++/4.9.x/) +include_directories(SYSTEM ${CROSS_NDK_TOOLCHAIN}/include/c++/4.9.x/arm-linux-androideabi/) + +set(CROSS_LINK_FLAGS "${CROSS_LINK_FLAGS} -B ${CROSS_ROOTFS}/usr/lib/gcc/${TOOLCHAIN}") +set(CROSS_LINK_FLAGS "${CROSS_LINK_FLAGS} -L${CROSS_ROOTFS}/lib/${TOOLCHAIN}") +set(CROSS_LINK_FLAGS "${CROSS_LINK_FLAGS} --sysroot=${CROSS_ROOTFS}") +set(CROSS_LINK_FLAGS "${CROSS_LINK_FLAGS} -fPIE -pie") + +set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${CROSS_LINK_FLAGS}" CACHE STRING "" FORCE) +set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} ${CROSS_LINK_FLAGS}" CACHE STRING "" FORCE) +set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} ${CROSS_LINK_FLAGS}" CACHE STRING "" FORCE) + +set(CMAKE_FIND_ROOT_PATH "${CROSS_ROOTFS}") +set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) +set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) +set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) +set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY) diff --git a/eng/common/cross/android/arm64/toolchain.cmake b/eng/common/cross/android/arm64/toolchain.cmake new file mode 100644 index 00000000000..29415899c1c --- /dev/null +++ b/eng/common/cross/android/arm64/toolchain.cmake @@ -0,0 +1,42 @@ +set(CROSS_NDK_TOOLCHAIN $ENV{ROOTFS_DIR}/../) +set(CROSS_ROOTFS ${CROSS_NDK_TOOLCHAIN}/sysroot) +set(CLR_CMAKE_PLATFORM_ANDROID "Android") + +set(CMAKE_SYSTEM_NAME Linux) +set(CMAKE_SYSTEM_VERSION 1) +set(CMAKE_SYSTEM_PROCESSOR aarch64) + +## Specify the toolchain +set(TOOLCHAIN "aarch64-linux-android") +set(CMAKE_PREFIX_PATH ${CROSS_NDK_TOOLCHAIN}) +set(TOOLCHAIN_PREFIX ${TOOLCHAIN}-) + +find_program(CMAKE_C_COMPILER ${TOOLCHAIN_PREFIX}clang) +find_program(CMAKE_CXX_COMPILER ${TOOLCHAIN_PREFIX}clang++) +find_program(CMAKE_ASM_COMPILER ${TOOLCHAIN_PREFIX}clang) +find_program(CMAKE_AR ${TOOLCHAIN_PREFIX}ar) +find_program(CMAKE_LD ${TOOLCHAIN_PREFIX}ar) +find_program(CMAKE_OBJCOPY ${TOOLCHAIN_PREFIX}objcopy) +find_program(CMAKE_OBJDUMP ${TOOLCHAIN_PREFIX}objdump) + +add_compile_options(--sysroot=${CROSS_ROOTFS}) +add_compile_options(-fPIE) + +## Needed for Android or bionic specific conditionals +add_compile_options(-D__ANDROID__) +add_compile_options(-D__BIONIC__) + +set(CROSS_LINK_FLAGS "${CROSS_LINK_FLAGS} -B ${CROSS_ROOTFS}/usr/lib/gcc/${TOOLCHAIN}") +set(CROSS_LINK_FLAGS "${CROSS_LINK_FLAGS} -L${CROSS_ROOTFS}/lib/${TOOLCHAIN}") +set(CROSS_LINK_FLAGS "${CROSS_LINK_FLAGS} --sysroot=${CROSS_ROOTFS}") +set(CROSS_LINK_FLAGS "${CROSS_LINK_FLAGS} -fPIE -pie") + +set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${CROSS_LINK_FLAGS}" CACHE STRING "" FORCE) +set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} ${CROSS_LINK_FLAGS}" CACHE STRING "" FORCE) +set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} ${CROSS_LINK_FLAGS}" CACHE STRING "" FORCE) + +set(CMAKE_FIND_ROOT_PATH "${CROSS_ROOTFS}") +set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) +set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) +set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) +set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY) diff --git a/eng/common/cross/arm/sources.list.bionic b/eng/common/cross/arm/sources.list.bionic new file mode 100644 index 00000000000..21095574095 --- /dev/null +++ b/eng/common/cross/arm/sources.list.bionic @@ -0,0 +1,11 @@ +deb http://ports.ubuntu.com/ubuntu-ports/ bionic main restricted universe +deb-src http://ports.ubuntu.com/ubuntu-ports/ bionic main restricted universe + +deb http://ports.ubuntu.com/ubuntu-ports/ bionic-updates main restricted universe +deb-src http://ports.ubuntu.com/ubuntu-ports/ bionic-updates main restricted universe + +deb http://ports.ubuntu.com/ubuntu-ports/ bionic-backports main restricted +deb-src http://ports.ubuntu.com/ubuntu-ports/ bionic-backports main restricted + +deb http://ports.ubuntu.com/ubuntu-ports/ bionic-security main restricted universe multiverse +deb-src http://ports.ubuntu.com/ubuntu-ports/ bionic-security main restricted universe multiverse diff --git a/eng/common/cross/arm/sources.list.jessie b/eng/common/cross/arm/sources.list.jessie new file mode 100644 index 00000000000..4d142ac9b10 --- /dev/null +++ b/eng/common/cross/arm/sources.list.jessie @@ -0,0 +1,3 @@ +# Debian (sid) # UNSTABLE +deb http://ftp.debian.org/debian/ sid main contrib non-free +deb-src http://ftp.debian.org/debian/ sid main contrib non-free diff --git a/eng/common/cross/arm/sources.list.trusty b/eng/common/cross/arm/sources.list.trusty new file mode 100644 index 00000000000..07d8f88d82e --- /dev/null +++ b/eng/common/cross/arm/sources.list.trusty @@ -0,0 +1,11 @@ +deb http://ports.ubuntu.com/ubuntu-ports/ trusty main restricted universe +deb-src http://ports.ubuntu.com/ubuntu-ports/ trusty main restricted universe + +deb http://ports.ubuntu.com/ubuntu-ports/ trusty-updates main restricted universe +deb-src http://ports.ubuntu.com/ubuntu-ports/ trusty-updates main restricted universe + +deb http://ports.ubuntu.com/ubuntu-ports/ trusty-backports main restricted +deb-src http://ports.ubuntu.com/ubuntu-ports/ trusty-backports main restricted + +deb http://ports.ubuntu.com/ubuntu-ports/ trusty-security main restricted universe multiverse +deb-src http://ports.ubuntu.com/ubuntu-ports/ trusty-security main restricted universe multiverse \ No newline at end of file diff --git a/eng/common/cross/arm/sources.list.vivid b/eng/common/cross/arm/sources.list.vivid new file mode 100644 index 00000000000..0b1215e475a --- /dev/null +++ b/eng/common/cross/arm/sources.list.vivid @@ -0,0 +1,11 @@ +deb http://ports.ubuntu.com/ubuntu-ports/ vivid main restricted universe +deb-src http://ports.ubuntu.com/ubuntu-ports/ vivid main restricted universe + +deb http://ports.ubuntu.com/ubuntu-ports/ vivid-updates main restricted universe +deb-src http://ports.ubuntu.com/ubuntu-ports/ vivid-updates main restricted universe + +deb http://ports.ubuntu.com/ubuntu-ports/ vivid-backports main restricted +deb-src http://ports.ubuntu.com/ubuntu-ports/ vivid-backports main restricted + +deb http://ports.ubuntu.com/ubuntu-ports/ vivid-security main restricted universe multiverse +deb-src http://ports.ubuntu.com/ubuntu-ports/ vivid-security main restricted universe multiverse \ No newline at end of file diff --git a/eng/common/cross/arm/sources.list.wily b/eng/common/cross/arm/sources.list.wily new file mode 100644 index 00000000000..e23d1e02a05 --- /dev/null +++ b/eng/common/cross/arm/sources.list.wily @@ -0,0 +1,11 @@ +deb http://ports.ubuntu.com/ubuntu-ports/ wily main restricted universe +deb-src http://ports.ubuntu.com/ubuntu-ports/ wily main restricted universe + +deb http://ports.ubuntu.com/ubuntu-ports/ wily-updates main restricted universe +deb-src http://ports.ubuntu.com/ubuntu-ports/ wily-updates main restricted universe + +deb http://ports.ubuntu.com/ubuntu-ports/ wily-backports main restricted +deb-src http://ports.ubuntu.com/ubuntu-ports/ wily-backports main restricted + +deb http://ports.ubuntu.com/ubuntu-ports/ wily-security main restricted universe multiverse +deb-src http://ports.ubuntu.com/ubuntu-ports/ wily-security main restricted universe multiverse \ No newline at end of file diff --git a/eng/common/cross/arm/sources.list.xenial b/eng/common/cross/arm/sources.list.xenial new file mode 100644 index 00000000000..eacd86b7df3 --- /dev/null +++ b/eng/common/cross/arm/sources.list.xenial @@ -0,0 +1,11 @@ +deb http://ports.ubuntu.com/ubuntu-ports/ xenial main restricted universe +deb-src http://ports.ubuntu.com/ubuntu-ports/ xenial main restricted universe + +deb http://ports.ubuntu.com/ubuntu-ports/ xenial-updates main restricted universe +deb-src http://ports.ubuntu.com/ubuntu-ports/ xenial-updates main restricted universe + +deb http://ports.ubuntu.com/ubuntu-ports/ xenial-backports main restricted +deb-src http://ports.ubuntu.com/ubuntu-ports/ xenial-backports main restricted + +deb http://ports.ubuntu.com/ubuntu-ports/ xenial-security main restricted universe multiverse +deb-src http://ports.ubuntu.com/ubuntu-ports/ xenial-security main restricted universe multiverse \ No newline at end of file diff --git a/eng/common/cross/arm/sources.list.zesty b/eng/common/cross/arm/sources.list.zesty new file mode 100644 index 00000000000..ea2c14a7874 --- /dev/null +++ b/eng/common/cross/arm/sources.list.zesty @@ -0,0 +1,11 @@ +deb http://ports.ubuntu.com/ubuntu-ports/ zesty main restricted universe +deb-src http://ports.ubuntu.com/ubuntu-ports/ zesty main restricted universe + +deb http://ports.ubuntu.com/ubuntu-ports/ zesty-updates main restricted universe +deb-src http://ports.ubuntu.com/ubuntu-ports/ zesty-updates main restricted universe + +deb http://ports.ubuntu.com/ubuntu-ports/ zesty-backports main restricted +deb-src http://ports.ubuntu.com/ubuntu-ports/ zesty-backports main restricted + +deb http://ports.ubuntu.com/ubuntu-ports/ zesty-security main restricted universe multiverse +deb-src http://ports.ubuntu.com/ubuntu-ports/ zesty-security main restricted universe multiverse diff --git a/eng/common/cross/arm/trusty-lttng-2.4.patch b/eng/common/cross/arm/trusty-lttng-2.4.patch new file mode 100644 index 00000000000..8e4dd7ae719 --- /dev/null +++ b/eng/common/cross/arm/trusty-lttng-2.4.patch @@ -0,0 +1,71 @@ +From e72c9d7ead60e3317bd6d1fade995c07021c947b Mon Sep 17 00:00:00 2001 +From: Mathieu Desnoyers +Date: Thu, 7 May 2015 13:25:04 -0400 +Subject: [PATCH] Fix: building probe providers with C++ compiler + +Robert Daniels wrote: +> > I'm attempting to use lttng userspace tracing with a C++ application +> > on an ARM platform. I'm using GCC 4.8.4 on Linux 3.14 with the 2.6 +> > release of lttng. I've compiled lttng-modules, lttng-ust, and +> > lttng-tools and have been able to get a simple test working with C +> > code. When I attempt to run the hello.cxx test on my target it will +> > segfault. +> +> +> I spent a little time digging into this issue and finally discovered the +> cause of my segfault with ARM C++ tracepoints. +> +> There is a struct called 'lttng_event' in ust-events.h which contains an +> empty union 'u'. This was the cause of my issue. Under C, this empty union +> compiles to a zero byte member while under C++ it compiles to a one byte +> member, and in my case was four-byte aligned which caused my C++ code to +> have the 'cds_list_head node' offset incorrectly by four bytes. This lead +> to an incorrect linked list structure which caused my issue. +> +> Since this union is empty, I simply removed it from the struct and everything +> worked correctly. +> +> I don't know the history or purpose behind this empty union so I'd like to +> know if this is a safe fix. If it is I can submit a patch with the union +> removed. + +That's a very nice catch! + +We do not support building tracepoint probe provider with +g++ yet, as stated in lttng-ust(3): + +"- Note for C++ support: although an application instrumented with + tracepoints can be compiled with g++, tracepoint probes should be + compiled with gcc (only tested with gcc so far)." + +However, if it works fine with this fix, then I'm tempted to take it, +especially because removing the empty union does not appear to affect +the layout of struct lttng_event as seen from liblttng-ust, which must +be compiled with a C compiler, and from probe providers compiled with +a C compiler. So all we are changing is the layout of a probe provider +compiled with a C++ compiler, which is anyway buggy at the moment, +because it is not compatible with the layout expected by liblttng-ust +compiled with a C compiler. + +Reported-by: Robert Daniels +Signed-off-by: Mathieu Desnoyers +--- + include/lttng/ust-events.h | 2 -- + 1 file changed, 2 deletions(-) + +diff --git a/usr/include/lttng/ust-events.h b/usr/include/lttng/ust-events.h +index 328a875..3d7a274 100644 +--- a/usr/include/lttng/ust-events.h ++++ b/usr/include/lttng/ust-events.h +@@ -407,8 +407,6 @@ struct lttng_event { + void *_deprecated1; + struct lttng_ctx *ctx; + enum lttng_ust_instrumentation instrumentation; +- union { +- } u; + struct cds_list_head node; /* Event list in session */ + struct cds_list_head _deprecated2; + void *_deprecated3; +-- +2.7.4 + diff --git a/eng/common/cross/arm/trusty.patch b/eng/common/cross/arm/trusty.patch new file mode 100644 index 00000000000..2f2972f8eb5 --- /dev/null +++ b/eng/common/cross/arm/trusty.patch @@ -0,0 +1,97 @@ +diff -u -r a/usr/include/urcu/uatomic/generic.h b/usr/include/urcu/uatomic/generic.h +--- a/usr/include/urcu/uatomic/generic.h 2014-03-28 06:04:42.000000000 +0900 ++++ b/usr/include/urcu/uatomic/generic.h 2017-02-13 10:35:21.189927116 +0900 +@@ -65,17 +65,17 @@ + switch (len) { + #ifdef UATOMIC_HAS_ATOMIC_BYTE + case 1: +- return __sync_val_compare_and_swap_1(addr, old, _new); ++ return __sync_val_compare_and_swap_1((uint8_t *) addr, old, _new); + #endif + #ifdef UATOMIC_HAS_ATOMIC_SHORT + case 2: +- return __sync_val_compare_and_swap_2(addr, old, _new); ++ return __sync_val_compare_and_swap_2((uint16_t *) addr, old, _new); + #endif + case 4: +- return __sync_val_compare_and_swap_4(addr, old, _new); ++ return __sync_val_compare_and_swap_4((uint32_t *) addr, old, _new); + #if (CAA_BITS_PER_LONG == 64) + case 8: +- return __sync_val_compare_and_swap_8(addr, old, _new); ++ return __sync_val_compare_and_swap_8((uint64_t *) addr, old, _new); + #endif + } + _uatomic_link_error(); +@@ -100,20 +100,20 @@ + switch (len) { + #ifdef UATOMIC_HAS_ATOMIC_BYTE + case 1: +- __sync_and_and_fetch_1(addr, val); ++ __sync_and_and_fetch_1((uint8_t *) addr, val); + return; + #endif + #ifdef UATOMIC_HAS_ATOMIC_SHORT + case 2: +- __sync_and_and_fetch_2(addr, val); ++ __sync_and_and_fetch_2((uint16_t *) addr, val); + return; + #endif + case 4: +- __sync_and_and_fetch_4(addr, val); ++ __sync_and_and_fetch_4((uint32_t *) addr, val); + return; + #if (CAA_BITS_PER_LONG == 64) + case 8: +- __sync_and_and_fetch_8(addr, val); ++ __sync_and_and_fetch_8((uint64_t *) addr, val); + return; + #endif + } +@@ -139,20 +139,20 @@ + switch (len) { + #ifdef UATOMIC_HAS_ATOMIC_BYTE + case 1: +- __sync_or_and_fetch_1(addr, val); ++ __sync_or_and_fetch_1((uint8_t *) addr, val); + return; + #endif + #ifdef UATOMIC_HAS_ATOMIC_SHORT + case 2: +- __sync_or_and_fetch_2(addr, val); ++ __sync_or_and_fetch_2((uint16_t *) addr, val); + return; + #endif + case 4: +- __sync_or_and_fetch_4(addr, val); ++ __sync_or_and_fetch_4((uint32_t *) addr, val); + return; + #if (CAA_BITS_PER_LONG == 64) + case 8: +- __sync_or_and_fetch_8(addr, val); ++ __sync_or_and_fetch_8((uint64_t *) addr, val); + return; + #endif + } +@@ -180,17 +180,17 @@ + switch (len) { + #ifdef UATOMIC_HAS_ATOMIC_BYTE + case 1: +- return __sync_add_and_fetch_1(addr, val); ++ return __sync_add_and_fetch_1((uint8_t *) addr, val); + #endif + #ifdef UATOMIC_HAS_ATOMIC_SHORT + case 2: +- return __sync_add_and_fetch_2(addr, val); ++ return __sync_add_and_fetch_2((uint16_t *) addr, val); + #endif + case 4: +- return __sync_add_and_fetch_4(addr, val); ++ return __sync_add_and_fetch_4((uint32_t *) addr, val); + #if (CAA_BITS_PER_LONG == 64) + case 8: +- return __sync_add_and_fetch_8(addr, val); ++ return __sync_add_and_fetch_8((uint64_t *) addr, val); + #endif + } + _uatomic_link_error(); diff --git a/eng/common/cross/arm64/sources.list.bionic b/eng/common/cross/arm64/sources.list.bionic new file mode 100644 index 00000000000..21095574095 --- /dev/null +++ b/eng/common/cross/arm64/sources.list.bionic @@ -0,0 +1,11 @@ +deb http://ports.ubuntu.com/ubuntu-ports/ bionic main restricted universe +deb-src http://ports.ubuntu.com/ubuntu-ports/ bionic main restricted universe + +deb http://ports.ubuntu.com/ubuntu-ports/ bionic-updates main restricted universe +deb-src http://ports.ubuntu.com/ubuntu-ports/ bionic-updates main restricted universe + +deb http://ports.ubuntu.com/ubuntu-ports/ bionic-backports main restricted +deb-src http://ports.ubuntu.com/ubuntu-ports/ bionic-backports main restricted + +deb http://ports.ubuntu.com/ubuntu-ports/ bionic-security main restricted universe multiverse +deb-src http://ports.ubuntu.com/ubuntu-ports/ bionic-security main restricted universe multiverse diff --git a/eng/common/cross/arm64/sources.list.trusty b/eng/common/cross/arm64/sources.list.trusty new file mode 100644 index 00000000000..07d8f88d82e --- /dev/null +++ b/eng/common/cross/arm64/sources.list.trusty @@ -0,0 +1,11 @@ +deb http://ports.ubuntu.com/ubuntu-ports/ trusty main restricted universe +deb-src http://ports.ubuntu.com/ubuntu-ports/ trusty main restricted universe + +deb http://ports.ubuntu.com/ubuntu-ports/ trusty-updates main restricted universe +deb-src http://ports.ubuntu.com/ubuntu-ports/ trusty-updates main restricted universe + +deb http://ports.ubuntu.com/ubuntu-ports/ trusty-backports main restricted +deb-src http://ports.ubuntu.com/ubuntu-ports/ trusty-backports main restricted + +deb http://ports.ubuntu.com/ubuntu-ports/ trusty-security main restricted universe multiverse +deb-src http://ports.ubuntu.com/ubuntu-ports/ trusty-security main restricted universe multiverse \ No newline at end of file diff --git a/eng/common/cross/arm64/sources.list.vivid b/eng/common/cross/arm64/sources.list.vivid new file mode 100644 index 00000000000..0b1215e475a --- /dev/null +++ b/eng/common/cross/arm64/sources.list.vivid @@ -0,0 +1,11 @@ +deb http://ports.ubuntu.com/ubuntu-ports/ vivid main restricted universe +deb-src http://ports.ubuntu.com/ubuntu-ports/ vivid main restricted universe + +deb http://ports.ubuntu.com/ubuntu-ports/ vivid-updates main restricted universe +deb-src http://ports.ubuntu.com/ubuntu-ports/ vivid-updates main restricted universe + +deb http://ports.ubuntu.com/ubuntu-ports/ vivid-backports main restricted +deb-src http://ports.ubuntu.com/ubuntu-ports/ vivid-backports main restricted + +deb http://ports.ubuntu.com/ubuntu-ports/ vivid-security main restricted universe multiverse +deb-src http://ports.ubuntu.com/ubuntu-ports/ vivid-security main restricted universe multiverse \ No newline at end of file diff --git a/eng/common/cross/arm64/sources.list.wily b/eng/common/cross/arm64/sources.list.wily new file mode 100644 index 00000000000..e23d1e02a05 --- /dev/null +++ b/eng/common/cross/arm64/sources.list.wily @@ -0,0 +1,11 @@ +deb http://ports.ubuntu.com/ubuntu-ports/ wily main restricted universe +deb-src http://ports.ubuntu.com/ubuntu-ports/ wily main restricted universe + +deb http://ports.ubuntu.com/ubuntu-ports/ wily-updates main restricted universe +deb-src http://ports.ubuntu.com/ubuntu-ports/ wily-updates main restricted universe + +deb http://ports.ubuntu.com/ubuntu-ports/ wily-backports main restricted +deb-src http://ports.ubuntu.com/ubuntu-ports/ wily-backports main restricted + +deb http://ports.ubuntu.com/ubuntu-ports/ wily-security main restricted universe multiverse +deb-src http://ports.ubuntu.com/ubuntu-ports/ wily-security main restricted universe multiverse \ No newline at end of file diff --git a/eng/common/cross/arm64/sources.list.xenial b/eng/common/cross/arm64/sources.list.xenial new file mode 100644 index 00000000000..eacd86b7df3 --- /dev/null +++ b/eng/common/cross/arm64/sources.list.xenial @@ -0,0 +1,11 @@ +deb http://ports.ubuntu.com/ubuntu-ports/ xenial main restricted universe +deb-src http://ports.ubuntu.com/ubuntu-ports/ xenial main restricted universe + +deb http://ports.ubuntu.com/ubuntu-ports/ xenial-updates main restricted universe +deb-src http://ports.ubuntu.com/ubuntu-ports/ xenial-updates main restricted universe + +deb http://ports.ubuntu.com/ubuntu-ports/ xenial-backports main restricted +deb-src http://ports.ubuntu.com/ubuntu-ports/ xenial-backports main restricted + +deb http://ports.ubuntu.com/ubuntu-ports/ xenial-security main restricted universe multiverse +deb-src http://ports.ubuntu.com/ubuntu-ports/ xenial-security main restricted universe multiverse \ No newline at end of file diff --git a/eng/common/cross/arm64/sources.list.zesty b/eng/common/cross/arm64/sources.list.zesty new file mode 100644 index 00000000000..ea2c14a7874 --- /dev/null +++ b/eng/common/cross/arm64/sources.list.zesty @@ -0,0 +1,11 @@ +deb http://ports.ubuntu.com/ubuntu-ports/ zesty main restricted universe +deb-src http://ports.ubuntu.com/ubuntu-ports/ zesty main restricted universe + +deb http://ports.ubuntu.com/ubuntu-ports/ zesty-updates main restricted universe +deb-src http://ports.ubuntu.com/ubuntu-ports/ zesty-updates main restricted universe + +deb http://ports.ubuntu.com/ubuntu-ports/ zesty-backports main restricted +deb-src http://ports.ubuntu.com/ubuntu-ports/ zesty-backports main restricted + +deb http://ports.ubuntu.com/ubuntu-ports/ zesty-security main restricted universe multiverse +deb-src http://ports.ubuntu.com/ubuntu-ports/ zesty-security main restricted universe multiverse diff --git a/eng/common/cross/armel/sources.list.jessie b/eng/common/cross/armel/sources.list.jessie new file mode 100644 index 00000000000..3d9c3059d89 --- /dev/null +++ b/eng/common/cross/armel/sources.list.jessie @@ -0,0 +1,3 @@ +# Debian (jessie) # Stable +deb http://ftp.debian.org/debian/ jessie main contrib non-free +deb-src http://ftp.debian.org/debian/ jessie main contrib non-free diff --git a/eng/common/cross/armel/tizen-build-rootfs.sh b/eng/common/cross/armel/tizen-build-rootfs.sh new file mode 100755 index 00000000000..87c48e78fbb --- /dev/null +++ b/eng/common/cross/armel/tizen-build-rootfs.sh @@ -0,0 +1,44 @@ +#!/usr/bin/env bash +set -e + +__ARM_SOFTFP_CrossDir=$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd ) +__TIZEN_CROSSDIR="$__ARM_SOFTFP_CrossDir/tizen" + +if [[ -z "$ROOTFS_DIR" ]]; then + echo "ROOTFS_DIR is not defined." + exit 1; +fi + +# Clean-up (TODO-Cleanup: We may already delete $ROOTFS_DIR at ./cross/build-rootfs.sh.) +# hk0110 +if [ -d "$ROOTFS_DIR" ]; then + umount $ROOTFS_DIR/* + rm -rf $ROOTFS_DIR +fi + +TIZEN_TMP_DIR=$ROOTFS_DIR/tizen_tmp +mkdir -p $TIZEN_TMP_DIR + +# Download files +echo ">>Start downloading files" +VERBOSE=1 $__ARM_SOFTFP_CrossDir/tizen-fetch.sh $TIZEN_TMP_DIR +echo "<>Start constructing Tizen rootfs" +TIZEN_RPM_FILES=`ls $TIZEN_TMP_DIR/*.rpm` +cd $ROOTFS_DIR +for f in $TIZEN_RPM_FILES; do + rpm2cpio $f | cpio -idm --quiet +done +echo "<>Start configuring Tizen rootfs" +rm ./usr/lib/libunwind.so +ln -s libunwind.so.8 ./usr/lib/libunwind.so +ln -sfn asm-arm ./usr/include/asm +patch -p1 < $__TIZEN_CROSSDIR/tizen.patch +echo "</dev/null; then + VERBOSE=0 +fi + +Log() +{ + if [ $VERBOSE -ge $1 ]; then + echo ${@:2} + fi +} + +Inform() +{ + Log 1 -e "\x1B[0;34m$@\x1B[m" +} + +Debug() +{ + Log 2 -e "\x1B[0;32m$@\x1B[m" +} + +Error() +{ + >&2 Log 0 -e "\x1B[0;31m$@\x1B[m" +} + +Fetch() +{ + URL=$1 + FILE=$2 + PROGRESS=$3 + if [ $VERBOSE -ge 1 ] && [ $PROGRESS ]; then + CURL_OPT="--progress-bar" + else + CURL_OPT="--silent" + fi + curl $CURL_OPT $URL > $FILE +} + +hash curl 2> /dev/null || { Error "Require 'curl' Aborting."; exit 1; } +hash xmllint 2> /dev/null || { Error "Require 'xmllint' Aborting."; exit 1; } +hash sha256sum 2> /dev/null || { Error "Require 'sha256sum' Aborting."; exit 1; } + +TMPDIR=$1 +if [ ! -d $TMPDIR ]; then + TMPDIR=./tizen_tmp + Debug "Create temporary directory : $TMPDIR" + mkdir -p $TMPDIR +fi + +TIZEN_URL=http://download.tizen.org/releases/milestone/tizen +BUILD_XML=build.xml +REPOMD_XML=repomd.xml +PRIMARY_XML=primary.xml +TARGET_URL="http://__not_initialized" + +Xpath_get() +{ + XPATH_RESULT='' + XPATH=$1 + XML_FILE=$2 + RESULT=$(xmllint --xpath $XPATH $XML_FILE) + if [[ -z ${RESULT// } ]]; then + Error "Can not find target from $XML_FILE" + Debug "Xpath = $XPATH" + exit 1 + fi + XPATH_RESULT=$RESULT +} + +fetch_tizen_pkgs_init() +{ + TARGET=$1 + PROFILE=$2 + Debug "Initialize TARGET=$TARGET, PROFILE=$PROFILE" + + TMP_PKG_DIR=$TMPDIR/tizen_${PROFILE}_pkgs + if [ -d $TMP_PKG_DIR ]; then rm -rf $TMP_PKG_DIR; fi + mkdir -p $TMP_PKG_DIR + + PKG_URL=$TIZEN_URL/$PROFILE/latest + + BUILD_XML_URL=$PKG_URL/$BUILD_XML + TMP_BUILD=$TMP_PKG_DIR/$BUILD_XML + TMP_REPOMD=$TMP_PKG_DIR/$REPOMD_XML + TMP_PRIMARY=$TMP_PKG_DIR/$PRIMARY_XML + TMP_PRIMARYGZ=${TMP_PRIMARY}.gz + + Fetch $BUILD_XML_URL $TMP_BUILD + + Debug "fetch $BUILD_XML_URL to $TMP_BUILD" + + TARGET_XPATH="//build/buildtargets/buildtarget[@name=\"$TARGET\"]/repo[@type=\"binary\"]/text()" + Xpath_get $TARGET_XPATH $TMP_BUILD + TARGET_PATH=$XPATH_RESULT + TARGET_URL=$PKG_URL/$TARGET_PATH + + REPOMD_URL=$TARGET_URL/repodata/repomd.xml + PRIMARY_XPATH='string(//*[local-name()="data"][@type="primary"]/*[local-name()="location"]/@href)' + + Fetch $REPOMD_URL $TMP_REPOMD + + Debug "fetch $REPOMD_URL to $TMP_REPOMD" + + Xpath_get $PRIMARY_XPATH $TMP_REPOMD + PRIMARY_XML_PATH=$XPATH_RESULT + PRIMARY_URL=$TARGET_URL/$PRIMARY_XML_PATH + + Fetch $PRIMARY_URL $TMP_PRIMARYGZ + + Debug "fetch $PRIMARY_URL to $TMP_PRIMARYGZ" + + gunzip $TMP_PRIMARYGZ + + Debug "unzip $TMP_PRIMARYGZ to $TMP_PRIMARY" +} + +fetch_tizen_pkgs() +{ + ARCH=$1 + PACKAGE_XPATH_TPL='string(//*[local-name()="metadata"]/*[local-name()="package"][*[local-name()="name"][text()="_PKG_"]][*[local-name()="arch"][text()="_ARCH_"]]/*[local-name()="location"]/@href)' + + PACKAGE_CHECKSUM_XPATH_TPL='string(//*[local-name()="metadata"]/*[local-name()="package"][*[local-name()="name"][text()="_PKG_"]][*[local-name()="arch"][text()="_ARCH_"]]/*[local-name()="checksum"]/text())' + + for pkg in ${@:2} + do + Inform "Fetching... $pkg" + XPATH=${PACKAGE_XPATH_TPL/_PKG_/$pkg} + XPATH=${XPATH/_ARCH_/$ARCH} + Xpath_get $XPATH $TMP_PRIMARY + PKG_PATH=$XPATH_RESULT + + XPATH=${PACKAGE_CHECKSUM_XPATH_TPL/_PKG_/$pkg} + XPATH=${XPATH/_ARCH_/$ARCH} + Xpath_get $XPATH $TMP_PRIMARY + CHECKSUM=$XPATH_RESULT + + PKG_URL=$TARGET_URL/$PKG_PATH + PKG_FILE=$(basename $PKG_PATH) + PKG_PATH=$TMPDIR/$PKG_FILE + + Debug "Download $PKG_URL to $PKG_PATH" + Fetch $PKG_URL $PKG_PATH true + + echo "$CHECKSUM $PKG_PATH" | sha256sum -c - > /dev/null + if [ $? -ne 0 ]; then + Error "Fail to fetch $PKG_URL to $PKG_PATH" + Debug "Checksum = $CHECKSUM" + exit 1 + fi + done +} + +Inform "Initialize arm base" +fetch_tizen_pkgs_init standard base +Inform "fetch common packages" +fetch_tizen_pkgs armv7l gcc glibc glibc-devel libicu libicu-devel +fetch_tizen_pkgs noarch linux-glibc-devel +Inform "fetch coreclr packages" +fetch_tizen_pkgs armv7l lldb lldb-devel libgcc libstdc++ libstdc++-devel libunwind libunwind-devel tizen-release lttng-ust-devel lttng-ust userspace-rcu-devel userspace-rcu +Inform "fetch corefx packages" +fetch_tizen_pkgs armv7l libcom_err libcom_err-devel zlib zlib-devel libopenssl libopenssl-devel krb5 krb5-devel libcurl libcurl-devel + +Inform "Initialize standard unified" +fetch_tizen_pkgs_init standard unified +Inform "fetch corefx packages" +fetch_tizen_pkgs armv7l gssdp gssdp-devel + diff --git a/eng/common/cross/armel/tizen/tizen-dotnet.ks b/eng/common/cross/armel/tizen/tizen-dotnet.ks new file mode 100644 index 00000000000..506d455bd4f --- /dev/null +++ b/eng/common/cross/armel/tizen/tizen-dotnet.ks @@ -0,0 +1,50 @@ +lang en_US.UTF-8 +keyboard us +timezone --utc Asia/Seoul + +part / --fstype="ext4" --size=3500 --ondisk=mmcblk0 --label rootfs --fsoptions=defaults,noatime + +rootpw tizen +desktop --autologinuser=root +user --name root --groups audio,video --password 'tizen' + +repo --name=standard --baseurl=http://download.tizen.org/releases/milestone/tizen/unified/latest/repos/standard/packages/ --ssl_verify=no +repo --name=base --baseurl=http://download.tizen.org/releases/milestone/tizen/base/latest/repos/standard/packages/ --ssl_verify=no + +%packages +tar +gzip + +sed +grep +gawk +perl + +binutils +findutils +util-linux +lttng-ust +userspace-rcu +procps-ng +tzdata +ca-certificates + + +### Core FX +libicu +libunwind +iputils +zlib +krb5 +libcurl +libopenssl + +%end + +%post + +### Update /tmp privilege +chmod 777 /tmp +#################################### + +%end diff --git a/eng/common/cross/armel/tizen/tizen.patch b/eng/common/cross/armel/tizen/tizen.patch new file mode 100644 index 00000000000..d223427c978 --- /dev/null +++ b/eng/common/cross/armel/tizen/tizen.patch @@ -0,0 +1,18 @@ +diff -u -r a/usr/lib/libc.so b/usr/lib/libc.so +--- a/usr/lib/libc.so 2016-12-30 23:00:08.284951863 +0900 ++++ b/usr/lib/libc.so 2016-12-30 23:00:32.140951815 +0900 +@@ -2,4 +2,4 @@ + Use the shared library, but some functions are only in + the static library, so try that secondarily. */ + OUTPUT_FORMAT(elf32-littlearm) +-GROUP ( /lib/libc.so.6 /usr/lib/libc_nonshared.a AS_NEEDED ( /lib/ld-linux.so.3 ) ) ++GROUP ( libc.so.6 libc_nonshared.a AS_NEEDED ( ld-linux.so.3 ) ) +diff -u -r a/usr/lib/libpthread.so b/usr/lib/libpthread.so +--- a/usr/lib/libpthread.so 2016-12-30 23:00:19.408951841 +0900 ++++ b/usr/lib/libpthread.so 2016-12-30 23:00:39.068951801 +0900 +@@ -2,4 +2,4 @@ + Use the shared library, but some functions are only in + the static library, so try that secondarily. */ + OUTPUT_FORMAT(elf32-littlearm) +-GROUP ( /lib/libpthread.so.0 /usr/lib/libpthread_nonshared.a ) ++GROUP ( libpthread.so.0 libpthread_nonshared.a ) diff --git a/eng/common/cross/build-android-rootfs.sh b/eng/common/cross/build-android-rootfs.sh new file mode 100755 index 00000000000..adceda877ad --- /dev/null +++ b/eng/common/cross/build-android-rootfs.sh @@ -0,0 +1,137 @@ +#!/usr/bin/env bash +set -e +__NDK_Version=r14 + +usage() +{ + echo "Creates a toolchain and sysroot used for cross-compiling for Android." + echo. + echo "Usage: $0 [BuildArch] [ApiLevel]" + echo. + echo "BuildArch is the target architecture of Android. Currently only arm64 is supported." + echo "ApiLevel is the target Android API level. API levels usually match to Android releases. See https://source.android.com/source/build-numbers.html" + echo. + echo "By default, the toolchain and sysroot will be generated in cross/android-rootfs/toolchain/[BuildArch]. You can change this behavior" + echo "by setting the TOOLCHAIN_DIR environment variable" + echo. + echo "By default, the NDK will be downloaded into the cross/android-rootfs/android-ndk-$__NDK_Version directory. If you already have an NDK installation," + echo "you can set the NDK_DIR environment variable to have this script use that installation of the NDK." + echo "By default, this script will generate a file, android_platform, in the root of the ROOTFS_DIR directory that contains the RID for the supported and tested Android build: android.21-arm64. This file is to replace '/etc/os-release', which is not available for Android." + exit 1 +} + +__ApiLevel=21 # The minimum platform for arm64 is API level 21 +__BuildArch=arm64 +__AndroidArch=aarch64 +__AndroidToolchain=aarch64-linux-android + +for i in "$@" + do + lowerI="$(echo $i | awk '{print tolower($0)}')" + case $lowerI in + -?|-h|--help) + usage + exit 1 + ;; + arm64) + __BuildArch=arm64 + __AndroidArch=aarch64 + __AndroidToolchain=aarch64-linux-android + ;; + arm) + __BuildArch=arm + __AndroidArch=arm + __AndroidToolchain=arm-linux-androideabi + ;; + *[0-9]) + __ApiLevel=$i + ;; + *) + __UnprocessedBuildArgs="$__UnprocessedBuildArgs $i" + ;; + esac +done + +# Obtain the location of the bash script to figure out where the root of the repo is. +__CrossDir="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" + +__Android_Cross_Dir="$__CrossDir/android-rootfs" +__NDK_Dir="$__Android_Cross_Dir/android-ndk-$__NDK_Version" +__libunwind_Dir="$__Android_Cross_Dir/libunwind" +__lldb_Dir="$__Android_Cross_Dir/lldb" +__ToolchainDir="$__Android_Cross_Dir/toolchain/$__BuildArch" + +if [[ -n "$TOOLCHAIN_DIR" ]]; then + __ToolchainDir=$TOOLCHAIN_DIR +fi + +if [[ -n "$NDK_DIR" ]]; then + __NDK_Dir=$NDK_DIR +fi + +echo "Target API level: $__ApiLevel" +echo "Target architecture: $__BuildArch" +echo "NDK location: $__NDK_Dir" +echo "Target Toolchain location: $__ToolchainDir" + +# Download the NDK if required +if [ ! -d $__NDK_Dir ]; then + echo Downloading the NDK into $__NDK_Dir + mkdir -p $__NDK_Dir + wget -nv -nc --show-progress https://dl.google.com/android/repository/android-ndk-$__NDK_Version-linux-x86_64.zip -O $__Android_Cross_Dir/android-ndk-$__NDK_Version-linux-x86_64.zip + unzip -q $__Android_Cross_Dir/android-ndk-$__NDK_Version-linux-x86_64.zip -d $__Android_Cross_Dir +fi + +if [ ! -d $__lldb_Dir ]; then + mkdir -p $__lldb_Dir + echo Downloading LLDB into $__lldb_Dir + wget -nv -nc --show-progress https://dl.google.com/android/repository/lldb-2.3.3614996-linux-x86_64.zip -O $__Android_Cross_Dir/lldb-2.3.3614996-linux-x86_64.zip + unzip -q $__Android_Cross_Dir/lldb-2.3.3614996-linux-x86_64.zip -d $__lldb_Dir +fi + +# Create the RootFS for both arm64 as well as aarch +rm -rf $__Android_Cross_Dir/toolchain + +echo Generating the $__BuildArch toolchain +$__NDK_Dir/build/tools/make_standalone_toolchain.py --arch $__BuildArch --api $__ApiLevel --install-dir $__ToolchainDir + +# Install the required packages into the toolchain +# TODO: Add logic to get latest pkg version instead of specific version number +rm -rf $__Android_Cross_Dir/deb/ +rm -rf $__Android_Cross_Dir/tmp + +mkdir -p $__Android_Cross_Dir/deb/ +mkdir -p $__Android_Cross_Dir/tmp/$arch/ +wget -nv -nc http://termux.net/dists/stable/main/binary-$__AndroidArch/libicu_60.2_$__AndroidArch.deb -O $__Android_Cross_Dir/deb/libicu_60.2_$__AndroidArch.deb +wget -nv -nc http://termux.net/dists/stable/main/binary-$__AndroidArch/libicu-dev_60.2_$__AndroidArch.deb -O $__Android_Cross_Dir/deb/libicu-dev_60.2_$__AndroidArch.deb + +wget -nv -nc http://termux.net/dists/stable/main/binary-$__AndroidArch/libandroid-glob-dev_0.4_$__AndroidArch.deb -O $__Android_Cross_Dir/deb/libandroid-glob-dev_0.4_$__AndroidArch.deb +wget -nv -nc http://termux.net/dists/stable/main/binary-$__AndroidArch/libandroid-glob_0.4_$__AndroidArch.deb -O $__Android_Cross_Dir/deb/libandroid-glob_0.4_$__AndroidArch.deb +wget -nv -nc http://termux.net/dists/stable/main/binary-$__AndroidArch/libandroid-support-dev_22_$__AndroidArch.deb -O $__Android_Cross_Dir/deb/libandroid-support-dev_22_$__AndroidArch.deb +wget -nv -nc http://termux.net/dists/stable/main/binary-$__AndroidArch/libandroid-support_22_$__AndroidArch.deb -O $__Android_Cross_Dir/deb/libandroid-support_22_$__AndroidArch.deb +wget -nv -nc http://termux.net/dists/stable/main/binary-$__AndroidArch/liblzma-dev_5.2.3_$__AndroidArch.deb -O $__Android_Cross_Dir/deb/liblzma-dev_5.2.3_$__AndroidArch.deb +wget -nv -nc http://termux.net/dists/stable/main/binary-$__AndroidArch/liblzma_5.2.3_$__AndroidArch.deb -O $__Android_Cross_Dir/deb/liblzma_5.2.3_$__AndroidArch.deb +wget -nv -nc http://termux.net/dists/stable/main/binary-$__AndroidArch/libunwind-dev_1.2.20170304_$__AndroidArch.deb -O $__Android_Cross_Dir/deb/libunwind-dev_1.2.20170304_$__AndroidArch.deb +wget -nv -nc http://termux.net/dists/stable/main/binary-$__AndroidArch/libunwind_1.2.20170304_$__AndroidArch.deb -O $__Android_Cross_Dir/deb/libunwind_1.2.20170304_$__AndroidArch.deb + +echo Unpacking Termux packages +dpkg -x $__Android_Cross_Dir/deb/libicu_60.2_$__AndroidArch.deb $__Android_Cross_Dir/tmp/$__AndroidArch/ +dpkg -x $__Android_Cross_Dir/deb/libicu-dev_60.2_$__AndroidArch.deb $__Android_Cross_Dir/tmp/$__AndroidArch/ +dpkg -x $__Android_Cross_Dir/deb/libandroid-glob-dev_0.4_$__AndroidArch.deb $__Android_Cross_Dir/tmp/$__AndroidArch/ +dpkg -x $__Android_Cross_Dir/deb/libandroid-glob_0.4_$__AndroidArch.deb $__Android_Cross_Dir/tmp/$__AndroidArch/ +dpkg -x $__Android_Cross_Dir/deb/libandroid-support-dev_22_$__AndroidArch.deb $__Android_Cross_Dir/tmp/$__AndroidArch/ +dpkg -x $__Android_Cross_Dir/deb/libandroid-support_22_$__AndroidArch.deb $__Android_Cross_Dir/tmp/$__AndroidArch/ +dpkg -x $__Android_Cross_Dir/deb/liblzma-dev_5.2.3_$__AndroidArch.deb $__Android_Cross_Dir/tmp/$__AndroidArch/ +dpkg -x $__Android_Cross_Dir/deb/liblzma_5.2.3_$__AndroidArch.deb $__Android_Cross_Dir/tmp/$__AndroidArch/ +dpkg -x $__Android_Cross_Dir/deb/libunwind-dev_1.2.20170304_$__AndroidArch.deb $__Android_Cross_Dir/tmp/$__AndroidArch/ +dpkg -x $__Android_Cross_Dir/deb/libunwind_1.2.20170304_$__AndroidArch.deb $__Android_Cross_Dir/tmp/$__AndroidArch/ + +cp -R $__Android_Cross_Dir/tmp/$__AndroidArch/data/data/com.termux/files/usr/* $__ToolchainDir/sysroot/usr/ + +# Generate platform file for build.sh script to assign to __DistroRid +echo "Generating platform file..." + +echo "RID=android.21-arm64" > $__ToolchainDir/sysroot/android_platform +echo Now run: +echo CONFIG_DIR=\`realpath cross/android/$__BuildArch\` ROOTFS_DIR=\`realpath $__ToolchainDir/sysroot\` ./build.sh cross $__BuildArch skipgenerateversion skipnuget cmakeargs -DENABLE_LLDBPLUGIN=0 + diff --git a/eng/common/cross/build-rootfs.sh b/eng/common/cross/build-rootfs.sh new file mode 100755 index 00000000000..805948ca83c --- /dev/null +++ b/eng/common/cross/build-rootfs.sh @@ -0,0 +1,210 @@ +#!/usr/bin/env bash + +usage() +{ + echo "Usage: $0 [BuildArch] [LinuxCodeName] [lldbx.y] [--skipunmount]" + echo "BuildArch can be: arm(default), armel, arm64, x86" + echo "LinuxCodeName - optional, Code name for Linux, can be: trusty(default), vivid, wily, xenial, zesty, bionic, alpine. If BuildArch is armel, LinuxCodeName is jessie(default) or tizen." + echo "lldbx.y - optional, LLDB version, can be: lldb3.6(default), lldb3.8, lldb3.9, lldb4.0, no-lldb. Ignored for alpine" + echo "--skipunmount - optional, will skip the unmount of rootfs folder." + exit 1 +} + +__LinuxCodeName=trusty +__CrossDir=$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd ) +__InitialDir=$PWD +__BuildArch=arm +__UbuntuArch=armhf +__UbuntuRepo="http://ports.ubuntu.com/" +__LLDB_Package="lldb-3.6-dev" +__SkipUnmount=0 + +# base development support +__UbuntuPackages="build-essential" + +__AlpinePackages="alpine-base" +__AlpinePackages+=" build-base" +__AlpinePackages+=" linux-headers" +__AlpinePackages+=" lldb-dev" +__AlpinePackages+=" llvm-dev" + +# symlinks fixer +__UbuntuPackages+=" symlinks" + +# CoreCLR and CoreFX dependencies +__UbuntuPackages+=" libicu-dev" +__UbuntuPackages+=" liblttng-ust-dev" +__UbuntuPackages+=" libunwind8-dev" + +__AlpinePackages+=" gettext-dev" +__AlpinePackages+=" icu-dev" +__AlpinePackages+=" libunwind-dev" +__AlpinePackages+=" lttng-ust-dev" + +# CoreFX dependencies +__UbuntuPackages+=" libcurl4-openssl-dev" +__UbuntuPackages+=" libkrb5-dev" +__UbuntuPackages+=" libssl-dev" +__UbuntuPackages+=" zlib1g-dev" + +__AlpinePackages+=" curl-dev" +__AlpinePackages+=" krb5-dev" +__AlpinePackages+=" openssl-dev" +__AlpinePackages+=" zlib-dev" + +__UnprocessedBuildArgs= +for i in "$@" ; do + lowerI="$(echo $i | awk '{print tolower($0)}')" + case $lowerI in + -?|-h|--help) + usage + exit 1 + ;; + arm) + __BuildArch=arm + __UbuntuArch=armhf + __AlpineArch=armhf + __QEMUArch=arm + ;; + arm64) + __BuildArch=arm64 + __UbuntuArch=arm64 + __AlpineArch=aarch64 + __QEMUArch=aarch64 + ;; + armel) + __BuildArch=armel + __UbuntuArch=armel + __UbuntuRepo="http://ftp.debian.org/debian/" + __LinuxCodeName=jessie + ;; + x86) + __BuildArch=x86 + __UbuntuArch=i386 + __UbuntuRepo="http://archive.ubuntu.com/ubuntu/" + ;; + lldb3.6) + __LLDB_Package="lldb-3.6-dev" + ;; + lldb3.8) + __LLDB_Package="lldb-3.8-dev" + ;; + lldb3.9) + __LLDB_Package="liblldb-3.9-dev" + ;; + lldb4.0) + __LLDB_Package="liblldb-4.0-dev" + ;; + no-lldb) + unset __LLDB_Package + ;; + vivid) + if [ "$__LinuxCodeName" != "jessie" ]; then + __LinuxCodeName=vivid + fi + ;; + wily) + if [ "$__LinuxCodeName" != "jessie" ]; then + __LinuxCodeName=wily + fi + ;; + xenial) + if [ "$__LinuxCodeName" != "jessie" ]; then + __LinuxCodeName=xenial + fi + ;; + zesty) + if [ "$__LinuxCodeName" != "jessie" ]; then + __LinuxCodeName=zesty + fi + ;; + bionic) + if [ "$__LinuxCodeName" != "jessie" ]; then + __LinuxCodeName=bionic + fi + ;; + jessie) + __LinuxCodeName=jessie + __UbuntuRepo="http://ftp.debian.org/debian/" + ;; + tizen) + if [ "$__BuildArch" != "armel" ]; then + echo "Tizen is available only for armel." + usage; + exit 1; + fi + __LinuxCodeName= + __UbuntuRepo= + __Tizen=tizen + ;; + alpine) + __LinuxCodeName=alpine + __UbuntuRepo= + ;; + --skipunmount) + __SkipUnmount=1 + ;; + *) + __UnprocessedBuildArgs="$__UnprocessedBuildArgs $i" + ;; + esac +done + +if [ "$__BuildArch" == "armel" ]; then + __LLDB_Package="lldb-3.5-dev" +fi +__UbuntuPackages+=" ${__LLDB_Package:-}" + +__RootfsDir="$__CrossDir/rootfs/$__BuildArch" + +if [[ -n "$ROOTFS_DIR" ]]; then + __RootfsDir=$ROOTFS_DIR +fi + +if [ -d "$__RootfsDir" ]; then + if [ $__SkipUnmount == 0 ]; then + umount $__RootfsDir/* + fi + rm -rf $__RootfsDir +fi + +if [[ "$__LinuxCodeName" == "alpine" ]]; then + __ApkToolsVersion=2.9.1 + __AlpineVersion=3.7 + __ApkToolsDir=$(mktemp -d) + wget https://github.com/alpinelinux/apk-tools/releases/download/v$__ApkToolsVersion/apk-tools-$__ApkToolsVersion-x86_64-linux.tar.gz -P $__ApkToolsDir + tar -xf $__ApkToolsDir/apk-tools-$__ApkToolsVersion-x86_64-linux.tar.gz -C $__ApkToolsDir + mkdir -p $__RootfsDir/usr/bin + cp -v /usr/bin/qemu-$__QEMUArch-static $__RootfsDir/usr/bin + $__ApkToolsDir/apk-tools-$__ApkToolsVersion/apk \ + -X http://dl-cdn.alpinelinux.org/alpine/v$__AlpineVersion/main \ + -X http://dl-cdn.alpinelinux.org/alpine/v$__AlpineVersion/community \ + -X http://dl-cdn.alpinelinux.org/alpine/edge/testing \ + -U --allow-untrusted --root $__RootfsDir --arch $__AlpineArch --initdb \ + add $__AlpinePackages + rm -r $__ApkToolsDir +elif [[ -n $__LinuxCodeName ]]; then + qemu-debootstrap --arch $__UbuntuArch $__LinuxCodeName $__RootfsDir $__UbuntuRepo + cp $__CrossDir/$__BuildArch/sources.list.$__LinuxCodeName $__RootfsDir/etc/apt/sources.list + chroot $__RootfsDir apt-get update + chroot $__RootfsDir apt-get -f -y install + chroot $__RootfsDir apt-get -y install $__UbuntuPackages + chroot $__RootfsDir symlinks -cr /usr + + if [ $__SkipUnmount == 0 ]; then + umount $__RootfsDir/* + fi + + if [[ "$__BuildArch" == "arm" && "$__LinuxCodeName" == "trusty" ]]; then + pushd $__RootfsDir + patch -p1 < $__CrossDir/$__BuildArch/trusty.patch + patch -p1 < $__CrossDir/$__BuildArch/trusty-lttng-2.4.patch + popd + fi +elif [ "$__Tizen" == "tizen" ]; then + ROOTFS_DIR=$__RootfsDir $__CrossDir/$__BuildArch/tizen-build-rootfs.sh +else + echo "Unsupported target platform." + usage; + exit 1 +fi diff --git a/eng/common/cross/toolchain.cmake b/eng/common/cross/toolchain.cmake new file mode 100644 index 00000000000..071d4112419 --- /dev/null +++ b/eng/common/cross/toolchain.cmake @@ -0,0 +1,138 @@ +set(CROSS_ROOTFS $ENV{ROOTFS_DIR}) + +set(TARGET_ARCH_NAME $ENV{TARGET_BUILD_ARCH}) +set(CMAKE_SYSTEM_NAME Linux) +set(CMAKE_SYSTEM_VERSION 1) + +if(TARGET_ARCH_NAME STREQUAL "armel") + set(CMAKE_SYSTEM_PROCESSOR armv7l) + set(TOOLCHAIN "arm-linux-gnueabi") + if("$ENV{__DistroRid}" MATCHES "tizen.*") + set(TIZEN_TOOLCHAIN "armv7l-tizen-linux-gnueabi/6.2.1") + endif() +elseif(TARGET_ARCH_NAME STREQUAL "arm") + set(CMAKE_SYSTEM_PROCESSOR armv7l) + if(EXISTS ${CROSS_ROOTFS}/usr/lib/gcc/armv6-alpine-linux-musleabihf) + set(TOOLCHAIN "armv6-alpine-linux-musleabihf") + else() + set(TOOLCHAIN "arm-linux-gnueabihf") + endif() +elseif(TARGET_ARCH_NAME STREQUAL "arm64") + set(CMAKE_SYSTEM_PROCESSOR aarch64) + if(EXISTS ${CROSS_ROOTFS}/usr/lib/gcc/aarch64-alpine-linux-musl) + set(TOOLCHAIN "aarch64-alpine-linux-musl") + else() + set(TOOLCHAIN "aarch64-linux-gnu") + endif() +elseif(TARGET_ARCH_NAME STREQUAL "x86") + set(CMAKE_SYSTEM_PROCESSOR i686) + set(TOOLCHAIN "i686-linux-gnu") +else() + message(FATAL_ERROR "Arch is ${TARGET_ARCH_NAME}. Only armel, arm, arm64 and x86 are supported!") +endif() + +# Specify include paths +if(TARGET_ARCH_NAME STREQUAL "armel") + if(DEFINED TIZEN_TOOLCHAIN) + include_directories(SYSTEM ${CROSS_ROOTFS}/usr/lib/gcc/${TIZEN_TOOLCHAIN}/include/c++/) + include_directories(SYSTEM ${CROSS_ROOTFS}/usr/lib/gcc/${TIZEN_TOOLCHAIN}/include/c++/armv7l-tizen-linux-gnueabi) + endif() +endif() + +# add_compile_param - adds only new options without duplicates. +# arg0 - list with result options, arg1 - list with new options. +# arg2 - optional argument, quick summary string for optional using CACHE FORCE mode. +macro(add_compile_param) + if(NOT ${ARGC} MATCHES "^(2|3)$") + message(FATAL_ERROR "Wrong using add_compile_param! Two or three parameters must be given! See add_compile_param description.") + endif() + foreach(OPTION ${ARGV1}) + if(NOT ${ARGV0} MATCHES "${OPTION}($| )") + set(${ARGV0} "${${ARGV0}} ${OPTION}") + if(${ARGC} EQUAL "3") # CACHE FORCE mode + set(${ARGV0} "${${ARGV0}}" CACHE STRING "${ARGV2}" FORCE) + endif() + endif() + endforeach() +endmacro() + +# Specify link flags +add_compile_param(CROSS_LINK_FLAGS "--sysroot=${CROSS_ROOTFS}") +add_compile_param(CROSS_LINK_FLAGS "--gcc-toolchain=${CROSS_ROOTFS}/usr") +add_compile_param(CROSS_LINK_FLAGS "--target=${TOOLCHAIN}") +add_compile_param(CROSS_LINK_FLAGS "-fuse-ld=gold") + +if(TARGET_ARCH_NAME STREQUAL "armel") + if(DEFINED TIZEN_TOOLCHAIN) # For Tizen only + add_compile_param(CROSS_LINK_FLAGS "-B${CROSS_ROOTFS}/usr/lib/gcc/${TIZEN_TOOLCHAIN}") + add_compile_param(CROSS_LINK_FLAGS "-L${CROSS_ROOTFS}/lib") + add_compile_param(CROSS_LINK_FLAGS "-L${CROSS_ROOTFS}/usr/lib") + add_compile_param(CROSS_LINK_FLAGS "-L${CROSS_ROOTFS}/usr/lib/gcc/${TIZEN_TOOLCHAIN}") + endif() +elseif(TARGET_ARCH_NAME STREQUAL "x86") + add_compile_param(CROSS_LINK_FLAGS "-m32") +endif() + +add_compile_param(CMAKE_EXE_LINKER_FLAGS "${CROSS_LINK_FLAGS}" "TOOLCHAIN_EXE_LINKER_FLAGS") +add_compile_param(CMAKE_SHARED_LINKER_FLAGS "${CROSS_LINK_FLAGS}" "TOOLCHAIN_EXE_LINKER_FLAGS") +add_compile_param(CMAKE_MODULE_LINKER_FLAGS "${CROSS_LINK_FLAGS}" "TOOLCHAIN_EXE_LINKER_FLAGS") + +# Specify compile options +add_compile_options("--sysroot=${CROSS_ROOTFS}") +add_compile_options("--target=${TOOLCHAIN}") +add_compile_options("--gcc-toolchain=${CROSS_ROOTFS}/usr") + +if(TARGET_ARCH_NAME MATCHES "^(arm|armel|arm64)$") + set(CMAKE_C_COMPILER_TARGET ${TOOLCHAIN}) + set(CMAKE_CXX_COMPILER_TARGET ${TOOLCHAIN}) + set(CMAKE_ASM_COMPILER_TARGET ${TOOLCHAIN}) +endif() + +if(TARGET_ARCH_NAME MATCHES "^(arm|armel)$") + add_compile_options(-mthumb) + add_compile_options(-mfpu=vfpv3) + if(TARGET_ARCH_NAME STREQUAL "armel") + add_compile_options(-mfloat-abi=softfp) + if(DEFINED TIZEN_TOOLCHAIN) + add_compile_options(-Wno-deprecated-declarations) # compile-time option + add_compile_options(-D__extern_always_inline=inline) # compile-time option + endif() + endif() +elseif(TARGET_ARCH_NAME STREQUAL "x86") + add_compile_options(-m32) + add_compile_options(-Wno-error=unused-command-line-argument) +endif() + +# Set LLDB include and library paths +if(TARGET_ARCH_NAME MATCHES "^(arm|armel|x86)$") + if(TARGET_ARCH_NAME STREQUAL "x86") + set(LLVM_CROSS_DIR "$ENV{LLVM_CROSS_HOME}") + else() # arm/armel case + set(LLVM_CROSS_DIR "$ENV{LLVM_ARM_HOME}") + endif() + if(LLVM_CROSS_DIR) + set(WITH_LLDB_LIBS "${LLVM_CROSS_DIR}/lib/" CACHE STRING "") + set(WITH_LLDB_INCLUDES "${LLVM_CROSS_DIR}/include" CACHE STRING "") + set(LLDB_H "${WITH_LLDB_INCLUDES}" CACHE STRING "") + set(LLDB "${LLVM_CROSS_DIR}/lib/liblldb.so" CACHE STRING "") + else() + if(TARGET_ARCH_NAME STREQUAL "x86") + set(WITH_LLDB_LIBS "${CROSS_ROOTFS}/usr/lib/i386-linux-gnu" CACHE STRING "") + set(CHECK_LLVM_DIR "${CROSS_ROOTFS}/usr/lib/llvm-3.8/include") + if(EXISTS "${CHECK_LLVM_DIR}" AND IS_DIRECTORY "${CHECK_LLVM_DIR}") + set(WITH_LLDB_INCLUDES "${CHECK_LLVM_DIR}") + else() + set(WITH_LLDB_INCLUDES "${CROSS_ROOTFS}/usr/lib/llvm-3.6/include") + endif() + else() # arm/armel case + set(WITH_LLDB_LIBS "${CROSS_ROOTFS}/usr/lib/${TOOLCHAIN}" CACHE STRING "") + set(WITH_LLDB_INCLUDES "${CROSS_ROOTFS}/usr/lib/llvm-3.6/include" CACHE STRING "") + endif() + endif() +endif() + +set(CMAKE_FIND_ROOT_PATH "${CROSS_ROOTFS}") +set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) +set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) +set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) +set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY) diff --git a/eng/common/cross/x86/sources.list.bionic b/eng/common/cross/x86/sources.list.bionic new file mode 100644 index 00000000000..a71ccadcffa --- /dev/null +++ b/eng/common/cross/x86/sources.list.bionic @@ -0,0 +1,11 @@ +deb http://archive.ubuntu.com/ubuntu/ bionic main restricted universe +deb-src http://archive.ubuntu.com/ubuntu/ bionic main restricted universe + +deb http://archive.ubuntu.com/ubuntu/ bionic-updates main restricted universe +deb-src http://archive.ubuntu.com/ubuntu/ bionic-updates main restricted universe + +deb http://archive.ubuntu.com/ubuntu/ bionic-backports main restricted +deb-src http://archive.ubuntu.com/ubuntu/ bionic-backports main restricted + +deb http://archive.ubuntu.com/ubuntu/ bionic-security main restricted universe multiverse +deb-src http://archive.ubuntu.com/ubuntu/ bionic-security main restricted universe multiverse diff --git a/eng/common/cross/x86/sources.list.trusty b/eng/common/cross/x86/sources.list.trusty new file mode 100644 index 00000000000..9b3085436e9 --- /dev/null +++ b/eng/common/cross/x86/sources.list.trusty @@ -0,0 +1,11 @@ +deb http://archive.ubuntu.com/ubuntu/ trusty main restricted universe +deb-src http://archive.ubuntu.com/ubuntu/ trusty main restricted universe + +deb http://archive.ubuntu.com/ubuntu/ trusty-updates main restricted universe +deb-src http://archive.ubuntu.com/ubuntu/ trusty-updates main restricted universe + +deb http://archive.ubuntu.com/ubuntu/ trusty-backports main restricted +deb-src http://archive.ubuntu.com/ubuntu/ trusty-backports main restricted + +deb http://archive.ubuntu.com/ubuntu/ trusty-security main restricted universe multiverse +deb-src http://archive.ubuntu.com/ubuntu/ trusty-security main restricted universe multiverse diff --git a/eng/common/cross/x86/sources.list.vivid b/eng/common/cross/x86/sources.list.vivid new file mode 100644 index 00000000000..26d37b20fc3 --- /dev/null +++ b/eng/common/cross/x86/sources.list.vivid @@ -0,0 +1,11 @@ +deb http://archive.ubuntu.com/ubuntu/ vivid main restricted universe +deb-src http://archive.ubuntu.com/ubuntu/ vivid main restricted universe + +deb http://archive.ubuntu.com/ubuntu/ vivid-updates main restricted universe +deb-src http://archive.ubuntu.com/ubuntu/ vivid-updates main restricted universe + +deb http://archive.ubuntu.com/ubuntu/ vivid-backports main restricted +deb-src http://archive.ubuntu.com/ubuntu/ vivid-backports main restricted + +deb http://archive.ubuntu.com/ubuntu/ vivid-security main restricted universe multiverse +deb-src http://archive.ubuntu.com/ubuntu/ vivid-security main restricted universe multiverse diff --git a/eng/common/cross/x86/sources.list.wily b/eng/common/cross/x86/sources.list.wily new file mode 100644 index 00000000000..c4b0b442ab6 --- /dev/null +++ b/eng/common/cross/x86/sources.list.wily @@ -0,0 +1,11 @@ +deb http://archive.ubuntu.com/ubuntu/ wily main restricted universe +deb-src http://archive.ubuntu.com/ubuntu/ wily main restricted universe + +deb http://archive.ubuntu.com/ubuntu/ wily-updates main restricted universe +deb-src http://archive.ubuntu.com/ubuntu/ wily-updates main restricted universe + +deb http://archive.ubuntu.com/ubuntu/ wily-backports main restricted +deb-src http://archive.ubuntu.com/ubuntu/ wily-backports main restricted + +deb http://archive.ubuntu.com/ubuntu/ wily-security main restricted universe multiverse +deb-src http://archive.ubuntu.com/ubuntu/ wily-security main restricted universe multiverse diff --git a/eng/common/cross/x86/sources.list.xenial b/eng/common/cross/x86/sources.list.xenial new file mode 100644 index 00000000000..ad9c5a0144e --- /dev/null +++ b/eng/common/cross/x86/sources.list.xenial @@ -0,0 +1,11 @@ +deb http://archive.ubuntu.com/ubuntu/ xenial main restricted universe +deb-src http://archive.ubuntu.com/ubuntu/ xenial main restricted universe + +deb http://archive.ubuntu.com/ubuntu/ xenial-updates main restricted universe +deb-src http://archive.ubuntu.com/ubuntu/ xenial-updates main restricted universe + +deb http://archive.ubuntu.com/ubuntu/ xenial-backports main restricted +deb-src http://archive.ubuntu.com/ubuntu/ xenial-backports main restricted + +deb http://archive.ubuntu.com/ubuntu/ xenial-security main restricted universe multiverse +deb-src http://archive.ubuntu.com/ubuntu/ xenial-security main restricted universe multiverse diff --git a/eng/common/darc-init.ps1 b/eng/common/darc-init.ps1 new file mode 100644 index 00000000000..96cad844ba3 --- /dev/null +++ b/eng/common/darc-init.ps1 @@ -0,0 +1,32 @@ +param ( + $darcVersion = $null +) + +$verbosity = "m" +. $PSScriptRoot\tools.ps1 + +function InstallDarcCli ($darcVersion) { + $darcCliPackageName = "microsoft.dotnet.darc" + + $dotnetRoot = InitializeDotNetCli -install:$true + $dotnet = "$dotnetRoot\dotnet.exe" + $toolList = Invoke-Expression "& `"$dotnet`" tool list -g" + + if ($toolList -like "*$darcCliPackageName*") { + Invoke-Expression "& `"$dotnet`" tool uninstall $darcCliPackageName -g" + } + + # Until we can anonymously query the BAR API for the latest arcade-services + # build applied to the PROD channel, this is hardcoded. + if (-not $darcVersion) { + $darcVersion = '1.1.0-beta.19057.9' + } + + $arcadeServicesSource = 'https://dotnetfeed.blob.core.windows.net/dotnet-arcade/index.json' + + Write-Host "Installing Darc CLI version $darcVersion..." + Write-Host "You may need to restart your command window if this is the first dotnet tool you have installed." + Invoke-Expression "& `"$dotnet`" tool install $darcCliPackageName --version $darcVersion --add-source '$arcadeServicesSource' -v $verbosity -g" +} + +InstallDarcCli $darcVersion diff --git a/eng/common/darc-init.sh b/eng/common/darc-init.sh new file mode 100755 index 00000000000..bad07c3ae61 --- /dev/null +++ b/eng/common/darc-init.sh @@ -0,0 +1,38 @@ +#!/usr/bin/env bash + +source="${BASH_SOURCE[0]}" + +# resolve $source until the file is no longer a symlink +while [[ -h "$source" ]]; do + scriptroot="$( cd -P "$( dirname "$source" )" && pwd )" + source="$(readlink "$source")" + # if $source was a relative symlink, we need to resolve it relative to the path where the + # symlink file was located + [[ $source != /* ]] && source="$scriptroot/$source" +done +scriptroot="$( cd -P "$( dirname "$source" )" && pwd )" +verbosity=m + +. "$scriptroot/tools.sh" + +function InstallDarcCli { + local darc_cli_package_name="microsoft.dotnet.darc" + + InitializeDotNetCli + local dotnet_root=$_InitializeDotNetCli + + local uninstall_command=`$dotnet_root/dotnet tool uninstall $darc_cli_package_name -g` + local tool_list=$($dotnet_root/dotnet tool list -g) + if [[ $tool_list = *$darc_cli_package_name* ]]; then + echo $($dotnet_root/dotnet tool uninstall $darc_cli_package_name -g) + fi + + ReadGlobalVersion "Microsoft.DotNet.Arcade.Sdk" + local toolset_version=$_ReadGlobalVersion + + echo "Installing Darc CLI version $toolset_version..." + echo "You may need to restart your command shell if this is the first dotnet tool you have installed." + echo $($dotnet_root/dotnet tool install $darc_cli_package_name --version $toolset_version -v $verbosity -g) +} + +InstallDarcCli diff --git a/eng/common/helixpublish.proj b/eng/common/helixpublish.proj new file mode 100644 index 00000000000..d7f185856e7 --- /dev/null +++ b/eng/common/helixpublish.proj @@ -0,0 +1,26 @@ + + + + msbuild + + + + + %(Identity) + + + + + + $(WorkItemDirectory) + $(WorkItemCommand) + $(WorkItemTimeout) + + + + + + + + + diff --git a/eng/common/init-tools-native.cmd b/eng/common/init-tools-native.cmd new file mode 100644 index 00000000000..438cd548c45 --- /dev/null +++ b/eng/common/init-tools-native.cmd @@ -0,0 +1,3 @@ +@echo off +powershell -NoProfile -NoLogo -ExecutionPolicy ByPass -command "& """%~dp0init-tools-native.ps1""" %*" +exit /b %ErrorLevel% \ No newline at end of file diff --git a/eng/common/init-tools-native.ps1 b/eng/common/init-tools-native.ps1 new file mode 100644 index 00000000000..e25c60fed42 --- /dev/null +++ b/eng/common/init-tools-native.ps1 @@ -0,0 +1,128 @@ +<# +.SYNOPSIS +Entry point script for installing native tools + +.DESCRIPTION +Reads $RepoRoot\global.json file to determine native assets to install +and executes installers for those tools + +.PARAMETER BaseUri +Base file directory or Url from which to acquire tool archives + +.PARAMETER InstallDirectory +Directory to install native toolset. This is a command-line override for the default +Install directory precedence order: +- InstallDirectory command-line override +- NETCOREENG_INSTALL_DIRECTORY environment variable +- (default) %USERPROFILE%/.netcoreeng/native + +.PARAMETER Clean +Switch specifying to not install anything, but cleanup native asset folders + +.PARAMETER Force +Clean and then install tools + +.PARAMETER DownloadRetries +Total number of retry attempts + +.PARAMETER RetryWaitTimeInSeconds +Wait time between retry attempts in seconds + +.PARAMETER GlobalJsonFile +File path to global.json file + +.NOTES +#> +[CmdletBinding(PositionalBinding=$false)] +Param ( + [string] $BaseUri = "https://netcorenativeassets.blob.core.windows.net/resource-packages/external", + [string] $InstallDirectory, + [switch] $Clean = $False, + [switch] $Force = $False, + [int] $DownloadRetries = 5, + [int] $RetryWaitTimeInSeconds = 30, + [string] $GlobalJsonFile = "$PSScriptRoot\..\..\global.json" +) + +Set-StrictMode -version 2.0 +$ErrorActionPreference="Stop" + +Import-Module -Name (Join-Path $PSScriptRoot "native\CommonLibrary.psm1") + +try { + # Define verbose switch if undefined + $Verbose = $VerbosePreference -Eq "Continue" + + $EngCommonBaseDir = Join-Path $PSScriptRoot "native\" + $NativeBaseDir = $InstallDirectory + if (!$NativeBaseDir) { + $NativeBaseDir = CommonLibrary\Get-NativeInstallDirectory + } + $Env:CommonLibrary_NativeInstallDir = $NativeBaseDir + $InstallBin = Join-Path $NativeBaseDir "bin" + $InstallerPath = Join-Path $EngCommonBaseDir "install-tool.ps1" + + # Process tools list + Write-Host "Processing $GlobalJsonFile" + If (-Not (Test-Path $GlobalJsonFile)) { + Write-Host "Unable to find '$GlobalJsonFile'" + exit 0 + } + $NativeTools = Get-Content($GlobalJsonFile) -Raw | + ConvertFrom-Json | + Select-Object -Expand "native-tools" -ErrorAction SilentlyContinue + if ($NativeTools) { + $NativeTools.PSObject.Properties | ForEach-Object { + $ToolName = $_.Name + $ToolVersion = $_.Value + $LocalInstallerCommand = $InstallerPath + $LocalInstallerCommand += " -ToolName $ToolName" + $LocalInstallerCommand += " -InstallPath $InstallBin" + $LocalInstallerCommand += " -BaseUri $BaseUri" + $LocalInstallerCommand += " -CommonLibraryDirectory $EngCommonBaseDir" + $LocalInstallerCommand += " -Version $ToolVersion" + + if ($Verbose) { + $LocalInstallerCommand += " -Verbose" + } + if (Get-Variable 'Force' -ErrorAction 'SilentlyContinue') { + if($Force) { + $LocalInstallerCommand += " -Force" + } + } + if ($Clean) { + $LocalInstallerCommand += " -Clean" + } + + Write-Verbose "Installing $ToolName version $ToolVersion" + Write-Verbose "Executing '$LocalInstallerCommand'" + Invoke-Expression "$LocalInstallerCommand" + if ($LASTEXITCODE -Ne "0") { + Write-Error "Execution failed" + exit 1 + } + } + } + else { + Write-Host "No native tools defined in global.json" + exit 0 + } + + if ($Clean) { + exit 0 + } + if (Test-Path $InstallBin) { + Write-Host "Native tools are available from" (Convert-Path -Path $InstallBin) + Write-Host "##vso[task.prependpath]$(Convert-Path -Path $InstallBin)" + } + else { + Write-Error "Native tools install directory does not exist, installation failed" + exit 1 + } + exit 0 +} +catch { + Write-Host $_ + Write-Host $_.Exception + exit 1 +} diff --git a/eng/common/init-tools-native.sh b/eng/common/init-tools-native.sh new file mode 100755 index 00000000000..54b70f678ba --- /dev/null +++ b/eng/common/init-tools-native.sh @@ -0,0 +1,145 @@ +#!/usr/bin/env bash + +source="${BASH_SOURCE[0]}" +scriptroot="$( cd -P "$( dirname "$source" )" && pwd )" + +base_uri='https://netcorenativeassets.blob.core.windows.net/resource-packages/external' +install_directory='' +clean=false +force=false +download_retries=5 +retry_wait_time_seconds=30 +global_json_file="${scriptroot}/../../global.json" +declare -A native_assets + +. $scriptroot/native/common-library.sh + +while (($# > 0)); do + lowerI="$(echo $1 | awk '{print tolower($0)}')" + case $lowerI in + --baseuri) + base_uri=$2 + shift 2 + ;; + --installdirectory) + install_directory=$2 + shift 2 + ;; + --clean) + clean=true + shift 1 + ;; + --force) + force=true + shift 1 + ;; + --downloadretries) + download_retries=$2 + shift 2 + ;; + --retrywaittimeseconds) + retry_wait_time_seconds=$2 + shift 2 + ;; + --help) + echo "Common settings:" + echo " --installdirectory Directory to install native toolset." + echo " This is a command-line override for the default" + echo " Install directory precedence order:" + echo " - InstallDirectory command-line override" + echo " - NETCOREENG_INSTALL_DIRECTORY environment variable" + echo " - (default) %USERPROFILE%/.netcoreeng/native" + echo "" + echo " --clean Switch specifying not to install anything, but cleanup native asset folders" + echo " --force Clean and then install tools" + echo " --help Print help and exit" + echo "" + echo "Advanced settings:" + echo " --baseuri Base URI for where to download native tools from" + echo " --downloadretries Number of times a download should be attempted" + echo " --retrywaittimeseconds Wait time between download attempts" + echo "" + exit 0 + ;; + esac +done + +function ReadGlobalJsonNativeTools { + # Get the native-tools section from the global.json. + local native_tools_section=$(cat $global_json_file | awk '/"native-tools"/,/}/') + # Only extract the contents of the object. + local native_tools_list=$(echo $native_tools_section | awk -F"[{}]" '{print $2}') + native_tools_list=${native_tools_list//[\" ]/} + native_tools_list=${native_tools_list//,/$'\n'} + + local old_IFS=$IFS + while read -r line; do + # Lines are of the form: 'tool:version' + IFS=: + while read -r key value; do + native_assets[$key]=$value + done <<< "$line" + done <<< "$native_tools_list" + IFS=$old_IFS + + return 0; +} + +native_base_dir=$install_directory +if [[ -z $install_directory ]]; then + native_base_dir=$(GetNativeInstallDirectory) +fi + +install_bin="${native_base_dir}/bin" + +ReadGlobalJsonNativeTools + +if [[ ${#native_assets[@]} -eq 0 ]]; then + echo "No native tools defined in global.json" + exit 0; +else + native_installer_dir="$scriptroot/native" + for tool in "${!native_assets[@]}" + do + tool_version=${native_assets[$tool]} + installer_name="install-$tool.sh" + installer_command="$native_installer_dir/$installer_name" + installer_command+=" --baseuri $base_uri" + installer_command+=" --installpath $install_bin" + installer_command+=" --version $tool_version" + + if [[ $force = true ]]; then + installer_command+=" --force" + fi + + if [[ $clean = true ]]; then + installer_command+=" --clean" + fi + + echo "Installing $tool version $tool_version" + echo "Executing '$installer_command'" + $installer_command + + if [[ $? != 0 ]]; then + echo "Execution Failed" >&2 + exit 1 + fi + done +fi + +if [[ ! -z $clean ]]; then + exit 0 +fi + +if [[ -d $install_bin ]]; then + echo "Native tools are available from $install_bin" + if [[ !-z BUILD_BUILDNUMBER ]]; then + echo "##vso[task.prependpath]$install_bin" + fi +else + echo "Native tools install directory does not exist, installation failed" >&2 + exit 1 +fi + +exit 0 + diff --git a/eng/common/msbuild.ps1 b/eng/common/msbuild.ps1 new file mode 100644 index 00000000000..b37fd3d5e97 --- /dev/null +++ b/eng/common/msbuild.ps1 @@ -0,0 +1,27 @@ +[CmdletBinding(PositionalBinding=$false)] +Param( + [string] $verbosity = "minimal", + [bool] $warnAsError = $true, + [bool] $nodeReuse = $true, + [switch] $ci, + [switch] $prepareMachine, + [Parameter(ValueFromRemainingArguments=$true)][String[]]$extraArgs +) + +. $PSScriptRoot\tools.ps1 + +try { + if ($ci) { + $nodeReuse = $false + } + + MSBuild @extraArgs +} +catch { + Write-Host $_ + Write-Host $_.Exception + Write-Host $_.ScriptStackTrace + ExitWithExitCode 1 +} + +ExitWithExitCode 0 \ No newline at end of file diff --git a/eng/common/msbuild.sh b/eng/common/msbuild.sh new file mode 100755 index 00000000000..8160cd5a59d --- /dev/null +++ b/eng/common/msbuild.sh @@ -0,0 +1,58 @@ +#!/usr/bin/env bash + +source="${BASH_SOURCE[0]}" + +# resolve $source until the file is no longer a symlink +while [[ -h "$source" ]]; do + scriptroot="$( cd -P "$( dirname "$source" )" && pwd )" + source="$(readlink "$source")" + # if $source was a relative symlink, we need to resolve it relative to the path where the + # symlink file was located + [[ $source != /* ]] && source="$scriptroot/$source" +done +scriptroot="$( cd -P "$( dirname "$source" )" && pwd )" + +verbosity='minimal' +warn_as_error=true +node_reuse=true +prepare_machine=false +extra_args='' + +while (($# > 0)); do + lowerI="$(echo $1 | awk '{print tolower($0)}')" + case $lowerI in + --verbosity) + verbosity=$2 + shift 2 + ;; + --warnaserror) + warn_as_error=$2 + shift 2 + ;; + --nodereuse) + node_reuse=$2 + shift 2 + ;; + --ci) + ci=true + shift 1 + ;; + --preparemachine) + prepare_machine=true + shift 1 + ;; + *) + extra_args="$extra_args $1" + shift 1 + ;; + esac +done + +. "$scriptroot/tools.sh" + +if [[ "$ci" == true ]]; then + node_reuse=false +fi + +MSBuild $extra_args +ExitWithExitCode 0 diff --git a/eng/common/native/CommonLibrary.psm1 b/eng/common/native/CommonLibrary.psm1 new file mode 100644 index 00000000000..f286ae0cde2 --- /dev/null +++ b/eng/common/native/CommonLibrary.psm1 @@ -0,0 +1,358 @@ +<# +.SYNOPSIS +Helper module to install an archive to a directory + +.DESCRIPTION +Helper module to download and extract an archive to a specified directory + +.PARAMETER Uri +Uri of artifact to download + +.PARAMETER InstallDirectory +Directory to extract artifact contents to + +.PARAMETER Force +Force download / extraction if file or contents already exist. Default = False + +.PARAMETER DownloadRetries +Total number of retry attempts. Default = 5 + +.PARAMETER RetryWaitTimeInSeconds +Wait time between retry attempts in seconds. Default = 30 + +.NOTES +Returns False if download or extraction fail, True otherwise +#> +function DownloadAndExtract { + [CmdletBinding(PositionalBinding=$false)] + Param ( + [Parameter(Mandatory=$True)] + [string] $Uri, + [Parameter(Mandatory=$True)] + [string] $InstallDirectory, + [switch] $Force = $False, + [int] $DownloadRetries = 5, + [int] $RetryWaitTimeInSeconds = 30 + ) + # Define verbose switch if undefined + $Verbose = $VerbosePreference -Eq "Continue" + + $TempToolPath = CommonLibrary\Get-TempPathFilename -Path $Uri + + # Download native tool + $DownloadStatus = CommonLibrary\Get-File -Uri $Uri ` + -Path $TempToolPath ` + -DownloadRetries $DownloadRetries ` + -RetryWaitTimeInSeconds $RetryWaitTimeInSeconds ` + -Force:$Force ` + -Verbose:$Verbose + + if ($DownloadStatus -Eq $False) { + Write-Error "Download failed" + return $False + } + + # Extract native tool + $UnzipStatus = CommonLibrary\Expand-Zip -ZipPath $TempToolPath ` + -OutputDirectory $InstallDirectory ` + -Force:$Force ` + -Verbose:$Verbose + + if ($UnzipStatus -Eq $False) { + Write-Error "Unzip failed" + return $False + } + return $True +} + +<# +.SYNOPSIS +Download a file, retry on failure + +.DESCRIPTION +Download specified file and retry if attempt fails + +.PARAMETER Uri +Uri of file to download. If Uri is a local path, the file will be copied instead of downloaded + +.PARAMETER Path +Path to download or copy uri file to + +.PARAMETER Force +Overwrite existing file if present. Default = False + +.PARAMETER DownloadRetries +Total number of retry attempts. Default = 5 + +.PARAMETER RetryWaitTimeInSeconds +Wait time between retry attempts in seconds Default = 30 + +#> +function Get-File { + [CmdletBinding(PositionalBinding=$false)] + Param ( + [Parameter(Mandatory=$True)] + [string] $Uri, + [Parameter(Mandatory=$True)] + [string] $Path, + [int] $DownloadRetries = 5, + [int] $RetryWaitTimeInSeconds = 30, + [switch] $Force = $False + ) + $Attempt = 0 + + if ($Force) { + if (Test-Path $Path) { + Remove-Item $Path -Force + } + } + if (Test-Path $Path) { + Write-Host "File '$Path' already exists, skipping download" + return $True + } + + $DownloadDirectory = Split-Path -ErrorAction Ignore -Path "$Path" -Parent + if (-Not (Test-Path $DownloadDirectory)) { + New-Item -path $DownloadDirectory -force -itemType "Directory" | Out-Null + } + + if (Test-Path -IsValid -Path $Uri) { + Write-Verbose "'$Uri' is a file path, copying file to '$Path'" + Copy-Item -Path $Uri -Destination $Path + return $? + } + else { + Write-Verbose "Downloading $Uri" + while($Attempt -Lt $DownloadRetries) + { + try { + Invoke-WebRequest -UseBasicParsing -Uri $Uri -OutFile $Path + Write-Verbose "Downloaded to '$Path'" + return $True + } + catch { + $Attempt++ + if ($Attempt -Lt $DownloadRetries) { + $AttemptsLeft = $DownloadRetries - $Attempt + Write-Warning "Download failed, $AttemptsLeft attempts remaining, will retry in $RetryWaitTimeInSeconds seconds" + Start-Sleep -Seconds $RetryWaitTimeInSeconds + } + else { + Write-Error $_ + Write-Error $_.Exception + } + } + } + } + + return $False +} + +<# +.SYNOPSIS +Generate a shim for a native tool + +.DESCRIPTION +Creates a wrapper script (shim) that passes arguments forward to native tool assembly + +.PARAMETER ShimName +The name of the shim + +.PARAMETER ShimDirectory +The directory where shims are stored + +.PARAMETER ToolFilePath +Path to file that shim forwards to + +.PARAMETER Force +Replace shim if already present. Default = False + +.NOTES +Returns $True if generating shim succeeds, $False otherwise +#> +function New-ScriptShim { + [CmdletBinding(PositionalBinding=$false)] + Param ( + [Parameter(Mandatory=$True)] + [string] $ShimName, + [Parameter(Mandatory=$True)] + [string] $ShimDirectory, + [Parameter(Mandatory=$True)] + [string] $ToolFilePath, + [Parameter(Mandatory=$True)] + [string] $BaseUri, + [switch] $Force + ) + try { + Write-Verbose "Generating '$ShimName' shim" + + if (-Not (Test-Path $ToolFilePath)){ + Write-Error "Specified tool file path '$ToolFilePath' does not exist" + return $False + } + + # WinShimmer is a small .NET Framework program that creates .exe shims to bootstrapped programs + # Many of the checks for installed programs expect a .exe extension for Windows tools, rather + # than a .bat or .cmd file. + # Source: https://github.com/dotnet/arcade/tree/master/src/WinShimmer + if (-Not (Test-Path "$ShimDirectory\WinShimmer\winshimmer.exe")) { + $InstallStatus = DownloadAndExtract -Uri "$BaseUri/windows/winshimmer/WinShimmer.zip" ` + -InstallDirectory $ShimDirectory\WinShimmer ` + -Force:$Force ` + -DownloadRetries 2 ` + -RetryWaitTimeInSeconds 5 ` + -Verbose:$Verbose + } + + if ((Test-Path (Join-Path $ShimDirectory "$ShimName.exe"))) { + Write-Host "$ShimName.exe already exists; replacing..." + Remove-Item (Join-Path $ShimDirectory "$ShimName.exe") + } + + Invoke-Expression "$ShimDirectory\WinShimmer\winshimmer.exe $ShimName $ToolFilePath $ShimDirectory" + return $True + } + catch { + Write-Host $_ + Write-Host $_.Exception + return $False + } +} + +<# +.SYNOPSIS +Returns the machine architecture of the host machine + +.NOTES +Returns 'x64' on 64 bit machines + Returns 'x86' on 32 bit machines +#> +function Get-MachineArchitecture { + $ProcessorArchitecture = $Env:PROCESSOR_ARCHITECTURE + $ProcessorArchitectureW6432 = $Env:PROCESSOR_ARCHITEW6432 + if($ProcessorArchitecture -Eq "X86") + { + if(($ProcessorArchitectureW6432 -Eq "") -Or + ($ProcessorArchitectureW6432 -Eq "X86")) { + return "x86" + } + $ProcessorArchitecture = $ProcessorArchitectureW6432 + } + if (($ProcessorArchitecture -Eq "AMD64") -Or + ($ProcessorArchitecture -Eq "IA64") -Or + ($ProcessorArchitecture -Eq "ARM64")) { + return "x64" + } + return "x86" +} + +<# +.SYNOPSIS +Get the name of a temporary folder under the native install directory +#> +function Get-TempDirectory { + return Join-Path (Get-NativeInstallDirectory) "temp/" +} + +function Get-TempPathFilename { + [CmdletBinding(PositionalBinding=$false)] + Param ( + [Parameter(Mandatory=$True)] + [string] $Path + ) + $TempDir = CommonLibrary\Get-TempDirectory + $TempFilename = Split-Path $Path -leaf + $TempPath = Join-Path $TempDir $TempFilename + return $TempPath +} + +<# +.SYNOPSIS +Returns the base directory to use for native tool installation + +.NOTES +Returns the value of the NETCOREENG_INSTALL_DIRECTORY if that environment variable +is set, or otherwise returns an install directory under the %USERPROFILE% +#> +function Get-NativeInstallDirectory { + $InstallDir = $Env:NETCOREENG_INSTALL_DIRECTORY + if (!$InstallDir) { + $InstallDir = Join-Path $Env:USERPROFILE ".netcoreeng/native/" + } + return $InstallDir +} + +<# +.SYNOPSIS +Unzip an archive + +.DESCRIPTION +Powershell module to unzip an archive to a specified directory + +.PARAMETER ZipPath (Required) +Path to archive to unzip + +.PARAMETER OutputDirectory (Required) +Output directory for archive contents + +.PARAMETER Force +Overwrite output directory contents if they already exist + +.NOTES +- Returns True and does not perform an extraction if output directory already exists but Overwrite is not True. +- Returns True if unzip operation is successful +- Returns False if Overwrite is True and it is unable to remove contents of OutputDirectory +- Returns False if unable to extract zip archive +#> +function Expand-Zip { + [CmdletBinding(PositionalBinding=$false)] + Param ( + [Parameter(Mandatory=$True)] + [string] $ZipPath, + [Parameter(Mandatory=$True)] + [string] $OutputDirectory, + [switch] $Force + ) + + Write-Verbose "Extracting '$ZipPath' to '$OutputDirectory'" + try { + if ((Test-Path $OutputDirectory) -And (-Not $Force)) { + Write-Host "Directory '$OutputDirectory' already exists, skipping extract" + return $True + } + if (Test-Path $OutputDirectory) { + Write-Verbose "'Force' is 'True', but '$OutputDirectory' exists, removing directory" + Remove-Item $OutputDirectory -Force -Recurse + if ($? -Eq $False) { + Write-Error "Unable to remove '$OutputDirectory'" + return $False + } + } + if (-Not (Test-Path $OutputDirectory)) { + New-Item -path $OutputDirectory -Force -itemType "Directory" | Out-Null + } + + Add-Type -assembly "system.io.compression.filesystem" + [io.compression.zipfile]::ExtractToDirectory("$ZipPath", "$OutputDirectory") + if ($? -Eq $False) { + Write-Error "Unable to extract '$ZipPath'" + return $False + } + } + catch { + Write-Host $_ + Write-Host $_.Exception + + return $False + } + return $True +} + +export-modulemember -function DownloadAndExtract +export-modulemember -function Expand-Zip +export-modulemember -function Get-File +export-modulemember -function Get-MachineArchitecture +export-modulemember -function Get-NativeInstallDirectory +export-modulemember -function Get-TempDirectory +export-modulemember -function Get-TempPathFilename +export-modulemember -function New-ScriptShim diff --git a/eng/common/native/common-library.sh b/eng/common/native/common-library.sh new file mode 100755 index 00000000000..271bddfac5a --- /dev/null +++ b/eng/common/native/common-library.sh @@ -0,0 +1,168 @@ +#!/usr/bin/env bash + +function GetNativeInstallDirectory { + local install_dir + + if [[ -z $NETCOREENG_INSTALL_DIRECTORY ]]; then + install_dir=$HOME/.netcoreeng/native/ + else + install_dir=$NETCOREENG_INSTALL_DIRECTORY + fi + + echo $install_dir + return 0 +} + +function GetTempDirectory { + + echo $(GetNativeInstallDirectory)temp/ + return 0 +} + +function ExpandZip { + local zip_path=$1 + local output_directory=$2 + local force=${3:-false} + + echo "Extracting $zip_path to $output_directory" + if [[ -d $output_directory ]] && [[ $force = false ]]; then + echo "Directory '$output_directory' already exists, skipping extract" + return 0 + fi + + if [[ -d $output_directory ]]; then + echo "'Force flag enabled, but '$output_directory' exists. Removing directory" + rm -rf $output_directory + if [[ $? != 0 ]]; then + echo Unable to remove '$output_directory'>&2 + return 1 + fi + fi + + echo "Creating directory: '$output_directory'" + mkdir -p $output_directory + + echo "Extracting archive" + tar -xf $zip_path -C $output_directory + if [[ $? != 0 ]]; then + echo "Unable to extract '$zip_path'" >&2 + return 1 + fi + + return 0 +} + +function GetCurrentOS { + local unameOut="$(uname -s)" + case $unameOut in + Linux*) echo "Linux";; + Darwin*) echo "MacOS";; + esac + return 0 +} + +function GetFile { + local uri=$1 + local path=$2 + local force=${3:-false} + local download_retries=${4:-5} + local retry_wait_time_seconds=${5:-30} + + if [[ -f $path ]]; then + if [[ $force = false ]]; then + echo "File '$path' already exists. Skipping download" + return 0 + else + rm -rf $path + fi + fi + + if [[ -f $uri ]]; then + echo "'$uri' is a file path, copying file to '$path'" + cp $uri $path + return $? + fi + + echo "Downloading $uri" + # Use curl if available, otherwise use wget + if command -v curl > /dev/null; then + curl "$uri" -sSL --retry $download_retries --retry-delay $retry_wait_time_seconds --create-dirs -o "$path" --fail + else + wget -q -O "$path" "$uri" --tries="$download_retries" + fi + + return $? +} + +function GetTempPathFileName { + local path=$1 + + local temp_dir=$(GetTempDirectory) + local temp_file_name=$(basename $path) + echo $temp_dir$temp_file_name + return 0 +} + +function DownloadAndExtract { + local uri=$1 + local installDir=$2 + local force=${3:-false} + local download_retries=${4:-5} + local retry_wait_time_seconds=${5:-30} + + local temp_tool_path=$(GetTempPathFileName $uri) + + echo "downloading to: $temp_tool_path" + + # Download file + GetFile "$uri" "$temp_tool_path" $force $download_retries $retry_wait_time_seconds + if [[ $? != 0 ]]; then + echo "Failed to download '$uri' to '$temp_tool_path'." >&2 + return 1 + fi + + # Extract File + echo "extracting from $temp_tool_path to $installDir" + ExpandZip "$temp_tool_path" "$installDir" $force $download_retries $retry_wait_time_seconds + if [[ $? != 0 ]]; then + echo "Failed to extract '$temp_tool_path' to '$installDir'." >&2 + return 1 + fi + + return 0 +} + +function NewScriptShim { + local shimpath=$1 + local tool_file_path=$2 + local force=${3:-false} + + echo "Generating '$shimpath' shim" + if [[ -f $shimpath ]]; then + if [[ $force = false ]]; then + echo "File '$shimpath' already exists." >&2 + return 1 + else + rm -rf $shimpath + fi + fi + + if [[ ! -f $tool_file_path ]]; then + echo "Specified tool file path:'$tool_file_path' does not exist" >&2 + return 1 + fi + + local shim_contents=$'#!/usr/bin/env bash\n' + shim_contents+="SHIMARGS="$'$1\n' + shim_contents+="$tool_file_path"$' $SHIMARGS\n' + + # Write shim file + echo "$shim_contents" > $shimpath + + chmod +x $shimpath + + echo "Finished generating shim '$shimpath'" + + return $? +} + diff --git a/eng/common/native/install-cmake.sh b/eng/common/native/install-cmake.sh new file mode 100755 index 00000000000..293af6017df --- /dev/null +++ b/eng/common/native/install-cmake.sh @@ -0,0 +1,117 @@ +#!/usr/bin/env bash + +source="${BASH_SOURCE[0]}" +scriptroot="$( cd -P "$( dirname "$source" )" && pwd )" + +. $scriptroot/common-library.sh + +base_uri= +install_path= +version= +clean=false +force=false +download_retries=5 +retry_wait_time_seconds=30 + +while (($# > 0)); do + lowerI="$(echo $1 | awk '{print tolower($0)}')" + case $lowerI in + --baseuri) + base_uri=$2 + shift 2 + ;; + --installpath) + install_path=$2 + shift 2 + ;; + --version) + version=$2 + shift 2 + ;; + --clean) + clean=true + shift 1 + ;; + --force) + force=true + shift 1 + ;; + --downloadretries) + download_retries=$2 + shift 2 + ;; + --retrywaittimeseconds) + retry_wait_time_seconds=$2 + shift 2 + ;; + --help) + echo "Common settings:" + echo " --baseuri Base file directory or Url wrom which to acquire tool archives" + echo " --installpath Base directory to install native tool to" + echo " --clean Don't install the tool, just clean up the current install of the tool" + echo " --force Force install of tools even if they previously exist" + echo " --help Print help and exit" + echo "" + echo "Advanced settings:" + echo " --downloadretries Total number of retry attempts" + echo " --retrywaittimeseconds Wait time between retry attempts in seconds" + echo "" + exit 0 + ;; + esac +done + +tool_name="cmake" +tool_os=$(GetCurrentOS) +tool_folder=$(echo $tool_os | awk '{print tolower($0)}') +tool_arch="x86_64" +tool_name_moniker="$tool_name-$version-$tool_os-$tool_arch" +tool_install_directory="$install_path/$tool_name/$version" +tool_file_path="$tool_install_directory/$tool_name_moniker/bin/$tool_name" +shim_path="$install_path/$tool_name.sh" +uri="${base_uri}/$tool_folder/cmake/$tool_name_moniker.tar.gz" + +# Clean up tool and installers +if [[ $clean = true ]]; then + echo "Cleaning $tool_install_directory" + if [[ -d $tool_install_directory ]]; then + rm -rf $tool_install_directory + fi + + echo "Cleaning $shim_path" + if [[ -f $shim_path ]]; then + rm -rf $shim_path + fi + + tool_temp_path=$(GetTempPathFileName $uri) + echo "Cleaning $tool_temp_path" + if [[ -f $tool_temp_path ]]; then + rm -rf $tool_temp_path + fi + + exit 0 +fi + +# Install tool +if [[ -f $tool_file_path ]] && [[ $force = false ]]; then + echo "$tool_name ($version) already exists, skipping install" + exit 0 +fi + +DownloadAndExtract $uri $tool_install_directory $force $download_retries $retry_wait_time_seconds + +if [[ $? != 0 ]]; then + echo "Installation failed" >&2 + exit 1 +fi + +# Generate Shim +# Always rewrite shims so that we are referencing the expected version +NewScriptShim $shim_path $tool_file_path true + +if [[ $? != 0 ]]; then + echo "Shim generation failed" >&2 + exit 1 +fi + +exit 0 \ No newline at end of file diff --git a/eng/common/native/install-tool.ps1 b/eng/common/native/install-tool.ps1 new file mode 100644 index 00000000000..635ab3fd414 --- /dev/null +++ b/eng/common/native/install-tool.ps1 @@ -0,0 +1,130 @@ +<# +.SYNOPSIS +Install native tool + +.DESCRIPTION +Install cmake native tool from Azure blob storage + +.PARAMETER InstallPath +Base directory to install native tool to + +.PARAMETER BaseUri +Base file directory or Url from which to acquire tool archives + +.PARAMETER CommonLibraryDirectory +Path to folder containing common library modules + +.PARAMETER Force +Force install of tools even if they previously exist + +.PARAMETER Clean +Don't install the tool, just clean up the current install of the tool + +.PARAMETER DownloadRetries +Total number of retry attempts + +.PARAMETER RetryWaitTimeInSeconds +Wait time between retry attempts in seconds + +.NOTES +Returns 0 if install succeeds, 1 otherwise +#> +[CmdletBinding(PositionalBinding=$false)] +Param ( + [Parameter(Mandatory=$True)] + [string] $ToolName, + [Parameter(Mandatory=$True)] + [string] $InstallPath, + [Parameter(Mandatory=$True)] + [string] $BaseUri, + [Parameter(Mandatory=$True)] + [string] $Version, + [string] $CommonLibraryDirectory = $PSScriptRoot, + [switch] $Force = $False, + [switch] $Clean = $False, + [int] $DownloadRetries = 5, + [int] $RetryWaitTimeInSeconds = 30 +) + +# Import common library modules +Import-Module -Name (Join-Path $CommonLibraryDirectory "CommonLibrary.psm1") + +try { + # Define verbose switch if undefined + $Verbose = $VerbosePreference -Eq "Continue" + + $Arch = CommonLibrary\Get-MachineArchitecture + $ToolOs = "win64" + if($Arch -Eq "x32") { + $ToolOs = "win32" + } + $ToolNameMoniker = "$ToolName-$Version-$ToolOs-$Arch" + $ToolInstallDirectory = Join-Path $InstallPath "$ToolName\$Version\" + $Uri = "$BaseUri/windows/$ToolName/$ToolNameMoniker.zip" + $ShimPath = Join-Path $InstallPath "$ToolName.exe" + + if ($Clean) { + Write-Host "Cleaning $ToolInstallDirectory" + if (Test-Path $ToolInstallDirectory) { + Remove-Item $ToolInstallDirectory -Force -Recurse + } + Write-Host "Cleaning $ShimPath" + if (Test-Path $ShimPath) { + Remove-Item $ShimPath -Force + } + $ToolTempPath = CommonLibrary\Get-TempPathFilename -Path $Uri + Write-Host "Cleaning $ToolTempPath" + if (Test-Path $ToolTempPath) { + Remove-Item $ToolTempPath -Force + } + exit 0 + } + + # Install tool + if ((Test-Path $ToolInstallDirectory) -And (-Not $Force)) { + Write-Verbose "$ToolName ($Version) already exists, skipping install" + } + else { + $InstallStatus = CommonLibrary\DownloadAndExtract -Uri $Uri ` + -InstallDirectory $ToolInstallDirectory ` + -Force:$Force ` + -DownloadRetries $DownloadRetries ` + -RetryWaitTimeInSeconds $RetryWaitTimeInSeconds ` + -Verbose:$Verbose + + if ($InstallStatus -Eq $False) { + Write-Error "Installation failed" + exit 1 + } + } + + $ToolFilePath = Get-ChildItem $ToolInstallDirectory -Recurse -Filter "$ToolName.exe" | % { $_.FullName } + if (@($ToolFilePath).Length -Gt 1) { + Write-Error "There are multiple copies of $ToolName in $($ToolInstallDirectory): `n$(@($ToolFilePath | out-string))" + exit 1 + } elseif (@($ToolFilePath).Length -Lt 1) { + Write-Error "$ToolName was not found in $ToolFilePath." + exit 1 + } + + # Generate shim + # Always rewrite shims so that we are referencing the expected version + $GenerateShimStatus = CommonLibrary\New-ScriptShim -ShimName $ToolName ` + -ShimDirectory $InstallPath ` + -ToolFilePath "$ToolFilePath" ` + -BaseUri $BaseUri ` + -Force:$Force ` + -Verbose:$Verbose + + if ($GenerateShimStatus -Eq $False) { + Write-Error "Generate shim failed" + return 1 + } + + exit 0 +} +catch { + Write-Host $_ + Write-Host $_.Exception + exit 1 +} diff --git a/eng/common/sdk-task.ps1 b/eng/common/sdk-task.ps1 new file mode 100644 index 00000000000..9ba7530122f --- /dev/null +++ b/eng/common/sdk-task.ps1 @@ -0,0 +1,74 @@ +[CmdletBinding(PositionalBinding=$false)] +Param( + [string] $projects = "", + [string][Alias('v')]$verbosity = "minimal", + [string] $msbuildEngine = $null, + [bool] $warnAsError = $true, + [switch][Alias('bl')]$binaryLog, + [switch][Alias('r')]$restore, + [switch] $ci, + [switch] $prepareMachine, + [switch] $help, + [Parameter(ValueFromRemainingArguments=$true)][String[]]$properties +) + +. $PSScriptRoot\tools.ps1 + +function Print-Usage() { + Write-Host "Common settings:" + Write-Host " -v[erbosity] Msbuild verbosity: q[uiet], m[inimal], n[ormal], d[etailed], and diag[nostic]" + Write-Host " -[bl|binaryLog] Output binary log (short: -bl)" + Write-Host " -help Print help and exit" + Write-Host "" + + Write-Host "Advanced settings:" + Write-Host " -restore Restore dependencies (short: -r)" + Write-Host " -projects Semi-colon delimited list of sln/proj's from the Arcade sdk to build. Globbing is supported (*.sln)" + Write-Host " -ci Set when running on CI server" + Write-Host " -prepareMachine Prepare machine for CI run" + Write-Host " -msbuildEngine Msbuild engine to use to run build ('dotnet', 'vs', or unspecified)." + Write-Host "" + Write-Host "Command line arguments not listed above are passed thru to msbuild." + Write-Host "The above arguments can be shortened as much as to be unambiguous (e.g. -co for configuration, -t for test, etc.)." +} + +function Build { + $toolsetBuildProj = InitializeToolset + + $toolsetBuildProj = Join-Path (Split-Path $toolsetBuildProj -Parent) "SdkTasks\SdkTask.proj" + $bl = if ($binaryLog) { "/bl:" + (Join-Path $LogDir "SdkTask.binlog") } else { "" } + MSBuild $toolsetBuildProj ` + $bl ` + /p:Projects=$projects ` + /p:Restore=$restore ` + /p:RepoRoot=$RepoRoot ` + /p:ContinuousIntegrationBuild=$ci ` + @properties +} + +try { + if ($help -or (($null -ne $properties) -and ($properties.Contains("/help") -or $properties.Contains("/?")))) { + Print-Usage + exit 0 + } + + if ($projects -eq "") { + Write-Error "Missing required parameter '-projects '" + Print-Usage + ExitWithExitCode 1 + } + + if ($ci) { + $binaryLog = $true + } + + Build +} +catch { + Write-Host $_ + Write-Host $_.Exception + Write-Host $_.ScriptStackTrace + ExitWithExitCode 1 +} + +ExitWithExitCode 0 diff --git a/eng/common/templates/job/job.yml b/eng/common/templates/job/job.yml new file mode 100644 index 00000000000..5e293db35d7 --- /dev/null +++ b/eng/common/templates/job/job.yml @@ -0,0 +1,205 @@ +parameters: +# Job schema parameters - https://docs.microsoft.com/en-us/azure/devops/pipelines/yaml-schema?view=vsts&tabs=schema#job + cancelTimeoutInMinutes: '' + + condition: '' + + continueOnError: false + + container: '' + + dependsOn: '' + + displayName: '' + + steps: [] + + pool: '' + + strategy: '' + + timeoutInMinutes: '' + + variables: [] + + workspace: '' + +# Job base template specific parameters + # Optional: Enable installing Microbuild plugin + # if 'true', these "variables" must be specified in the variables object or as part of the queue matrix + # _TeamName - the name of your team + # _SignType - 'test' or 'real' + enableMicrobuild: false + + # Optional: Include PublishBuildArtifacts task + enablePublishBuildArtifacts: false + + # Optional: Enable publishing to the build asset registry + enablePublishBuildAssets: false + + # Optional: Include PublishTestResults task + enablePublishTestResults: false + + # Optional: enable sending telemetry + # if 'true', these "variables" must be specified in the variables object or as part of the queue matrix + # _HelixBuildConfig - differentiate between Debug, Release, other + # _HelixType - Example: build/product/ + # _HelixSource - Example: official/dotnet/arcade/$(Build.SourceBranch) + enableTelemetry: false + + # Optional: If specified, then automatically derive "_HelixSource" variable for telemetry + helixRepo: '' + + # Optional: Define the type for helix telemetry (must end in '/') + helixType: build/product/ + + # Required: name of the job + name: '' + + # Optional: should run as a public build even in the internal project + # if 'true', the build won't run any of the internal only steps, even if it is running in non-public projects. + runAsPublic: false + +# Internal resources (telemetry, microbuild) can only be accessed from non-public projects, +# and some (Microbuild) should only be applied to non-PR cases for internal builds. + +jobs: +- job: ${{ parameters.name }} + + ${{ if ne(parameters.cancelTimeoutInMinutes, '') }}: + cancelTimeoutInMinutes: ${{ parameters.cancelTimeoutInMinutes }} + + ${{ if ne(parameters.condition, '') }}: + condition: ${{ parameters.condition }} + + ${{ if ne(parameters.container, '') }}: + container: ${{ parameters.container }} + + ${{ if ne(parameters.continueOnError, '') }}: + continueOnError: ${{ parameters.continueOnError }} + + ${{ if ne(parameters.dependsOn, '') }}: + dependsOn: ${{ parameters.dependsOn }} + + ${{ if ne(parameters.displayName, '') }}: + displayName: ${{ parameters.displayName }} + + ${{ if ne(parameters.pool, '') }}: + pool: ${{ parameters.pool }} + + ${{ if ne(parameters.strategy, '') }}: + strategy: ${{ parameters.strategy }} + + ${{ if ne(parameters.timeoutInMinutes, '') }}: + timeoutInMinutes: ${{ parameters.timeoutInMinutes }} + + variables: + - ${{ each variable in parameters.variables }}: + # handle name-value variable syntax + # example: + # - name: [key] + # value: [value] + - ${{ if ne(variable.name, '') }}: + - name: ${{ variable.name }} + value: ${{ variable.value }} + + # handle variable groups + - ${{ if ne(variable.group, '') }}: + - group: ${{ variable.group }} + + # handle key-value variable syntax. + # example: + # - [key]: [value] + - ${{ if and(eq(variable.name, ''), eq(variable.group, '')) }}: + - ${{ each pair in variable }}: + - name: ${{ pair.key }} + value: ${{ pair.value }} + + # Add additional variables + - ${{ if and(ne(parameters.helixRepo, ''), eq(parameters.runAsPublic, 'false'), ne(variables['System.TeamProject'], 'public'), notIn(variables['Build.Reason'], 'PullRequest')) }}: + - name: _HelixSource + value: official/${{ parameters.helixRepo }}/$(Build.SourceBranch) + - ${{ if and(ne(parameters.helixRepo, ''), or(ne(parameters.runAsPublic, 'false'), eq(variables['System.TeamProject'], 'public'), in(variables['Build.Reason'], 'PullRequest'))) }}: + - name: _HelixSource + value: pr/${{ parameters.helixRepo }}/$(Build.SourceBranch) + - name: _HelixType + value: ${{ parameters.helixType }} + - name: _HelixBuildConfig + value: $(_BuildConfig) + + ${{ if ne(parameters.workspace, '') }}: + workspace: ${{ parameters.workspace }} + + steps: + - ${{ if eq(parameters.enableTelemetry, 'true') }}: + - template: /eng/common/templates/steps/telemetry-start.yml + parameters: + buildConfig: $(_HelixBuildConfig) + helixSource: $(_HelixSource) + helixType: $(_HelixType) + runAsPublic: ${{ parameters.runAsPublic }} + + - ${{ if eq(parameters.enableMicrobuild, 'true') }}: + - ${{ if and(eq(parameters.runAsPublic, 'false'), ne(variables['System.TeamProject'], 'public'), notin(variables['Build.Reason'], 'PullRequest')) }}: + - task: MicroBuildSigningPlugin@2 + displayName: Install MicroBuild plugin + inputs: + signType: $(_SignType) + zipSources: false + feedSource: https://dnceng.pkgs.visualstudio.com/_packaging/MicroBuildToolset/nuget/v3/index.json + env: + TeamName: $(_TeamName) + continueOnError: ${{ parameters.continueOnError }} + condition: and(succeeded(), in(variables['_SignType'], 'real', 'test'), eq(variables['Agent.Os'], 'Windows_NT')) + + - ${{ each step in parameters.steps }}: + - ${{ step }} + + - ${{ if eq(parameters.enableMicrobuild, 'true') }}: + - ${{ if and(eq(parameters.runAsPublic, 'false'), ne(variables['System.TeamProject'], 'public'), notin(variables['Build.Reason'], 'PullRequest')) }}: + - task: MicroBuildCleanup@1 + displayName: Execute Microbuild cleanup tasks + condition: and(always(), in(variables['_SignType'], 'real', 'test'), eq(variables['Agent.Os'], 'Windows_NT')) + continueOnError: ${{ parameters.continueOnError }} + env: + TeamName: $(_TeamName) + + - ${{ if eq(parameters.enableTelemetry, 'true') }}: + - template: /eng/common/templates/steps/telemetry-end.yml + + - ${{ if eq(parameters.enablePublishBuildArtifacts, 'true') }}: + - task: PublishBuildArtifacts@1 + displayName: Publish Logs to VSTS + inputs: + PathtoPublish: '$(Build.SourcesDirectory)/artifacts/log/$(_BuildConfig)' + PublishLocation: Container + ArtifactName: $(Agent.Os)_$(Agent.JobName) + continueOnError: true + condition: always() + + - ${{ if eq(parameters.enablePublishTestResults, 'true') }}: + - task: PublishTestResults@2 + displayName: Publish Test Results + inputs: + testResultsFormat: 'xUnit' + testResultsFiles: '*.xml' + searchFolder: '$(Build.SourcesDirectory)/artifacts/TestResults/$(_BuildConfig)' + continueOnError: true + condition: always() + + - ${{ if and(eq(parameters.enablePublishBuildAssets, true), eq(parameters.runAsPublic, 'false'), ne(variables['System.TeamProject'], 'public'), notin(variables['Build.Reason'], 'PullRequest')) }}: + - task: CopyFiles@2 + displayName: Gather Asset Manifests + inputs: + SourceFolder: '$(Build.SourcesDirectory)/artifacts/log/$(_BuildConfig)/AssetManifest' + TargetFolder: '$(Build.StagingDirectory)/AssetManifests' + continueOnError: ${{ parameters.continueOnError }} + condition: and(succeeded(), eq(variables['_DotNetPublishToBlobFeed'], 'true')) + - task: PublishBuildArtifacts@1 + displayName: Push Asset Manifests + inputs: + PathtoPublish: '$(Build.StagingDirectory)/AssetManifests' + PublishLocation: Container + ArtifactName: AssetManifests + continueOnError: ${{ parameters.continueOnError }} + condition: and(succeeded(), eq(variables['_DotNetPublishToBlobFeed'], 'true')) \ No newline at end of file diff --git a/eng/common/templates/job/publish-build-assets.yml b/eng/common/templates/job/publish-build-assets.yml new file mode 100644 index 00000000000..c094658fefc --- /dev/null +++ b/eng/common/templates/job/publish-build-assets.yml @@ -0,0 +1,63 @@ +parameters: + configuration: 'Debug' + + # Optional: condition for the job to run + condition: '' + + # Optional: 'true' if future jobs should run even if this job fails + continueOnError: false + + # Optional: dependencies of the job + dependsOn: '' + + # Optional: Include PublishBuildArtifacts task + enablePublishBuildArtifacts: false + + # Optional: A defined YAML pool - https://docs.microsoft.com/en-us/azure/devops/pipelines/yaml-schema?view=vsts&tabs=schema#pool + pool: {} + + # Optional: should run as a public build even in the internal project + # if 'true', the build won't run any of the internal only steps, even if it is running in non-public projects. + runAsPublic: false + +jobs: +- job: Asset_Registry_Publish + + dependsOn: ${{ parameters.dependsOn }} + + displayName: Publish to Build Asset Registry + + pool: ${{ parameters.pool }} + + variables: + - ${{ if and(eq(parameters.runAsPublic, 'false'), ne(variables['System.TeamProject'], 'public'), notin(variables['Build.Reason'], 'PullRequest')) }}: + - name: _BuildConfig + value: ${{ parameters.configuration }} + - group: Publish-Build-Assets + + steps: + - ${{ if and(eq(parameters.runAsPublic, 'false'), ne(variables['System.TeamProject'], 'public'), notin(variables['Build.Reason'], 'PullRequest')) }}: + - task: DownloadBuildArtifacts@0 + displayName: Download artifact + inputs: + artifactName: AssetManifests + downloadPath: '$(Build.StagingDirectory)/Download' + condition: ${{ parameters.condition }} + continueOnError: ${{ parameters.continueOnError }} + - script: eng\common\publishbuildassets.cmd + /p:ManifestsPath='$(Build.StagingDirectory)/Download/AssetManifests' + /p:BuildAssetRegistryToken=$(MaestroAccessToken) + /p:MaestroApiEndpoint=https://maestro-prod.westus2.cloudapp.azure.com + /p:Configuration=$(_BuildConfig) + displayName: Publish Build Assets + condition: ${{ parameters.condition }} + continueOnError: ${{ parameters.continueOnError }} + - ${{ if eq(parameters.enablePublishBuildArtifacts, 'true') }}: + - task: PublishBuildArtifacts@1 + displayName: Publish Logs to VSTS + inputs: + PathtoPublish: '$(Build.SourcesDirectory)/artifacts/log/$(_BuildConfig)' + PublishLocation: Container + ArtifactName: $(Agent.Os)_PublishBuildAssets + continueOnError: true + condition: always() diff --git a/eng/common/templates/jobs/jobs.yml b/eng/common/templates/jobs/jobs.yml new file mode 100644 index 00000000000..c7226b12ed2 --- /dev/null +++ b/eng/common/templates/jobs/jobs.yml @@ -0,0 +1,77 @@ +parameters: + # Optional: 'true' if failures in job.yml job should not fail the job + continueOnError: false + + # Optional: Enable installing Microbuild plugin + # if 'true', these "variables" must be specified in the variables object or as part of the queue matrix + # _TeamName - the name of your team + # _SignType - 'test' or 'real' + enableMicrobuild: false + + # Optional: Include PublishBuildArtifacts task + enablePublishBuildArtifacts: false + + # Optional: Enable publishing to the build asset registry + enablePublishBuildAssets: false + + # Optional: Include PublishTestResults task + enablePublishTestResults: false + + # Optional: enable sending telemetry + # if 'true', these "variables" must be specified in the variables object or as part of the queue matrix + # _HelixBuildConfig - differentiate between Debug, Release, other + # _HelixType - Example: build/product/ + # _HelixSource - Example: official/dotnet/arcade/$(Build.SourceBranch) + enableTelemetry: false + + # Required: A collection of jobs to run - https://docs.microsoft.com/en-us/azure/devops/pipelines/yaml-schema?view=vsts&tabs=schema#job + jobs: [] + + # Optional: If specified, then automatically derive "_HelixSource" variable for telemetry + helixRepo: '' + + # Optional: Define the type for helix telemetry (must end in '/') + helixType: build/product/ + + # Optional: Override automatically derived dependsOn value for "publish build assets" job + publishBuildAssetsDependsOn: '' + + # Optional: should run as a public build even in the internal project + # if 'true', the build won't run any of the internal only steps, even if it is running in non-public projects. + runAsPublic: false + +# Internal resources (telemetry, microbuild) can only be accessed from non-public projects, +# and some (Microbuild) should only be applied to non-PR cases for internal builds. + +jobs: +- ${{ each job in parameters.jobs }}: + - template: ../job/job.yml + parameters: + # pass along parameters + ${{ each parameter in parameters }}: + ${{ if ne(parameter.key, 'jobs') }}: + ${{ parameter.key }}: ${{ parameter.value }} + + # pass along job properties + ${{ each property in job }}: + ${{ if ne(property.key, 'job') }}: + ${{ property.key }}: ${{ property.value }} + + name: ${{ job.job }} + +- ${{ if and(eq(parameters.enablePublishBuildAssets, true), eq(parameters.runAsPublic, 'false'), ne(variables['System.TeamProject'], 'public'), notin(variables['Build.Reason'], 'PullRequest')) }}: + - template: ../job/publish-build-assets.yml + parameters: + continueOnError: ${{ parameters.continueOnError }} + dependsOn: + - ${{ if ne(parameters.publishBuildAssetsDependsOn, '') }}: + - ${{ each job in parameters.publishBuildAssetsDependsOn }}: + - ${{ job.job }} + - ${{ if eq(parameters.publishBuildAssetsDependsOn, '') }}: + - ${{ each job in parameters.jobs }}: + - ${{ job.job }} + pool: + vmImage: vs2017-win2016 + runAsPublic: ${{ parameters.runAsPublic }} + enablePublishBuildArtifacts: ${{ parameters.enablePublishBuildArtifacts }} + diff --git a/eng/common/templates/phases/base.yml b/eng/common/templates/phases/base.yml new file mode 100644 index 00000000000..0123cf43b16 --- /dev/null +++ b/eng/common/templates/phases/base.yml @@ -0,0 +1,130 @@ +parameters: + # Optional: Clean sources before building + clean: true + + # Optional: Git fetch depth + fetchDepth: '' + + # Optional: name of the phase (not specifying phase name may cause name collisions) + name: '' + # Optional: display name of the phase + displayName: '' + + # Optional: condition for the job to run + condition: '' + + # Optional: dependencies of the phase + dependsOn: '' + + # Required: A defined YAML queue + queue: {} + + # Required: build steps + steps: [] + + # Optional: variables + variables: {} + + # Optional: should run as a public build even in the internal project + # if 'true', the build won't run any of the internal only steps, even if it is running in non-public projects. + runAsPublic: false + + ## Telemetry variables + + # Optional: enable sending telemetry + # if 'true', these "variables" must be specified in the variables object or as part of the queue matrix + # _HelixBuildConfig - differentiate between Debug, Release, other + # _HelixSource - Example: build/product + # _HelixType - Example: official/dotnet/arcade/$(Build.SourceBranch) + enableTelemetry: false + + # Optional: Enable installing Microbuild plugin + # if 'true', these "variables" must be specified in the variables object or as part of the queue matrix + # _TeamName - the name of your team + # _SignType - 'test' or 'real' + enableMicrobuild: false + +# Internal resources (telemetry, microbuild) can only be accessed from non-public projects, +# and some (Microbuild) should only be applied to non-PR cases for internal builds. + +phases: +- phase: ${{ parameters.name }} + + ${{ if ne(parameters.displayName, '') }}: + displayName: ${{ parameters.displayName }} + + ${{ if ne(parameters.condition, '') }}: + condition: ${{ parameters.condition }} + + ${{ if ne(parameters.dependsOn, '') }}: + dependsOn: ${{ parameters.dependsOn }} + + queue: ${{ parameters.queue }} + + ${{ if ne(parameters.variables, '') }}: + variables: + ${{ insert }}: ${{ parameters.variables }} + + steps: + - checkout: self + clean: ${{ parameters.clean }} + ${{ if ne(parameters.fetchDepth, '') }}: + fetchDepth: ${{ parameters.fetchDepth }} + + - ${{ if eq(parameters.enableTelemetry, 'true') }}: + - template: /eng/common/templates/steps/telemetry-start.yml + parameters: + buildConfig: $(_HelixBuildConfig) + helixSource: $(_HelixSource) + helixType: $(_HelixType) + runAsPublic: ${{ parameters.runAsPublic }} + + - ${{ if eq(parameters.enableMicrobuild, 'true') }}: + # Internal only resource, and Microbuild signing shouldn't be applied to PRs. + - ${{ if and(eq(parameters.runAsPublic, 'false'), ne(variables['System.TeamProject'], 'public'), notin(variables['Build.Reason'], 'PullRequest')) }}: + - task: MicroBuildSigningPlugin@2 + displayName: Install MicroBuild plugin + inputs: + signType: $(_SignType) + zipSources: false + feedSource: https://dnceng.pkgs.visualstudio.com/_packaging/MicroBuildToolset/nuget/v3/index.json + + env: + TeamName: $(_TeamName) + continueOnError: false + condition: and(succeeded(), in(variables['_SignType'], 'real', 'test'), eq(variables['Agent.Os'], 'Windows_NT')) + + # Run provided build steps + - ${{ parameters.steps }} + + - ${{ if eq(parameters.enableMicrobuild, 'true') }}: + # Internal only resources + - ${{ if and(eq(parameters.runAsPublic, 'false'), ne(variables['System.TeamProject'], 'public'), notin(variables['Build.Reason'], 'PullRequest')) }}: + - task: MicroBuildCleanup@1 + displayName: Execute Microbuild cleanup tasks + condition: and(always(), in(variables['_SignType'], 'real', 'test'), eq(variables['Agent.Os'], 'Windows_NT')) + env: + TeamName: $(_TeamName) + + - ${{ if eq(parameters.enableTelemetry, 'true') }}: + - template: /eng/common/templates/steps/telemetry-end.yml + parameters: + helixSource: $(_HelixSource) + helixType: $(_HelixType) + + - ${{ if and(eq(parameters.runAsPublic, 'false'), ne(variables['System.TeamProject'], 'public'), notin(variables['Build.Reason'], 'PullRequest')) }}: + - task: CopyFiles@2 + displayName: Gather Asset Manifests + inputs: + SourceFolder: '$(Build.SourcesDirectory)/artifacts/log/$(_BuildConfig)/AssetManifest' + TargetFolder: '$(Build.StagingDirectory)/AssetManifests' + continueOnError: false + condition: and(succeeded(), eq(variables['_DotNetPublishToBlobFeed'], 'true')) + - task: PublishBuildArtifacts@1 + displayName: Push Asset Manifests + inputs: + PathtoPublish: '$(Build.StagingDirectory)/AssetManifests' + PublishLocation: Container + ArtifactName: AssetManifests + continueOnError: false + condition: and(succeeded(), eq(variables['_DotNetPublishToBlobFeed'], 'true')) diff --git a/eng/common/templates/phases/publish-build-assets.yml b/eng/common/templates/phases/publish-build-assets.yml new file mode 100644 index 00000000000..0df6203b506 --- /dev/null +++ b/eng/common/templates/phases/publish-build-assets.yml @@ -0,0 +1,46 @@ +parameters: + dependsOn: '' + queue: {} + configuration: 'Debug' + condition: succeeded() + continueOnError: false + runAsPublic: false +phases: + - phase: Asset_Registry_Publish + displayName: Publish to Build Asset Registry + dependsOn: ${{ parameters.dependsOn }} + queue: ${{ parameters.queue }} + variables: + _BuildConfig: ${{ parameters.configuration }} + steps: + - ${{ if and(eq(parameters.runAsPublic, 'false'), ne(variables['System.TeamProject'], 'public'), notin(variables['Build.Reason'], 'PullRequest')) }}: + - task: DownloadBuildArtifacts@0 + displayName: Download artifact + inputs: + artifactName: AssetManifests + downloadPath: '$(Build.StagingDirectory)/Download' + condition: ${{ parameters.condition }} + continueOnError: ${{ parameters.continueOnError }} + - task: AzureKeyVault@1 + inputs: + azureSubscription: 'DotNet-Engineering-Services_KeyVault' + KeyVaultName: EngKeyVault + SecretsFilter: 'MaestroAccessToken' + condition: ${{ parameters.condition }} + continueOnError: ${{ parameters.continueOnError }} + - script: eng\common\publishbuildassets.cmd + -configuration $(_BuildConfig) + /p:ManifestsPath='$(Build.StagingDirectory)/Download/AssetManifests' + /p:BuildAssetRegistryToken=$(MaestroAccessToken) + /p:MaestroApiEndpoint=https://maestro-prod.westus2.cloudapp.azure.com + displayName: Publish Build Assets + condition: ${{ parameters.condition }} + continueOnError: ${{ parameters.continueOnError }} + - task: PublishBuildArtifacts@1 + displayName: Publish Logs to VSTS + inputs: + PathtoPublish: '$(Build.SourcesDirectory)/artifacts/log/$(_BuildConfig)' + PublishLocation: Container + ArtifactName: $(Agent.Os)_Asset_Registry_Publish + continueOnError: true + condition: always() diff --git a/eng/common/templates/steps/build-reason.yml b/eng/common/templates/steps/build-reason.yml new file mode 100644 index 00000000000..eba58109b52 --- /dev/null +++ b/eng/common/templates/steps/build-reason.yml @@ -0,0 +1,12 @@ +# build-reason.yml +# Description: runs steps if build.reason condition is valid. conditions is a string of valid build reasons +# to include steps (',' separated). +parameters: + conditions: '' + steps: [] + +steps: + - ${{ if and( not(startsWith(parameters.conditions, 'not')), contains(parameters.conditions, variables['build.reason'])) }}: + - ${{ parameters.steps }} + - ${{ if and( startsWith(parameters.conditions, 'not'), not(contains(parameters.conditions, variables['build.reason']))) }}: + - ${{ parameters.steps }} diff --git a/eng/common/templates/steps/helix-publish.yml b/eng/common/templates/steps/helix-publish.yml new file mode 100644 index 00000000000..470ab65da0c --- /dev/null +++ b/eng/common/templates/steps/helix-publish.yml @@ -0,0 +1,51 @@ +parameters: + HelixSource: 'pr/dotnet-github-anon-kaonashi-bot' + HelixType: ̓'tests/default' + HelixBuild: $(Build.BuildNumber) + HelixTargetQueues: '' + HelixAccessToken: '' + HelixPreCommands: '' + HelixPostCommands: '' + WorkItemDirectory: '' + WorkItemCommand: '' + CorrelationPayloadDirectory: '' + XUnitProjects: '' + XUnitTargetFramework: '' + XUnitRunnerVersion: '' + IncludeDotNetCli: false + DotNetCliPackageType: '' + DotNetCliVersion: '' + EnableXUnitReporter: false + WaitForWorkItemCompletion: true + condition: succeeded() + continueOnError: false + +steps: + - task: DotNetCoreCLI@2 + inputs: + command: custom + projects: eng/common/helixpublish.proj + custom: msbuild + arguments: '/bl:$(Build.SourcesDirectory)/artifacts/log/$(_BuildConfig)/SendToHelix.binlog' + displayName: Send job to Helix + env: + HelixSource: ${{ parameters.HelixSource }} + HelixType: ${{ parameters.HelixType }} + HelixBuild: ${{ parameters.HelixBuild }} + HelixTargetQueues: ${{ parameters.HelixTargetQueues }} + HelixAccessToken: ${{ parameters.HelixAccessToken }} + HelixPreCommands: ${{ parameters.HelixPreCommands }} + HelixPostCommands: ${{ parameters.HelixPostCommands }} + WorkItemDirectory: ${{ parameters.WorkItemDirectory }} + WorkItemCommand: ${{ parameters.WorkItemCommand }} + CorrelationPayloadDirectory: ${{ parameters.CorrelationPayloadDirectory }} + XUnitProjects: ${{ parameters.XUnitProjects }} + XUnitRuntimeTargetFramework: ${{ parameters.XUnitTargetFramework }} + XUnitRunnerVersion: ${{ parameters.XUnitRunnerVersion }} + IncludeDotNetCli: ${{ parameters.IncludeDotNetCli }} + DotNetCliPackageType: ${{ parameters.DotNetCliPackageType }} + DotNetCliVersion: ${{ parameters.DotNetCliVersion }} + EnableXUnitReporter: ${{ parameters.EnableXUnitReporter }} + WaitForWorkItemCompletion: ${{ parameters.WaitForWorkItemCompletion }} + condition: ${{ parameters.condition }} + continueOnError: ${{ parameters.continueOnError }} diff --git a/eng/common/templates/steps/run-on-unix.yml b/eng/common/templates/steps/run-on-unix.yml new file mode 100644 index 00000000000..e1733814f65 --- /dev/null +++ b/eng/common/templates/steps/run-on-unix.yml @@ -0,0 +1,7 @@ +parameters: + agentOs: '' + steps: [] + +steps: +- ${{ if ne(parameters.agentOs, 'Windows_NT') }}: + - ${{ parameters.steps }} diff --git a/eng/common/templates/steps/run-on-windows.yml b/eng/common/templates/steps/run-on-windows.yml new file mode 100644 index 00000000000..73e7e9c275a --- /dev/null +++ b/eng/common/templates/steps/run-on-windows.yml @@ -0,0 +1,7 @@ +parameters: + agentOs: '' + steps: [] + +steps: +- ${{ if eq(parameters.agentOs, 'Windows_NT') }}: + - ${{ parameters.steps }} diff --git a/eng/common/templates/steps/run-script-ifequalelse.yml b/eng/common/templates/steps/run-script-ifequalelse.yml new file mode 100644 index 00000000000..3d1242f5587 --- /dev/null +++ b/eng/common/templates/steps/run-script-ifequalelse.yml @@ -0,0 +1,33 @@ +parameters: + # if parameter1 equals parameter 2, run 'ifScript' command, else run 'elsescript' command + parameter1: '' + parameter2: '' + ifScript: '' + elseScript: '' + + # name of script step + name: Script + + # display name of script step + displayName: If-Equal-Else Script + + # environment + env: {} + + # conditional expression for step execution + condition: '' + +steps: +- ${{ if and(ne(parameters.ifScript, ''), eq(parameters.parameter1, parameters.parameter2)) }}: + - script: ${{ parameters.ifScript }} + name: ${{ parameters.name }} + displayName: ${{ parameters.displayName }} + env: ${{ parameters.env }} + condition: ${{ parameters.condition }} + +- ${{ if and(ne(parameters.elseScript, ''), ne(parameters.parameter1, parameters.parameter2)) }}: + - script: ${{ parameters.elseScript }} + name: ${{ parameters.name }} + displayName: ${{ parameters.displayName }} + env: ${{ parameters.env }} + condition: ${{ parameters.condition }} \ No newline at end of file diff --git a/eng/common/templates/steps/send-to-helix.yml b/eng/common/templates/steps/send-to-helix.yml new file mode 100644 index 00000000000..a5835c0f473 --- /dev/null +++ b/eng/common/templates/steps/send-to-helix.yml @@ -0,0 +1,81 @@ +parameters: + HelixSource: 'pr/default' # required -- sources must start with pr/, official/, prodcon/, or agent/ + HelixType: 'tests/default/' # required -- Helix telemetry which identifies what type of data this is; should include "test" for clarity and must end in '/' + HelixBuild: $(Build.BuildNumber) # required -- the build number Helix will use to identify this -- automatically set to the AzDO build number + HelixTargetQueues: '' # required -- semicolon delimited list of Helix queues to test on; see https://helix.dot.net/api/2018-03-14/info/queues for a list of queues + HelixAccessToken: '' # required -- access token to make Helix API requests; should be provided by the appropriate variable group + HelixPreCommands: '' # optional -- commands to run before Helix work item execution + HelixPostCommands: '' # optional -- commands to run after Helix work item execution + WorkItemDirectory: '' # optional -- a payload directory to zip up and send to Helix; requires WorkItemCommand; incompatible with XUnitProjects + WorkItemCommand: '' # optional -- a command to execute on the payload; requires WorkItemDirectory; incompatible with XUnitProjects + WorkItemTimeout: '' # optional -- a timeout in seconds for the work item command; requires WorkItemDirectory; incompatible with XUnitProjects + CorrelationPayloadDirectory: '' # optional -- a directory to zip up and send to Helix as a correlation payload + XUnitProjects: '' # optional -- semicolon delimited list of XUnitProjects to parse and send to Helix; requires XUnitRuntimeTargetFramework, XUnitPublishTargetFramework, XUnitRunnerVersion, and IncludeDotNetCli=true + XUnitPublishTargetFramework: '' # optional -- framework to use to publish your xUnit projects + XUnitRuntimeTargetFramework: '' # optional -- framework to use for the xUnit console runner + XUnitRunnerVersion: '' # optional -- version of the xUnit nuget package you wish to use on Helix; required for XUnitProjects + IncludeDotNetCli: false # optional -- true will download a version of the .NET CLI onto the Helix machine as a correlation payload; requires DotNetCliPackageType and DotNetCliVersion + DotNetCliPackageType: '' # optional -- either 'sdk' or 'runtime'; determines whether the sdk or runtime will be sent to Helix; see https://raw.githubusercontent.com/dotnet/core/master/release-notes/releases.json + DotNetCliVersion: '' # optional -- version of the CLI to send to Helix; based on this: https://raw.githubusercontent.com/dotnet/core/master/release-notes/releases.json + EnableXUnitReporter: false # optional -- true enables XUnit result reporting to Mission Control + WaitForWorkItemCompletion: true # optional -- true will make the task wait until work items have been completed and fail the build if work items fail. False is "fire and forget." + IsExternal: false # [DEPRECATED] -- doesn't do anything, jobs are external if HelixAccessToken is empty and Creator is set + Creator: '' # optional -- if the build is external, use this to specify who is sending the job + condition: succeeded() # optional -- condition for step to execute; defaults to succeeded() + continueOnError: false # optional -- determines whether to continue the build if the step errors; defaults to false + +steps: + - powershell: 'powershell "$env:BUILD_SOURCESDIRECTORY\eng\common\msbuild.ps1 $env:BUILD_SOURCESDIRECTORY\eng\common\helixpublish.proj /bl:$env:BUILD_SOURCESDIRECTORY\artifacts\log\$env:BuildConfig\SendToHelix.binlog"' + displayName: Send job to Helix (Windows) + env: + BuildConfig: $(_BuildConfig) + HelixSource: ${{ parameters.HelixSource }} + HelixType: ${{ parameters.HelixType }} + HelixBuild: ${{ parameters.HelixBuild }} + HelixTargetQueues: ${{ parameters.HelixTargetQueues }} + HelixAccessToken: ${{ parameters.HelixAccessToken }} + HelixPreCommands: ${{ parameters.HelixPreCommands }} + HelixPostCommands: ${{ parameters.HelixPostCommands }} + WorkItemDirectory: ${{ parameters.WorkItemDirectory }} + WorkItemCommand: ${{ parameters.WorkItemCommand }} + WorkItemTimeout: ${{ parameters.WorkItemTimeout }} + CorrelationPayloadDirectory: ${{ parameters.CorrelationPayloadDirectory }} + XUnitProjects: ${{ parameters.XUnitProjects }} + XUnitPublishTargetFramework: ${{ parameters.XUnitPublishTargetFramework }} + XUnitRuntimeTargetFramework: ${{ parameters.XUnitRuntimeTargetFramework }} + XUnitRunnerVersion: ${{ parameters.XUnitRunnerVersion }} + IncludeDotNetCli: ${{ parameters.IncludeDotNetCli }} + DotNetCliPackageType: ${{ parameters.DotNetCliPackageType }} + DotNetCliVersion: ${{ parameters.DotNetCliVersion }} + EnableXUnitReporter: ${{ parameters.EnableXUnitReporter }} + WaitForWorkItemCompletion: ${{ parameters.WaitForWorkItemCompletion }} + Creator: ${{ parameters.Creator }} + condition: and(${{ parameters.condition }}, eq(variables['Agent.Os'], 'Windows_NT')) + continueOnError: ${{ parameters.continueOnError }} + - script: $BUILD_SOURCESDIRECTORY/eng/common/msbuild.sh $BUILD_SOURCESDIRECTORY/eng/common/helixpublish.proj /bl:$BUILD_SOURCESDIRECTORY/artifacts/log/$BuildConfig/SendToHelix.binlog + displayName: Send job to Helix (Unix) + env: + BuildConfig: $(_BuildConfig) + HelixSource: ${{ parameters.HelixSource }} + HelixType: ${{ parameters.HelixType }} + HelixBuild: ${{ parameters.HelixBuild }} + HelixTargetQueues: ${{ parameters.HelixTargetQueues }} + HelixAccessToken: ${{ parameters.HelixAccessToken }} + HelixPreCommands: ${{ parameters.HelixPreCommands }} + HelixPostCommands: ${{ parameters.HelixPostCommands }} + WorkItemDirectory: ${{ parameters.WorkItemDirectory }} + WorkItemCommand: ${{ parameters.WorkItemCommand }} + WorkItemTimeout: ${{ parameters.WorkItemTimeout }} + CorrelationPayloadDirectory: ${{ parameters.CorrelationPayloadDirectory }} + XUnitProjects: ${{ parameters.XUnitProjects }} + XUnitPublishTargetFramework: ${{ parameters.XUnitPublishTargetFramework }} + XUnitRuntimeTargetFramework: ${{ parameters.XUnitRuntimeTargetFramework }} + XUnitRunnerVersion: ${{ parameters.XUnitRunnerVersion }} + IncludeDotNetCli: ${{ parameters.IncludeDotNetCli }} + DotNetCliPackageType: ${{ parameters.DotNetCliPackageType }} + DotNetCliVersion: ${{ parameters.DotNetCliVersion }} + EnableXUnitReporter: ${{ parameters.EnableXUnitReporter }} + WaitForWorkItemCompletion: ${{ parameters.WaitForWorkItemCompletion }} + Creator: ${{ parameters.Creator }} + condition: and(${{ parameters.condition }}, ne(variables['Agent.Os'], 'Windows_NT')) + continueOnError: ${{ parameters.continueOnError }} diff --git a/eng/common/templates/steps/telemetry-end.yml b/eng/common/templates/steps/telemetry-end.yml new file mode 100644 index 00000000000..9b61481e7e1 --- /dev/null +++ b/eng/common/templates/steps/telemetry-end.yml @@ -0,0 +1,63 @@ +steps: +- bash: | + if [ "$AGENT_JOBSTATUS" = "Succeeded" ] || [ "$AGENT_JOBSTATUS" = "PartiallySucceeded" ]; then + errorCount=0 + else + errorCount=1 + fi + warningCount=0 + + # create a temporary file for curl output + res=`mktemp` + + curlResult=` + curl --verbose --output $res --write-out "%{http_code}"\ + -H 'Content-Type: application/json' \ + -H "X-Helix-Job-Token: $Helix_JobToken" \ + -H 'Content-Length: 0' \ + -X POST -G "https://helix.dot.net/api/2018-03-14/telemetry/job/build/$Helix_WorkItemId/finish" \ + --data-urlencode "errorCount=$errorCount" \ + --data-urlencode "warningCount=$warningCount"` + curlStatus=$? + + if [ $curlStatus -eq 0 ]; then + if [ $curlResult -gt 299 ] || [ $curlResult -lt 200 ]; then + curlStatus=$curlResult + fi + fi + + if [ $curlStatus -ne 0 ]; then + echo "Failed to Send Build Finish information" + vstsLogOutput="vso[task.logissue type=error;sourcepath=templates/steps/telemetry-end.yml;code=1;]Failed to Send Build Finish information: $curlStatus" + echo "##$vstsLogOutput" + exit 1 + fi + displayName: Send Unix Build End Telemetry + env: + # defined via VSTS variables in start-job.sh + Helix_JobToken: $(Helix_JobToken) + Helix_WorkItemId: $(Helix_WorkItemId) + condition: and(always(), ne(variables['Agent.Os'], 'Windows_NT')) +- powershell: | + if (($env:Agent_JobStatus -eq 'Succeeded') -or ($env:Agent_JobStatus -eq 'PartiallySucceeded')) { + $ErrorCount = 0 + } else { + $ErrorCount = 1 + } + $WarningCount = 0 + + try { + Invoke-RestMethod -Uri "https://helix.dot.net/api/2018-03-14/telemetry/job/build/$env:Helix_WorkItemId/finish?errorCount=$ErrorCount&warningCount=$WarningCount" -Method Post -ContentType "application/json" -Body "" ` + -Headers @{ 'X-Helix-Job-Token'=$env:Helix_JobToken } + } + catch { + Write-Error $_ + Write-Error $_.Exception + exit 1 + } + displayName: Send Windows Build End Telemetry + env: + # defined via VSTS variables in start-job.ps1 + Helix_JobToken: $(Helix_JobToken) + Helix_WorkItemId: $(Helix_WorkItemId) + condition: and(always(),eq(variables['Agent.Os'], 'Windows_NT')) diff --git a/eng/common/templates/steps/telemetry-start.yml b/eng/common/templates/steps/telemetry-start.yml new file mode 100644 index 00000000000..79c128c5de8 --- /dev/null +++ b/eng/common/templates/steps/telemetry-start.yml @@ -0,0 +1,154 @@ +parameters: + helixSource: 'undefined_defaulted_in_telemetry.yml' + helixType: 'undefined_defaulted_in_telemetry.yml' + buildConfig: '' + runAsPublic: false + +steps: +- ${{ if and(eq(parameters.runAsPublic, 'false'), not(eq(variables['System.TeamProject'], 'public'))) }}: + - task: AzureKeyVault@1 + inputs: + azureSubscription: 'HelixProd_KeyVault' + KeyVaultName: HelixProdKV + SecretsFilter: 'HelixApiAccessToken' + condition: always() +- bash: | + # create a temporary file + jobInfo=`mktemp` + + # write job info content to temporary file + cat > $jobInfo <' | Set-Content $proj + MSBuild $proj $bl /t:__WriteToolsetLocation /noconsolelogger /p:__ToolsetLocationOutputFile=$toolsetLocationFile + + $path = Get-Content $toolsetLocationFile -TotalCount 1 + if (!(Test-Path $path)) { + throw "Invalid toolset path: $path" + } + + return $global:_ToolsetBuildProj = $path +} + +function ExitWithExitCode([int] $exitCode) { + if ($ci -and $prepareMachine) { + Stop-Processes + } + exit $exitCode +} + +function Stop-Processes() { + Write-Host "Killing running build processes..." + foreach ($processName in $processesToStopOnExit) { + Get-Process -Name $processName -ErrorAction SilentlyContinue | Stop-Process + } +} + +# +# Executes msbuild (or 'dotnet msbuild') with arguments passed to the function. +# The arguments are automatically quoted. +# Terminates the script if the build fails. +# +function MSBuild() { + if ($ci) { + if (!$binaryLog) { + throw "Binary log must be enabled in CI build." + } + + if ($nodeReuse) { + throw "Node reuse must be disabled in CI build." + } + } + + $buildTool = InitializeBuildTool + + $cmdArgs = "$($buildTool.Command) /m /nologo /clp:Summary /v:$verbosity /nr:$nodeReuse" + + if ($warnAsError) { + $cmdArgs += " /warnaserror /p:TreatWarningsAsErrors=true" + } + + foreach ($arg in $args) { + if ($arg -ne $null -and $arg.Trim() -ne "") { + $cmdArgs += " `"$arg`"" + } + } + + $exitCode = Exec-Process $buildTool.Path $cmdArgs + + if ($exitCode -ne 0) { + Write-Host "Build failed." -ForegroundColor Red + + $buildLog = GetMSBuildBinaryLogCommandLineArgument $args + if ($buildLog -ne $null) { + Write-Host "See log: $buildLog" -ForegroundColor DarkGray + } + + ExitWithExitCode $exitCode + } +} + +function GetMSBuildBinaryLogCommandLineArgument($arguments) { + foreach ($argument in $arguments) { + if ($argument -ne $null) { + $arg = $argument.Trim() + if ($arg.StartsWith("/bl:", "OrdinalIgnoreCase")) { + return $arg.Substring("/bl:".Length) + } + + if ($arg.StartsWith("/binaryLogger:", "OrdinalIgnoreCase")) { + return $arg.Substring("/binaryLogger:".Length) + } + } + } + + return $null +} + +$RepoRoot = Resolve-Path (Join-Path $PSScriptRoot "..\..") +$EngRoot = Resolve-Path (Join-Path $PSScriptRoot "..") +$ArtifactsDir = Join-Path $RepoRoot "artifacts" +$ToolsetDir = Join-Path $ArtifactsDir "toolset" +$ToolsDir = Join-Path $RepoRoot ".tools" +$LogDir = Join-Path (Join-Path $ArtifactsDir "log") $configuration +$TempDir = Join-Path (Join-Path $ArtifactsDir "tmp") $configuration +$GlobalJson = Get-Content -Raw -Path (Join-Path $RepoRoot "global.json") | ConvertFrom-Json + +Create-Directory $ToolsetDir +Create-Directory $TempDir +Create-Directory $LogDir + +if ($ci) { + $env:TEMP = $TempDir + $env:TMP = $TempDir +} diff --git a/eng/common/tools.sh b/eng/common/tools.sh new file mode 100755 index 00000000000..8a253bef513 --- /dev/null +++ b/eng/common/tools.sh @@ -0,0 +1,319 @@ +# Initialize variables if they aren't already defined. + +# CI mode - set to true on CI server for PR validation build or official build. +ci=${ci:-false} + +# Build configuration. Common values include 'Debug' and 'Release', but the repository may use other names. +configuration=${configuration:-'Debug'} + +# Set to true to output binary log from msbuild. Note that emitting binary log slows down the build. +# Binary log must be enabled on CI. +binary_log=${binary_log:-$ci} + +# Turns on machine preparation/clean up code that changes the machine state (e.g. kills build processes). +prepare_machine=${prepare_machine:-false} + +# True to restore toolsets and dependencies. +restore=${restore:-true} + +# Adjusts msbuild verbosity level. +verbosity=${verbosity:-'minimal'} + +# Set to true to reuse msbuild nodes. Recommended to not reuse on CI. +if [[ "$ci" == true ]]; then + node_reuse=${node_reuse:-false} +else + node_reuse=${node_reuse:-true} +fi + +# Configures warning treatment in msbuild. +warn_as_error=${warn_as_error:-true} + +# True to attempt using .NET Core already that meets requirements specified in global.json +# installed on the machine instead of downloading one. +use_installed_dotnet_cli=${use_installed_dotnet_cli:-true} + +# True to use global NuGet cache instead of restoring packages to repository-local directory. +if [[ "$ci" == true ]]; then + use_global_nuget_cache=${use_global_nuget_cache:-false} +else + use_global_nuget_cache=${use_global_nuget_cache:-true} +fi + +# Resolve any symlinks in the given path. +function ResolvePath { + local path=$1 + + while [[ -h $path ]]; do + local dir="$( cd -P "$( dirname "$path" )" && pwd )" + path="$(readlink "$path")" + + # if $path was a relative symlink, we need to resolve it relative to the path where the + # symlink file was located + [[ $path != /* ]] && path="$dir/$path" + done + + # return value + _ResolvePath="$path" +} + +# ReadVersionFromJson [json key] +function ReadGlobalVersion { + local key=$1 + + local line=`grep -m 1 "$key" "$global_json_file"` + local pattern="\"$key\" *: *\"(.*)\"" + + if [[ ! $line =~ $pattern ]]; then + echo "Error: Cannot find \"$key\" in $global_json_file" >&2 + ExitWithExitCode 1 + fi + + # return value + _ReadGlobalVersion=${BASH_REMATCH[1]} +} + +function InitializeDotNetCli { + if [[ -n "${_InitializeDotNetCli:-}" ]]; then + return + fi + + local install=$1 + + # Don't resolve runtime, shared framework, or SDK from other locations to ensure build determinism + export DOTNET_MULTILEVEL_LOOKUP=0 + + # Disable first run since we want to control all package sources + export DOTNET_SKIP_FIRST_TIME_EXPERIENCE=1 + + # Disable telemetry on CI + if [[ $ci == true ]]; then + export DOTNET_CLI_TELEMETRY_OPTOUT=1 + fi + + # LTTNG is the logging infrastructure used by Core CLR. Need this variable set + # so it doesn't output warnings to the console. + export LTTNG_HOME="$HOME" + + # Source Build uses DotNetCoreSdkDir variable + if [[ -n "${DotNetCoreSdkDir:-}" ]]; then + export DOTNET_INSTALL_DIR="$DotNetCoreSdkDir" + fi + + # Find the first path on $PATH that contains the dotnet.exe + if [[ "$use_installed_dotnet_cli" == true && -z "${DOTNET_INSTALL_DIR:-}" ]]; then + local dotnet_path=`command -v dotnet` + if [[ -n "$dotnet_path" ]]; then + ResolvePath "$dotnet_path" + export DOTNET_INSTALL_DIR=`dirname "$_ResolvePath"` + fi + fi + + ReadGlobalVersion "dotnet" + local dotnet_sdk_version=$_ReadGlobalVersion + local dotnet_root="" + + # Use dotnet installation specified in DOTNET_INSTALL_DIR if it contains the required SDK version, + # otherwise install the dotnet CLI and SDK to repo local .dotnet directory to avoid potential permission issues. + if [[ -n "${DOTNET_INSTALL_DIR:-}" && -d "$DOTNET_INSTALL_DIR/sdk/$dotnet_sdk_version" ]]; then + dotnet_root="$DOTNET_INSTALL_DIR" + else + dotnet_root="$repo_root/.dotnet" + export DOTNET_INSTALL_DIR="$dotnet_root" + + if [[ ! -d "$DOTNET_INSTALL_DIR/sdk/$dotnet_sdk_version" ]]; then + if [[ "$install" == true ]]; then + InstallDotNetSdk "$dotnet_root" "$dotnet_sdk_version" + else + echo "Unable to find dotnet with SDK version '$dotnet_sdk_version'" >&2 + ExitWithExitCode 1 + fi + fi + fi + + # Add dotnet to PATH. This prevents any bare invocation of dotnet in custom + # build steps from using anything other than what we've downloaded. + export PATH="$dotnet_root:$PATH" + + if [[ $ci == true ]]; then + # Make Sure that our bootstrapped dotnet cli is avaliable in future steps of the Azure Pipelines build + echo "##vso[task.prependpath]$dotnet_root" + echo "##vso[task.setvariable variable=DOTNET_MULTILEVEL_LOOKUP]0" + echo "##vso[task.setvariable variable=DOTNET_SKIP_FIRST_TIME_EXPERIENCE]1" + fi + + # return value + _InitializeDotNetCli="$dotnet_root" +} + +function InstallDotNetSdk { + local root=$1 + local version=$2 + + GetDotNetInstallScript "$root" + local install_script=$_GetDotNetInstallScript + + bash "$install_script" --version $version --install-dir "$root" || { + local exit_code=$? + echo "Failed to install dotnet SDK (exit code '$exit_code')." >&2 + ExitWithExitCode $exit_code + } +} + +function GetDotNetInstallScript { + local root=$1 + local install_script="$root/dotnet-install.sh" + local install_script_url="https://dot.net/v1/dotnet-install.sh" + + if [[ ! -a "$install_script" ]]; then + mkdir -p "$root" + + echo "Downloading '$install_script_url'" + + # Use curl if available, otherwise use wget + if command -v curl > /dev/null; then + curl "$install_script_url" -sSL --retry 10 --create-dirs -o "$install_script" + else + wget -q -O "$install_script" "$install_script_url" + fi + fi + + # return value + _GetDotNetInstallScript="$install_script" +} + +function InitializeBuildTool { + if [[ -n "${_InitializeBuildTool:-}" ]]; then + return + fi + + InitializeDotNetCli $restore + + # return values + _InitializeBuildTool="$_InitializeDotNetCli/dotnet" + _InitializeBuildToolCommand="msbuild" +} + +function GetNuGetPackageCachePath { + if [[ -z ${NUGET_PACKAGES:-} ]]; then + if [[ "$use_global_nuget_cache" == true ]]; then + export NUGET_PACKAGES="$HOME/.nuget/packages" + else + export NUGET_PACKAGES="$repo_root/.packages" + fi + fi + + # return value + _GetNuGetPackageCachePath=$NUGET_PACKAGES +} + +function InitializeToolset { + if [[ -n "${_InitializeToolset:-}" ]]; then + return + fi + + GetNuGetPackageCachePath + + ReadGlobalVersion "Microsoft.DotNet.Arcade.Sdk" + + local toolset_version=$_ReadGlobalVersion + local toolset_location_file="$toolset_dir/$toolset_version.txt" + + if [[ -a "$toolset_location_file" ]]; then + local path=`cat "$toolset_location_file"` + if [[ -a "$path" ]]; then + # return value + _InitializeToolset="$path" + return + fi + fi + + if [[ "$restore" != true ]]; then + echo "Toolset version $toolsetVersion has not been restored." >&2 + ExitWithExitCode 2 + fi + + local toolset_restore_log="$log_dir/ToolsetRestore.binlog" + local proj="$toolset_dir/restore.proj" + + echo '' > "$proj" + MSBuild "$proj" /t:__WriteToolsetLocation /noconsolelogger /bl:"$toolset_restore_log" /p:__ToolsetLocationOutputFile="$toolset_location_file" + + local toolset_build_proj=`cat "$toolset_location_file"` + + if [[ ! -a "$toolset_build_proj" ]]; then + echo "Invalid toolset path: $toolset_build_proj" >&2 + ExitWithExitCode 3 + fi + + # return value + _InitializeToolset="$toolset_build_proj" +} + +function ExitWithExitCode { + if [[ "$ci" == true && "$prepare_machine" == true ]]; then + StopProcesses + fi + exit $1 +} + +function StopProcesses { + echo "Killing running build processes..." + pkill -9 "dotnet" || true + pkill -9 "vbcscompiler" || true + return 0 +} + +function MSBuild { + if [[ "$ci" == true ]]; then + if [[ "$binary_log" != true ]]; then + echo "Binary log must be enabled in CI build." >&2 + ExitWithExitCode 1 + fi + + if [[ "$node_reuse" == true ]]; then + echo "Node reuse must be disabled in CI build." >&2 + ExitWithExitCode 1 + fi + fi + + InitializeBuildTool + + local warnaserror_switch="" + if [[ $warn_as_error == true ]]; then + warnaserror_switch="/warnaserror" + fi + + "$_InitializeBuildTool" "$_InitializeBuildToolCommand" /m /nologo /clp:Summary /v:$verbosity /nr:$node_reuse $warnaserror_switch /p:TreatWarningsAsErrors=$warn_as_error "$@" || { + local exit_code=$? + echo "Build failed (exit code '$exit_code')." >&2 + ExitWithExitCode $exit_code + } +} + +ResolvePath "${BASH_SOURCE[0]}" +_script_dir=`dirname "$_ResolvePath"` + +eng_root=`cd -P "$_script_dir/.." && pwd` +repo_root=`cd -P "$_script_dir/../.." && pwd` +artifacts_dir="$repo_root/artifacts" +toolset_dir="$artifacts_dir/toolset" +log_dir="$artifacts_dir/log/$configuration" +temp_dir="$artifacts_dir/tmp/$configuration" + +global_json_file="$repo_root/global.json" + +# HOME may not be defined in some scenarios, but it is required by NuGet +if [[ -z $HOME ]]; then + export HOME="$repo_root/artifacts/.home/" + mkdir -p "$HOME" +fi + +mkdir -p "$toolset_dir" +mkdir -p "$temp_dir" +mkdir -p "$log_dir" + +if [[ $ci == true ]]; then + export TEMP="$temp_dir" + export TMP="$temp_dir" +fi diff --git a/fcs/build.fsx b/fcs/build.fsx index 7f9f96f3574..8549ed86348 100644 --- a/fcs/build.fsx +++ b/fcs/build.fsx @@ -94,7 +94,7 @@ Target "Test" (fun _ -> runDotnet __SOURCE_DIRECTORY__ "build ../tests/projects/Sample_NETCoreSDK_FSharp_Library_netstandard2_0/Sample_NETCoreSDK_FSharp_Library_netstandard2_0.fsproj -v n" // Now run the tests - runDotnet __SOURCE_DIRECTORY__ "test FSharp.Compiler.Service.Tests/FSharp.Compiler.Service.Tests.fsproj -v n -c release" + runDotnet __SOURCE_DIRECTORY__ "test FSharp.Compiler.Service.Tests/FSharp.Compiler.Service.Tests.fsproj --no-restore --no-build -v n -c release" ) Target "NuGet" (fun _ -> diff --git a/global.json b/global.json new file mode 100644 index 00000000000..ac6900880b3 --- /dev/null +++ b/global.json @@ -0,0 +1,9 @@ +{ + "tools": { + "dotnet": "2.1.500" + }, + "msbuild-sdks": { + "Microsoft.DotNet.Arcade.Sdk": "1.0.0-beta.19069.2", + "Microsoft.DotNet.Helix.Sdk": "2.0.0-beta.19069.2" + } +} diff --git a/packages.config b/packages.config new file mode 100644 index 00000000000..709d225851d --- /dev/null +++ b/packages.config @@ -0,0 +1,4 @@ + + + + From 99e307f3a3ef2109ba6542ffc58affe76fc0e2a0 Mon Sep 17 00:00:00 2001 From: "Brett V. Forsgren" Date: Mon, 28 Jan 2019 19:14:59 -0800 Subject: [PATCH 160/160] remove test that was only testing the default machine state (#6154) --- .../CompilerOptions/fsc/codepage/E_DefaultCodePage01.fsx | 4 ---- tests/fsharpqa/Source/CompilerOptions/fsc/codepage/env.lst | 1 - 2 files changed, 5 deletions(-) delete mode 100644 tests/fsharpqa/Source/CompilerOptions/fsc/codepage/E_DefaultCodePage01.fsx diff --git a/tests/fsharpqa/Source/CompilerOptions/fsc/codepage/E_DefaultCodePage01.fsx b/tests/fsharpqa/Source/CompilerOptions/fsc/codepage/E_DefaultCodePage01.fsx deleted file mode 100644 index 1ed9611bb9d..00000000000 --- a/tests/fsharpqa/Source/CompilerOptions/fsc/codepage/E_DefaultCodePage01.fsx +++ /dev/null @@ -1,4 +0,0 @@ -// #Regression #NoMT #CompilerOptions -#load "FunctionalLibrary01.fs";; -#q;; -//Unexpected character '\?' in type name$ \ No newline at end of file diff --git a/tests/fsharpqa/Source/CompilerOptions/fsc/codepage/env.lst b/tests/fsharpqa/Source/CompilerOptions/fsc/codepage/env.lst index 1befab598a4..b80eac641bd 100644 --- a/tests/fsharpqa/Source/CompilerOptions/fsc/codepage/env.lst +++ b/tests/fsharpqa/Source/CompilerOptions/fsc/codepage/env.lst @@ -29,7 +29,6 @@ SOURCE=E_RequiresParameter01.fs TAILFLAGS="--codepage" # E_RequiresParameter01.fs SOURCE=E_RequiresParameter01.fs TAILFLAGS="--codepage" FSIMODE=EXEC # E_RequiresParameter01.fs-fsi - SOURCE=E_DefaultCodePage01.fsx COMPILE_ONLY=1 FSIMODE=EXEC # E_DefaultCodePage01.fsx SOURCE=E_DefaultCodePage02.fsx COMPILE_ONLY=1 # E_DefaultCodePage02.fsx SOURCE=MatchingCodePage01.fsx COMPILE_ONLY=1 SCFLAGS="--codepage:1250" FSIMODE=EXEC # MatchingCodePage01.fsx

t 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�judlDjx@NqV64qiq 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�IG= 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 literal 1452544 zcmd4437{NRmH%I<>aOnBZ%O*SmwwsEO9F(VyORJ>OoBiJ*%1K|!;T=xUa>1dO#31- zf(ijwTu>2#i2H)OGo!eU;~>Um)Nx@PbsT?=I*#M0<7oJQzUNkTSHJXo1jpa+KQHOJ z+qvhSbMCq4u664vXTRJFJkKled*l(%`zWsdHrjLc$MqzSOn!XC`{2NrmVb24$zNK2 z#$}f$%Qm;-XSbet^|FhfdCfKPmSq=RvaGfBnq`+?v+T)FecH0C<7Zv6dU&|9UyAzF zV?6KVIf3`3=U?-*thDcYBg+Tpls#`n%@Ibz(j)ON!*e07sFUCCBzqx2`@4&D;`JAJ z7ZyElp8fB-Y0!aq4;)eR&XFIy-%sx<_+Q7kMfuFBs@xBndiYl=dVoo_)f_4 zR&TlFx-Ep~Elc?luhYsW%Z003N$XQg2qs|Rr#91L}N~^?s;do zpmMXysYLi1ehm6b-5WcoTXrt3@Mc)hHg}TD1<3@UMEhzeR)& z)+)Fjfpr9AjajS~N*iLvwbIN5D1!GdYw(=aviAk_n<(HU}{1Zq#f13(%F??m5PP z!TTvRB962kza{=jU;iZ|y<9El*emDQs|2$OrnK>9Lm>I6*3kzioK**=5?ghw<9#SF z-iOP^vlBoM=Y_y=UPLTXfs}tZg5wV3VUP*{xkv$0_JJz(=X*l*iSMksn-xFYJs#7z zLWJaP@TKyhA55t()V7SkdN*FgSiE_<@haZp%|pD}D|jG;_(S}*JPsK&bkk`~E?pjD zl`6`mqopog9%EAJIeS3R>;WdK)ApNb95i&>J`GxS%-X&ZvId{Fcg%1lf(Y9CK2kwz zC-;yCOP}h=%LtjCyaJz5cO@F@X?kLX>c2>wveXfuI zAX07pow!&q>fBN*lF0g7#EOL#YWLxXcHYYmZF}u$DL*S5KQv+Sqb4jK(A7Oz2~$?2 z!hP5%m5q&zl$00Q+RGpc8|h@2Kb?3rt3Pth)Tq zF|39;wM0*Q6<2zCN-EoBy?WZCpm_>0PmWTm+z51ao0+E`0@d%z?ods#J5GG5-H9Y> zXLlCk#a^f~&5oD{JCVk#6pJ@c*M5vxJoZH%Q$Oi_H=R~bKGNkeT9uAnqgfXiPqb+o z=AvrmB1UuRG7I(lJ9bRqeql<`esM~`{zzd;!2U>a%7DQuo%vT>!f9Q6laSTLgLtet z54y640wZC#JWz`FgZD~UTjPiIuy!!d3{b^k4UEXKuv)B!YYOwdMoGTizBfjbtE~yD zg*xuRacsI z$Mzs1*`9T-`Iszz0Mm>FWqXwBY|p195(`U5?B+MjIFo_J7kVvUsLL#NQt0
s}+Fbl?{_B+($E>yG4XOh}Sy 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�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
-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