Example #1
0
        public void RecoveringAttributesRecoversTheAttributesInTheModulesProvided_ViaModule_PropertiesAreHandlesSeparately(string getAttributes, string letAttributes, string setAttributes)
        {
            var inputCode =
                $@"Public Property Get Foo() As Variant
{getAttributes}
End Property

Public Property Let Foo(ByVal RHS As Long)
{letAttributes}
End Property

Public Property Set Foo(ByVal RHs As Object)
{setAttributes}
End Property";

            var expectedCodeWithRecovery = inputCode;

            var expectedCodeWithoutRecovery =
                $@"Public Property Get Foo() As Variant{(string.IsNullOrEmpty(getAttributes) ? Environment.NewLine : string.Empty)}
End Property

Public Property Let Foo(ByVal RHS As Long){(string.IsNullOrEmpty(letAttributes) ? Environment.NewLine : string.Empty)}
End Property

Public Property Set Foo(ByVal RHs As Object){(string.IsNullOrEmpty(setAttributes) ? Environment.NewLine : string.Empty)}
End Property";

            var vbe = MockVbeBuilder.BuildFromStdModules(("RecoveryModule", inputCode), ("NoRecoveryModule", inputCode)).Object;

            var(state, rewritingManager) = MockParser.CreateAndParseWithRewritingManager(vbe);
            using (state)
            {
                var attributesUpdater        = new AttributesUpdater(state);
                var mockFailureNotifier      = new Mock <IMemberAttributeRecoveryFailureNotifier>();
                var memberAttributeRecoverer = new MemberAttributeRecoverer(state, state, attributesUpdater, mockFailureNotifier.Object);
                memberAttributeRecoverer.RewritingManager = rewritingManager;

                var recoveryModule = state.DeclarationFinder.UserDeclarations(DeclarationType.Module)
                                     .First(decl => decl.IdentifierName.Equals("RecoveryModule")).QualifiedModuleName;
                var noRecoveryModule = state.DeclarationFinder.UserDeclarations(DeclarationType.Module)
                                       .First(decl => decl.IdentifierName.Equals("NoRecoveryModule")).QualifiedModuleName;

                var modulesToRecoverAttributesIn = new List <QualifiedModuleName> {
                    recoveryModule
                };

                memberAttributeRecoverer.RecoverCurrentMemberAttributesAfterNextParse(modulesToRecoverAttributesIn);

                var rewriteSession = rewritingManager.CheckOutCodePaneSession();
                var declarationsForWhichToRemoveAttributes = state.DeclarationFinder.UserDeclarations(DeclarationType.Property);
                RemoveAttributes(declarationsForWhichToRemoveAttributes, rewriteSession);

                ExecuteAndWaitForParserState(state, () => rewriteSession.TryRewrite(), ParserState.Ready);

                var actualCodeWithRecovery    = state.ProjectsProvider.Component(recoveryModule).CodeModule.Content();
                var actualCodeWithoutRecovery = state.ProjectsProvider.Component(noRecoveryModule).CodeModule.Content();
                Assert.AreEqual(expectedCodeWithRecovery, actualCodeWithRecovery);
                Assert.AreEqual(expectedCodeWithoutRecovery, actualCodeWithoutRecovery);
            }
        }
        protected override IRefactoringAction <AnnotateDeclarationModel> TestBaseRefactoring(RubberduckParserState state, IRewritingManager rewritingManager)
        {
            var annotationUpdater = new AnnotationUpdater(state);
            var attributesUpdater = new AttributesUpdater(state);

            return(new AnnotateDeclarationRefactoringAction(rewritingManager, annotationUpdater, attributesUpdater));
        }
