Skip to content

Commit

Permalink
Merge pull request #35 from IBM/feature/facade-request-contexts
Browse files Browse the repository at this point in the history
Per-request contexts
  • Loading branch information
vankeisb authored Feb 10, 2024
2 parents c86e423 + 1f35000 commit d31ee05
Show file tree
Hide file tree
Showing 3 changed files with 51 additions and 20 deletions.
49 changes: 34 additions & 15 deletions diesel/js/src/main/scala/diesel/facade/DieselFacade.scala
Original file line number Diff line number Diff line change
Expand Up @@ -26,12 +26,22 @@ trait MarkerPostProcessor {
def postProcessMarkers(tree: GenericTree): Seq[Marker]
}

case class ParseContext(
markerPostProcessor: Option[MarkerPostProcessor] = None,
navigatorFactory: Result => Navigator = Navigator(_)
)

case class PredictContext(
markerPostProcessor: Option[MarkerPostProcessor] = None,
navigatorFactory: Result => Navigator = Navigator(_),
config: Option[CompletionConfiguration] = None,
userDataProvider: Option[UserDataProvider] = None
)

class DieselParserFacade(
val dsl: Dsl,
val config: Option[CompletionConfiguration] = None,
val markerPostProcessor: Option[MarkerPostProcessor] = None,
val navigatorFactory: Result => Navigator = Navigator(_),
val userDataProviderFactory: Option[PredictRequest => Option[UserDataProvider]] = None
val parseContextFactory: Option[ParseRequest => ParseContext] = None,
val predictContextFactory: Option[PredictRequest => PredictContext] = None
) {

val bnf: Bnf = Bnf(dsl)
Expand All @@ -43,17 +53,25 @@ class DieselParserFacade(
}

@JSExport
def parse(request: ParseRequest): DieselParseResult =
DieselParseResult(doParse(request), markerPostProcessor, navigatorFactory)
def parse(request: ParseRequest): DieselParseResult = {
val parseContext = parseContextFactory.map(_(request)).getOrElse(ParseContext())
DieselParseResult(
doParse(request),
parseContext.markerPostProcessor,
parseContext.navigatorFactory
)
}

@JSExport
def predict(request: PredictRequest): DieselPredictResult = {
val predictContext = predictContextFactory.map(_(request)).getOrElse(PredictContext())
DieselPredictResult(
request,
doParse(request),
config,
navigatorFactory,
userDataProviderFactory
request.text,
request.offset,
predictContext.config,
predictContext.navigatorFactory,
predictContext.userDataProvider
)
}

Expand Down Expand Up @@ -213,21 +231,22 @@ object DieselPredictResult {
private def errorResult(reason: String): DieselPredictResult = DieselPredictResult(Left(reason))

def apply(
request: PredictRequest,
result: Result,
text: String,
offset: Int,
config: Option[CompletionConfiguration],
navigatorFactory: Result => Navigator,
userDataProviderFactory: Option[PredictRequest => Option[UserDataProvider]]
userDataProvider: Option[UserDataProvider]
): DieselPredictResult = {
if (result.success) {
val navigator = navigatorFactory(result)
if (navigator.hasNext) {
val proposals = new CompletionProcessor(
result,
request.text,
text,
config,
userDataProviderFactory.flatMap(udpf => udpf(request))
).computeCompletionProposal(request.offset).distinctBy(
userDataProvider
).computeCompletionProposal(offset).distinctBy(
_.text
) // not sure why but we have to dedup this
new DieselPredictResult(Right(proposals))
Expand Down
10 changes: 7 additions & 3 deletions diesel/js/src/test/scala/diesel/facade/DieselFacadeTest.scala
Original file line number Diff line number Diff line change
Expand Up @@ -96,12 +96,16 @@ class DieselFacadeTest extends FunSuite {
}

test("facade should support marker post processing") {
val facade = new DieselParserFacade(MyDsl, markerPostProcessor = Some(MyMarkerPostProcessor))
val res = facade.parse(createParseRequest("1+2"))
val parseContextFactory = (pr: ParseRequest) =>
ParseContext(markerPostProcessor =
Some(MyMarkerPostProcessor)
)
val facade = new DieselParserFacade(MyDsl, parseContextFactory = Some(parseContextFactory))
val res = facade.parse(createParseRequest("1+2"))
assert(res.success)
assert(res.error.isEmpty)
assertEquals(res.markers.length, 1)
val m0 = res.markers(0)
val m0 = res.markers(0)
assertEquals(m0.offset, 0)
assertEquals(m0.length, 3)
assertEquals(m0.getMessage("en"), "yalla")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,13 +22,21 @@ import diesel.samples.jsmodeldsl.BmdDsl
import diesel.samples.sfeel.SFeel

import scala.scalajs.js.annotation.{JSExport, JSExportTopLevel}
import diesel.facade.PredictRequest
import diesel.facade.PredictContext

@JSExportTopLevel("DieselSamples")
object DieselSamples {

@JSExport
def createBmdParser(): DieselParserFacade =
new DieselParserFacade(BmdDsl, Some(BmdDsl.completionConfiguration))
def createBmdParser(): DieselParserFacade = {
val predictContextFactory = (r: PredictRequest) =>
PredictContext(config =
Some(BmdDsl.completionConfiguration)
)

new DieselParserFacade(BmdDsl, predictContextFactory = Some(predictContextFactory))
}

@JSExport
def createGlslParser(): DieselParserFacade = new DieselParserFacade(Glsl)
Expand Down

0 comments on commit d31ee05

Please sign in to comment.