Skip to content

Commit 5dcb85f

Browse files
authored
Fix for LT-22315 (#353)
1 parent a3b309c commit 5dcb85f

File tree

2 files changed

+79
-9
lines changed

2 files changed

+79
-9
lines changed

src/SIL.LCModel/DomainServices/MorphServices.cs

Lines changed: 31 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -654,13 +654,29 @@ public static bool IsSuffixishType(LcmCache cache, int hvoMorphType)
654654
public static ILexSense GetMainOrFirstSenseOfVariant(ILexEntryRef variantRef)
655655
{
656656
var mainEntryOrSense = variantRef.ComponentLexemesRS[0] as IVariantComponentLexeme;
657-
// find first gloss
658-
ILexEntry mainEntry;
659-
ILexSense mainOrFirstSense;
660-
GetMainEntryAndSenseStack(mainEntryOrSense, out mainEntry, out mainOrFirstSense);
661-
return mainOrFirstSense;
662-
}
663-
657+
if (mainEntryOrSense != null)
658+
{
659+
// find first gloss
660+
ILexEntry mainEntry;
661+
ILexSense mainOrFirstSense;
662+
GetMainEntryAndSenseStack(mainEntryOrSense, out mainEntry, out mainOrFirstSense);
663+
return mainOrFirstSense;
664+
}
665+
else
666+
{
667+
var componentLexeme = variantRef.ComponentLexemesRS[0];
668+
if (componentLexeme != null && componentLexeme is ILexEntry)
669+
{
670+
ILexEntry entry = (ILexEntry)componentLexeme;
671+
if (entry.SensesOS.Count > 0)
672+
{
673+
return GetMainOrFirstSenseOfVariant(entry.EntryRefsOS[0]);
674+
}
675+
}
676+
}
677+
return null;
678+
}
679+
664680
/// <summary>
665681
///
666682
/// </summary>
@@ -672,7 +688,14 @@ public static void GetMainEntryAndSenseStack(IVariantComponentLexeme mainEntryOr
672688
if (mainEntryOrSense is ILexEntry entry)
673689
{
674690
mainEntry = entry;
675-
mainOrFirstSense = mainEntry.SensesOS.Count > 0 ? mainEntry.SensesOS[0] : null;
691+
if (entry.SensesOS.Count == 0)
692+
{
693+
mainOrFirstSense = GetMainOrFirstSenseOfVariant(entry.EntryRefsOS[0]);
694+
}
695+
else
696+
{
697+
mainOrFirstSense = mainEntry.SensesOS[0];
698+
}
676699
}
677700
else if (mainEntryOrSense is ILexSense sense)
678701
{

tests/SIL.LCModel.Tests/DomainServices/MorphServicesTests.cs

Lines changed: 48 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -553,8 +553,55 @@ public void GlossOfNonInflVariantOfSense_SingleType()
553553
Assert.That(variantGloss, Is.Not.Null);
554554
Assert.That(variantGloss.Text, Is.EqualTo("mainEntrySense2+dial. var. of"));
555555
}
556-
}
556+
}
557+
558+
/// <summary>
559+
/// Get sense/gloss for a variant of a variant (see LT-22315).
560+
/// </summary>
561+
[Test]
562+
public void GlossOfVariantOfVariant()
563+
{
564+
NonUndoableUnitOfWorkHelper.Do(Cache.ActionHandlerAccessor, () =>
565+
{
566+
ILexEntry newMainEntry = GetNewMainEntry();
567+
newMainEntry.SensesOS.Add(Cache.ServiceLocator.GetInstance<ILexSenseFactory>().Create());
568+
newMainEntry.SensesOS[0].Gloss.set_String(Cache.DefaultAnalWs, "gloss");
569+
570+
ILexEntryType letDialectalVariantType = Cache.ServiceLocator.GetInstance<ILexEntryTypeRepository>().GetObject(LexEntryTypeTags.kguidLexTypDialectalVar);
571+
ILexEntryRef newLerDial;
572+
SetupLexEntryVariant(Cache, "vaDialVar", newMainEntry, letDialectalVariantType, out newLerDial);
573+
AddVariantOf(newLerDial, newMainEntry, letDialectalVariantType);
574+
575+
// Now create a contraction variant of the dialectal variant
576+
ILexEntryType letContractionVariantType = Cache.ServiceLocator.GetInstance<ILexEntryTypeRepository>().GetObject(LexEntryTypeTags.kguidLexTypContraction);
577+
ILexEntryRef newLerCont;
578+
SetupLexEntryVariant(Cache, "vaContractionVar", newMainEntry, letContractionVariantType, out newLerCont);
579+
ILexEntry varEntry = Cache.ServiceLocator.GetInstance<ILexEntryFactory>().Create();
580+
AddVariantOf(newLerCont, varEntry, letContractionVariantType);
581+
});
582+
583+
var variant = Cache.ServiceLocator.GetInstance<ILexEntryRepository>().GetHomographs("vaDialVar").FirstOrDefault();
584+
var variantRefs = DomainObjectServices.GetVariantRefs(variant);
585+
Assert.That(variantRefs.Count(), Is.EqualTo(2));
586+
var variant2 = Cache.ServiceLocator.GetInstance<ILexEntryRepository>().GetHomographs("vaContractionVar").FirstOrDefault();
587+
var variant2Refs = DomainObjectServices.GetVariantRefs(variant2);
588+
Assert.That(variant2Refs.Count(), Is.EqualTo(2));
589+
var analWs = Cache.ServiceLocator.WritingSystemManager.Get(Cache.DefaultAnalWs);
590+
{
591+
IMultiUnicode gloss1;
592+
GetMainVariantGloss(variantRefs.ElementAt(0), out gloss1);
557593

594+
var variantGloss = MorphServices.MakeGlossWithReverseAbbrs(gloss1, analWs, variantRefs.ElementAt(0).VariantEntryTypesRS);
595+
Assert.That(variantGloss, Is.Not.Null);
596+
Assert.That(variantGloss.Text, Is.EqualTo("gloss+***"));
597+
598+
GetMainVariantGloss(variant2Refs.ElementAt(0), out gloss1);
599+
variantGloss = MorphServices.MakeGlossWithReverseAbbrs(gloss1, analWs, variant2Refs.ElementAt(0).VariantEntryTypesRS);
600+
Assert.That(variantGloss, Is.Not.Null);
601+
Assert.That(variantGloss.Text, Is.EqualTo("gloss+***"));
602+
}
603+
}
604+
558605
/// <summary>
559606
/// TODO: If the variant itself has a glosss use it? (Ask Beth Bryson)
560607
/// 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?)

0 commit comments

Comments
 (0)