Example #3
0
        protected override CommandBase TestCommand(
            IVBE vbe, RubberduckParserState state,
            IRewritingManager rewritingManager,
            ISelectionService selectionService)
        {
            var factory = new Mock <IRefactoringPresenterFactory>().Object;
            var msgBox  = new Mock <IMessageBox>().Object;

            var uiDispatcherMock = new Mock <IUiDispatcher>();

            uiDispatcherMock
            .Setup(m => m.Invoke(It.IsAny <Action>()))
            .Callback((Action action) => action.Invoke());
            var userInteraction = new RefactoringUserInteraction <IAnnotateDeclarationPresenter, AnnotateDeclarationModel>(factory, uiDispatcherMock.Object);

            var annotationUpdater         = new AnnotationUpdater(state);
            var attributesUpdater         = new AttributesUpdater(state);
            var annotateDeclarationAction = new AnnotateDeclarationRefactoringAction(rewritingManager, annotationUpdater, attributesUpdater);

            var selectedDeclarationProvider = new SelectedDeclarationProvider(selectionService, state);

            var refactoring = new AnnotateDeclarationRefactoring(annotateDeclarationAction, selectedDeclarationProvider, selectionService, userInteraction);
            var notifier    = new AnnotateDeclarationFailedNotifier(msgBox);

            return(new AnnotateSelectedMemberCommand(refactoring, notifier, selectionService, state, state, selectedDeclarationProvider));
        }
        public void UpdateAttributeWithValuesSpecifiedUpdatesOnlyEntriesForTheAttributeWithSpecifiedValuesForMembers()
        {
            const string inputCode =
                @"VERSION 1.0 CLASS
BEGIN
  MultiUse = -1  'True
END
Attribute VB_Name = ""ClassKeys""
Attribute VB_GlobalNameSpace = False
Public Sub Foo(bar As String)
Attribute Foo.VB_Ext_Key = ""Key"", ""Value""
Attribute Foo.VB_Ext_Key = ""OtherKey"", ""Value""
Attribute Foo.VB_Description = ""Desc""
    bar = vbNullString
End Sub
";

            const string expectedCode =
                @"VERSION 1.0 CLASS
BEGIN
  MultiUse = -1  'True
END
Attribute VB_Name = ""ClassKeys""
Attribute VB_GlobalNameSpace = False
Public Sub Foo(bar As String)
Attribute Foo.VB_Ext_Key = ""AnotherKey"", ""AnotherValue""
Attribute Foo.VB_Ext_Key = ""OtherKey"", ""Value""
Attribute Foo.VB_Description = ""Desc""
    bar = vbNullString
End Sub
";
            var attributesToRemove = "Foo.VB_Ext_Key";
            var oldValues          = new List <string> {
                "\"Key\"", "\"Value\""
            };
            var newValues = new List <string> {
                "\"AnotherKey\"", "\"AnotherValue\""
            };

            string actualCode;

            var(component, rewriteSession, state) = TestSetup(inputCode);
            using (state)
            {
                var fooDeclaration = state.DeclarationFinder
                                     .UserDeclarations(DeclarationType.Procedure)
                                     .First(decl => decl.IdentifierName == "Foo");
                var attributesUpdater = new AttributesUpdater(state);

                attributesUpdater.UpdateAttribute(rewriteSession, fooDeclaration, attributesToRemove, newValues, oldValues);
                rewriteSession.TryRewrite();

                actualCode = component.CodeModule.Content();
            }
            Assert.AreEqual(expectedCode, actualCode);
        }
