Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
39 changes: 31 additions & 8 deletions src/SIL.LCModel/DomainServices/MorphServices.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}

/// <summary>
///
/// </summary>
Expand All @@ -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)
{
Expand Down
49 changes: 48 additions & 1 deletion tests/SIL.LCModel.Tests/DomainServices/MorphServicesTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -553,8 +553,55 @@ public void GlossOfNonInflVariantOfSense_SingleType()
Assert.That(variantGloss, Is.Not.Null);
Assert.That(variantGloss.Text, Is.EqualTo("mainEntrySense2+dial. var. of"));
}
}
}

/// <summary>
/// Get sense/gloss for a variant of a variant (see LT-22315).
/// </summary>
[Test]
public void GlossOfVariantOfVariant()
{
NonUndoableUnitOfWorkHelper.Do(Cache.ActionHandlerAccessor, () =>
{
ILexEntry newMainEntry = GetNewMainEntry();
newMainEntry.SensesOS.Add(Cache.ServiceLocator.GetInstance<ILexSenseFactory>().Create());
newMainEntry.SensesOS[0].Gloss.set_String(Cache.DefaultAnalWs, "gloss");

ILexEntryType letDialectalVariantType = Cache.ServiceLocator.GetInstance<ILexEntryTypeRepository>().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<ILexEntryTypeRepository>().GetObject(LexEntryTypeTags.kguidLexTypContraction);
ILexEntryRef newLerCont;
SetupLexEntryVariant(Cache, "vaContractionVar", newMainEntry, letContractionVariantType, out newLerCont);
ILexEntry varEntry = Cache.ServiceLocator.GetInstance<ILexEntryFactory>().Create();
AddVariantOf(newLerCont, varEntry, letContractionVariantType);
});

var variant = Cache.ServiceLocator.GetInstance<ILexEntryRepository>().GetHomographs("vaDialVar").FirstOrDefault();
var variantRefs = DomainObjectServices.GetVariantRefs(variant);
Assert.That(variantRefs.Count(), Is.EqualTo(2));
var variant2 = Cache.ServiceLocator.GetInstance<ILexEntryRepository>().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+***"));
}
}

/// <summary>
/// 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?)
Expand Down
Loading