diff --git a/src/SIL.LCModel/DomainServices/MorphServices.cs b/src/SIL.LCModel/DomainServices/MorphServices.cs
index b935577e..63fc5436 100644
--- a/src/SIL.LCModel/DomainServices/MorphServices.cs
+++ b/src/SIL.LCModel/DomainServices/MorphServices.cs
@@ -654,13 +654,29 @@ public static bool IsSuffixishType(LcmCache cache, int hvoMorphType)
public static ILexSense GetMainOrFirstSenseOfVariant(ILexEntryRef variantRef)
{
var mainEntryOrSense = variantRef.ComponentLexemesRS[0] as IVariantComponentLexeme;
- // find first gloss
- ILexEntry mainEntry;
- ILexSense mainOrFirstSense;
- GetMainEntryAndSenseStack(mainEntryOrSense, out mainEntry, out mainOrFirstSense);
- return mainOrFirstSense;
- }
-
+ if (mainEntryOrSense != null)
+ {
+ // find first gloss
+ ILexEntry mainEntry;
+ ILexSense mainOrFirstSense;
+ GetMainEntryAndSenseStack(mainEntryOrSense, out mainEntry, out mainOrFirstSense);
+ return mainOrFirstSense;
+ }
+ else
+ {
+ var componentLexeme = variantRef.ComponentLexemesRS[0];
+ if (componentLexeme != null && componentLexeme is ILexEntry)
+ {
+ ILexEntry entry = (ILexEntry)componentLexeme;
+ if (entry.SensesOS.Count > 0)
+ {
+ return GetMainOrFirstSenseOfVariant(entry.EntryRefsOS[0]);
+ }
+ }
+ }
+ return null;
+ }
+
///
///
///
@@ -672,7 +688,14 @@ public static void GetMainEntryAndSenseStack(IVariantComponentLexeme mainEntryOr
if (mainEntryOrSense is ILexEntry entry)
{
mainEntry = entry;
- mainOrFirstSense = mainEntry.SensesOS.Count > 0 ? mainEntry.SensesOS[0] : null;
+ if (entry.SensesOS.Count == 0)
+ {
+ mainOrFirstSense = GetMainOrFirstSenseOfVariant(entry.EntryRefsOS[0]);
+ }
+ else
+ {
+ mainOrFirstSense = mainEntry.SensesOS[0];
+ }
}
else if (mainEntryOrSense is ILexSense sense)
{
diff --git a/tests/SIL.LCModel.Tests/DomainServices/MorphServicesTests.cs b/tests/SIL.LCModel.Tests/DomainServices/MorphServicesTests.cs
index f2e62668..4c41c7a2 100644
--- a/tests/SIL.LCModel.Tests/DomainServices/MorphServicesTests.cs
+++ b/tests/SIL.LCModel.Tests/DomainServices/MorphServicesTests.cs
@@ -553,8 +553,55 @@ public void GlossOfNonInflVariantOfSense_SingleType()
Assert.That(variantGloss, Is.Not.Null);
Assert.That(variantGloss.Text, Is.EqualTo("mainEntrySense2+dial. var. of"));
}
- }
+ }
+
+ ///
+ /// Get sense/gloss for a variant of a variant (see LT-22315).
+ ///
+ [Test]
+ public void GlossOfVariantOfVariant()
+ {
+ NonUndoableUnitOfWorkHelper.Do(Cache.ActionHandlerAccessor, () =>
+ {
+ ILexEntry newMainEntry = GetNewMainEntry();
+ newMainEntry.SensesOS.Add(Cache.ServiceLocator.GetInstance().Create());
+ newMainEntry.SensesOS[0].Gloss.set_String(Cache.DefaultAnalWs, "gloss");
+
+ ILexEntryType letDialectalVariantType = Cache.ServiceLocator.GetInstance().GetObject(LexEntryTypeTags.kguidLexTypDialectalVar);
+ ILexEntryRef newLerDial;
+ SetupLexEntryVariant(Cache, "vaDialVar", newMainEntry, letDialectalVariantType, out newLerDial);
+ AddVariantOf(newLerDial, newMainEntry, letDialectalVariantType);
+
+ // Now create a contraction variant of the dialectal variant
+ ILexEntryType letContractionVariantType = Cache.ServiceLocator.GetInstance().GetObject(LexEntryTypeTags.kguidLexTypContraction);
+ ILexEntryRef newLerCont;
+ SetupLexEntryVariant(Cache, "vaContractionVar", newMainEntry, letContractionVariantType, out newLerCont);
+ ILexEntry varEntry = Cache.ServiceLocator.GetInstance().Create();
+ AddVariantOf(newLerCont, varEntry, letContractionVariantType);
+ });
+
+ var variant = Cache.ServiceLocator.GetInstance().GetHomographs("vaDialVar").FirstOrDefault();
+ var variantRefs = DomainObjectServices.GetVariantRefs(variant);
+ Assert.That(variantRefs.Count(), Is.EqualTo(2));
+ var variant2 = Cache.ServiceLocator.GetInstance().GetHomographs("vaContractionVar").FirstOrDefault();
+ var variant2Refs = DomainObjectServices.GetVariantRefs(variant2);
+ Assert.That(variant2Refs.Count(), Is.EqualTo(2));
+ var analWs = Cache.ServiceLocator.WritingSystemManager.Get(Cache.DefaultAnalWs);
+ {
+ IMultiUnicode gloss1;
+ GetMainVariantGloss(variantRefs.ElementAt(0), out gloss1);
+ var variantGloss = MorphServices.MakeGlossWithReverseAbbrs(gloss1, analWs, variantRefs.ElementAt(0).VariantEntryTypesRS);
+ Assert.That(variantGloss, Is.Not.Null);
+ Assert.That(variantGloss.Text, Is.EqualTo("gloss+***"));
+
+ GetMainVariantGloss(variant2Refs.ElementAt(0), out gloss1);
+ variantGloss = MorphServices.MakeGlossWithReverseAbbrs(gloss1, analWs, variant2Refs.ElementAt(0).VariantEntryTypesRS);
+ Assert.That(variantGloss, Is.Not.Null);
+ Assert.That(variantGloss.Text, Is.EqualTo("gloss+***"));
+ }
+ }
+
///
/// TODO: If the variant itself has a glosss use it? (Ask Beth Bryson)
/// TODO: What do we do if there is no sense, or no gloss? Use lexEntry form instead? (or just put the info on the LexEntry line?)