public virtual void EnterCopyCompilerStatementBody(QualifiedTextName qualifiedTextName, TypeCobol.Compiler.Scanner.Token suppress, PairTokenListList replacingOperands) { var copy = (CopyDirective)CompilerDirective; bool isCopy = copy.COPYToken.TokenType == TokenType.COPY; copy.TextName = GetName(qualifiedTextName.TextName); copy.TextNameSymbol = qualifiedTextName.TextName; { #if EUROINFO_RULES if (TypeCobolOptions.UseEuroInformationLegacyReplacingSyntax) { if (copy.TextName != null) { // Find the list of copy text names variations declared by previous REMARKS compiler directives var variations = CopyTextNameVariations; if (TypeCobolOptions.AutoRemarksEnable && (variations == null || !variations.Any( v => string.Equals(v.TextNameWithSuffix, copy.TextName, StringComparison.InvariantCultureIgnoreCase)))) //If it does not exists, create the text variation (AutoRemarks mechanism Issue #440) { variations = new List <RemarksDirective.TextNameVariation> { new RemarksDirective.TextNameVariation(copy.TextName) }; CopyTextNameVariations.AddRange(variations); } if (variations != null) { var declaration = variations.Find(d => String.Equals(d.TextNameWithSuffix, copy.TextName, StringComparison.InvariantCultureIgnoreCase)); if (declaration != null && copy.TextName.StartsWith("Y", StringComparison.InvariantCultureIgnoreCase)) { // Declaration found and copy name starts with Y => apply the legacy REPLACING semantics to the copy directive copy.RemoveFirst01Level = true; if (declaration.HasSuffix) { copy.TextName = declaration.TextName; copy.InsertSuffixChar = true; copy.Suffix = declaration.Suffix; copy.PreSuffix = declaration.PreSuffix; } } } } } #endif } copy.LibraryName = GetName(qualifiedTextName.LibraryName); copy.LibraryNameSymbol = qualifiedTextName.LibraryName; copy.Suppress = suppress != null; // REPLACING if (replacingOperands != null) { // Data used to build the current replace operation Token comparisonToken = null; Token[] followingComparisonTokens = null; Token replacementToken = null; Token[] replacementTokens = null; foreach (Tuple <List <Token>, List <Token> > copyReplacingOperands in replacingOperands) { // Get relevant tokens List <Token> relevantTokens = copyReplacingOperands.Item1; List <Token> replaceTokens = copyReplacingOperands.Item2; BuildReplaceOperation(copy.ReplaceOperations, ref comparisonToken, ref followingComparisonTokens, ref replacementToken, ref replacementTokens, false, relevantTokens); BuildReplaceOperation(copy.ReplaceOperations, ref comparisonToken, ref followingComparisonTokens, ref replacementToken, ref replacementTokens, true, replaceTokens); } } }
public virtual void EnterReplaceCompilerStatement(Token replaceTokn, Token offToken, PairTokenListList replacingOperands) { ReplaceDirective replaceDirective = (ReplaceDirective)CompilerDirective; if (replacingOperands != null) { // Data used to build the current replace operation Token comparisonToken = null; Token[] followingComparisonTokens = null; Token replacementToken = null; Token[] replacementTokens = null; foreach (Tuple <List <Token>, List <Token> > copyReplacingOperands in replacingOperands) { // Get relevant tokens List <Token> relevantTokens = copyReplacingOperands.Item1; List <Token> replaceTokens = copyReplacingOperands.Item2; BuildReplaceOperation(replaceDirective.ReplaceOperations, ref comparisonToken, ref followingComparisonTokens, ref replacementToken, ref replacementTokens, false, relevantTokens); BuildReplaceOperation(replaceDirective.ReplaceOperations, ref comparisonToken, ref followingComparisonTokens, ref replacementToken, ref replacementTokens, true, replaceTokens); } } }