From f3703cbcc5da1c3ea777d038131243cad04db0c7 Mon Sep 17 00:00:00 2001 From: aclement Date: Fri, 13 Aug 2010 17:39:31 +0000 Subject: [PATCH] generics --- .../aspectj/weaver/BoundedReferenceType.java | 2 +- .../weaver/BoundedReferenceTypeDelegate.java | 9 ++- .../aspectj/weaver/ConcreteTypeMunger.java | 3 +- .../aspectj/weaver/CrosscuttingMembers.java | 8 +- .../src/org/aspectj/weaver/Dump.java | 2 +- .../GeneratedReferenceTypeDelegate.java | 7 +- .../src/org/aspectj/weaver/IntMap.java | 15 ++-- .../aspectj/weaver/JoinPointSignature.java | 2 +- .../src/org/aspectj/weaver/Lint.java | 48 ++++++----- .../src/org/aspectj/weaver/ReferenceType.java | 2 +- .../aspectj/weaver/ResolvedMemberImpl.java | 2 +- .../src/org/aspectj/weaver/Shadow.java | 79 +++++++++++-------- .../weaver/TypeVariableReferenceType.java | 4 +- 13 files changed, 107 insertions(+), 76 deletions(-) diff --git a/org.aspectj.matcher/src/org/aspectj/weaver/BoundedReferenceType.java b/org.aspectj.matcher/src/org/aspectj/weaver/BoundedReferenceType.java index 68c18c4a2..30a2e4e4c 100644 --- a/org.aspectj.matcher/src/org/aspectj/weaver/BoundedReferenceType.java +++ b/org.aspectj.matcher/src/org/aspectj/weaver/BoundedReferenceType.java @@ -96,7 +96,7 @@ public class BoundedReferenceType extends ReferenceType { } @Override - public UnresolvedType parameterize(Map typeBindings) { + public UnresolvedType parameterize(Map typeBindings) { if (this.kind == UNBOUND) { return this; } diff --git a/org.aspectj.matcher/src/org/aspectj/weaver/BoundedReferenceTypeDelegate.java b/org.aspectj.matcher/src/org/aspectj/weaver/BoundedReferenceTypeDelegate.java index 03a2c4ff8..a9db7b699 100644 --- a/org.aspectj.matcher/src/org/aspectj/weaver/BoundedReferenceTypeDelegate.java +++ b/org.aspectj.matcher/src/org/aspectj/weaver/BoundedReferenceTypeDelegate.java @@ -6,6 +6,7 @@ package org.aspectj.weaver; import java.util.Collection; import java.util.Collections; +import org.aspectj.weaver.patterns.Declare; import org.aspectj.weaver.patterns.PerClause; class BoundedReferenceTypeDelegate extends AbstractReferenceTypeDelegate { @@ -102,16 +103,16 @@ class BoundedReferenceTypeDelegate extends AbstractReferenceTypeDelegate { return resolvedTypeX.getPerClause(); } - public Collection getDeclares() { + public Collection getDeclares() { return resolvedTypeX.getDeclares(); } - public Collection getTypeMungers() { + public Collection getTypeMungers() { return resolvedTypeX.getTypeMungers(); } - public Collection getPrivilegedAccesses() { - return Collections.EMPTY_LIST; + public Collection getPrivilegedAccesses() { + return Collections.emptyList(); } public int getModifiers() { diff --git a/org.aspectj.matcher/src/org/aspectj/weaver/ConcreteTypeMunger.java b/org.aspectj.matcher/src/org/aspectj/weaver/ConcreteTypeMunger.java index 8f8687622..81cf351a9 100644 --- a/org.aspectj.matcher/src/org/aspectj/weaver/ConcreteTypeMunger.java +++ b/org.aspectj.matcher/src/org/aspectj/weaver/ConcreteTypeMunger.java @@ -38,8 +38,7 @@ public abstract class ConcreteTypeMunger implements PartialOrder.PartialComparab ResolvedTypeMunger otherTypeMunger = o.getMunger(); ResolvedTypeMunger thisTypeMunger = getMunger(); if (thisTypeMunger instanceof NewConstructorTypeMunger && otherTypeMunger instanceof NewConstructorTypeMunger) { - return ((otherTypeMunger == null) ? (thisTypeMunger == null) : ((NewConstructorTypeMunger) otherTypeMunger) - .equivalentTo(thisTypeMunger)) + return (((NewConstructorTypeMunger) otherTypeMunger).equivalentTo(thisTypeMunger)) && ((o.getAspectType() == null) ? (getAspectType() == null) : o.getAspectType().equals(getAspectType())); } else { return ((otherTypeMunger == null) ? (thisTypeMunger == null) : otherTypeMunger.equals(thisTypeMunger)) diff --git a/org.aspectj.matcher/src/org/aspectj/weaver/CrosscuttingMembers.java b/org.aspectj.matcher/src/org/aspectj/weaver/CrosscuttingMembers.java index 23662c002..0b514d6ca 100644 --- a/org.aspectj.matcher/src/org/aspectj/weaver/CrosscuttingMembers.java +++ b/org.aspectj.matcher/src/org/aspectj/weaver/CrosscuttingMembers.java @@ -73,8 +73,8 @@ public class CrosscuttingMembers { this.shouldConcretizeIfNeeded = shouldConcretizeIfNeeded; } - private final Hashtable cflowFields = new Hashtable(); - private final Hashtable cflowBelowFields = new Hashtable(); + private final Hashtable cflowFields = new Hashtable(); + private final Hashtable cflowBelowFields = new Hashtable(); // public void addConcreteShadowMungers(Collection c) { // shadowMungers.addAll(c); @@ -558,11 +558,11 @@ public class CrosscuttingMembers { return declareTypeEow; } - public Map getCflowBelowFields() { + public Map getCflowBelowFields() { return cflowBelowFields; } - public Map getCflowFields() { + public Map getCflowFields() { return cflowFields; } diff --git a/org.aspectj.matcher/src/org/aspectj/weaver/Dump.java b/org.aspectj.matcher/src/org/aspectj/weaver/Dump.java index 4c0d67ee0..8d9aefda7 100644 --- a/org.aspectj.matcher/src/org/aspectj/weaver/Dump.java +++ b/org.aspectj.matcher/src/org/aspectj/weaver/Dump.java @@ -46,7 +46,7 @@ public class Dump { public static final String DUMP_EXCLUDED = "Excluded"; public static final String NULL_OR_EMPTY = "Empty"; - private static Class exceptionClass; + private static Class exceptionClass; private static IMessage.Kind conditionKind = IMessage.ABORT; private static File directory = new File("."); diff --git a/org.aspectj.matcher/src/org/aspectj/weaver/GeneratedReferenceTypeDelegate.java b/org.aspectj.matcher/src/org/aspectj/weaver/GeneratedReferenceTypeDelegate.java index c819ac321..e396b4025 100644 --- a/org.aspectj.matcher/src/org/aspectj/weaver/GeneratedReferenceTypeDelegate.java +++ b/org.aspectj.matcher/src/org/aspectj/weaver/GeneratedReferenceTypeDelegate.java @@ -11,6 +11,7 @@ package org.aspectj.weaver; import java.util.Collection; +import org.aspectj.weaver.patterns.Declare; import org.aspectj.weaver.patterns.PerClause; /** @@ -115,15 +116,15 @@ public class GeneratedReferenceTypeDelegate extends AbstractReferenceTypeDelegat throw new UnsupportedOperationException("Not supported for GeneratedReferenceTypeDelegate"); } - public Collection getDeclares() { + public Collection getDeclares() { throw new UnsupportedOperationException("Not supported for GeneratedReferenceTypeDelegate"); } - public Collection getTypeMungers() { + public Collection getTypeMungers() { throw new UnsupportedOperationException("Not supported for GeneratedReferenceTypeDelegate"); } - public Collection getPrivilegedAccesses() { + public Collection getPrivilegedAccesses() { throw new UnsupportedOperationException("Not supported for GeneratedReferenceTypeDelegate"); } diff --git a/org.aspectj.matcher/src/org/aspectj/weaver/IntMap.java b/org.aspectj.matcher/src/org/aspectj/weaver/IntMap.java index 6f37f20f2..c0af738ba 100644 --- a/org.aspectj.matcher/src/org/aspectj/weaver/IntMap.java +++ b/org.aspectj.matcher/src/org/aspectj/weaver/IntMap.java @@ -24,7 +24,7 @@ public class IntMap { // XXX begin hack to avoid a signature refactoring in Pointcut private ResolvedType concreteAspect; private ShadowMunger enclosingAdvice; - private List/* ResolvedPointcutDefinition */enclosingDefinition = new ArrayList(); + private List enclosingDefinition = new ArrayList(); public void pushEnclosingDefinition(ResolvedPointcutDefinition def) { enclosingDefinition.add(def); @@ -35,9 +35,10 @@ public class IntMap { } public ResolvedPointcutDefinition peekEnclosingDefinition() { - if (enclosingDefinition.size() == 0) + if (enclosingDefinition.size() == 0) { return null; - return (ResolvedPointcutDefinition) enclosingDefinition.get(enclosingDefinition.size() - 1); + } + return enclosingDefinition.get(enclosingDefinition.size() - 1); } public boolean directlyInAdvice() { @@ -53,10 +54,11 @@ public class IntMap { } public Member getAdviceSignature() { - if (enclosingAdvice instanceof Advice) + if (enclosingAdvice instanceof Advice) { return ((Advice) enclosingAdvice).getSignature(); - else + } else { return null; + } } public ResolvedType getConcreteAspect() { @@ -99,8 +101,9 @@ public class IntMap { if (key >= map.length) { int[] tmp = new int[key * 2 + 1]; // ??? better expansion function System.arraycopy(map, 0, tmp, 0, map.length); - for (int i = map.length, len = tmp.length; i < len; i++) + for (int i = map.length, len = tmp.length; i < len; i++) { tmp[i] = MISSING; + } map = tmp; } map[key] = val; diff --git a/org.aspectj.matcher/src/org/aspectj/weaver/JoinPointSignature.java b/org.aspectj.matcher/src/org/aspectj/weaver/JoinPointSignature.java index 75a7618a2..39bbf4053 100644 --- a/org.aspectj.matcher/src/org/aspectj/weaver/JoinPointSignature.java +++ b/org.aspectj.matcher/src/org/aspectj/weaver/JoinPointSignature.java @@ -277,7 +277,7 @@ public class JoinPointSignature implements ResolvedMember { return realMember.getAnnotations(); } - public Collection getDeclaringTypes(World world) { + public Collection getDeclaringTypes(World world) { throw new UnsupportedOperationException("Adrian doesn't think you should be calling this..."); } diff --git a/org.aspectj.matcher/src/org/aspectj/weaver/Lint.java b/org.aspectj.matcher/src/org/aspectj/weaver/Lint.java index 70d3c9106..099adcd42 100644 --- a/org.aspectj.matcher/src/org/aspectj/weaver/Lint.java +++ b/org.aspectj.matcher/src/org/aspectj/weaver/Lint.java @@ -139,19 +139,23 @@ public class Lint { private static Trace trace = TraceFactory.getTraceFactory().getTrace(Lint.class); public Lint(World world) { - if (trace.isTraceEnabled()) + if (trace.isTraceEnabled()) { trace.enter("", this, world); + } this.world = world; - if (trace.isTraceEnabled()) + if (trace.isTraceEnabled()) { trace.exit(""); + } } public void setAll(String messageKind) { - if (trace.isTraceEnabled()) + if (trace.isTraceEnabled()) { trace.enter("setAll", this, messageKind); + } setAll(getMessageKind(messageKind)); - if (trace.isTraceEnabled()) + if (trace.isTraceEnabled()) { trace.exit("setAll"); + } } private void setAll(IMessage.Kind messageKind) { @@ -161,15 +165,16 @@ public class Lint { } public void setFromProperties(File file) { - if (trace.isTraceEnabled()) + if (trace.isTraceEnabled()) { trace.enter("setFromProperties", this, file); + } InputStream s = null; try { s = new FileInputStream(file); setFromProperties(s); } catch (IOException ioe) { - MessageUtil.error(world.getMessageHandler(), WeaverMessages.format(WeaverMessages.XLINT_LOAD_ERROR, file.getPath(), ioe - .getMessage())); + MessageUtil.error(world.getMessageHandler(), + WeaverMessages.format(WeaverMessages.XLINT_LOAD_ERROR, file.getPath(), ioe.getMessage())); } finally { if (s != null) { try { @@ -180,8 +185,9 @@ public class Lint { } } - if (trace.isTraceEnabled()) + if (trace.isTraceEnabled()) { trace.exit("setFromProperties"); + } } public void loadDefaultProperties() { @@ -193,8 +199,8 @@ public class Lint { try { setFromProperties(s); } catch (IOException ioe) { - MessageUtil.error(world.getMessageHandler(), WeaverMessages.format(WeaverMessages.XLINTDEFAULT_LOAD_PROBLEM, ioe - .getMessage())); + MessageUtil.error(world.getMessageHandler(), + WeaverMessages.format(WeaverMessages.XLINTDEFAULT_LOAD_PROBLEM, ioe.getMessage())); } finally { try { s.close(); @@ -211,6 +217,7 @@ public class Lint { setFromProperties(p); } + @SuppressWarnings("rawtypes") public void setFromProperties(Properties properties) { for (Iterator i = properties.entrySet().iterator(); i.hasNext();) { Map.Entry entry = (Map.Entry) i.next(); @@ -232,11 +239,11 @@ public class Lint { } // temporarily suppress the given lint messages - public void suppressKinds(Collection lintKind) { - if (lintKind.isEmpty()) + public void suppressKinds(Collection lintKind) { + if (lintKind.isEmpty()) { return; - for (Iterator iter = lintKind.iterator(); iter.hasNext();) { - Kind k = (Kind) iter.next(); + } + for (Kind k : lintKind) { k.setSuppressed(true); } } @@ -255,12 +262,13 @@ public class Lint { } private IMessage.Kind getMessageKind(String v) { - if (v.equals("ignore")) + if (v.equals("ignore")) { return null; - else if (v.equals("warning")) + } else if (v.equals("warning")) { return IMessage.WARNING; - else if (v.equals("error")) + } else if (v.equals("error")) { return IMessage.ERROR; + } MessageUtil.error(world.getMessageHandler(), WeaverMessages.format(WeaverMessages.XLINT_VALUE_ERROR, v)); return null; @@ -308,8 +316,9 @@ public class Lint { } public void signal(String info, ISourceLocation location) { - if (kind == null) + if (kind == null) { return; + } String text = MessageFormat.format(message, new Object[] { info }); text += " [Xlint:" + name + "]"; @@ -317,8 +326,9 @@ public class Lint { } public void signal(String[] infos, ISourceLocation location, ISourceLocation[] extraLocations) { - if (kind == null) + if (kind == null) { return; + } String text = MessageFormat.format(message, (Object[]) infos); text += " [Xlint:" + name + "]"; diff --git a/org.aspectj.matcher/src/org/aspectj/weaver/ReferenceType.java b/org.aspectj.matcher/src/org/aspectj/weaver/ReferenceType.java index 10fb6c2d7..17d3ca3ec 100644 --- a/org.aspectj.matcher/src/org/aspectj/weaver/ReferenceType.java +++ b/org.aspectj.matcher/src/org/aspectj/weaver/ReferenceType.java @@ -53,7 +53,7 @@ public class ReferenceType extends ResolvedType { ResolvedMember[] parameterizedPointcuts = null; WeakReference parameterizedInterfaces = new WeakReference(null); Collection parameterizedDeclares = null; - Collection parameterizedTypeMungers = null; + // Collection parameterizedTypeMungers = null; // During matching it can be necessary to temporary mark types as annotated. For example // a declare @type may trigger a separate declare parents to match, and so the annotation diff --git a/org.aspectj.matcher/src/org/aspectj/weaver/ResolvedMemberImpl.java b/org.aspectj.matcher/src/org/aspectj/weaver/ResolvedMemberImpl.java index 7360b2fe1..14a6bc4d4 100644 --- a/org.aspectj.matcher/src/org/aspectj/weaver/ResolvedMemberImpl.java +++ b/org.aspectj.matcher/src/org/aspectj/weaver/ResolvedMemberImpl.java @@ -27,7 +27,7 @@ import org.aspectj.bridge.ISourceLocation; * @author PARC * @author Andy Clement */ -public class ResolvedMemberImpl extends MemberImpl implements IHasPosition, TypeVariableDeclaringElement, ResolvedMember { +public class ResolvedMemberImpl extends MemberImpl implements IHasPosition, ResolvedMember { private String[] parameterNames = null; protected UnresolvedType[] checkedExceptions = UnresolvedType.NONE; diff --git a/org.aspectj.matcher/src/org/aspectj/weaver/Shadow.java b/org.aspectj.matcher/src/org/aspectj/weaver/Shadow.java index c8c3121db..7d636f40f 100644 --- a/org.aspectj.matcher/src/org/aspectj/weaver/Shadow.java +++ b/org.aspectj.matcher/src/org/aspectj/weaver/Shadow.java @@ -85,8 +85,9 @@ public abstract class Shadow { * @throws IllegalStateException if there is no this here */ public final UnresolvedType getThisType() { - if (!hasThis()) + if (!hasThis()) { throw new IllegalStateException("no this"); + } if (getKind().isEnclosingKind()) { return getSignature().getDeclaringType(); } else { @@ -120,8 +121,9 @@ public abstract class Shadow { * @throws IllegalStateException if there is no target here */ public final UnresolvedType getTargetType() { - if (!hasTarget()) + if (!hasTarget()) { throw new IllegalStateException("no target"); + } return getSignature().getDeclaringType(); } @@ -133,8 +135,9 @@ public abstract class Shadow { public abstract Var getTargetVar(); public UnresolvedType[] getArgTypes() { - if (getKind() == FieldSet) + if (getKind() == FieldSet) { return new UnresolvedType[] { getSignature().getReturnType() }; + } return getSignature().getParameterTypes(); } @@ -153,14 +156,17 @@ public abstract class Shadow { int dims = 1; while (pos < s.length()) { pos++; - if (pos < s.length()) + if (pos < s.length()) { dims += (s.charAt(pos) == '[' ? 1 : 0); + } } - if (dims == 1) + if (dims == 1) { return new ResolvedType[] { ResolvedType.INT }; + } ResolvedType[] someInts = new ResolvedType[dims]; - for (int i = 0; i < dims; i++) + for (int i = 0; i < dims; i++) { someInts[i] = ResolvedType.INT; + } return someInts; } @@ -171,20 +177,23 @@ public abstract class Shadow { if (isShadowForMonitor()) { return UnresolvedType.ARRAY_WITH_JUST_OBJECT; } - if (getKind() == FieldSet) + if (getKind() == FieldSet) { return new UnresolvedType[] { getResolvedSignature().getGenericReturnType() }; + } return getResolvedSignature().getGenericParameterTypes(); } public UnresolvedType getArgType(int arg) { - if (getKind() == FieldSet) + if (getKind() == FieldSet) { return getSignature().getReturnType(); + } return getSignature().getParameterTypes()[arg]; } public int getArgCount() { - if (getKind() == FieldSet) + if (getKind() == FieldSet) { return 1; + } return getSignature().getParameterTypes().length; } @@ -263,12 +272,13 @@ public abstract class Shadow { } public UnresolvedType getReturnType() { - if (kind == ConstructorCall) + if (kind == ConstructorCall) { return getSignature().getDeclaringType(); - else if (kind == FieldSet) + } else if (kind == FieldSet) { return ResolvedType.VOID; - else if (kind == SynchronizationLock || kind == SynchronizationUnlock) + } else if (kind == SynchronizationLock || kind == SynchronizationUnlock) { return ResolvedType.VOID; + } return getResolvedSignature().getGenericReturnType(); } @@ -337,8 +347,9 @@ public abstract class Shadow { public static int howMany(int i) { int count = 0; for (int j = 0; j < SHADOW_KINDS.length; j++) { - if ((i & SHADOW_KINDS[j].bit) != 0) + if ((i & SHADOW_KINDS[j].bit) != 0) { count++; + } } return count; } @@ -423,10 +434,11 @@ public abstract class Shadow { public String getSimpleName() { int dash = getName().lastIndexOf('-'); - if (dash == -1) + if (dash == -1) { return getName(); - else + } else { return getName().substring(dash + 1); + } } public static Kind read(DataInputStream s) throws IOException { @@ -471,9 +483,10 @@ public abstract class Shadow { */ protected boolean checkMunger(ShadowMunger munger) { if (munger.mustCheckExceptions()) { - for (Iterator i = munger.getThrownExceptions().iterator(); i.hasNext();) { - if (!checkCanThrow(munger, (ResolvedType) i.next())) + for (Iterator i = munger.getThrownExceptions().iterator(); i.hasNext();) { + if (!checkCanThrow(munger, i.next())) { return false; + } } } return true; @@ -506,24 +519,27 @@ public abstract class Shadow { private boolean isDeclaredException(ResolvedType resolvedTypeX, Member member) { ResolvedType[] excs = getIWorld().resolve(member.getExceptions(getIWorld())); for (int i = 0, len = excs.length; i < len; i++) { - if (excs[i].isAssignableFrom(resolvedTypeX)) + if (excs[i].isAssignableFrom(resolvedTypeX)) { return true; + } } return false; } public void addMunger(ShadowMunger munger) { if (checkMunger(munger)) { - if (mungers == Collections.EMPTY_LIST) + if (mungers == Collections.EMPTY_LIST) { mungers = new ArrayList(); + } this.mungers.add(munger); } } public final void implement() { sortMungers(); - if (mungers == null) + if (mungers == null) { return; + } prepareForMungers(); implementMungers(); } @@ -537,8 +553,7 @@ public abstract class Shadow { if (sorted == null) { // this means that we have circular dependencies - for (Iterator i = mungers.iterator(); i.hasNext();) { - ShadowMunger m = (ShadowMunger) i.next(); + for (ShadowMunger m : mungers) { getIWorld().getMessageHandler().handleMessage( MessageUtil.error(WeaverMessages.format(WeaverMessages.CIRCULAR_DEPENDENCY, this), m.getSourceLocation())); } @@ -552,7 +567,7 @@ public abstract class Shadow { // Stores a set of strings of the form 'aspect1:aspect2' which indicates there is no // precedence specified between the two aspects at this shadow. - Set clashingAspects = new HashSet(); + Set clashingAspects = new HashSet(); int max = mungers.size(); // Compare every pair of advice mungers @@ -580,20 +595,21 @@ public abstract class Shadow { if (order != null && order.equals(new Integer(0))) { String key = adviceA.getDeclaringAspect() + ":" + adviceB.getDeclaringAspect(); String possibleExistingKey = adviceB.getDeclaringAspect() + ":" + adviceA.getDeclaringAspect(); - if (!clashingAspects.contains(possibleExistingKey)) + if (!clashingAspects.contains(possibleExistingKey)) { clashingAspects.add(key); + } } } } } } } - for (Iterator iter = clashingAspects.iterator(); iter.hasNext();) { - String element = (String) iter.next(); + for (Iterator iter = clashingAspects.iterator(); iter.hasNext();) { + String element = iter.next(); String aspect1 = element.substring(0, element.indexOf(":")); String aspect2 = element.substring(element.indexOf(":") + 1); - getIWorld().getLint().unorderedAdviceAtShadow.signal(new String[] { this.toString(), aspect1, aspect2 }, this - .getSourceLocation(), null); + getIWorld().getLint().unorderedAdviceAtShadow.signal(new String[] { this.toString(), aspect1, aspect2 }, + this.getSourceLocation(), null); } } } @@ -655,12 +671,13 @@ public abstract class Shadow { * Convert a bit array for the shadow kinds into a set of them... should only be used for testing - mainline code should do bit * manipulation! */ - public static Set toSet(int i) { - Set results = new HashSet(); + public static Set toSet(int i) { + Set results = new HashSet(); for (int j = 0; j < Shadow.SHADOW_KINDS.length; j++) { Kind k = Shadow.SHADOW_KINDS[j]; - if (k.isSet(i)) + if (k.isSet(i)) { results.add(k); + } } return results; } diff --git a/org.aspectj.matcher/src/org/aspectj/weaver/TypeVariableReferenceType.java b/org.aspectj.matcher/src/org/aspectj/weaver/TypeVariableReferenceType.java index d3cecff00..5579dfa9f 100644 --- a/org.aspectj.matcher/src/org/aspectj/weaver/TypeVariableReferenceType.java +++ b/org.aspectj.matcher/src/org/aspectj/weaver/TypeVariableReferenceType.java @@ -47,8 +47,8 @@ public class TypeVariableReferenceType extends ReferenceType implements TypeVari } @Override - public UnresolvedType parameterize(Map typeBindings) { - UnresolvedType ut = (UnresolvedType) typeBindings.get(getName()); + public UnresolvedType parameterize(Map typeBindings) { + UnresolvedType ut = typeBindings.get(getName()); if (ut != null) { return world.resolve(ut); } -- 2.39.5