Example #5
0
        public void AddOrUpdateAttribute_UsualAttribute_AlreadyThere_UpdatesAttribute_Variable()
        {
            const string inputCode =
                @"VERSION 1.0 CLASS
BEGIN
  MultiUse = -1  'True
END
Attribute VB_Name = ""ClassKeys""
Attribute VB_GlobalNameSpace = False

Public MyVariable As Variant
Attribute MyVariable.VB_VarDescription = ""NotMyDesc""

Public Sub Foo(bar As String)
    bar = vbNullString
End Sub
";

            const string expectedCode =
                @"VERSION 1.0 CLASS
BEGIN
  MultiUse = -1  'True
END
Attribute VB_Name = ""ClassKeys""
Attribute VB_GlobalNameSpace = False

Public MyVariable As Variant
Attribute MyVariable.VB_VarDescription = ""MyDesc""

Public Sub Foo(bar As String)
    bar = vbNullString
End Sub
";
            var attribute = "MyVariable.VB_VarDescription";
            var newValues = new List <string> {
                "\"MyDesc\""
            };

            string actualCode;

            var(component, rewriteSession, state) = TestSetup(inputCode);
            using (state)
            {
                var moduleDeclaration = state.DeclarationFinder
                                        .UserDeclarations(DeclarationType.Variable)
                                        .Single(declaration => declaration.IdentifierName.Equals("MyVariable"));
                var attributesUpdater = new AttributesUpdater(state);

                attributesUpdater.AddOrUpdateAttribute(rewriteSession, moduleDeclaration, attribute, newValues);
                rewriteSession.TryRewrite();

                actualCode = component.CodeModule.Content();
            }
            Assert.AreEqual(expectedCode, actualCode);
        }
        public void MultipleAddAttributeWorkForModules()
        {
            const string inputCode =
                @"VERSION 1.0 CLASS
BEGIN
  MultiUse = -1  'True
END
Attribute VB_Name = ""ClassKeys""
Attribute VB_GlobalNameSpace = False
Public Sub Foo(bar As String)
    bar = vbNullString
End Sub
";

            const string expectedCode =
                @"VERSION 1.0 CLASS
BEGIN
  MultiUse = -1  'True
END
Attribute VB_Name = ""ClassKeys""
Attribute VB_GlobalNameSpace = False
Attribute VB_Exposed = False
Attribute VB_Description = ""Module Description""
Public Sub Foo(bar As String)
    bar = vbNullString
End Sub
";
            var firstAttributeToAdd  = "VB_Exposed";
            var firstAttributeValues = new List <string> {
                "False"
            };
            var secondAttributeToAdd  = "VB_Description";
            var secondAttributeValues = new List <string> {
                "\"Module Description\""
            };

            string actualCode;

            var(component, rewriteSession, state) = TestSetup(inputCode);
            using (state)
            {
                var moduleDeclaration = state.DeclarationFinder
                                        .UserDeclarations(DeclarationType.ProceduralModule)
                                        .First();
                var attributesUpdater = new AttributesUpdater(state);

                attributesUpdater.AddAttribute(rewriteSession, moduleDeclaration, firstAttributeToAdd, firstAttributeValues);
                attributesUpdater.AddAttribute(rewriteSession, moduleDeclaration, secondAttributeToAdd, secondAttributeValues);
                rewriteSession.TryRewrite();

                actualCode = component.CodeModule.Content();
            }
            Assert.AreEqual(expectedCode, actualCode);
        }
        public void MultipleAddAttributeWorkForMembers()
        {
            const string inputCode =
                @"VERSION 1.0 CLASS
BEGIN
  MultiUse = -1  'True
END
Attribute VB_Name = ""ClassKeys""
Attribute VB_GlobalNameSpace = False
Public Sub Foo(bar As String)
    bar = vbNullString
End Sub
";

            const string expectedCode =
                @"VERSION 1.0 CLASS
BEGIN
  MultiUse = -1  'True
END
Attribute VB_Name = ""ClassKeys""
Attribute VB_GlobalNameSpace = False
Public Sub Foo(bar As String)
Attribute Foo.VB_Description = ""The MyFunc Description""
Attribute Foo.VB_HelpID = 2
    bar = vbNullString
End Sub
";
            var firstAttributeToAdd  = "Foo.VB_Description";
            var firstAttributeValues = new List <string> {
                "\"The MyFunc Description\""
            };
            var secondAttributeToAdd  = "Foo.VB_HelpID";
            var secondAttributeValues = new List <string> {
                "2"
            };

            string actualCode;

            var(component, rewriteSession, state) = TestSetup(inputCode);
            using (state)
            {
                var fooDeclaration = state.DeclarationFinder
                                     .UserDeclarations(DeclarationType.Procedure)
                                     .First(decl => decl.IdentifierName == "Foo");
                var attributesUpdater = new AttributesUpdater(state);

                attributesUpdater.AddAttribute(rewriteSession, fooDeclaration, firstAttributeToAdd, firstAttributeValues);
                attributesUpdater.AddAttribute(rewriteSession, fooDeclaration, secondAttributeToAdd, secondAttributeValues);
                rewriteSession.TryRewrite();

                actualCode = component.CodeModule.Content();
            }
            Assert.AreEqual(expectedCode, actualCode);
        }
