/// <summary> /// <summary> /// Compute the typed proper paths of a data defintion. The proper root paths are /// root procedures path and data definition variables path. /// </summary> /// <param name="dataNode">The node owning the data dedinition.</param> /// <param name="dataDesc">The Data Description to compute the proper root path</param> /// <param name="properType"> The Proper type of the data definition </param> /// <param name="pathProcedures">[out] root procedures path</param> /// <param name="pathVariables">[out]typed variables path</param> public static void ComputeTypedProperPaths(Node dataNode, DataDescriptionEntry dataDesc, Compiler.Nodes.TypeDefinition properType, out List <string> pathProcedures, out List <Tuple <string, string> > pathVariables) { System.Diagnostics.Contracts.Contract.Requires(properType != null); pathProcedures = new List <string>(); pathVariables = new List <Tuple <string, string> >(); if (properType == null) { return; } pathVariables.Add(new Tuple <string, string>(dataDesc.Name, properType.Name)); Compiler.Nodes.Node parent = dataNode.Parent; while (parent != null) { if (parent is TypeCobol.Compiler.Nodes.DataDefinition) { TypeCobol.Compiler.Nodes.DataDefinition dataParent = parent as TypeCobol.Compiler.Nodes.DataDefinition; pathVariables.Add(new System.Tuple <string, string>(dataParent.Name, "")); } else if (!string.IsNullOrEmpty(parent.Name)) { pathProcedures.Add(parent.Name); } parent = parent.Parent; } }
/// <summary> /// Tries to detect a (PIC|PICTURE) construction for a Data Description Entry. /// </summary> /// <param name="dataDescEntry">The Data Description Entry Node</param> /// <param name="bHasPeriod">out true if a period separator has been encountered, false otherwise.</param> /// <returns>The string representing the PIC clause </returns> internal static string ExtractPicTokensValues(DataDescriptionEntry dataDescEntry, out bool bHasPeriod) { bHasPeriod = false; StringBuilder sb = new StringBuilder(); if (dataDescEntry.ConsumedTokens != null) { if (dataDescEntry.ConsumedTokens != null) { int i = 0; while (i < dataDescEntry.ConsumedTokens.Count && dataDescEntry.ConsumedTokens[i].TokenType != Compiler.Scanner.TokenType.PIC && dataDescEntry.ConsumedTokens[i].TokenType != Compiler.Scanner.TokenType.PICTURE) { i++; } if (i < dataDescEntry.ConsumedTokens.Count) { sb.Append(string.Intern(" ")); sb.Append(dataDescEntry.ConsumedTokens[i].Text); } while (++i < dataDescEntry.ConsumedTokens.Count) { if ((i != dataDescEntry.ConsumedTokens.Count - 1) || (dataDescEntry.ConsumedTokens[i].TokenType != Compiler.Scanner.TokenType.PeriodSeparator)) { sb.Append(string.Intern(" "));//Add a space but not before a a Period Separator } sb.Append(dataDescEntry.ConsumedTokens[i].Text); if (i == dataDescEntry.ConsumedTokens.Count - 1) { bHasPeriod = dataDescEntry.ConsumedTokens[i].TokenType == Compiler.Scanner.TokenType.PeriodSeparator; } } } } return(sb.ToString()); }
private static Nodes.DataDescription CreateData(int level, string name, char type, int length) { var data = new DataDescriptionEntry(); data.LevelNumber = new GeneratedIntegerValue(level); data.DataName = new SymbolDefinition(new GeneratedAlphanumericValue(name), SymbolType.DataName); data.Picture = new GeneratedAlphanumericValue(String.Format("{0}({1})", type, length)); data.DataType = DataType.Create(data.Picture.Value); return(new Nodes.DataDescription(data)); }
internal static ITextLine CreateDataDefinition(DataDefinitionEntry data_def, int level, int indent, bool isCustomType, bool isFirst, TypeDefinition customtype = null) { if (data_def is DataDescriptionEntry) { DataDescriptionEntry data = data_def as DataDescriptionEntry; bool bHasPeriod = false; var line = GetIndent(level, indent, isFirst); line.Append(level.ToString("00")); if (data_def.Name != null) { line.Append(' ').Append(data.Name); } if (!isCustomType) { string text = ExtractPicTokensValues(data, out bHasPeriod); if (text.Length > 0) { line.Append(text); } else { line.Append(" PIC ").Append(data.Picture); } } else if (customtype != null) { //This variable will have no subtypes as children at all //So Auto detect a type based on scalar COBOL typedef. string text = ExtractAnyCobolScalarTypeDef(customtype, out bHasPeriod); line.Append(text); } if (!bHasPeriod) { line.Append('.'); } return(new TextLineSnapshot(-1, line.ToString(), null)); } else if (data_def is DataConditionEntry || data_def is DataRenamesEntry || data_def is DataRedefinesEntry) { bool bHasPeriod = false; var line = GetIndent(level, indent, isFirst); string text = ConsumedTokenToString(data_def, out bHasPeriod); line.Append(text); if (!bHasPeriod) { line.Append('.'); } return(new TextLineSnapshot(-1, line.ToString(), null)); } else {//Humm ... It will be a Bug System.Diagnostics.Debug.Assert(data_def is DataDescriptionEntry || data_def is DataConditionEntry); } return(null); }
/// <summary> /// Extract All Tokens after encountering a LevelNumber token /// </summary> /// <param name="dataDescEntry">The Data Description Entry Node</param> /// <param name="bHasPeriod">out true if a period separator has been encountered, false otherwise.</param> /// <returns>The string representing all tokens after a LevelNumber </returns> internal static string ExtractTokensValuesAfterLevel(ColumnsLayout? layout, DataDescriptionEntry dataDescEntry, out bool bHasPeriod, Func<Compiler.Scanner.Token, string> tokenFilter = null) { bHasPeriod = false; StringBuilder sb = new StringBuilder(); if (dataDescEntry.ConsumedTokens != null) { int i = 0; while (i < dataDescEntry.ConsumedTokens.Count && dataDescEntry.ConsumedTokens[i].TokenType != Compiler.Scanner.TokenType.LevelNumber) i++; FlushConsumedTokens(layout, i, dataDescEntry.ConsumedTokens, sb, out bHasPeriod, tokenFilter); } return sb.ToString(); }
/// <summary> /// Extract All Tokens after encountering a LevelNumber token /// </summary> /// <param name="dataDescEntry">The Data Description Entry Node</param> /// <param name="bHasPeriod">out true if a period separator has been encountered, false otherwise.</param> /// <returns>The string representing all tokens after a LevelNumber </returns> internal static string ExtractTokensValuesAfterLevel(DataDescriptionEntry dataDescEntry, out bool bHasPeriod) { bHasPeriod = false; StringBuilder sb = new StringBuilder(); if (dataDescEntry.ConsumedTokens != null) { if (dataDescEntry.ConsumedTokens != null) { int i = 0; while (i < dataDescEntry.ConsumedTokens.Count && dataDescEntry.ConsumedTokens[i].TokenType != Compiler.Scanner.TokenType.LevelNumber) { i++; } FlushConsumedTokens(++i, dataDescEntry.ConsumedTokens, sb, out bHasPeriod); } } return(sb.ToString()); }
public static void OnCodeElement(DataDescriptionEntry data, CodeElementsParser.DataDescriptionEntryContext context) { var external = GetContext(data, context?.externalClause()); var global = GetContext(data, context?.globalClause()); if (data.DataName == null) { if (!data.IsFiller) { DiagnosticUtils.AddError(data, "Data name or FILLER expected", context?.dataNameDefinition()); } if (data.IsExternal) { DiagnosticUtils.AddError(data, "Data name must be specified for any entry containing the EXTERNAL clause", external); } if (data.IsGlobal) { DiagnosticUtils.AddError(data, "Data name must be specified for any entry containing the GLOBAL clause", global); } } else { if (data.LevelNumber != null && data.IsExternal && data.LevelNumber.Value != 01) { DiagnosticUtils.AddError(data, "External is only allowed for level 01", external); } if (data.LevelNumber != null && !((data.LevelNumber.Value >= 01 && data.LevelNumber.Value <= 49) || data.LevelNumber.Value == 66 || data.LevelNumber.Value == 77 || data.LevelNumber.Value == 88)) { DiagnosticUtils.AddError(data, "Data must be declared between level 01 to 49, or equals to 66, 77, 88", context?.dataNameDefinition()); } } }
/// <summary> /// Tries to detect a (PIC|PICTURE) construction for a Data Description Entry. /// </summary> /// <param name="dataDescEntry">The Data Description Entry Node</param> /// <param name="bHasPeriod">out true if a period separator has been encountered, false otherwise.</param> /// <returns>The string representing the PIC clause </returns> internal static string ExtractPicTokensValues(DataDescriptionEntry dataDescEntry, out bool bHasPeriod) { bHasPeriod = false; StringBuilder sb = new StringBuilder(); if (dataDescEntry.ConsumedTokens != null) { if (dataDescEntry.ConsumedTokens != null) { int i = 0; while (i < dataDescEntry.ConsumedTokens.Count && dataDescEntry.ConsumedTokens[i].TokenType != Compiler.Scanner.TokenType.PIC && dataDescEntry.ConsumedTokens[i].TokenType != Compiler.Scanner.TokenType.PICTURE) { i++; } if (i < dataDescEntry.ConsumedTokens.Count) { sb.Append(string.Intern(" ")); sb.Append(dataDescEntry.ConsumedTokens[i].Text); } FlushConsumedTokens(++i, dataDescEntry.ConsumedTokens, sb, out bHasPeriod); } } return(sb.ToString()); }
private static IToken BuildCodeElementFromType(CodeElementType type, Token lastTokenBeforeError, string informationText) { CodeElement codeElement = null; switch (type) { case CodeElementType.ProgramIdentification: codeElement = new ProgramIdentification(); break; case CodeElementType.ProgramEnd: codeElement = new ProgramEnd(); break; case CodeElementType.ClassIdentification: codeElement = new ClassIdentification(); break; case CodeElementType.ClassEnd: codeElement = new ClassEnd(); break; case CodeElementType.FactoryIdentification: codeElement = new FactoryIdentification(); break; case CodeElementType.FactoryEnd: codeElement = new FactoryEnd(); break; case CodeElementType.ObjectIdentification: codeElement = new ObjectIdentification(); break; case CodeElementType.ObjectEnd: codeElement = new ObjectEnd(); break; case CodeElementType.MethodIdentification: codeElement = new MethodIdentification(); break; case CodeElementType.MethodEnd: codeElement = new MethodEnd(); break; case CodeElementType.EnvironmentDivisionHeader: codeElement = new EnvironmentDivisionHeader(); break; case CodeElementType.DataDivisionHeader: codeElement = new DataDivisionHeader(); break; case CodeElementType.ProcedureDivisionHeader: codeElement = new ProcedureDivisionHeader(); break; case CodeElementType.DeclarativesHeader: codeElement = new DeclarativesHeader(); break; case CodeElementType.DeclarativesEnd: codeElement = new DeclarativesEnd(); break; case CodeElementType.SectionHeader: codeElement = new SectionHeader(); break; case CodeElementType.ConfigurationSectionHeader: codeElement = new ConfigurationSectionHeader(); break; case CodeElementType.InputOutputSectionHeader: codeElement = new InputOutputSectionHeader(); break; case CodeElementType.FileSectionHeader: codeElement = new FileSectionHeader(); break; case CodeElementType.WorkingStorageSectionHeader: codeElement = new WorkingStorageSectionHeader(); break; case CodeElementType.LocalStorageSectionHeader: codeElement = new LocalStorageSectionHeader(); break; case CodeElementType.LinkageSectionHeader: codeElement = new LinkageSectionHeader(); break; case CodeElementType.ParagraphHeader: codeElement = new ParagraphHeader(); break; case CodeElementType.FileControlParagraphHeader: codeElement = new FileControlParagraphHeader(); break; case CodeElementType.IOControlParagraphHeader: codeElement = new IOControlParagraphHeader(); break; case CodeElementType.SentenceEnd: codeElement = new SentenceEnd(); break; case CodeElementType.FileDescriptionEntry: codeElement = new FileDescriptionEntry(); break; case CodeElementType.DataDescriptionEntry: codeElement = new DataDescriptionEntry(); break; case CodeElementType.DataRedefinesEntry: codeElement = new DataRedefinesEntry(); break; case CodeElementType.DataRenamesEntry: codeElement = new DataRenamesEntry(); break; case CodeElementType.DataConditionEntry: codeElement = new DataConditionEntry(); break; case CodeElementType.FileControlEntry: codeElement = new FileControlEntry(); break; case CodeElementType.IOControlEntry: codeElement = new RerunIOControlEntry(); break; case CodeElementType.SourceComputerParagraph: codeElement = new SourceComputerParagraph(); break; case CodeElementType.ObjectComputerParagraph: codeElement = new ObjectComputerParagraph(); break; case CodeElementType.SpecialNamesParagraph: codeElement = new SpecialNamesParagraph(); break; case CodeElementType.RepositoryParagraph: codeElement = new RepositoryParagraph(); break; case CodeElementType.AcceptStatement: codeElement = new AcceptFromInputDeviceStatement(); break; case CodeElementType.AddStatement: codeElement = new AddSimpleStatement(); break; case CodeElementType.AlterStatement: codeElement = new AlterStatement(); break; case CodeElementType.CallStatement: codeElement = new CallStatement(); break; case CodeElementType.CancelStatement: codeElement = new CancelStatement(); break; case CodeElementType.CloseStatement: codeElement = new CloseStatement(); break; case CodeElementType.ComputeStatement: codeElement = new ComputeStatement(); break; case CodeElementType.ContinueStatement: codeElement = new ContinueStatement(); break; case CodeElementType.DeleteStatement: codeElement = new DeleteStatement(); break; case CodeElementType.DisplayStatement: codeElement = new DisplayStatement(); break; case CodeElementType.DivideStatement: codeElement = new DivideSimpleStatement(); break; case CodeElementType.EntryStatement: codeElement = new EntryStatement(); break; case CodeElementType.EvaluateStatement: codeElement = new EvaluateStatement(); break; case CodeElementType.ExecStatement: codeElement = new ExecStatement(); break; case CodeElementType.ExitMethodStatement: codeElement = new ExitMethodStatement(); break; case CodeElementType.ExitProgramStatement: codeElement = new ExitProgramStatement(); break; case CodeElementType.ExitStatement: codeElement = new ExitStatement(); break; case CodeElementType.GobackStatement: codeElement = new GobackStatement(); break; case CodeElementType.GotoStatement: codeElement = new GotoSimpleStatement(); break; case CodeElementType.IfStatement: codeElement = new IfStatement(); break; case CodeElementType.InitializeStatement: codeElement = new InitializeStatement(); break; case CodeElementType.InspectStatement: codeElement = new InspectTallyingStatement(); break; case CodeElementType.InvokeStatement: codeElement = new InvokeStatement(); break; case CodeElementType.MergeStatement: codeElement = new MergeStatement(); break; case CodeElementType.MoveStatement: codeElement = new MoveSimpleStatement(null, null, null); break; case CodeElementType.MultiplyStatement: codeElement = new MultiplySimpleStatement(); break; case CodeElementType.NextSentenceStatement: codeElement = new NextSentenceStatement(); break; case CodeElementType.OpenStatement: codeElement = new OpenStatement(); break; case CodeElementType.PerformProcedureStatement: codeElement = new PerformProcedureStatement(); break; case CodeElementType.PerformStatement: codeElement = new PerformStatement(); break; case CodeElementType.ReadStatement: codeElement = new ReadStatement(); break; case CodeElementType.ReleaseStatement: codeElement = new ReleaseStatement(); break; case CodeElementType.ReturnStatement: codeElement = new ReturnStatement(); break; case CodeElementType.RewriteStatement: codeElement = new RewriteStatement(); break; case CodeElementType.SearchStatement: codeElement = new SearchSerialStatement(); break; case CodeElementType.SetStatement: codeElement = new SetStatementForAssignment(); break; case CodeElementType.SortStatement: codeElement = new SortStatement(); break; case CodeElementType.StartStatement: codeElement = new StartStatement(); break; case CodeElementType.StopStatement: codeElement = new StopStatement(); break; case CodeElementType.StringStatement: codeElement = new StringStatement(); break; case CodeElementType.SubtractStatement: codeElement = new SubtractSimpleStatement(); break; case CodeElementType.UnstringStatement: codeElement = new UnstringStatement(); break; case CodeElementType.UseStatement: codeElement = new UseAfterIOExceptionStatement(); break; case CodeElementType.WriteStatement: codeElement = new WriteStatement(); break; case CodeElementType.XmlGenerateStatement: codeElement = new XmlGenerateStatement(); break; case CodeElementType.XmlParseStatement: codeElement = new XmlParseStatement(); break; case CodeElementType.AtEndCondition: codeElement = new AtEndCondition(); break; case CodeElementType.NotAtEndCondition: codeElement = new NotAtEndCondition(); break; case CodeElementType.AtEndOfPageCondition: codeElement = new AtEndOfPageCondition(); break; case CodeElementType.NotAtEndOfPageCondition: codeElement = new NotAtEndOfPageCondition(); break; case CodeElementType.OnExceptionCondition: codeElement = new OnExceptionCondition(); break; case CodeElementType.NotOnExceptionCondition: codeElement = new NotOnExceptionCondition(); break; case CodeElementType.OnOverflowCondition: codeElement = new OnOverflowCondition(); break; case CodeElementType.NotOnOverflowCondition: codeElement = new NotOnOverflowCondition(); break; case CodeElementType.InvalidKeyCondition: codeElement = new InvalidKeyCondition(); break; case CodeElementType.NotInvalidKeyCondition: codeElement = new NotInvalidKeyCondition(); break; case CodeElementType.OnSizeErrorCondition: codeElement = new OnSizeErrorCondition(); break; case CodeElementType.NotOnSizeErrorCondition: codeElement = new NotOnSizeErrorCondition(); break; case CodeElementType.ElseCondition: codeElement = new ElseCondition(); break; case CodeElementType.WhenCondition: codeElement = new WhenCondition(); break; case CodeElementType.WhenOtherCondition: codeElement = new WhenOtherCondition(); break; case CodeElementType.WhenSearchCondition: codeElement = new WhenSearchCondition(); break; case CodeElementType.AddStatementEnd: codeElement = new AddStatementEnd(); break; case CodeElementType.CallStatementEnd: codeElement = new CallStatementEnd(); break; case CodeElementType.ComputeStatementEnd: codeElement = new ComputeStatementEnd(); break; case CodeElementType.DeleteStatementEnd: codeElement = new DeleteStatementEnd(); break; case CodeElementType.DivideStatementEnd: codeElement = new DivideStatementEnd(); break; case CodeElementType.EvaluateStatementEnd: codeElement = new EvaluateStatementEnd(); break; case CodeElementType.IfStatementEnd: codeElement = new IfStatementEnd(); break; case CodeElementType.InvokeStatementEnd: codeElement = new InvokeStatementEnd(); break; case CodeElementType.MultiplyStatementEnd: codeElement = new MultiplyStatementEnd(); break; case CodeElementType.PerformStatementEnd: codeElement = new PerformStatementEnd(); break; case CodeElementType.ReadStatementEnd: codeElement = new ReadStatementEnd(); break; case CodeElementType.ReturnStatementEnd: codeElement = new ReturnStatementEnd(); break; case CodeElementType.RewriteStatementEnd: codeElement = new RewriteStatementEnd(); break; case CodeElementType.SearchStatementEnd: codeElement = new SearchStatementEnd(); break; case CodeElementType.StartStatementEnd: codeElement = new StartStatementEnd(); break; case CodeElementType.StringStatementEnd: codeElement = new StringStatementEnd(); break; case CodeElementType.SubtractStatementEnd: codeElement = new SubtractStatementEnd(); break; case CodeElementType.UnstringStatementEnd: codeElement = new UnstringStatementEnd(); break; case CodeElementType.WriteStatementEnd: codeElement = new WriteStatementEnd(); break; case CodeElementType.XmlStatementEnd: codeElement = new XmlStatementEnd(); break; case CodeElementType.LibraryCopy: codeElement = new LibraryCopyCodeElement(); break; case CodeElementType.FunctionDeclarationHeader: codeElement = new FunctionDeclarationHeader(null, AccessModifier.Private, FunctionType.Undefined); break; case CodeElementType.FunctionDeclarationEnd: codeElement = new FunctionDeclarationEnd(); break; default: throw new NotImplementedException(); } if (lastTokenBeforeError != null) { var missingToken = new MissingToken(TokenType.InvalidToken, informationText, lastTokenBeforeError.TokensLine, lastTokenBeforeError.StopIndex); codeElement.ConsumedTokens.Add(missingToken); } return(codeElement); }
public virtual void StartDataDescriptionEntry(DataDescriptionEntry entry) { var dataTypeDescriptionEntry = entry as DataTypeDescriptionEntry; if (dataTypeDescriptionEntry != null) { StartTypeDefinitionEntry(dataTypeDescriptionEntry); } else { SetCurrentNodeToTopLevelItem(entry.LevelNumber); //Update DataType of CodeElement by searching info on the declared Type into SymbolTable. //Note that the AST is not complete here, but you can only refer to a Type that has previously been defined. var node = new DataDescription(entry); if (_CurrentTypeDefinition != null) { node.ParentTypeDefinition = _CurrentTypeDefinition; } Enter(node); if (entry.Indexes != null && entry.Indexes.Any()) { var table = node.SymbolTable; foreach (var index in entry.Indexes) { if (node.CodeElement().IsGlobal) { table = table.GetTableFromScope(SymbolTable.Scope.Global); } var indexNode = new IndexDefinition(index); Enter(indexNode, null, table); if (_CurrentTypeDefinition != null) { indexNode.ParentTypeDefinition = _CurrentTypeDefinition; } table.AddVariable(indexNode); Exit(); } } var types = node.SymbolTable.GetType(node); if (types.Count == 1) { entry.DataType.RestrictionLevel = types[0].DataType.RestrictionLevel; } //else do nothing, it's an error that will be handled by Cobol2002Checker if (_IsInsideWorkingStorageContext) { node.SetFlag(Node.Flag.WorkingSectionNode, true); //Set flag to know that this node belongs to Working Storage Section } if (_IsInsideLinkageSectionContext) { node.SetFlag(Node.Flag.LinkageSectionNode, true); //Set flag to know that this node belongs to Linkage Section } if (_IsInsideLocalStorageSectionContext) { node.SetFlag(Node.Flag.LocalStorageSectionNode, true); //Set flag to know that this node belongs to Local Storage Section } if (_IsInsideFileSectionContext) { node.SetFlag(Node.Flag.FileSectionNode, true); //Set flag to know that this node belongs to File Section } if (_IsInsideGlobalStorageSection) { node.SetFlag(Node.Flag.GlobalStorageSection, true); //Set flag to know that this node belongs to Global Storage Section } AddToSymbolTable(node); } }
/// <summary> /// Tries to detect a (PIC|PICTURE) construction for a Data Description Entry. /// </summary> /// <param name="dataDescEntry">The Data Description Entry Node</param> /// <param name="bHasPeriod">out true if a period separator has been encountered, false otherwise.</param> /// <returns>The string representing the PIC clause </returns> internal static string ExtractPicTokensValues(ColumnsLayout? layout, DataDescriptionEntry dataDescEntry, out bool bHasPeriod, out bool globalSeen) { return ExtractPicTokensValues(layout, dataDescEntry.ConsumedTokens, out bHasPeriod, out globalSeen); }
/// <summary> /// Tries to extract all remaining tokens after a Type Name. /// </summary> /// <param name="customtype">The Type definition node</param> /// <param name="bHasPeriod">out true if a period separator has been encountered, false otherwise.</param> /// <returns>The string representing the Tokens after TYPE Name</returns> internal static string ExtractTokensValuesAfterTypeName(ColumnsLayout? layout, DataDescriptionEntry dataDescEntry, out bool bHasPeriod, out bool globalSeen, Func<Compiler.Scanner.Token, string> tokenFilter = null) { globalSeen = false; bHasPeriod = false; StringBuilder sb = new StringBuilder(); if (dataDescEntry.ConsumedTokens != null) { int i = 0; while (i < dataDescEntry.ConsumedTokens.Count && dataDescEntry.ConsumedTokens[i].TokenType != Compiler.Scanner.TokenType.TYPE) i++; i++;//Ignore the Name of the Type. ++i; //Ignore qualified type name while (i < dataDescEntry.ConsumedTokens.Count && dataDescEntry.ConsumedTokens[i].TokenType == Compiler.Scanner.TokenType.QualifiedNameSeparator) { i += 2; //skip :: and the next type name } globalSeen = ContainsToken(dataDescEntry.ConsumedTokens, i - 1, TokenType.GLOBAL); FlushConsumedTokens(layout, i - 1, dataDescEntry.ConsumedTokens, sb, out bHasPeriod, tokenFilter); } return sb.ToString(); }
public virtual bool Visit(DataDescriptionEntry dataDescriptionEntry) { return(true); }