diff --git a/plugin/src/main/java/com/intellij/java/impl/ig/classlayout/PublicConstructorInspection.java b/plugin/src/main/java/com/intellij/java/impl/ig/classlayout/PublicConstructorInspection.java index 8093615f7..d9d910293 100644 --- a/plugin/src/main/java/com/intellij/java/impl/ig/classlayout/PublicConstructorInspection.java +++ b/plugin/src/main/java/com/intellij/java/impl/ig/classlayout/PublicConstructorInspection.java @@ -19,12 +19,13 @@ import com.intellij.java.impl.ig.psiutils.SerializationUtils; import com.intellij.java.language.psi.PsiClass; import com.intellij.java.language.psi.PsiMethod; -import com.intellij.java.language.psi.PsiModifier; import com.intellij.java.language.psi.PsiParameterList; import com.siyeh.ig.BaseInspection; import com.siyeh.ig.BaseInspectionVisitor; import com.siyeh.ig.InspectionGadgetsFix; import com.siyeh.localize.InspectionGadgetsLocalize; +import consulo.annotation.access.RequiredReadAction; +import consulo.annotation.access.RequiredWriteAction; import consulo.annotation.component.ExtensionImpl; import consulo.dataContext.DataContext; import consulo.dataContext.DataManager; @@ -77,6 +78,7 @@ public LocalizeValue getName() { } @Override + @RequiredWriteAction protected void doFix(Project project, ProblemDescriptor descriptor) throws IncorrectOperationException { PsiElement element = PsiTreeUtil.getParentOfType(descriptor.getPsiElement(), PsiClass.class, PsiMethod.class); AsyncResult context = DataManager.getInstance().getDataContextFromFocus(); @@ -94,18 +96,18 @@ public BaseInspectionVisitor buildVisitor() { } private static class PublicConstructorVisitor extends BaseInspectionVisitor { - @Override - public void visitMethod(PsiMethod method) { + @RequiredReadAction + public void visitMethod(@Nonnull PsiMethod method) { super.visitMethod(method); if (!method.isConstructor()) { return; } - if (!method.hasModifierProperty(PsiModifier.PUBLIC)) { + if (!method.isPublic()) { return; } PsiClass aClass = method.getContainingClass(); - if (aClass == null || aClass.hasModifierProperty(PsiModifier.ABSTRACT)) { + if (aClass == null || aClass.isAbstract()) { return; } if (SerializationUtils.isExternalizable(aClass)) { @@ -118,12 +120,13 @@ public void visitMethod(PsiMethod method) { } @Override - public void visitClass(PsiClass aClass) { + @RequiredReadAction + public void visitClass(@Nonnull PsiClass aClass) { super.visitClass(aClass); if (aClass.isInterface() || aClass.isEnum()) { return; } - if (!aClass.hasModifierProperty(PsiModifier.PUBLIC) || aClass.hasModifierProperty(PsiModifier.ABSTRACT)) { + if (!aClass.isPublic() || aClass.isAbstract()) { return; } PsiMethod[] constructors = aClass.getConstructors(); diff --git a/plugin/src/main/java/com/intellij/java/impl/refactoring/changeSignature/JavaChangeSignatureUsageSearcher.java b/plugin/src/main/java/com/intellij/java/impl/refactoring/changeSignature/JavaChangeSignatureUsageSearcher.java index 81f189d4f..2c658e515 100644 --- a/plugin/src/main/java/com/intellij/java/impl/refactoring/changeSignature/JavaChangeSignatureUsageSearcher.java +++ b/plugin/src/main/java/com/intellij/java/impl/refactoring/changeSignature/JavaChangeSignatureUsageSearcher.java @@ -43,6 +43,7 @@ import consulo.util.collection.ContainerUtil; import consulo.util.lang.Comparing; import consulo.xml.psi.xml.XmlElement; +import jakarta.annotation.Nonnull; import java.util.ArrayList; import java.util.HashSet; @@ -64,9 +65,7 @@ class JavaChangeSignatureUsageSearcher { public UsageInfo[] findUsages() { List result = new ArrayList<>(); PsiElement element = myChangeInfo.getMethod(); - if (element instanceof PsiMethod) { - PsiMethod method = (PsiMethod) element; - + if (element instanceof PsiMethod method) { findSimpleUsages(method, result); UsageInfo[] usageInfos = result.toArray(new UsageInfo[result.size()]); @@ -248,11 +247,8 @@ else if (element instanceof PsiDocTagValue) { } else if (element instanceof PsiMethod refMethod && refMethod.isConstructor()) { if (JavaLanguage.INSTANCE.equals(element.getLanguage())) { - DefaultConstructorImplicitUsageInfo implicitUsageInfo = new DefaultConstructorImplicitUsageInfo( - (PsiMethod) element, - ((PsiMethod) element).getContainingClass(), - method - ); + DefaultConstructorImplicitUsageInfo implicitUsageInfo = + new DefaultConstructorImplicitUsageInfo(refMethod, refMethod.getContainingClass(), method); result.add(implicitUsageInfo); } } @@ -270,8 +266,8 @@ else if (element instanceof PsiClass psiClass) { result.add(new NoConstructorClassUsageInfo(psiClass)); } } - else if (ref instanceof PsiCallReference) { - result.add(new CallReferenceUsageInfo((PsiCallReference) ref)); + else if (ref instanceof PsiCallReference callRef) { + result.add(new CallReferenceUsageInfo(callRef)); } else { result.add(new MoveRenameUsageInfo(element, ref, method)); @@ -279,8 +275,10 @@ else if (ref instanceof PsiCallReference) { } //if (method.isConstructor() && parameterCount == 0) { - // RefactoringUtil.visitImplicitConstructorUsages(method.getContainingClass(), - // new DefaultConstructorUsageCollector(result)); + // RefactoringUtil.visitImplicitConstructorUsages( + // method.getContainingClass(), + // new DefaultConstructorUsageCollector(result) + // ); //} } else if (myChangeInfo.isParameterTypesChanged()) { @@ -338,6 +336,7 @@ public RenamedParameterCollidesWithLocalUsageInfo(PsiParameter parameter, PsiEle myMethod = method; } + @Nonnull @Override public LocalizeValue getDescription() { return RefactoringLocalize.thereIsAlreadyA0InThe1ItWillConflictWithTheRenamedParameter( diff --git a/plugin/src/main/java/com/intellij/java/impl/refactoring/changeSignature/NewParameterCollidesWithLocalUsageInfo.java b/plugin/src/main/java/com/intellij/java/impl/refactoring/changeSignature/NewParameterCollidesWithLocalUsageInfo.java index 25fadeee3..aa6ec6b01 100644 --- a/plugin/src/main/java/com/intellij/java/impl/refactoring/changeSignature/NewParameterCollidesWithLocalUsageInfo.java +++ b/plugin/src/main/java/com/intellij/java/impl/refactoring/changeSignature/NewParameterCollidesWithLocalUsageInfo.java @@ -19,9 +19,9 @@ import consulo.language.editor.refactoring.localize.RefactoringLocalize; import consulo.language.editor.refactoring.rename.UnresolvableCollisionUsageInfo; import consulo.language.editor.refactoring.ui.RefactoringUIUtil; -import consulo.language.editor.refactoring.util.CommonRefactoringUtil; import consulo.language.psi.PsiElement; import consulo.localize.LocalizeValue; +import jakarta.annotation.Nonnull; /** * @author dsl @@ -39,6 +39,7 @@ public NewParameterCollidesWithLocalUsageInfo( myMethod = method; } + @Nonnull @Override public LocalizeValue getDescription() { return RefactoringLocalize.thereIsAlreadyA0In1ItWillConflictWithTheNewParameter( diff --git a/plugin/src/main/java/com/intellij/java/impl/refactoring/convertToInstanceMethod/ConvertToInstanceMethodDialog.java b/plugin/src/main/java/com/intellij/java/impl/refactoring/convertToInstanceMethod/ConvertToInstanceMethodDialog.java index 04639fe60..b0d13f3d0 100644 --- a/plugin/src/main/java/com/intellij/java/impl/refactoring/convertToInstanceMethod/ConvertToInstanceMethodDialog.java +++ b/plugin/src/main/java/com/intellij/java/impl/refactoring/convertToInstanceMethod/ConvertToInstanceMethodDialog.java @@ -15,17 +15,17 @@ */ package com.intellij.java.impl.refactoring.convertToInstanceMethod; -import consulo.application.HelpManager; -import consulo.language.editor.refactoring.localize.RefactoringLocalize; -import consulo.logging.Logger; +import com.intellij.java.impl.refactoring.HelpID; +import com.intellij.java.impl.refactoring.move.moveInstanceMethod.MoveInstanceMethodDialogBase; import com.intellij.java.language.psi.PsiMethod; import com.intellij.java.language.psi.PsiParameter; import com.intellij.java.language.psi.PsiVariable; -import com.intellij.java.impl.refactoring.HelpID; -import consulo.language.editor.refactoring.RefactoringBundle; -import com.intellij.java.impl.refactoring.move.moveInstanceMethod.MoveInstanceMethodDialogBase; -import consulo.ui.ex.awt.event.DoubleClickListener; +import consulo.application.HelpManager; +import consulo.language.editor.refactoring.localize.RefactoringLocalize; +import consulo.logging.Logger; +import consulo.ui.annotation.RequiredUIAccess; import consulo.ui.ex.awt.UIUtil; +import consulo.ui.ex.awt.event.DoubleClickListener; import javax.swing.*; import java.awt.*; @@ -34,49 +34,62 @@ /** * @author ven */ -public class ConvertToInstanceMethodDialog extends MoveInstanceMethodDialogBase { - private static final Logger LOG = Logger.getInstance(ConvertToInstanceMethodDialog.class); - public ConvertToInstanceMethodDialog(PsiMethod method, PsiParameter[] variables) { - super(method, variables, ConvertToInstanceMethodHandler.REFACTORING_NAME); - init(); - } +public class ConvertToInstanceMethodDialog extends MoveInstanceMethodDialogBase { + private static final Logger LOG = Logger.getInstance(ConvertToInstanceMethodDialog.class); + + public ConvertToInstanceMethodDialog(PsiMethod method, PsiParameter[] variables) { + super(method, variables, ConvertToInstanceMethodHandler.REFACTORING_NAME.get()); + init(); + } - protected void doAction() { - PsiVariable targetVariable = (PsiVariable)myList.getSelectedValue(); - LOG.assertTrue(targetVariable instanceof PsiParameter); - ConvertToInstanceMethodProcessor processor = new ConvertToInstanceMethodProcessor(myMethod.getProject(), - myMethod, (PsiParameter)targetVariable, - myVisibilityPanel.getVisibility()); - if (!verifyTargetClass(processor.getTargetClass())) return; - invokeRefactoring(processor); - } + @Override + @RequiredUIAccess + protected void doAction() { + PsiVariable targetVariable = (PsiVariable) myList.getSelectedValue(); + LOG.assertTrue(targetVariable instanceof PsiParameter); + ConvertToInstanceMethodProcessor processor = new ConvertToInstanceMethodProcessor(myMethod.getProject(), + myMethod, (PsiParameter) targetVariable, + myVisibilityPanel.getVisibility() + ); + if (!verifyTargetClass(processor.getTargetClass())) { + return; + } + invokeRefactoring(processor); + } - protected void doHelpAction() { - HelpManager.getInstance().invokeHelp(HelpID.CONVERT_TO_INSTANCE_METHOD); - } + @Override + @RequiredUIAccess + protected void doHelpAction() { + HelpManager.getInstance().invokeHelp(HelpID.CONVERT_TO_INSTANCE_METHOD); + } - protected JComponent createCenterPanel() { - JPanel panel = new JPanel(new BorderLayout(UIUtil.DEFAULT_HGAP, UIUtil.DEFAULT_VGAP)); - JLabel label = new JLabel(RefactoringLocalize.moveinstancemethodSelectAnInstanceParameter().get()); - panel.add(label, BorderLayout.NORTH); - panel.add(createListAndVisibilityPanels(), BorderLayout.CENTER); - return panel; - } + @Override + protected JComponent createCenterPanel() { + JPanel panel = new JPanel(new BorderLayout(UIUtil.DEFAULT_HGAP, UIUtil.DEFAULT_VGAP)); + JLabel label = new JLabel(RefactoringLocalize.moveinstancemethodSelectAnInstanceParameter().get()); + panel.add(label, BorderLayout.NORTH); + panel.add(createListAndVisibilityPanels(), BorderLayout.CENTER); + return panel; + } - @Override - protected JList createTargetVariableChooser() { - final JList variableChooser = super.createTargetVariableChooser(); - new DoubleClickListener() { - @Override - protected boolean onDoubleClick(MouseEvent e) { - Point point = e.getPoint(); - int index = variableChooser.locationToIndex(point); - if (index == -1) return false; - if (!variableChooser.getCellBounds(index, index).contains(point)) return false; - doRefactorAction(); - return true; - } - }.installOn(variableChooser); - return variableChooser; - } + @Override + protected JList createTargetVariableChooser() { + final JList variableChooser = super.createTargetVariableChooser(); + new DoubleClickListener() { + @Override + protected boolean onDoubleClick(MouseEvent e) { + Point point = e.getPoint(); + int index = variableChooser.locationToIndex(point); + if (index == -1) { + return false; + } + if (!variableChooser.getCellBounds(index, index).contains(point)) { + return false; + } + doRefactorAction(); + return true; + } + }.installOn(variableChooser); + return variableChooser; + } } diff --git a/plugin/src/main/java/com/intellij/java/impl/refactoring/extractMethodObject/ExtractLightMethodObjectHandler.java b/plugin/src/main/java/com/intellij/java/impl/refactoring/extractMethodObject/ExtractLightMethodObjectHandler.java index 719ce75d9..47e7a331d 100644 --- a/plugin/src/main/java/com/intellij/java/impl/refactoring/extractMethodObject/ExtractLightMethodObjectHandler.java +++ b/plugin/src/main/java/com/intellij/java/impl/refactoring/extractMethodObject/ExtractLightMethodObjectHandler.java @@ -147,19 +147,19 @@ public static ExtractedData extractLightMethodObject( if (elementsCopy.length == 0) { return null; } - if (elementsCopy[elementsCopy.length - 1] instanceof PsiExpressionStatement) { - PsiExpression expr = ((PsiExpressionStatement) elementsCopy[elementsCopy.length - 1]).getExpression(); + if (elementsCopy[elementsCopy.length - 1] instanceof PsiExpressionStatement expressionStmt) { + PsiExpression expr = expressionStmt.getExpression(); if (!(expr instanceof PsiAssignmentExpression)) { PsiType expressionType = GenericsUtil.getVariableTypeByExpressionType(expr.getType()); if (expressionType instanceof PsiDisjunctionType disjunctionType) { - expressionType = ((PsiDisjunctionType) disjunctionType).getLeastUpperBound(); + expressionType = disjunctionType.getLeastUpperBound(); } if (isValidVariableType(expressionType)) { String uniqueResultName = JavaCodeStyleManager.getInstance(project).suggestUniqueVariableName("result", elementsCopy[0], true); String statementText = expressionType.getCanonicalText() + " " + uniqueResultName + " = " + expr.getText() + ";"; - elementsCopy[elementsCopy.length - 1] = elementsCopy[elementsCopy.length - 1] - .replace(elementFactory.createStatementFromText(statementText, elementsCopy[elementsCopy.length - 1])); + elementsCopy[elementsCopy.length - 1] = + expressionStmt.replace(elementFactory.createStatementFromText(statementText, expressionStmt)); } } } diff --git a/plugin/src/main/java/com/intellij/java/impl/refactoring/extractMethodObject/ExtractMethodObjectProcessor.java b/plugin/src/main/java/com/intellij/java/impl/refactoring/extractMethodObject/ExtractMethodObjectProcessor.java index 87f8ee684..4b1d0bf51 100644 --- a/plugin/src/main/java/com/intellij/java/impl/refactoring/extractMethodObject/ExtractMethodObjectProcessor.java +++ b/plugin/src/main/java/com/intellij/java/impl/refactoring/extractMethodObject/ExtractMethodObjectProcessor.java @@ -531,8 +531,8 @@ private String inferTypeArguments(PsiMethodCallExpression methodCallExpression) @Nonnull @Override - protected String getCommandName() { - return REFACTORING_NAME.get(); + protected LocalizeValue getCommandName() { + return REFACTORING_NAME; } @RequiredReadAction @@ -736,7 +736,7 @@ protected boolean isNeedToChangeCallContext() { @Override protected void apply(AbstractExtractDialog dialog) { super.apply(dialog); - myCreateInnerClass = !(dialog instanceof ExtractMethodObjectDialog) || ((ExtractMethodObjectDialog) dialog).createInnerClass(); + myCreateInnerClass = !(dialog instanceof ExtractMethodObjectDialog extractDialog && !extractDialog.createInnerClass()); myInnerClassName = myCreateInnerClass ? StringUtil.capitalize(dialog.getChosenMethodName()) : dialog.getChosenMethodName(); } diff --git a/plugin/src/main/java/com/intellij/java/impl/refactoring/inline/InlineParameterExpressionProcessor.java b/plugin/src/main/java/com/intellij/java/impl/refactoring/inline/InlineParameterExpressionProcessor.java index 0f458b301..93093b2c6 100644 --- a/plugin/src/main/java/com/intellij/java/impl/refactoring/inline/InlineParameterExpressionProcessor.java +++ b/plugin/src/main/java/com/intellij/java/impl/refactoring/inline/InlineParameterExpressionProcessor.java @@ -81,8 +81,8 @@ public InlineParameterExpressionProcessor( @Nonnull @Override - protected String getCommandName() { - return InlineParameterHandler.REFACTORING_NAME.get(); + protected LocalizeValue getCommandName() { + return InlineParameterHandler.REFACTORING_NAME; } @Nonnull diff --git a/plugin/src/main/java/com/intellij/java/impl/refactoring/inline/InlineToAnonymousClassProcessor.java b/plugin/src/main/java/com/intellij/java/impl/refactoring/inline/InlineToAnonymousClassProcessor.java index ade221ae5..0fa0d9e58 100644 --- a/plugin/src/main/java/com/intellij/java/impl/refactoring/inline/InlineToAnonymousClassProcessor.java +++ b/plugin/src/main/java/com/intellij/java/impl/refactoring/inline/InlineToAnonymousClassProcessor.java @@ -24,7 +24,6 @@ import consulo.language.editor.refactoring.rename.NonCodeUsageInfoFactory; import consulo.language.editor.refactoring.util.TextOccurrencesUtil; import consulo.language.psi.PsiElement; -import consulo.language.psi.PsiFile; import consulo.language.psi.PsiReference; import consulo.language.psi.scope.GlobalSearchScope; import consulo.language.psi.search.ReferencesSearch; @@ -346,7 +345,7 @@ public static PsiClassType getSuperType(PsiClass aClass) { @Nonnull @Override - protected String getCommandName() { - return RefactoringLocalize.inlineToAnonymousCommandName(myClass.getQualifiedName()).get(); + protected LocalizeValue getCommandName() { + return RefactoringLocalize.inlineToAnonymousCommandName(myClass.getQualifiedName()); } } diff --git a/plugin/src/main/java/com/intellij/java/impl/refactoring/inlineSuperClass/InlineSuperClassRefactoringProcessor.java b/plugin/src/main/java/com/intellij/java/impl/refactoring/inlineSuperClass/InlineSuperClassRefactoringProcessor.java index b21fdec5f..e7209ff19 100644 --- a/plugin/src/main/java/com/intellij/java/impl/refactoring/inlineSuperClass/InlineSuperClassRefactoringProcessor.java +++ b/plugin/src/main/java/com/intellij/java/impl/refactoring/inlineSuperClass/InlineSuperClassRefactoringProcessor.java @@ -102,10 +102,9 @@ protected void findUsages(@Nonnull List usages) { PsiResolveHelper resolveHelper = facade.getResolveHelper(); ReferencesSearch.search(mySuperClass).forEach(reference -> { - PsiElement element = reference.getElement(); - if (element instanceof PsiJavaCodeReferenceElement codeRef) { + if (reference.getElement() instanceof PsiJavaCodeReferenceElement codeRef) { if (myCurrentInheritor != null) { - if (element.getParent() instanceof PsiReferenceList refList + if (codeRef.getParent() instanceof PsiReferenceList refList && refList.getParent() instanceof PsiClass inheritor && (refList.equals(inheritor.getExtendsList()) || refList.equals(inheritor.getImplementsList())) && myCurrentInheritor.equals(inheritor)) { @@ -113,23 +112,19 @@ protected void findUsages(@Nonnull List usages) { } return true; } - PsiImportStaticStatement staticImportStatement = PsiTreeUtil.getParentOfType(element, PsiImportStaticStatement.class); + PsiImportStaticStatement staticImportStatement = PsiTreeUtil.getParentOfType(codeRef, PsiImportStaticStatement.class); if (staticImportStatement != null) { usages.add(new ReplaceStaticImportUsageInfo(staticImportStatement, myTargetClasses)); } else { - PsiImportStatement importStatement = PsiTreeUtil.getParentOfType(element, PsiImportStatement.class); + PsiImportStatement importStatement = PsiTreeUtil.getParentOfType(codeRef, PsiImportStatement.class); if (importStatement != null) { usages.add(new RemoveImportUsageInfo(importStatement)); } - else if (element.getParent() instanceof PsiReferenceList refList) { + else if (codeRef.getParent() instanceof PsiReferenceList refList) { if (refList.getParent() instanceof PsiClass inheritor && (refList.equals(inheritor.getExtendsList()) || refList.equals(inheritor.getImplementsList()))) { - usages.add(new ReplaceExtendsListUsageInfo( - (PsiJavaCodeReferenceElement) element, - mySuperClass, - inheritor - )); + usages.add(new ReplaceExtendsListUsageInfo(codeRef, mySuperClass, inheritor)); } } else { @@ -139,7 +134,7 @@ else if (element.getParent() instanceof PsiReferenceList refList) { TypeConversionUtil.getSuperClassSubstitutor(mySuperClass, targetClass, PsiSubstitutor.EMPTY) ); - if (element.getParent() instanceof PsiTypeElement typeElem) { + if (codeRef.getParent() instanceof PsiTypeElement typeElem) { PsiType superClassType = typeElem.getType(); PsiSubstitutor subst = getSuperClassSubstitutor(superClassType, targetClassType, resolveHelper, targetClass); usages.add(new ReplaceWithSubtypeUsageInfo( @@ -148,7 +143,7 @@ else if (element.getParent() instanceof PsiReferenceList refList) { myTargetClasses )); } - else if (element.getParent() instanceof PsiNewExpression newExpr) { + else if (codeRef.getParent() instanceof PsiNewExpression newExpr) { PsiClassType newType = elementFactory.createType( targetClass, getSuperClassSubstitutor( @@ -160,7 +155,7 @@ else if (element.getParent() instanceof PsiNewExpression newExpr) { ); usages.add(new ReplaceConstructorUsageInfo(newExpr, newType, myTargetClasses)); } - else if (element.getParent() instanceof PsiJavaCodeReferenceElement parentCodeRef) { + else if (codeRef.getParent() instanceof PsiJavaCodeReferenceElement parentCodeRef) { usages.add(new ReplaceReferenceUsageInfo(parentCodeRef.getQualifier(), myTargetClasses)); } } @@ -415,7 +410,7 @@ private static PsiSubstitutor getSuperClassSubstitutor( @Nonnull @Override - protected String getCommandName() { - return InlineSuperClassRefactoringHandler.REFACTORING_NAME.get(); + protected LocalizeValue getCommandName() { + return InlineSuperClassRefactoringHandler.REFACTORING_NAME; } } diff --git a/plugin/src/main/java/com/intellij/java/impl/refactoring/introduceParameter/IntroduceParameterProcessor.java b/plugin/src/main/java/com/intellij/java/impl/refactoring/introduceParameter/IntroduceParameterProcessor.java index 59a2d4658..fcb33a3b2 100644 --- a/plugin/src/main/java/com/intellij/java/impl/refactoring/introduceParameter/IntroduceParameterProcessor.java +++ b/plugin/src/main/java/com/intellij/java/impl/refactoring/introduceParameter/IntroduceParameterProcessor.java @@ -299,8 +299,7 @@ private void detectAccessibilityConflicts(UsageInfo[] usageArray, MultiMap extractedUsages = new ArrayList<>(usages.length); + List extractedUsages = new ArrayList<>(usages.length); for (UsageInfo usage : usages) { if (usage instanceof MoveRenameUsageInfo usageInfo && element.equals(usageInfo.getReferencedElement())) { extractedUsages.add(usageInfo); @@ -268,7 +269,7 @@ protected void performRefactoring(@Nonnull UsageInfo[] usages) { @Nonnull @Override - protected String getCommandName() { - return InvertBooleanHandler.REFACTORING_NAME.get(); + protected LocalizeValue getCommandName() { + return InvertBooleanHandler.REFACTORING_NAME; } }