提交 2180de45 编写于 作者: S Steffen Forkmann 提交者: Kevin Ransom (msft)

Optimize in FCS (#3784)

* Optimize in FCS

* Transport tcConfig

* Cleanup

* Replace more ILAsm in Exprs

* More ILAsm replacements

* update resource name

* Added some tests (#40)

* Add option to toggle unused declarations analyzer (#4074)

* Add option to toggle unused declarations analyzer

* Better name and handle registering code fixes.

This will ensure that if someone uses warnon:1182, we won't suggest
fixes if they've turned off the feature.

* Revert #1650 (and #3366) (#4173)

* Fix error logging in brace matching code (#4140)

* Remove error logger pushing code

* Update service.fs

* Fix #4200: Vsix: fix empty "New file" window for web projects (#4202)

* LOC CHECKIN | visualfsharp - master | 20180112 (#4194)

* Fixed FCS netcore tests (#4180)

* Remove ambiguous resolution error FS0332 (#4170)

* Add IsInteractive to parsing options for script load closures (#4169)

* Add IsInteractive to FSharpParsingOptions

* Add test

* Set serializable bit for all serializable types (#4211)

* Minor fix (#4195)

on string 58.

*  Symbols API: add Index to active pattern case, Name to pattern group (#4222)

* Symbols API: add Index to active pattern case, Name to pattern group

* Symbols API: add active pattern case use tests

* don't rebuild (#4230)

* Optimize in FCS

* Transport tcConfig

* Cleanup

* Replace more ILAsm in Exprs

* More ILAsm replacements

* update resource name

* Added some tests

* test conditions update

* test update

* test condition update

* test update

* review update

* added checked operators

* fixed dual conversions

* review fixes

* more targeted replacements

* adapt to latest

* added more tests

* added more tests

* review fixes

* fixed warnings
上级 be5b58c6
......@@ -6140,22 +6140,84 @@ let mkCallNewQuerySource (g:TcGlobals) m ty1 ty2 e1 = m
let mkCallCreateEvent (g:TcGlobals) m ty1 ty2 e1 e2 e3 = mkApps g (typedExprForIntrinsic g m g.create_event_info, [[ty1;ty2]], [ e1;e2;e3 ], m)
let mkCallGenericComparisonWithComparerOuter (g:TcGlobals) m ty comp e1 e2 = mkApps g (typedExprForIntrinsic g m g.generic_comparison_withc_outer_info, [[ty]], [ comp;e1;e2 ], m)
let mkCallEqualsOperator (g:TcGlobals) m ty e1 e2 = mkApps g (typedExprForIntrinsic g m g.equals_operator_info, [[ty]], [ e1;e2 ], m)
let mkCallGenericEqualityEROuter (g:TcGlobals) m ty e1 e2 = mkApps g (typedExprForIntrinsic g m g.generic_equality_er_outer_info, [[ty]], [ e1;e2 ], m)
let mkCallGenericEqualityWithComparerOuter (g:TcGlobals) m ty comp e1 e2 = mkApps g (typedExprForIntrinsic g m g.generic_equality_withc_outer_info, [[ty]], [comp;e1;e2], m)
let mkCallGenericHashWithComparerOuter (g:TcGlobals) m ty comp e1 = mkApps g (typedExprForIntrinsic g m g.generic_hash_withc_outer_info, [[ty]], [comp;e1], m)
let mkCallSubtractionOperator (g:TcGlobals) m ty e1 e2 = mkApps g (typedExprForIntrinsic g m g.unchecked_subtraction_info, [[ty; ty; ty]], [e1;e2], m)
let mkCallEqualsOperator (g:TcGlobals) m ty e1 e2 = mkApps g (typedExprForIntrinsic g m g.equals_operator_info, [[ty]], [ e1;e2 ], m)
let mkCallNotEqualsOperator (g:TcGlobals) m ty e1 e2 = mkApps g (typedExprForIntrinsic g m g.not_equals_operator, [[ty]], [ e1;e2 ], m)
let mkCallLessThanOperator (g:TcGlobals) m ty e1 e2 = mkApps g (typedExprForIntrinsic g m g.less_than_operator, [[ty]], [ e1;e2 ], m)
let mkCallLessThanOrEqualsOperator (g:TcGlobals) m ty e1 e2 = mkApps g (typedExprForIntrinsic g m g.less_than_or_equals_operator, [[ty]], [ e1;e2 ], m)
let mkCallGreaterThanOperator (g:TcGlobals) m ty e1 e2 = mkApps g (typedExprForIntrinsic g m g.greater_than_operator, [[ty]], [ e1;e2 ], m)
let mkCallGreaterThanOrEqualsOperator (g:TcGlobals) m ty e1 e2 = mkApps g (typedExprForIntrinsic g m g.greater_than_or_equals_operator, [[ty]], [ e1;e2 ], m)
let mkCallArrayLength (g:TcGlobals) m ty el = mkApps g (typedExprForIntrinsic g m g.array_length_info, [[ty]], [el], m)
let mkCallArrayGet (g:TcGlobals) m ty e1 e2 = mkApps g (typedExprForIntrinsic g m g.array_get_info, [[ty]], [ e1 ; e2 ], m)
let mkCallAdditionOperator (g:TcGlobals) m ty e1 e2 = mkApps g (typedExprForIntrinsic g m g.unchecked_addition_info, [[ty; ty; ty]], [e1;e2], m)
let mkCallSubtractionOperator (g:TcGlobals) m ty e1 e2 = mkApps g (typedExprForIntrinsic g m g.unchecked_subtraction_info, [[ty; ty; ty]], [e1;e2], m)
let mkCallMultiplyOperator (g:TcGlobals) m ty e1 e2 = mkApps g (typedExprForIntrinsic g m g.unchecked_multiply_info, [[ty; ty; ty]], [e1;e2], m)
let mkCallDivisionOperator (g:TcGlobals) m ty e1 e2 = mkApps g (typedExprForIntrinsic g m g.unchecked_division_info, [[ty; ty; ty]], [e1;e2], m)
let mkCallModulusOperator (g:TcGlobals) m ty e1 e2 = mkApps g (typedExprForIntrinsic g m g.unchecked_modulus_info, [[ty; ty; ty]], [e1;e2], m)
let mkCallBitwiseAndOperator (g:TcGlobals) m ty e1 e2 = mkApps g (typedExprForIntrinsic g m g.bitwise_and_info, [[ty]], [e1;e2], m)
let mkCallBitwiseOrOperator (g:TcGlobals) m ty e1 e2 = mkApps g (typedExprForIntrinsic g m g.bitwise_or_info, [[ty]], [e1;e2], m)
let mkCallBitwiseXorOperator (g:TcGlobals) m ty e1 e2 = mkApps g (typedExprForIntrinsic g m g.bitwise_xor_info, [[ty]], [e1;e2], m)
let mkCallShiftLeftOperator (g:TcGlobals) m ty e1 e2 = mkApps g (typedExprForIntrinsic g m g.bitwise_shift_left_info, [[ty]], [e1;e2], m)
let mkCallShiftRightOperator (g:TcGlobals) m ty e1 e2 = mkApps g (typedExprForIntrinsic g m g.bitwise_shift_right_info, [[ty]], [e1;e2], m)
let mkCallUnaryNegOperator (g:TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.unchecked_unary_minus_info, [[ty]], [e1], m)
let mkCallUnaryNotOperator (g:TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.bitwise_unary_not_info, [[ty]], [e1], m)
let mkCallAdditionChecked (g:TcGlobals) m ty e1 e2 = mkApps g (typedExprForIntrinsic g m g.checked_addition_info, [[ty; ty; ty]], [e1;e2], m)
let mkCallSubtractionChecked (g:TcGlobals) m ty e1 e2 = mkApps g (typedExprForIntrinsic g m g.checked_subtraction_info, [[ty; ty; ty]], [e1;e2], m)
let mkCallMultiplyChecked (g:TcGlobals) m ty e1 e2 = mkApps g (typedExprForIntrinsic g m g.checked_multiply_info, [[ty; ty; ty]], [e1;e2], m)
let mkCallUnaryNegChecked (g:TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.checked_unary_minus_info, [[ty]], [e1], m)
let mkCallToByteChecked (g:TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.byte_checked_info, [[ty]], [e1], m)
let mkCallToSByteChecked (g:TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.sbyte_checked_info, [[ty]], [e1], m)
let mkCallToInt16Checked (g:TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.int16_checked_info, [[ty]], [e1], m)
let mkCallToUInt16Checked (g:TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.uint16_checked_info, [[ty]], [e1], m)
let mkCallToIntChecked (g:TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.int_checked_info, [[ty]], [e1], m)
let mkCallToInt32Checked (g:TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.int32_checked_info, [[ty]], [e1], m)
let mkCallToUInt32Checked (g:TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.uint32_checked_info, [[ty]], [e1], m)
let mkCallToInt64Checked (g:TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.int64_checked_info, [[ty]], [e1], m)
let mkCallToUInt64Checked (g:TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.uint64_checked_info, [[ty]], [e1], m)
let mkCallToIntPtrChecked (g:TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.nativeint_checked_info, [[ty]], [e1], m)
let mkCallToUIntPtrChecked (g:TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.unativeint_checked_info, [[ty]], [e1], m)
let mkCallToByteOperator (g:TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.byte_operator_info, [[ty]], [e1], m)
let mkCallToSByteOperator (g:TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.sbyte_operator_info, [[ty]], [e1], m)
let mkCallToInt16Operator (g:TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.int16_operator_info, [[ty]], [e1], m)
let mkCallToUInt16Operator (g:TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.uint16_operator_info, [[ty]], [e1], m)
let mkCallToIntOperator (g:TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.int_operator_info, [[ty]], [e1], m)
let mkCallToInt32Operator (g:TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.int32_operator_info, [[ty]], [e1], m)
let mkCallToUInt32Operator (g:TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.uint32_operator_info, [[ty]], [e1], m)
let mkCallToInt64Operator (g:TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.int64_operator_info, [[ty]], [e1], m)
let mkCallToUInt64Operator (g:TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.uint64_operator_info, [[ty]], [e1], m)
let mkCallToSingleOperator (g:TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.float32_operator_info, [[ty]], [e1], m)
let mkCallToDoubleOperator (g:TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.float_operator_info, [[ty]], [e1], m)
let mkCallToIntPtrOperator (g:TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.nativeint_operator_info, [[ty]], [e1], m)
let mkCallToUIntPtrOperator (g:TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.unativeint_operator_info, [[ty]], [e1], m)
let mkCallToCharOperator (g:TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.char_operator_info, [[ty]], [e1], m)
let mkCallToEnumOperator (g:TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.enum_operator_info, [[ty]], [e1], m)
let mkCallArrayLength (g:TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.array_length_info, [[ty]], [e1], m)
let mkCallArrayGet (g:TcGlobals) m ty e1 idx1 = mkApps g (typedExprForIntrinsic g m g.array_get_info, [[ty]], [ e1 ; idx1 ], m)
let mkCallArray2DGet (g:TcGlobals) m ty e1 idx1 idx2 = mkApps g (typedExprForIntrinsic g m g.array2D_get_info, [[ty]], [ e1 ; idx1; idx2 ], m)
let mkCallArray3DGet (g:TcGlobals) m ty e1 idx1 idx2 idx3 = mkApps g (typedExprForIntrinsic g m g.array3D_get_info, [[ty]], [ e1 ; idx1; idx2; idx3 ], m)
let mkCallArray4DGet (g:TcGlobals) m ty e1 idx1 idx2 idx3 idx4 = mkApps g (typedExprForIntrinsic g m g.array4D_get_info, [[ty]], [ e1 ; idx1; idx2; idx3; idx4 ], m)
let mkCallArraySet (g:TcGlobals) m ty e1 idx1 v = mkApps g (typedExprForIntrinsic g m g.array_set_info, [[ty]], [ e1 ; idx1; v ], m)
let mkCallArray2DSet (g:TcGlobals) m ty e1 idx1 idx2 v = mkApps g (typedExprForIntrinsic g m g.array2D_set_info, [[ty]], [ e1 ; idx1; idx2; v ], m)
let mkCallArray3DSet (g:TcGlobals) m ty e1 idx1 idx2 idx3 v = mkApps g (typedExprForIntrinsic g m g.array3D_set_info, [[ty]], [ e1 ; idx1; idx2; idx3; v ], m)
let mkCallArray4DSet (g:TcGlobals) m ty e1 idx1 idx2 idx3 idx4 v = mkApps g (typedExprForIntrinsic g m g.array4D_set_info, [[ty]], [ e1 ; idx1; idx2; idx3; idx4; v ], m)
let mkCallHash (g:TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.hash_info, [[ty]], [ e1 ], m)
let mkCallBox (g:TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.box_info, [[ty]], [ e1 ], m)
let mkCallIsNull (g:TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.isnull_info, [[ty]], [ e1 ], m)
let mkCallIsNotNull (g:TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.isnotnull_info, [[ty]], [ e1 ], m)
let mkCallRaise (g:TcGlobals) m ty e1 = mkApps g (typedExprForIntrinsic g m g.raise_info, [[ty]], [ e1 ], m)
let mkCallNewDecimal (g:TcGlobals) m (e1, e2, e3, e4, e5) = mkApps g (typedExprForIntrinsic g m g.new_decimal_info, [], [ e1;e2;e3;e4;e5 ], m)
let mkCallNewFormat (g:TcGlobals) m aty bty cty dty ety e1 = mkApps g (typedExprForIntrinsic g m g.new_format_info, [[aty;bty;cty;dty;ety]], [ e1 ], m)
let mkCallRaise (g:TcGlobals) m aty e1 = mkApps g (typedExprForIntrinsic g m g.raise_info, [[aty]], [ e1 ], m)
let TryEliminateDesugaredConstants g m c =
match c with
......
......@@ -1221,15 +1221,77 @@ val mkCallArrayGet : TcGlobals -> range -> TType -> Expr -> Expr -> Ex
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 mkCallEqualsOperator : TcGlobals -> range -> TType -> Expr -> Expr -> Expr
val mkCallSubtractionOperator : 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
......
此差异已折叠。
......@@ -1806,11 +1806,16 @@ type FSharpProjectContext(thisCcu: CcuThunk, assemblies: FSharpAssembly list, ad
[<Sealed>]
// 'details' is an option because the creation of the tcGlobals etc. for the project may have failed.
type FSharpCheckProjectResults(projectFileName:string, keepAssemblyContents, errors: FSharpErrorInfo[], details:(TcGlobals*TcImports*CcuThunk*ModuleOrNamespaceType*TcSymbolUses list*TopAttribs option*CompileOps.IRawFSharpAssemblyData option * ILAssemblyRef * AccessorDomain * TypedImplFile list option * string[]) option, _reactorOps: IReactorOperations) =
type FSharpCheckProjectResults(projectFileName:string, tcConfigOption, keepAssemblyContents, errors: FSharpErrorInfo[], details:(TcGlobals*TcImports*CcuThunk*ModuleOrNamespaceType*TcSymbolUses list*TopAttribs option*CompileOps.IRawFSharpAssemblyData option * ILAssemblyRef * AccessorDomain * TypedImplFile list option * string[]) option, _reactorOps: IReactorOperations) =
let getDetails() =
match details with
| None -> invalidOp ("The project has no results due to critical errors in the project options. Check the HasCriticalErrors before accessing the detaild results. Errors: " + String.concat "\n" [ for e in errors -> e.Message ])
| None -> invalidOp ("The project has no results due to critical errors in the project options. Check the HasCriticalErrors before accessing the detailed results. Errors: " + String.concat "\n" [ for e in errors -> e.Message ])
| Some d -> d
let getTcConfig() =
match tcConfigOption with
| None -> invalidOp ("The project has no results due to critical errors in the project options. Check the HasCriticalErrors before accessing the detailed results. Errors: " + String.concat "\n" [ for e in errors -> e.Message ])
| Some d -> d
member info.Errors = errors
......@@ -1821,13 +1826,29 @@ type FSharpCheckProjectResults(projectFileName:string, keepAssemblyContents, err
let (tcGlobals, tcImports, thisCcu, ccuSig, _tcSymbolUses, topAttribs, _tcAssemblyData, _ilAssemRef, _ad, _tcAssemblyExpr, _dependencyFiles) = getDetails()
FSharpAssemblySignature(tcGlobals, thisCcu, tcImports, topAttribs, ccuSig)
member info.AssemblyContents =
member info.TypedImplementionFiles =
if not keepAssemblyContents then invalidOp "The 'keepAssemblyContents' flag must be set to true on the FSharpChecker in order to access the checked contents of assemblies"
let (tcGlobals, tcImports, thisCcu, _ccuSig, _tcSymbolUses, _topAttribs, _tcAssemblyData, _ilAssemRef, _ad, tcAssemblyExpr, _dependencyFiles) = getDetails()
let mimpls =
match tcAssemblyExpr with
| None -> []
| Some mimpls -> mimpls
tcGlobals, thisCcu, tcImports, mimpls
member info.AssemblyContents = FSharpAssemblyContents(info.TypedImplementionFiles)
member info.GetOptimizedAssemblyContents() =
let tcGlobals, thisCcu, tcImports, mimpls = info.TypedImplementionFiles
let outfile = "" // only used if tcConfig.writeTermsToFiles is true
let importMap = tcImports.GetImportMap()
let optEnv0 = GetInitialOptimizationEnv (tcImports, tcGlobals)
let tcConfig = getTcConfig()
let optimizedImpls, _optimizationData, _ = ApplyAllOptimizations (tcConfig, tcGlobals, (LightweightTcValForUsingInBuildMethodCall tcGlobals), outfile, importMap, false, optEnv0, thisCcu, mimpls)
let mimpls =
match optimizedImpls with
| TypedAssemblyAfterOptimization files ->
files |> List.map fst
FSharpAssemblyContents(tcGlobals, thisCcu, tcImports, mimpls)
// Not, this does not have to be a SyncOp, it can be called from any thread
......@@ -2706,13 +2727,13 @@ type BackgroundCompiler(legacyReferenceResolver, projectCacheSize, keepAssemblyC
use _unwind = decrement
match builderOpt with
| None ->
return FSharpCheckProjectResults (options.ProjectFileName, keepAssemblyContents, Array.ofList creationErrors, None, reactorOps)
return FSharpCheckProjectResults (options.ProjectFileName, None, keepAssemblyContents, Array.ofList creationErrors, None, reactorOps)
| Some builder ->
let! (tcProj, ilAssemRef, tcAssemblyDataOpt, tcAssemblyExprOpt) = builder.GetCheckResultsAndImplementationsForProject(ctok)
let errorOptions = tcProj.TcConfig.errorSeverityOptions
let fileName = TcGlobals.DummyFileNameForRangesWithoutASpecificLocation
let errors = [| yield! creationErrors; yield! ErrorHelpers.CreateErrorInfos (errorOptions, true, fileName, tcProj.Errors) |]
return FSharpCheckProjectResults (options.ProjectFileName, keepAssemblyContents, errors, Some(tcProj.TcGlobals, tcProj.TcImports, tcProj.TcState.Ccu, tcProj.TcState.PartialAssemblySignature, tcProj.TcSymbolUses, tcProj.TopAttribs, tcAssemblyDataOpt, ilAssemRef, tcProj.TcEnvAtEnd.AccessRights, tcAssemblyExprOpt, Array.ofList tcProj.TcDependencyFiles), reactorOps)
return FSharpCheckProjectResults (options.ProjectFileName, Some tcProj.TcConfig, keepAssemblyContents, errors, Some(tcProj.TcGlobals, tcProj.TcImports, tcProj.TcState.Ccu, tcProj.TcState.PartialAssemblySignature, tcProj.TcSymbolUses, tcProj.TopAttribs, tcAssemblyDataOpt, ilAssemRef, tcProj.TcEnvAtEnd.AccessRights, tcAssemblyExprOpt, Array.ofList tcProj.TcDependencyFiles), reactorOps)
}
/// Get the timestamp that would be on the output if fully built immediately
......@@ -3231,7 +3252,7 @@ type FsiInteractiveChecker(legacyReferenceResolver, reactorOps: IReactorOperatio
| Parser.TypeCheckAborted.No scope ->
let errors = [| yield! parseErrors; yield! tcErrors |]
let typeCheckResults = FSharpCheckFileResults (filename, errors, Some scope, dependencyFiles, None, reactorOps, false)
let projectResults = FSharpCheckProjectResults (filename, keepAssemblyContents, errors, Some(tcGlobals, tcImports, scope.ThisCcu, scope.CcuSig, [scope.ScopeSymbolUses], None, None, mkSimpleAssRef "stdin", tcState.TcEnvFromImpls.AccessRights, None, dependencyFiles), reactorOps)
let projectResults = FSharpCheckProjectResults (filename, Some tcConfig, keepAssemblyContents, errors, Some(tcGlobals, tcImports, scope.ThisCcu, scope.CcuSig, [scope.ScopeSymbolUses], None, None, mkSimpleAssRef "stdin", tcState.TcEnvFromImpls.AccessRights, None, dependencyFiles), reactorOps)
parseResults, typeCheckResults, projectResults
| _ ->
failwith "unexpected aborted"
......
......@@ -269,6 +269,9 @@ type public FSharpCheckProjectResults =
/// Get a view of the overall contents of the assembly. Only valid to use if HasCriticalErrors is false.
member AssemblyContents: FSharpAssemblyContents
/// Get an optimized view of the overall contents of the assembly. Only valid to use if HasCriticalErrors is false.
member GetOptimizedAssemblyContents: unit -> FSharpAssemblyContents
/// Get the resolution of the ProjectOptions
member ProjectContext: FSharpProjectContext
......
......@@ -197,6 +197,98 @@ module FSharpExprConvert =
| Expr.Op(TOp.ValFieldSet rfref, _, _, _) when IsStaticInitializationField rfref -> Some ()
| _ -> None
let (|ILUnaryOp|_|) e =
match e with
| AI_neg -> Some mkCallUnaryNegOperator
| AI_not -> Some mkCallUnaryNotOperator
| _ -> None
let (|ILBinaryOp|_|) e =
match e with
| AI_add -> Some mkCallAdditionOperator
| AI_add_ovf
| AI_add_ovf_un -> Some mkCallAdditionChecked
| AI_sub -> Some mkCallSubtractionOperator
| AI_sub_ovf
| AI_sub_ovf_un -> Some mkCallSubtractionChecked
| AI_mul -> Some mkCallMultiplyOperator
| AI_mul_ovf
| AI_mul_ovf_un -> Some mkCallMultiplyChecked
| AI_div
| AI_div_un -> Some mkCallDivisionOperator
| AI_rem
| AI_rem_un -> Some mkCallModulusOperator
| AI_ceq -> Some mkCallEqualsOperator
| AI_clt
| AI_clt_un -> Some mkCallLessThanOperator
| AI_cgt
| AI_cgt_un -> Some mkCallGreaterThanOperator
| AI_and -> Some mkCallBitwiseAndOperator
| AI_or -> Some mkCallBitwiseOrOperator
| AI_xor -> Some mkCallBitwiseXorOperator
| AI_shl -> Some mkCallShiftLeftOperator
| AI_shr
| AI_shr_un -> Some mkCallShiftRightOperator
| _ -> None
let (|ILConvertOp|_|) e =
match e with
| AI_conv basicTy ->
match basicTy with
| DT_R -> Some mkCallToDoubleOperator
| DT_I1 -> Some mkCallToSByteOperator
| DT_U1 -> Some mkCallToByteOperator
| DT_I2 -> Some mkCallToInt16Operator
| DT_U2 -> Some mkCallToUInt16Operator
| DT_I4 -> Some mkCallToInt32Operator
| DT_U4 -> Some mkCallToUInt32Operator
| DT_I8 -> Some mkCallToInt64Operator
| DT_U8 -> Some mkCallToUInt64Operator
| DT_R4 -> Some mkCallToSingleOperator
| DT_R8 -> Some mkCallToDoubleOperator
| DT_I -> Some mkCallToIntPtrOperator
| DT_U -> Some mkCallToUIntPtrOperator
| DT_REF -> None
| AI_conv_ovf basicTy
| AI_conv_ovf_un basicTy ->
match basicTy with
| DT_R -> Some mkCallToDoubleOperator
| DT_I1 -> Some mkCallToSByteChecked
| DT_U1 -> Some mkCallToByteChecked
| DT_I2 -> Some mkCallToInt16Checked
| DT_U2 -> Some mkCallToUInt16Checked
| DT_I4 -> Some mkCallToInt32Checked
| DT_U4 -> Some mkCallToUInt32Checked
| DT_I8 -> Some mkCallToInt64Checked
| DT_U8 -> Some mkCallToUInt64Checked
| DT_R4 -> Some mkCallToSingleOperator
| DT_R8 -> Some mkCallToDoubleOperator
| DT_I -> Some mkCallToIntPtrChecked
| DT_U -> Some mkCallToUIntPtrChecked
| DT_REF -> None
| _ -> None
let (|TTypeConvOp|_|) (cenv:Impl.cenv) ty =
let g = cenv.g
match ty with
| TType_app (tcref,_) ->
match tcref with
| _ when tyconRefEq g tcref g.sbyte_tcr -> Some mkCallToSByteOperator
| _ when tyconRefEq g tcref g.byte_tcr -> Some mkCallToByteOperator
| _ when tyconRefEq g tcref g.int16_tcr -> Some mkCallToInt16Operator
| _ when tyconRefEq g tcref g.uint16_tcr -> Some mkCallToUInt16Operator
| _ when tyconRefEq g tcref g.int_tcr -> Some mkCallToIntOperator
| _ when tyconRefEq g tcref g.int32_tcr -> Some mkCallToInt32Operator
| _ when tyconRefEq g tcref g.uint32_tcr -> Some mkCallToUInt32Operator
| _ when tyconRefEq g tcref g.int64_tcr -> Some mkCallToInt64Operator
| _ when tyconRefEq g tcref g.uint64_tcr -> Some mkCallToUInt64Operator
| _ when tyconRefEq g tcref g.float32_tcr -> Some mkCallToSingleOperator
| _ when tyconRefEq g tcref g.float_tcr -> Some mkCallToDoubleOperator
| _ when tyconRefEq g tcref g.nativeint_tcr -> Some mkCallToIntPtrOperator
| _ when tyconRefEq g tcref g.unativeint_tcr -> Some mkCallToUIntPtrOperator
| _ -> None
| _ -> None
let ConvType cenv typ = FSharpType(cenv, typ)
let ConvTypes cenv typs = List.map (ConvType cenv) typs
let ConvILTypeRefApp (cenv:Impl.cenv) m tref tyargs =
......@@ -530,11 +622,89 @@ module FSharpExprConvert =
let argR = ConvExpr cenv env arg
E.ILFieldSet(None, typR, fspec.Name, argR)
| TOp.ILAsm([ AI_ceq ], _), _, [arg1;arg2] ->
| TOp.ILAsm([ ], [tty]), _, [arg] ->
match tty with
| TTypeConvOp cenv convOp ->
let ty = tyOfExpr cenv.g arg
let op = convOp cenv.g m ty arg
ConvExprPrim cenv env op
| _ ->
ConvExprPrim cenv env arg
| TOp.ILAsm([ I_box _ ], _), [ty], [arg] ->
let op = mkCallBox cenv.g m ty arg
ConvExprPrim cenv env op
| TOp.ILAsm([ I_unbox_any _ ], _), [ty], [arg] ->
let op = mkCallUnbox cenv.g m ty arg
ConvExprPrim cenv env op
| TOp.ILAsm([ I_isinst _ ], _), [ty], [arg] ->
let op = mkCallTypeTest cenv.g m ty arg
ConvExprPrim cenv env op
| TOp.ILAsm ([ I_call (Normalcall, mspec, None) ], _), _, [arg]
when mspec.MethodRef.DeclaringTypeRef.Name = "System.String" && mspec.Name = "GetHashCode" ->
let ty = tyOfExpr cenv.g arg
let op = mkCallHash cenv.g m ty arg
ConvExprPrim cenv env op
| TOp.ILCall(_, _, _, _, _, _, _, mref, _, _, _), [],
[Expr.Op(TOp.ILAsm([ I_ldtoken (ILToken.ILType _) ], _), [ty], _, _)]
when mref.DeclaringTypeRef.Name = "System.Type" && mref.Name = "GetTypeFromHandle" ->
let op = mkCallTypeOf cenv.g m ty
ConvExprPrim cenv env op
| TOp.ILAsm([ EI_ilzero _ ], _), [ty], _ ->
E.DefaultValue (ConvType cenv ty)
| TOp.ILAsm([ AI_ldnull; AI_cgt_un ], _), _, [arg] ->
let elemTy = tyOfExpr cenv.g arg
let nullVal = mkNull m elemTy
let op = mkCallNotEqualsOperator cenv.g m elemTy arg nullVal
ConvExprPrim cenv env op
| TOp.ILAsm([ I_ldlen; AI_conv DT_I4 ], _), _, [arr] ->
let arrayTy = tyOfExpr cenv.g arr
let elemTy = destArrayTy cenv.g arrayTy
let op = mkCallArrayLength cenv.g m elemTy arr
ConvExprPrim cenv env op
| TOp.ILAsm([ I_newarr (ILArrayShape [(Some 0, None)], _)], _), [elemTy], xa ->
E.NewArray(ConvType cenv elemTy, ConvExprs cenv env xa)
| TOp.ILAsm([ I_ldelem_any (ILArrayShape [(Some 0, None)], _)], _), [elemTy], [arr; idx1] ->
let op = mkCallArrayGet cenv.g m elemTy arr idx1
ConvExprPrim cenv env op
| TOp.ILAsm([ I_stelem_any (ILArrayShape [(Some 0, None)], _)], _), [elemTy], [arr; idx1; v] ->
let op = mkCallArraySet cenv.g m elemTy arr idx1 v
ConvExprPrim cenv env op
| TOp.ILAsm([ ILUnaryOp unaryOp ], _), _, [arg] ->
let ty = tyOfExpr cenv.g arg
let op = unaryOp cenv.g m ty arg
ConvExprPrim cenv env op
| TOp.ILAsm([ ILBinaryOp binaryOp ], _), _, [arg1;arg2] ->
let ty = tyOfExpr cenv.g arg1
let eq = mkCallEqualsOperator cenv.g m ty arg1 arg2
ConvExprPrim cenv env eq
let op = binaryOp cenv.g m ty arg1 arg2
ConvExprPrim cenv env op
| TOp.ILAsm([ ILConvertOp convertOp1; ILConvertOp convertOp2 ], _), _, [arg] ->
let ty1 = tyOfExpr cenv.g arg
let op1 = convertOp1 cenv.g m ty1 arg
let ty2 = tyOfExpr cenv.g op1
let op2 = convertOp2 cenv.g m ty2 op1
ConvExprPrim cenv env op2
| TOp.ILAsm([ ILConvertOp convertOp ], [TType_app (tcref,_)]), _, [arg] ->
let ty = tyOfExpr cenv.g arg
let op =
if tyconRefEq cenv.g tcref cenv.g.char_tcr
then mkCallToCharOperator cenv.g m ty arg
else convertOp cenv.g m ty arg
ConvExprPrim cenv env op
| TOp.ILAsm([ I_throw ], _), _, [arg1] ->
let raiseExpr = mkCallRaise cenv.g m (tyOfExpr cenv.g expr) arg1
......@@ -603,17 +773,18 @@ module FSharpExprConvert =
| TOp.While _, [], [Expr.Lambda(_, _, _, [_], test, _, _);Expr.Lambda(_, _, _, [_], body, _, _)] ->
E.WhileLoop(ConvExpr cenv env test, ConvExpr cenv env body)
| TOp.For(_, (FSharpForLoopUp |FSharpForLoopDown as dir) ), [], [Expr.Lambda(_, _, _, [_], lim0, _, _); Expr.Lambda(_, _, _, [_], SimpleArrayLoopUpperBound, lm, _); SimpleArrayLoopBody cenv.g (arr, elemTy, body)] ->
| TOp.For(_, dir), [], [Expr.Lambda(_, _, _, [_], lim0, _, _); Expr.Lambda(_, _, _, [_], SimpleArrayLoopUpperBound, lm, _); SimpleArrayLoopBody cenv.g (arr, elemTy, body)] ->
let lim1 =
let len = mkCallArrayLength cenv.g lm elemTy arr // Array.length arr
mkCallSubtractionOperator cenv.g lm cenv.g.int32_ty len (Expr.Const(Const.Int32 1, m, cenv.g.int32_ty)) // len - 1
E.FastIntegerForLoop(ConvExpr cenv env lim0, ConvExpr cenv env lim1, ConvExpr cenv env body, (dir = FSharpForLoopUp))
| TOp.For(_, dir), [], [Expr.Lambda(_, _, _, [_], lim0, _, _);Expr.Lambda(_, _, _, [_], lim1, _, _);body] ->
match dir with
| FSharpForLoopUp -> E.FastIntegerForLoop(ConvExpr cenv env lim0, ConvExpr cenv env lim1, ConvExpr cenv env body, true)
| FSharpForLoopDown -> E.FastIntegerForLoop(ConvExpr cenv env lim0, ConvExpr cenv env lim1, ConvExpr cenv env body, false)
| _ -> failwith "unexpected for-loop form"
mkCallSubtractionOperator cenv.g lm cenv.g.int32_ty len (mkOne cenv.g lm) // len - 1
E.FastIntegerForLoop(ConvExpr cenv env lim0, ConvExpr cenv env lim1, ConvExpr cenv env body, dir <> FSharpForLoopDown)
| TOp.For(_, dir), [], [Expr.Lambda(_, _, _, [_], lim0, _, _); Expr.Lambda(_, _, _, [_], lim1, lm, _); body] ->
let lim1 =
if dir = CSharpForLoopUp then
mkCallSubtractionOperator cenv.g lm cenv.g.int32_ty lim1 (mkOne cenv.g lm) // len - 1
else lim1
E.FastIntegerForLoop(ConvExpr cenv env lim0, ConvExpr cenv env lim1, ConvExpr cenv env body, dir <> FSharpForLoopDown)
| TOp.ILCall(_, _, _, isNewObj, valUseFlags, _isProp, _, ilMethRef, enclTypeArgs, methTypeArgs, _tys), [], callArgs ->
ConvILCall cenv env (isNewObj, valUseFlags, ilMethRef, enclTypeArgs, methTypeArgs, callArgs, m)
......
......@@ -112,7 +112,7 @@ let mkStandardProjectReferences () =
yield fsCoreDefaultReference() ]
#endif
let mkProjectCommandLineArgs (dllName, fileNames) =
let mkProjectCommandLineArgsSilent (dllName, fileNames) =
let args =
[| yield "--simpleresolution"
yield "--noframework"
......@@ -134,6 +134,10 @@ let mkProjectCommandLineArgs (dllName, fileNames) =
for r in references do
yield "-r:" + r
|]
args
let mkProjectCommandLineArgs (dllName, fileNames) =
let args = mkProjectCommandLineArgsSilent (dllName, fileNames)
printfn "dllName = %A, args = %A" dllName args
args
......
因为 它太大了无法显示 source diff 。你可以改为 查看blob
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册