Example #8
0
        public void AddOrUpdateAttribute_ExtKey_KeyAlreadyThere_UpdatesAttribute()
        {
            const string inputCode =
                @"VERSION 1.0 CLASS
BEGIN
  MultiUse = -1  'True
END
Attribute VB_Name = ""ClassKeys""
Attribute VB_GlobalNameSpace = False
Attribute VB_Ext_Key = ""AnotherKey"", ""MyValue""
Attribute VB_Ext_Key = ""MyKey"", ""AnotherValue""
Public Sub Foo(bar As String)
    bar = vbNullString
End Sub
";

            const string expectedCode =
                @"VERSION 1.0 CLASS
BEGIN
  MultiUse = -1  'True
END
Attribute VB_Name = ""ClassKeys""
Attribute VB_GlobalNameSpace = False
Attribute VB_Ext_Key = ""AnotherKey"", ""MyValue""
Attribute VB_Ext_Key = ""MyKey"", ""MyValue""
Public Sub Foo(bar As String)
    bar = vbNullString
End Sub
";
            var attribute = "VB_Ext_Key";
            var newValues = new List <string> {
                "\"MyKey\"", "\"MyValue\""
            };

            string actualCode;

            var(component, rewriteSession, state) = TestSetup(inputCode);
            using (state)
            {
                var moduleDeclaration = state.DeclarationFinder
                                        .UserDeclarations(DeclarationType.Module)
                                        .Single();
                var attributesUpdater = new AttributesUpdater(state);

                attributesUpdater.AddOrUpdateAttribute(rewriteSession, moduleDeclaration, attribute, newValues);
                rewriteSession.TryRewrite();

                actualCode = component.CodeModule.Content();
            }
            Assert.AreEqual(expectedCode, actualCode);
        }
        public void UpdateAttributeWithoutValuesSpecifiedUpdatesFirstEntryForTheAttributeAndRemovesTheRestForModules()
        {
            const string inputCode =
                @"VERSION 1.0 CLASS
BEGIN
  MultiUse = -1  'True
END
Attribute VB_Name = ""ClassKeys""
Attribute VB_GlobalNameSpace = False
Attribute VB_Ext_Key = ""Key"", ""Value""
Attribute VB_Ext_Key = ""OtherKey"", ""Value""
Public Sub Foo(bar As String)
    bar = vbNullString
End Sub
";

            const string expectedCode =
                @"VERSION 1.0 CLASS
BEGIN
  MultiUse = -1  'True
END
Attribute VB_Name = ""ClassKeys""
Attribute VB_GlobalNameSpace = False
Attribute VB_Ext_Key = ""AnotherKey"", ""AnotherValue""
Public Sub Foo(bar As String)
    bar = vbNullString
End Sub
";
            var attributesToRemove = "VB_Ext_Key";
            var newValues          = new List <string> {
                "\"AnotherKey\"", "\"AnotherValue\""
            };

            string actualCode;

            var(component, rewriteSession, state) = TestSetup(inputCode);
            using (state)
            {
                var moduleDeclaration = state.DeclarationFinder
                                        .UserDeclarations(DeclarationType.ProceduralModule)
                                        .First();
                var attributesUpdater = new AttributesUpdater(state);

                attributesUpdater.UpdateAttribute(rewriteSession, moduleDeclaration, attributesToRemove, newValues);
                rewriteSession.TryRewrite();

                actualCode = component.CodeModule.Content();
            }
            Assert.AreEqual(expectedCode, actualCode);
        }
        public void AddAttributeAddsVbExtKeyAttributeForDifferentKey()
        {
            const string inputCode =
                @"VERSION 1.0 CLASS
BEGIN
  MultiUse = -1  'True
END
Attribute VB_Name = ""ClassKeys""
Attribute VB_GlobalNameSpace = False
Attribute VB_Ext_Key = ""Key"", ""Value""
Public Sub Foo(bar As String)
    bar = vbNullString
End Sub
";

            const string expectedCode =
                @"VERSION 1.0 CLASS
BEGIN
  MultiUse = -1  'True
END
Attribute VB_Name = ""ClassKeys""
Attribute VB_GlobalNameSpace = False
Attribute VB_Ext_Key = ""Key"", ""Value""
Attribute VB_Ext_Key = ""OtherKey"", ""Value""
Public Sub Foo(bar As String)
    bar = vbNullString
End Sub
";
            var attributeToAdd  = "VB_Ext_Key";
            var attributeValues = new List <string> {
                "\"OtherKey\"", "\"Value\""
            };

            string actualCode;

            var(component, rewriteSession, state) = TestSetup(inputCode);
            using (state)
            {
                var moduleDeclaration = state.DeclarationFinder
                                        .UserDeclarations(DeclarationType.ProceduralModule)
                                        .First();
                var attributesUpdater = new AttributesUpdater(state);

                attributesUpdater.AddAttribute(rewriteSession, moduleDeclaration, attributeToAdd, attributeValues);
                rewriteSession.TryRewrite();

                actualCode = component.CodeModule.Content();
            }
            Assert.AreEqual(expectedCode, actualCode);
        }
