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?)