提交 14e63aa0 编写于 作者: A Allison Chou

More refactoring

上级 ecd9e83f
......@@ -10329,7 +10329,7 @@ public async Task ExtractMethod_Argument1()
var service = new CSharpExtractMethodService();
Assert.NotNull(await Record.ExceptionAsync(async () =>
{
var tree = await service.ExtractMethodAsync(null, default, false, true, null, CancellationToken.None);
var tree = await service.ExtractMethodAsync(null, default, false, null, CancellationToken.None);
}));
}
......
......@@ -22,9 +22,9 @@ protected override CSharpSelectionValidator CreateSelectionValidator(SemanticDoc
return new CSharpSelectionValidator(document, textSpan, options);
}
protected override CSharpMethodExtractor CreateMethodExtractor(CSharpSelectionResult selectionResult, bool extractLocalFunction, bool preferStatic)
protected override CSharpMethodExtractor CreateMethodExtractor(CSharpSelectionResult selectionResult, bool extractLocalFunction)
{
return new CSharpMethodExtractor(selectionResult, extractLocalFunction, preferStatic);
return new CSharpMethodExtractor(selectionResult, extractLocalFunction);
}
}
}
......@@ -22,9 +22,8 @@ private class ExpressionCodeGenerator : CSharpCodeGenerator
InsertionPoint insertionPoint,
SelectionResult selectionResult,
AnalyzerResult analyzerResult,
bool extractLocalFunction,
bool preferStatic)
: base(insertionPoint, selectionResult, analyzerResult, extractLocalFunction, preferStatic)
bool extractLocalFunction)
: base(insertionPoint, selectionResult, analyzerResult, extractLocalFunction)
{
}
......
......@@ -19,9 +19,8 @@ public class MultipleStatementsCodeGenerator : CSharpCodeGenerator
InsertionPoint insertionPoint,
SelectionResult selectionResult,
AnalyzerResult analyzerResult,
bool extractLocalFunction,
bool preferStatic)
: base(insertionPoint, selectionResult, analyzerResult, extractLocalFunction, preferStatic)
bool extractLocalFunction)
: base(insertionPoint, selectionResult, analyzerResult, extractLocalFunction)
{
}
......
......@@ -19,9 +19,8 @@ public class SingleStatementCodeGenerator : CSharpCodeGenerator
InsertionPoint insertionPoint,
SelectionResult selectionResult,
AnalyzerResult analyzerResult,
bool extractLocalFunction,
bool preferStatic)
: base(insertionPoint, selectionResult, analyzerResult, extractLocalFunction, preferStatic)
bool extractLocalFunction)
: base(insertionPoint, selectionResult, analyzerResult, extractLocalFunction)
{
}
......
......@@ -32,10 +32,9 @@ private abstract partial class CSharpCodeGenerator : CodeGenerator<StatementSynt
SelectionResult selectionResult,
AnalyzerResult analyzerResult,
bool extractLocalFunction,
bool preferStatic,
CancellationToken cancellationToken)
{
var codeGenerator = Create(insertionPoint, selectionResult, analyzerResult, extractLocalFunction, preferStatic);
var codeGenerator = Create(insertionPoint, selectionResult, analyzerResult, extractLocalFunction);
return codeGenerator.GenerateAsync(cancellationToken);
}
......@@ -43,22 +42,21 @@ private abstract partial class CSharpCodeGenerator : CodeGenerator<StatementSynt
InsertionPoint insertionPoint,
SelectionResult selectionResult,
AnalyzerResult analyzerResult,
bool extractLocalFunction,
bool preferStatic)
bool extractLocalFunction)
{
if (ExpressionCodeGenerator.IsExtractMethodOnExpression(selectionResult))
{
return new ExpressionCodeGenerator(insertionPoint, selectionResult, analyzerResult, extractLocalFunction, preferStatic);
return new ExpressionCodeGenerator(insertionPoint, selectionResult, analyzerResult, extractLocalFunction);
}
if (SingleStatementCodeGenerator.IsExtractMethodOnSingleStatement(selectionResult))
{
return new SingleStatementCodeGenerator(insertionPoint, selectionResult, analyzerResult, extractLocalFunction, preferStatic);
return new SingleStatementCodeGenerator(insertionPoint, selectionResult, analyzerResult, extractLocalFunction);
}
if (MultipleStatementsCodeGenerator.IsExtractMethodOnMultipleStatements(selectionResult))
{
return new MultipleStatementsCodeGenerator(insertionPoint, selectionResult, analyzerResult, extractLocalFunction, preferStatic);
return new MultipleStatementsCodeGenerator(insertionPoint, selectionResult, analyzerResult, extractLocalFunction);
}
return Contract.FailWithReturn<CSharpCodeGenerator>("Unknown selection");
......@@ -68,9 +66,8 @@ private abstract partial class CSharpCodeGenerator : CodeGenerator<StatementSynt
InsertionPoint insertionPoint,
SelectionResult selectionResult,
AnalyzerResult analyzerResult,
bool extractLocalFunction,
bool preferStatic)
: base(insertionPoint, selectionResult, analyzerResult, extractLocalFunction, preferStatic)
bool extractLocalFunction)
: base(insertionPoint, selectionResult, analyzerResult, extractLocalFunction)
{
Contract.ThrowIfFalse(this.SemanticDocument == selectionResult.SemanticDocument);
......
......@@ -17,8 +17,8 @@ namespace Microsoft.CodeAnalysis.CSharp.ExtractMethod
{
internal partial class CSharpMethodExtractor : MethodExtractor
{
public CSharpMethodExtractor(CSharpSelectionResult result, bool extractLocalFunction = false, bool preferStatic = true)
: base(result, extractLocalFunction, preferStatic)
public CSharpMethodExtractor(CSharpSelectionResult result, bool extractLocalFunction = false)
: base(result, extractLocalFunction)
{
}
......@@ -76,7 +76,7 @@ protected override async Task<SemanticDocument> ExpandAsync(SelectionResult sele
protected override Task<GeneratedCode> GenerateCodeAsync(InsertionPoint insertionPoint, SelectionResult selectionResult, AnalyzerResult analyzeResult, CancellationToken cancellationToken)
{
return CSharpCodeGenerator.GenerateAsync(insertionPoint, selectionResult, analyzeResult, ExtractLocalFunction, PreferStaticFunction, cancellationToken);
return CSharpCodeGenerator.GenerateAsync(insertionPoint, selectionResult, analyzeResult, ExtractLocalFunction, cancellationToken);
}
protected override IEnumerable<AbstractFormattingRule> GetFormattingRules(Document document)
......
......@@ -13,13 +13,12 @@ internal abstract class AbstractExtractMethodService<TValidator, TExtractor, TRe
where TResult : SelectionResult
{
protected abstract TValidator CreateSelectionValidator(SemanticDocument document, TextSpan textSpan, OptionSet options);
protected abstract TExtractor CreateMethodExtractor(TResult selectionResult, bool extractLocalMethod, bool preferStatic);
protected abstract TExtractor CreateMethodExtractor(TResult selectionResult, bool extractLocalMethod);
public async Task<ExtractMethodResult> ExtractMethodAsync(
Document document,
TextSpan textSpan,
bool extractLocalFunction,
bool preferStatic,
OptionSet options,
CancellationToken cancellationToken)
{
......@@ -38,7 +37,7 @@ internal abstract class AbstractExtractMethodService<TValidator, TExtractor, TRe
cancellationToken.ThrowIfCancellationRequested();
// extract method
var extractor = CreateMethodExtractor((TResult)selectionResult, extractLocalFunction, preferStatic);
var extractor = CreateMethodExtractor((TResult)selectionResult, extractLocalFunction);
return await extractor.ExtractMethodAsync(cancellationToken).ConfigureAwait(false);
}
......
......@@ -12,7 +12,7 @@ internal static class ExtractMethodService
{
public static Task<ExtractMethodResult> ExtractMethodAsync(Document document, TextSpan textSpan, bool extractLocalMethod = false, bool preferStatic = true, OptionSet options = null, CancellationToken cancellationToken = default)
{
return document.GetLanguageService<IExtractMethodService>().ExtractMethodAsync(document, textSpan, extractLocalMethod, preferStatic, options, cancellationToken);
return document.GetLanguageService<IExtractMethodService>().ExtractMethodAsync(document, textSpan, extractLocalMethod, options, cancellationToken);
}
}
}
......@@ -10,6 +10,6 @@ namespace Microsoft.CodeAnalysis.ExtractMethod
{
internal interface IExtractMethodService : ILanguageService
{
Task<ExtractMethodResult> ExtractMethodAsync(Document document, TextSpan textSpan, bool extractLocalFunction = false, bool preferStatic = true, OptionSet options = null, CancellationToken cancellationToken = default);
Task<ExtractMethodResult> ExtractMethodAsync(Document document, TextSpan textSpan, bool extractLocalFunction = false, OptionSet options = null, CancellationToken cancellationToken = default);
}
}
......@@ -32,9 +32,9 @@ protected abstract partial class CodeGenerator<TStatement, TExpression, TNodeUnd
protected readonly AnalyzerResult AnalyzerResult;
protected readonly bool ExtractLocalFunction;
protected readonly bool PreferStaticFunction;
protected CodeGenerator(InsertionPoint insertionPoint, SelectionResult selectionResult, AnalyzerResult analyzerResult, bool extractLocalFunction = false, bool preferStatic = true)
protected CodeGenerator(InsertionPoint insertionPoint, SelectionResult selectionResult, AnalyzerResult analyzerResult, bool extractLocalFunction = false)
{
Contract.ThrowIfFalse(insertionPoint.SemanticDocument == analyzerResult.SemanticDocument);
......@@ -45,7 +45,6 @@ protected CodeGenerator(InsertionPoint insertionPoint, SelectionResult selection
AnalyzerResult = analyzerResult;
ExtractLocalFunction = extractLocalFunction;
PreferStaticFunction = preferStatic;
MethodNameAnnotation = new SyntaxAnnotation();
CallSiteAnnotation = new SyntaxAnnotation();
......@@ -106,7 +105,7 @@ public async Task<GeneratedCode> GenerateAsync(CancellationToken cancellationTok
{
newContainer = codeGenerationService.AddMethod(
destination, result.Data,
new CodeGenerationOptions(generateDefaultAccessibility: false, generateMethodBodies: true, generateStaticModifier: PreferStaticFunction),
new CodeGenerationOptions(generateDefaultAccessibility: false, generateMethodBodies: true),
cancellationToken);
}
else
......
......@@ -17,12 +17,11 @@ internal abstract partial class MethodExtractor
protected readonly bool ExtractLocalFunction;
protected readonly bool PreferStaticFunction;
public MethodExtractor(SelectionResult selectionResult, bool extractLocalFunction = false, bool preferStatic = true)
public MethodExtractor(SelectionResult selectionResult, bool extractLocalFunction = false)
{
Contract.ThrowIfNull(selectionResult);
OriginalSelectionResult = selectionResult;
ExtractLocalFunction = extractLocalFunction;
PreferStaticFunction = preferStatic;
}
protected abstract Task<AnalyzerResult> AnalyzeAsync(SelectionResult selectionResult, CancellationToken cancellationToken);
......
......@@ -21,7 +21,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.ExtractMethod
Return New VisualBasicSelectionValidator(document, textSpan, options)
End Function
Protected Overrides Function CreateMethodExtractor(selectionResult As VisualBasicSelectionResult, extractLocalFunction As Boolean, preferStatic As Boolean) As VisualBasicMethodExtractor
Protected Overrides Function CreateMethodExtractor(selectionResult As VisualBasicSelectionResult, extractLocalFunction As Boolean) As VisualBasicMethodExtractor
Return New VisualBasicMethodExtractor(selectionResult)
End Function
End Class
......
// Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.CodeAnalysis.CodeGeneration;
......@@ -169,8 +168,10 @@ internal static class MethodGenerator
var explicitInterfaceSpecifier = GenerateExplicitInterfaceSpecifier(method.ExplicitInterfaceImplementations);
var preferStaticFunction = workspace.Options.GetOption(CSharpCodeStyleOptions.PreferStaticLocalFunction).Value;
var localMethodDeclaration = SyntaxFactory.LocalFunctionStatement(
modifiers: GenerateModifiers(method, destination, options),
modifiers: GenerateModifiers(method, destination, options, preferStaticFunction),
returnType: method.GenerateReturnTypeSyntax(),
identifier: method.Name.ToIdentifierToken(),
typeParameterList: GenerateTypeParameterList(method, options),
......@@ -251,7 +252,7 @@ internal static class MethodGenerator
}
private static SyntaxTokenList GenerateModifiers(
IMethodSymbol method, CodeGenerationDestination destination, CodeGenerationOptions options)
IMethodSymbol method, CodeGenerationDestination destination, CodeGenerationOptions options, bool preferStaticFunction = true)
{
var tokens = ArrayBuilder<SyntaxToken>.GetInstance();
......@@ -282,7 +283,7 @@ internal static class MethodGenerator
tokens.Add(SyntaxFactory.Token(SyntaxKind.SealedKeyword));
}
if (method.IsStatic && options.GenerateStaticModifier)
if (method.IsStatic && preferStaticFunction)
{
tokens.Add(SyntaxFactory.Token(SyntaxKind.StaticKeyword));
}
......
......@@ -155,7 +155,6 @@ internal class CodeGenerationOptions
bool autoInsertionLocation = true,
bool sortMembers = true,
bool reuseSyntax = false,
bool generateStaticModifier = true,
ParseOptions parseOptions = null)
{
CheckLocation(contextLocation, nameof(contextLocation));
......@@ -177,7 +176,6 @@ internal class CodeGenerationOptions
this.AutoInsertionLocation = autoInsertionLocation;
this.SortMembers = sortMembers;
this.ReuseSyntax = reuseSyntax;
this.GenerateStaticModifier = generateStaticModifier;
this.ParseOptions = parseOptions ?? this.BestLocation?.SourceTree.Options;
}
......@@ -218,7 +216,6 @@ internal Location BestLocation
Optional<bool> autoInsertionLocation = default,
Optional<bool> sortMembers = default,
Optional<bool> reuseSyntax = default,
Optional<bool> generateStaticModifier = default,
Optional<ParseOptions> parseOptions = default)
{
var newContextLocation = contextLocation.HasValue ? contextLocation.Value : this.ContextLocation;
......@@ -236,7 +233,6 @@ internal Location BestLocation
var newAutoInsertionLocation = autoInsertionLocation.HasValue ? autoInsertionLocation.Value : this.AutoInsertionLocation;
var newSortMembers = sortMembers.HasValue ? sortMembers.Value : this.SortMembers;
var newReuseSyntax = reuseSyntax.HasValue ? reuseSyntax.Value : this.ReuseSyntax;
var newGenerateStaticModifier = generateStaticModifier.HasValue ? generateStaticModifier.Value : this.GenerateStaticModifier;
var newParseOptions = parseOptions.HasValue ? parseOptions.Value : this.ParseOptions;
return new CodeGenerationOptions(
......@@ -255,7 +251,6 @@ internal Location BestLocation
newAutoInsertionLocation,
newSortMembers,
newReuseSyntax,
newGenerateStaticModifier,
newParseOptions);
}
}
......
......@@ -656,7 +656,7 @@ internal class WorkspacesResources {
}
/// <summary>
/// Looks up a localized string similar to Destination type must be a {0}, {1} or {2}, {3} or {4}, but given one is {5}..
/// Looks up a localized string similar to Destination type must be a {0}, {1}, {2}, {3} or {4}, but given one is {5}..
/// </summary>
internal static string Destination_type_must_be_a_0_1_2_3_or_4_but_given_one_is_5 {
get {
......
......@@ -139,7 +139,7 @@
<value>Destination type must be a {0}, {1} or {2}, but given one is {3}.</value>
</data>
<data name="Destination_type_must_be_a_0_1_2_3_or_4_but_given_one_is_5" xml:space="preserve">
<value>Destination type must be a {0}, {1} or {2}, {3} or {4}, but given one is {5}.</value>
<value>Destination type must be a {0}, {1}, {2}, {3} or {4}, but given one is {5}.</value>
</data>
<data name="Could_not_find_location_to_generation_symbol_into" xml:space="preserve">
<value>Could not find location to generation symbol into.</value>
......
......@@ -38,8 +38,8 @@
<note />
</trans-unit>
<trans-unit id="Destination_type_must_be_a_0_1_2_3_or_4_but_given_one_is_5">
<source>Destination type must be a {0}, {1} or {2}, {3} or {4}, but given one is {5}.</source>
<target state="new">Destination type must be a {0}, {1} or {2}, {3} or {4}, but given one is {5}.</target>
<source>Destination type must be a {0}, {1}, {2}, {3} or {4}, but given one is {5}.</source>
<target state="new">Destination type must be a {0}, {1}, {2}, {3} or {4}, but given one is {5}.</target>
<note />
</trans-unit>
<trans-unit id="Document_does_not_support_syntax_trees">
......
......@@ -38,8 +38,8 @@
<note />
</trans-unit>
<trans-unit id="Destination_type_must_be_a_0_1_2_3_or_4_but_given_one_is_5">
<source>Destination type must be a {0}, {1} or {2}, {3} or {4}, but given one is {5}.</source>
<target state="new">Destination type must be a {0}, {1} or {2}, {3} or {4}, but given one is {5}.</target>
<source>Destination type must be a {0}, {1}, {2}, {3} or {4}, but given one is {5}.</source>
<target state="new">Destination type must be a {0}, {1}, {2}, {3} or {4}, but given one is {5}.</target>
<note />
</trans-unit>
<trans-unit id="Document_does_not_support_syntax_trees">
......
......@@ -38,8 +38,8 @@
<note />
</trans-unit>
<trans-unit id="Destination_type_must_be_a_0_1_2_3_or_4_but_given_one_is_5">
<source>Destination type must be a {0}, {1} or {2}, {3} or {4}, but given one is {5}.</source>
<target state="new">Destination type must be a {0}, {1} or {2}, {3} or {4}, but given one is {5}.</target>
<source>Destination type must be a {0}, {1}, {2}, {3} or {4}, but given one is {5}.</source>
<target state="new">Destination type must be a {0}, {1}, {2}, {3} or {4}, but given one is {5}.</target>
<note />
</trans-unit>
<trans-unit id="Document_does_not_support_syntax_trees">
......
......@@ -38,8 +38,8 @@
<note />
</trans-unit>
<trans-unit id="Destination_type_must_be_a_0_1_2_3_or_4_but_given_one_is_5">
<source>Destination type must be a {0}, {1} or {2}, {3} or {4}, but given one is {5}.</source>
<target state="new">Destination type must be a {0}, {1} or {2}, {3} or {4}, but given one is {5}.</target>
<source>Destination type must be a {0}, {1}, {2}, {3} or {4}, but given one is {5}.</source>
<target state="new">Destination type must be a {0}, {1}, {2}, {3} or {4}, but given one is {5}.</target>
<note />
</trans-unit>
<trans-unit id="Document_does_not_support_syntax_trees">
......
......@@ -38,8 +38,8 @@
<note />
</trans-unit>
<trans-unit id="Destination_type_must_be_a_0_1_2_3_or_4_but_given_one_is_5">
<source>Destination type must be a {0}, {1} or {2}, {3} or {4}, but given one is {5}.</source>
<target state="new">Destination type must be a {0}, {1} or {2}, {3} or {4}, but given one is {5}.</target>
<source>Destination type must be a {0}, {1}, {2}, {3} or {4}, but given one is {5}.</source>
<target state="new">Destination type must be a {0}, {1}, {2}, {3} or {4}, but given one is {5}.</target>
<note />
</trans-unit>
<trans-unit id="Document_does_not_support_syntax_trees">
......
......@@ -38,8 +38,8 @@
<note />
</trans-unit>
<trans-unit id="Destination_type_must_be_a_0_1_2_3_or_4_but_given_one_is_5">
<source>Destination type must be a {0}, {1} or {2}, {3} or {4}, but given one is {5}.</source>
<target state="new">Destination type must be a {0}, {1} or {2}, {3} or {4}, but given one is {5}.</target>
<source>Destination type must be a {0}, {1}, {2}, {3} or {4}, but given one is {5}.</source>
<target state="new">Destination type must be a {0}, {1}, {2}, {3} or {4}, but given one is {5}.</target>
<note />
</trans-unit>
<trans-unit id="Document_does_not_support_syntax_trees">
......
......@@ -38,8 +38,8 @@
<note />
</trans-unit>
<trans-unit id="Destination_type_must_be_a_0_1_2_3_or_4_but_given_one_is_5">
<source>Destination type must be a {0}, {1} or {2}, {3} or {4}, but given one is {5}.</source>
<target state="new">Destination type must be a {0}, {1} or {2}, {3} or {4}, but given one is {5}.</target>
<source>Destination type must be a {0}, {1}, {2}, {3} or {4}, but given one is {5}.</source>
<target state="new">Destination type must be a {0}, {1}, {2}, {3} or {4}, but given one is {5}.</target>
<note />
</trans-unit>
<trans-unit id="Document_does_not_support_syntax_trees">
......
......@@ -38,8 +38,8 @@
<note />
</trans-unit>
<trans-unit id="Destination_type_must_be_a_0_1_2_3_or_4_but_given_one_is_5">
<source>Destination type must be a {0}, {1} or {2}, {3} or {4}, but given one is {5}.</source>
<target state="new">Destination type must be a {0}, {1} or {2}, {3} or {4}, but given one is {5}.</target>
<source>Destination type must be a {0}, {1}, {2}, {3} or {4}, but given one is {5}.</source>
<target state="new">Destination type must be a {0}, {1}, {2}, {3} or {4}, but given one is {5}.</target>
<note />
</trans-unit>
<trans-unit id="Document_does_not_support_syntax_trees">
......
......@@ -38,8 +38,8 @@
<note />
</trans-unit>
<trans-unit id="Destination_type_must_be_a_0_1_2_3_or_4_but_given_one_is_5">
<source>Destination type must be a {0}, {1} or {2}, {3} or {4}, but given one is {5}.</source>
<target state="new">Destination type must be a {0}, {1} or {2}, {3} or {4}, but given one is {5}.</target>
<source>Destination type must be a {0}, {1}, {2}, {3} or {4}, but given one is {5}.</source>
<target state="new">Destination type must be a {0}, {1}, {2}, {3} or {4}, but given one is {5}.</target>
<note />
</trans-unit>
<trans-unit id="Document_does_not_support_syntax_trees">
......
......@@ -38,8 +38,8 @@
<note />
</trans-unit>
<trans-unit id="Destination_type_must_be_a_0_1_2_3_or_4_but_given_one_is_5">
<source>Destination type must be a {0}, {1} or {2}, {3} or {4}, but given one is {5}.</source>
<target state="new">Destination type must be a {0}, {1} or {2}, {3} or {4}, but given one is {5}.</target>
<source>Destination type must be a {0}, {1}, {2}, {3} or {4}, but given one is {5}.</source>
<target state="new">Destination type must be a {0}, {1}, {2}, {3} or {4}, but given one is {5}.</target>
<note />
</trans-unit>
<trans-unit id="Document_does_not_support_syntax_trees">
......
......@@ -38,8 +38,8 @@
<note />
</trans-unit>
<trans-unit id="Destination_type_must_be_a_0_1_2_3_or_4_but_given_one_is_5">
<source>Destination type must be a {0}, {1} or {2}, {3} or {4}, but given one is {5}.</source>
<target state="new">Destination type must be a {0}, {1} or {2}, {3} or {4}, but given one is {5}.</target>
<source>Destination type must be a {0}, {1}, {2}, {3} or {4}, but given one is {5}.</source>
<target state="new">Destination type must be a {0}, {1}, {2}, {3} or {4}, but given one is {5}.</target>
<note />
</trans-unit>
<trans-unit id="Document_does_not_support_syntax_trees">
......
......@@ -38,8 +38,8 @@
<note />
</trans-unit>
<trans-unit id="Destination_type_must_be_a_0_1_2_3_or_4_but_given_one_is_5">
<source>Destination type must be a {0}, {1} or {2}, {3} or {4}, but given one is {5}.</source>
<target state="new">Destination type must be a {0}, {1} or {2}, {3} or {4}, but given one is {5}.</target>
<source>Destination type must be a {0}, {1}, {2}, {3} or {4}, but given one is {5}.</source>
<target state="new">Destination type must be a {0}, {1}, {2}, {3} or {4}, but given one is {5}.</target>
<note />
</trans-unit>
<trans-unit id="Document_does_not_support_syntax_trees">
......
......@@ -38,8 +38,8 @@
<note />
</trans-unit>
<trans-unit id="Destination_type_must_be_a_0_1_2_3_or_4_but_given_one_is_5">
<source>Destination type must be a {0}, {1} or {2}, {3} or {4}, but given one is {5}.</source>
<target state="new">Destination type must be a {0}, {1} or {2}, {3} or {4}, but given one is {5}.</target>
<source>Destination type must be a {0}, {1}, {2}, {3} or {4}, but given one is {5}.</source>
<target state="new">Destination type must be a {0}, {1}, {2}, {3} or {4}, but given one is {5}.</target>
<note />
</trans-unit>
<trans-unit id="Document_does_not_support_syntax_trees">
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册