Example #11
0
        public AddEquipment(AttributesUpdater attributesUpdater)
        {
            InitializeComponent();
            cancel.FontFamily = Device.RuntimePlatform == Device.Android ? "FontAwesome" : null;
            qrScan.FontFamily = Device.RuntimePlatform == Device.Android ? "FontAwesome" : null;
            cancel.Text       = Constants.CancelIcon;
            qrScan.Text       = Constants.QRIcon;

            action.Text = "Verificar existencia";

            addTapGestureRecognizers();

            this.attributesUpdater = attributesUpdater;
        }
Example #12
0
        protected override IRefactoring TestRefactoring(
            IRewritingManager rewritingManager,
            RubberduckParserState state,
            RefactoringUserInteraction <IAnnotateDeclarationPresenter, AnnotateDeclarationModel> userInteraction,
            ISelectionService selectionService)
        {
            var annotationUpdater         = new AnnotationUpdater(state);
            var attributesUpdater         = new AttributesUpdater(state);
            var annotateDeclarationAction = new AnnotateDeclarationRefactoringAction(rewritingManager, annotationUpdater, attributesUpdater);

            var selectedDeclarationProvider = new SelectedDeclarationProvider(selectionService, state);

            return(new AnnotateDeclarationRefactoring(annotateDeclarationAction, selectedDeclarationProvider, selectionService, userInteraction));
        }
Example #13
0
        public void RecoveringAttributesRecoversTheAttributesForTheMembersProvided_ViaMember()
        {
            var inputCode =
                @"Public Function Foo() As Variant
Attribute Foo.VB_UserMemId = 0
Attribute Foo.VB_Description = ""DefaultMember""
End Function

Public Function Bar() As Variant
Attribute Bar.VB_UserMemId = -4
Attribute Bar.VB_Description = ""Enumerator""
End Function";

            var expectedCode =
                @"Public Function Foo() As Variant
Attribute Foo.VB_UserMemId = 0
Attribute Foo.VB_Description = ""DefaultMember""
End Function

Public Function Bar() As Variant
End Function";
            var vbe = MockVbeBuilder.BuildFromSingleStandardModule(inputCode, out var component).Object;

            var(state, rewritingManager) = MockParser.CreateAndParseWithRewritingManager(vbe);
            using (state)
            {
                var attributesUpdater        = new AttributesUpdater(state);
                var mockFailureNotifier      = new Mock <IMemberAttributeRecoveryFailureNotifier>();
                var memberAttributeRecoverer = new MemberAttributeRecoverer(state, state, attributesUpdater, mockFailureNotifier.Object);
                memberAttributeRecoverer.RewritingManager = rewritingManager;

                var fooDeclaration = state.DeclarationFinder.UserDeclarations(DeclarationType.Function)
                                     .First(decl => decl.IdentifierName.Equals("Foo"));
                var membersToRecoverAttributesFor = new List <QualifiedMemberName> {
                    fooDeclaration.QualifiedName
                };

                memberAttributeRecoverer.RecoverCurrentMemberAttributesAfterNextParse(membersToRecoverAttributesFor);

                var rewriteSession = rewritingManager.CheckOutCodePaneSession();
                var declarationsForWhichToRemoveAttributes = state.DeclarationFinder.UserDeclarations(DeclarationType.Function);
                RemoveAttributes(declarationsForWhichToRemoveAttributes, rewriteSession);

                ExecuteAndWaitForParserState(state, () => rewriteSession.TryRewrite(), ParserState.Ready);
            }
            var actualCode = component.CodeModule.Content();

            Assert.AreEqual(expectedCode, actualCode);
        }
