mirror of
https://github.com/enso-org/enso.git
synced 2025-01-03 21:35:15 +03:00
Avoid duplicated conversion & search target type scope (#7849)
This commit is contained in:
parent
74d1d0861c
commit
5150c14afd
@ -42,6 +42,4 @@ type Request_Body
|
||||
|
||||
Request_Body.from (that:Text) = Request_Body.Text that
|
||||
Request_Body.from (that:File) = Request_Body.Binary that
|
||||
# TODO: determine if this is needed.
|
||||
Request_Body.from (that:Request_Body) = that
|
||||
Request_Body.from (that:Any) = Request_Body.Json that
|
||||
|
@ -288,6 +288,9 @@ public abstract class ReadArgumentCheckNode extends Node {
|
||||
}
|
||||
|
||||
private Pair<Function, Type> findConversion(Type from) {
|
||||
if (expectedType == from) {
|
||||
return null;
|
||||
}
|
||||
var ctx = EnsoContext.get(this);
|
||||
|
||||
if (getRootNode() instanceof EnsoRootNode root) {
|
||||
|
@ -203,17 +203,23 @@ public final class ModuleScope implements EnsoObject {
|
||||
}
|
||||
|
||||
@TruffleBoundary
|
||||
public Function lookupConversionDefinition(Type type, Type target) {
|
||||
Function definedWithAtom = type.getDefinitionScope().getConversionsFor(target).get(type);
|
||||
if (definedWithAtom != null) {
|
||||
return definedWithAtom;
|
||||
public Function lookupConversionDefinition(Type original, Type target) {
|
||||
Function definedWithOriginal =
|
||||
original.getDefinitionScope().getConversionsFor(target).get(original);
|
||||
if (definedWithOriginal != null) {
|
||||
return definedWithOriginal;
|
||||
}
|
||||
Function definedHere = getConversionsFor(target).get(type);
|
||||
Function definedWithTarget =
|
||||
target.getDefinitionScope().getConversionsFor(target).get(original);
|
||||
if (definedWithTarget != null) {
|
||||
return definedWithTarget;
|
||||
}
|
||||
Function definedHere = getConversionsFor(target).get(original);
|
||||
if (definedHere != null) {
|
||||
return definedHere;
|
||||
}
|
||||
return imports.stream()
|
||||
.map(scope -> scope.getExportedConversion(type, target))
|
||||
.map(scope -> scope.getExportedConversion(original, target))
|
||||
.filter(Objects::nonNull)
|
||||
.findFirst()
|
||||
.orElse(null);
|
||||
|
@ -485,7 +485,7 @@ spec =
|
||||
test_file = enso_project.data / "does_not_exist.txt"
|
||||
Data.post url_post (Request_Body.Binary test_file) . should_fail_with Request_Error
|
||||
|
||||
Test.group "Headers" <|
|
||||
Test.group "Headers" pending=pending_has_url <|
|
||||
base_url_with_slash = if base_url.ends_with "/" then base_url else base_url + "/"
|
||||
url_post = base_url_with_slash + "post"
|
||||
|
||||
|
@ -65,6 +65,16 @@ type Fool
|
||||
|
||||
Fool.from (that : Any) = Fool.Value that
|
||||
|
||||
type Blob
|
||||
Text c:Text
|
||||
Binary b:File
|
||||
Json anything
|
||||
|
||||
|
||||
Blob.from (that:Text) = Blob.Text that
|
||||
Blob.from (that:File) = Blob.Binary that
|
||||
Blob.from (that:Any) = Blob.Json that
|
||||
|
||||
spec =
|
||||
Test.group "Conversion" <|
|
||||
Test.specify "should be able to convert atoms" <|
|
||||
@ -162,6 +172,37 @@ spec =
|
||||
Hello.formulate_with_to [ Hello.Say "Proper", Hello.Say "Type" ] . should_equal "ProperType"
|
||||
Hello.formulate_with_to [ Foo.Value "Perform", Bar.Value "Conversion" ] . should_equal "PERFORM conversion!"
|
||||
|
||||
Test.specify "Avoid parameter conversion of Blob into Blob" <|
|
||||
blob_me (b:Blob) = b
|
||||
|
||||
once = blob_me "Ahoj"
|
||||
second = blob_me once
|
||||
|
||||
Meta.type_of once . should_equal Blob
|
||||
Meta.type_of second . should_equal Blob
|
||||
once . should_equal second
|
||||
Meta.is_same_object once second . should_be_true
|
||||
|
||||
Test.specify "Avoid Any.to conversion of Blob into Blob" <|
|
||||
blob_me b = b.to Blob
|
||||
|
||||
once = blob_me "Ahoj"
|
||||
second = blob_me once
|
||||
|
||||
Meta.type_of once . should_equal Blob
|
||||
Meta.type_of second . should_equal Blob
|
||||
once . should_equal second
|
||||
Meta.is_same_object once second . should_be_true
|
||||
|
||||
Test.specify "Avoid inline conversion of Blob into Blob" <|
|
||||
once = "Ahoj" : Blob
|
||||
second = once : Blob
|
||||
|
||||
Meta.type_of once . should_equal Blob
|
||||
Meta.type_of second . should_equal Blob
|
||||
once . should_equal second
|
||||
Meta.is_same_object once second . should_be_true
|
||||
|
||||
Test.specify "Requesting Text & Foo" <|
|
||||
check a (n : Text & Foo) = case a of
|
||||
0 -> n.foo
|
||||
|
Loading…
Reference in New Issue
Block a user