Example #14
0
        public void AddOrUpdateAttribute_UsualAttribute_AlreadyThere_UpdatesAttribute_Member()
        {
            const string inputCode =
                @"VERSION 1.0 CLASS
BEGIN
  MultiUse = -1  'True
END
Attribute VB_Name = ""ClassKeys""
Attribute VB_GlobalNameSpace = False
Public Sub Foo(bar As String)
Attribute Foo.VB_UserMemId = -4
    bar = vbNullString
End Sub
";

            const string expectedCode =
                @"VERSION 1.0 CLASS
BEGIN
  MultiUse = -1  'True
END
Attribute VB_Name = ""ClassKeys""
Attribute VB_GlobalNameSpace = False
Public Sub Foo(bar As String)
Attribute Foo.VB_UserMemId = 0
    bar = vbNullString
End Sub
";
            var attribute = "Foo.VB_UserMemId";
            var newValues = new List <string> {
                "0"
            };

            string actualCode;

            var(component, rewriteSession, state) = TestSetup(inputCode);
            using (state)
            {
                var moduleDeclaration = state.DeclarationFinder
                                        .UserDeclarations(DeclarationType.Procedure)
                                        .Single();
                var attributesUpdater = new AttributesUpdater(state);

                attributesUpdater.AddOrUpdateAttribute(rewriteSession, moduleDeclaration, attribute, newValues);
                rewriteSession.TryRewrite();

                actualCode = component.CodeModule.Content();
            }
            Assert.AreEqual(expectedCode, actualCode);
        }
Example #15
0
        public void RecoveringAttributesStillThereDoesNotDoAnything_ViaMember()
        {
            var inputCode =
                @"Public Function Foo() As Variant
Attribute Foo.VB_UserMemId = 0
Attribute Foo.VB_Description = ""DefaultMember""
End Function

Public Function Bar() As Variant
Attribute Bar.VB_UserMemId = -4
Attribute Bar.VB_Description = ""Enumerator""
End Function";

            var expectedCode =
                @"Public Function Foo() As Variant
Attribute Foo.VB_UserMemId = 0
Attribute Foo.VB_Description = ""DefaultMember""
End Function

Public Function Bar() As Variant
Attribute Bar.VB_UserMemId = -4
Attribute Bar.VB_Description = ""Enumerator""
End Function";
            var vbe = MockVbeBuilder.BuildFromSingleStandardModule(inputCode, out var component).Object;

            var(state, rewritingManager) = MockParser.CreateAndParseWithRewritingManager(vbe);
            using (state)
            {
                var attributesUpdater        = new AttributesUpdater(state);
                var mockFailureNotifier      = new Mock <IMemberAttributeRecoveryFailureNotifier>();
                var memberAttributeRecoverer = new MemberAttributeRecoverer(state, state, attributesUpdater, mockFailureNotifier.Object);
                memberAttributeRecoverer.RewritingManager = rewritingManager;

                var fooDeclaration = state.DeclarationFinder.UserDeclarations(DeclarationType.Function)
                                     .First(decl => decl.IdentifierName.Equals("Foo"));
                var membersToRecoverAttributesFor = new List <QualifiedMemberName> {
                    fooDeclaration.QualifiedName
                };

                memberAttributeRecoverer.RecoverCurrentMemberAttributesAfterNextParse(membersToRecoverAttributesFor);

                state.OnParseRequested(this);
            }
            var actualCode = component.CodeModule.Content();

            Assert.AreEqual(expectedCode, actualCode);
        }
        //Should never happen in a real module.
        public void AddAttributeAddsModuleAttributeAtTopOfModuleIfThereAreNoModuleAttributesYet()
        {
            const string inputCode =
                @"Public Sub Foo(bar As String)
    bar = vbNullString
End Sub
";

            const string expectedCode =
                @"Attribute VB_Exposed = False
Public Sub Foo(bar As String)
    bar = vbNullString
End Sub
";
            var attributeToAdd  = "VB_Exposed";
            var attributeValues = new List <string> {
                "False"
            };

            string actualCode;

            var(component, rewriteSession, state) = TestSetup(inputCode);
            using (state)
            {
                var moduleDeclaration = state.DeclarationFinder
                                        .UserDeclarations(DeclarationType.ProceduralModule)
                                        .First();
                var attributesUpdater = new AttributesUpdater(state);

                attributesUpdater.AddAttribute(rewriteSession, moduleDeclaration, attributeToAdd, attributeValues);
                rewriteSession.TryRewrite();

                actualCode = component.CodeModule.Content();
            }
            Assert.AreEqual(expectedCode, actualCode);
        }