nitni services related to callbacks (used underneath the FFI)

Introduced classes

class ForeignCallbackSet

nitc :: ForeignCallbackSet

Provides a better API but mainly the same content as AExternCalls
class MExplicitCall

nitc :: MExplicitCall

A prossible call from C, declared explictly after the import keyword
interface NitniCallback

nitc :: NitniCallback

Classification for all nitni callbacks
class VerifyNitniCallbacksPhase

nitc :: VerifyNitniCallbacksPhase

  • checks for the validity of callbacks

Redefined classes

redef class AAsNotNullableExternCall

nitc :: nitni_callbacks $ AAsNotNullableExternCall

A single callback declaration on a cast to a non-nullable type
redef class AAsNullableExternCall

nitc :: nitni_callbacks $ AAsNullableExternCall

A single callback declaration on a cast to a nullable type
redef class ACastAsExternCall

nitc :: nitni_callbacks $ ACastAsExternCall

A single callback declaration on a cast to a given type
redef abstract class ACastExternCall

nitc :: nitni_callbacks $ ACastExternCall

A single callback declaration on a cast
redef abstract class AExternCall

nitc :: nitni_callbacks $ AExternCall

A single callback declaration
redef class AFullPropExternCall

nitc :: nitni_callbacks $ AFullPropExternCall

A single callback declaration on a method on an explicit receiver type.
redef class AInitPropExternCall

nitc :: nitni_callbacks $ AInitPropExternCall

A single callback declaration on a method on a constructor
redef class ALocalPropExternCall

nitc :: nitni_callbacks $ ALocalPropExternCall

A single callback declaration on a method on the current receiver
redef class AMethPropdef

nitc :: nitni_callbacks $ AMethPropdef

A definition of all kind of method (including constructors)
redef class ASuperExternCall

nitc :: nitni_callbacks $ ASuperExternCall

A single callback declaration on a super call
redef abstract class MType

nitc :: nitni_callbacks $ MType

A global static type
redef class ToolContext

nitc :: nitni_callbacks $ ToolContext

Global context for tools

All class definitions

redef class AAsNotNullableExternCall

nitc :: nitni_callbacks $ AAsNotNullableExternCall

A single callback declaration on a cast to a non-nullable type
redef class AAsNullableExternCall

nitc :: nitni_callbacks $ AAsNullableExternCall

A single callback declaration on a cast to a nullable type
redef class ACastAsExternCall

nitc :: nitni_callbacks $ ACastAsExternCall

A single callback declaration on a cast to a given type
redef abstract class ACastExternCall

nitc :: nitni_callbacks $ ACastExternCall

A single callback declaration on a cast
redef abstract class AExternCall

nitc :: nitni_callbacks $ AExternCall

A single callback declaration
redef class AFullPropExternCall

nitc :: nitni_callbacks $ AFullPropExternCall

A single callback declaration on a method on an explicit receiver type.
redef class AInitPropExternCall

nitc :: nitni_callbacks $ AInitPropExternCall

A single callback declaration on a method on a constructor
redef class ALocalPropExternCall

nitc :: nitni_callbacks $ ALocalPropExternCall

A single callback declaration on a method on the current receiver
redef class AMethPropdef

nitc :: nitni_callbacks $ AMethPropdef

A definition of all kind of method (including constructors)
redef class ASuperExternCall

nitc :: nitni_callbacks $ ASuperExternCall

A single callback declaration on a super call
class ForeignCallbackSet

nitc $ ForeignCallbackSet

Provides a better API but mainly the same content as AExternCalls
class MExplicitCall

nitc $ MExplicitCall

A prossible call from C, declared explictly after the import keyword
redef abstract class MType

nitc :: nitni_callbacks $ MType

A global static type
interface NitniCallback

nitc $ NitniCallback

Classification for all nitni callbacks
redef class ToolContext

nitc :: nitni_callbacks $ ToolContext

Global context for tools
class VerifyNitniCallbacksPhase

nitc $ VerifyNitniCallbacksPhase

  • checks for the validity of callbacks
package_diagram nitc::nitni_callbacks nitni_callbacks nitc::rapid_type_analysis rapid_type_analysis nitc::nitni_callbacks->nitc::rapid_type_analysis nitc::nitni_base nitni_base nitc::nitni_callbacks->nitc::nitni_base nitc\>semantize\> semantize nitc::rapid_type_analysis->nitc\>semantize\> nitc::explain_assert_api explain_assert_api nitc::rapid_type_analysis->nitc::explain_assert_api csv csv nitc::rapid_type_analysis->csv nitc::modelbuilder modelbuilder nitc::nitni_base->nitc::modelbuilder ...nitc\>semantize\> ... ...nitc\>semantize\>->nitc\>semantize\> ...nitc::explain_assert_api ... ...nitc::explain_assert_api->nitc::explain_assert_api ...csv ... ...csv->csv ...nitc::modelbuilder ... ...nitc::modelbuilder->nitc::modelbuilder nitc::nitni nitni nitc::nitni->nitc::nitni_callbacks nitc::ffi_base ffi_base nitc::ffi_base->nitc::nitni nitc::ffi_base... ... nitc::ffi_base...->nitc::ffi_base

Ancestors

module abstract_collection

core :: abstract_collection

Abstract collection classes and services.
module abstract_text

core :: abstract_text

Abstract class for manipulation of sequences of characters
module annotation

nitc :: annotation

Management and utilities on annotations
module array

core :: array

This module introduces the standard array structure.
module auto_super_init

nitc :: auto_super_init

Computing of super-constructors that must be implicitly called at the begin of constructors.
module bitset

core :: bitset

Services to handle BitSet
module bytes

core :: bytes

Services for byte streams and arrays
module caching

serialization :: caching

Services for caching serialization engines
module circular_array

core :: circular_array

Efficient data structure to access both end of the sequence.
module codec_base

core :: codec_base

Base for codecs to use with streams
module codecs

core :: codecs

Group module for all codec-related manipulations
module collection

core :: collection

This module define several collection classes.
module console

console :: console

Defines some ANSI Terminal Control Escape Sequences.
module core

core :: core

Standard classes and methods used by default by Nit programs and libraries.
module csv

csv :: csv

CSV document handling.
module digraph

graph :: digraph

Implementation of directed graphs, also called digraphs.
module engine_tools

serialization :: engine_tools

Advanced services for serialization engines
module environ

core :: environ

Access to the environment variables of the process
module error

core :: error

Standard error-management infrastructure.
module exec

core :: exec

Invocation and management of operating system sub-processes.
module explain_assert_api

nitc :: explain_assert_api

Explain failed assert to the console (service declaration only)
module file

core :: file

File manipulations (create, read, write, etc.)
module fixed_ints

core :: fixed_ints

Basic integers of fixed-precision
module fixed_ints_text

core :: fixed_ints_text

Text services to complement fixed_ints
module flat

core :: flat

All the array-based text representations
module flow

nitc :: flow

Intraprocedural static flow.
module gc

core :: gc

Access to the Nit internal garbage collection mechanism
module hash_collection

core :: hash_collection

Introduce HashMap and HashSet.
module ini

ini :: ini

Read and write INI configuration files
module inspect

serialization :: inspect

Refine Serializable::inspect to show more useful information
module iso8859_1

core :: iso8859_1

Codec for ISO8859-1 I/O
module kernel

core :: kernel

Most basic classes and methods.
module lexer

nitc :: lexer

Lexer and its tokens.
module lexer_work

nitc :: lexer_work

Internal algorithm and data structures for the Nit lexer
module list

core :: list

This module handle double linked lists
module literal

nitc :: literal

Parsing of literal values in the abstract syntax tree.
module loader

nitc :: loader

Loading of Nit source files
module local_var_init

nitc :: local_var_init

Verify that local variables are initialized before their usage
module location

nitc :: location

Nit source-file and locations in source-file
module math

core :: math

Mathematical operations
module mdoc

nitc :: mdoc

Documentation of model entities
module meta

meta :: meta

Simple user-defined meta-level to manipulate types of instances as object.
module mmodule

nitc :: mmodule

modules and module hierarchies in the metamodel
module mmodule_data

nitc :: mmodule_data

Define and retrieve data in modules
module model

nitc :: model

Classes, types and properties
module model_base

nitc :: model_base

The abstract concept of model and related common things
module modelbuilder_base

nitc :: modelbuilder_base

Load nit source files and build the associated model
module modelize

nitc :: modelize

Create a model from nit source files
module modelize_class

nitc :: modelize_class

Analysis and verification of class definitions to instantiate model element
module modelize_property

nitc :: modelize_property

Analysis and verification of property definitions to instantiate model element
module more_collections

more_collections :: more_collections

Highly specific, but useful, collections-related classes.
module mpackage

nitc :: mpackage

Modelisation of a Nit package
module native

core :: native

Native structures for text and bytes
module nitpm_shared

nitc :: nitpm_shared

Services related to the Nit package manager
module numeric

core :: numeric

Advanced services for Numeric types
module opts

opts :: opts

Management of options on the command line
module ordered_tree

ordered_tree :: ordered_tree

Manipulation and presentation of ordered trees.
module parser

nitc :: parser

Parser.
module parser_nodes

nitc :: parser_nodes

AST nodes of the Nit language
module parser_prod

nitc :: parser_prod

Production AST nodes full definition.
module parser_work

nitc :: parser_work

Internal algorithm and data structures for the Nit parser
module phase

nitc :: phase

Phases of the processing of nit programs
module poset

poset :: poset

Pre order sets and partial order set (ie hierarchies)
module protocol

core :: protocol

module queue

core :: queue

Queuing data structures and wrappers
module range

core :: range

Module for range of discrete objects.
module re

core :: re

Regular expression support for all services based on Pattern
module ropes

core :: ropes

Tree-based representation of a String.
module scope

nitc :: scope

Identification and scoping of local variables and labels.
module semantize

nitc :: semantize

Process bodies of methods in regard with the model.
module serialization

serialization :: serialization

General serialization services
module serialization_core

serialization :: serialization_core

Abstract services to serialize Nit objects to different formats
module sorter

core :: sorter

This module contains classes used to compare things and sorts arrays.
module stream

core :: stream

Input and output streams of characters
module tables

nitc :: tables

Module that interfaces the parsing tables.
module template

template :: template

Basic template system
module text

core :: text

All the classes and methods related to the manipulation of text entities
module time

core :: time

Management of time and dates
module toolcontext

nitc :: toolcontext

Common command-line tool infrastructure than handle options and error messages
module typing

nitc :: typing

Intraprocedural resolution of static types and OO-services
module union_find

core :: union_find

union–find algorithm using an efficient disjoint-set data structure
module utf8

core :: utf8

Codec for UTF-8 I/O
module version

nitc :: version

This file was generated by git-gen-version.sh

Parents

module nitni_base

nitc :: nitni_base

Native interface related services (used underneath the FFI)
module rapid_type_analysis

nitc :: rapid_type_analysis

Rapid type analysis on the AST

Children

module nitni

nitc :: nitni

Native interface related services (used underneath the FFI)

Descendants

module a_star-m

a_star-m

module abstract_compiler

nitc :: abstract_compiler

Abstract compiler
module android

nitc :: android

Compile program for the Android platform
module c

nitc :: c

Support for nesting C code within a Nit program using its FFI
module c_compiler_options

nitc :: c_compiler_options

Offers the annotations cflags and ldflags to specify
module compiler

nitc :: compiler

Compilation to C
module compiler_ffi

nitc :: compiler_ffi

Full FFI support for the compiler
module compiler_serialization

nitc :: compiler_serialization

Serialization support for the compiler
module cpp

nitc :: cpp

Supports the use of the C++ language through the FFI
module dynamic_loading_ffi

nitc :: dynamic_loading_ffi

Execute FFI code by creating and loading shared libraries
module emscripten

nitc :: emscripten

Compile to JavaScript using the Emscripten SDK
module extra_java_files

nitc :: extra_java_files

Intro the annotation extra_java_files to compile extra java files
module ffi

nitc :: ffi

Full FFI support, independent of the compiler
module ffi_base

nitc :: ffi_base

Tools and utilities for implement FFI with different languages
module global_compiler

nitc :: global_compiler

Global compilation of a Nit program
module header_dependency

nitc :: header_dependency

Tracks which modules has public header code that must be imported
module interpreter

nitc :: interpreter

Interpretation of Nit programs
module ios

nitc :: ios

Compile programs for the iOS platform
module java

nitc :: java

FFI support for the Java language
module light

nitc :: light

Light FFI support for the compiler
module light_only

nitc :: light_only

Compiler support for the light FFI only, detects unsupported usage of callbacks
module memory_logger

nitc :: memory_logger

Extension to inject memory-tracing instrumentation in code generated by nitc.
module nit

nitc :: nit

A naive Nit interpreter
module nitc

nitc :: nitc

A Nit compiler
module nith

nitc :: nith

A ligHt Nit compiler
module objc

nitc :: objc

FFI support for Objective-C
module on_demand_compiler

nitc :: on_demand_compiler

Compiles extern code within a module to a static library, as needed
module pkgconfig

nitc :: pkgconfig

Offers the PkgconfigPhase to use the external program "pkg-config" in order
module separate_compiler

nitc :: separate_compiler

Separate compilation of a Nit program
module separate_erasure_compiler

nitc :: separate_erasure_compiler

Separate compilation of a Nit program with generic type erasure
module test_astbuilder

nitc :: test_astbuilder

Program used to test the clone method of the astbuilder tool
module xcode_templates

nitc :: xcode_templates

Templates and other services to create XCode projects
# nitni services related to callbacks (used underneath the FFI)
module nitni_callbacks

import modelbuilder
intrude import rapid_type_analysis

import nitni_base

redef class ToolContext
	var verify_nitni_callback_phase: Phase = new VerifyNitniCallbacksPhase(self, [typing_phase])
end

# * checks for the validity of callbacks
# * store the callbacks on each method
class VerifyNitniCallbacksPhase
	super Phase

	redef fun process_npropdef(npropdef)
	do
		if not npropdef isa AMethPropdef then return
		var mpropdef = npropdef.mpropdef
		if mpropdef == null then return
		if not mpropdef.is_extern then return

		npropdef.verify_nitni_callbacks(toolcontext)
	end
end

# Provides a better API but mainly the same content as AExternCalls
class ForeignCallbackSet
	# set of imported functions, cached to avoid repetitions
	var callbacks: Set[ MExplicitCall ] = new HashSet[ MExplicitCall ]

	# set of imported functions, cached to avoid repetitions
	var supers: Set[ MExplicitSuper ] = new HashSet[ MExplicitSuper ]

	# set of relevant types, cached to avoid repetitions
	var types: Set[ MType ] = new HashSet[ MType ]

	# set of imported casts and as, cached to avoid repetitions
	var casts: Set[ MExplicitCast ] = new HashSet[ MExplicitCast ]

	# Utility function, must be called only when all other maps are filled
	private var all_cached: nullable Set[NitniCallback] = null
	fun all: Set[NitniCallback]
	do
		var cached = all_cached
		if cached != null then return cached

		var set = new HashSet[NitniCallback]
		set.add_all(callbacks)
		set.add_all(supers)
		set.add_all(types)
		set.add_all(casts)
		
		self.all_cached = set
		return set
	end

	# Integrate content from the `other` set into this one
	fun join(other: ForeignCallbackSet)
	do
		callbacks.add_all( other.callbacks )
		supers.add_all( other.supers )
		types.add_all( other.types )
		casts.add_all( other.casts )
	end
end

redef class AMethPropdef
	private var foreign_callbacks_cache: nullable ForeignCallbackSet = null

	# All foreign callbacks from this method
	fun foreign_callbacks: ForeignCallbackSet
	do
		var fcs = foreign_callbacks_cache
		assert fcs != null else print "Error: attempting to access nitni callbacks before phase 'verify_nitni_callback_phase'."
		return fcs
	end

	# Verifiy the validity of the explicit callbacks to Nit
	# also fills the set returned by foreign_callbacks
	fun verify_nitni_callbacks(toolcontext: ToolContext)
	do
		if foreign_callbacks_cache != null then return

		var fcs = new ForeignCallbackSet

		var mmodule = mpropdef.mclassdef.mmodule

		# receiver
		var recv_type = mpropdef.mclassdef.bound_mtype
		fcs.types.add(recv_type)

		# return type
		var rmt = mpropdef.msignature.return_mtype
		if rmt != null then
			if rmt isa MFormalType then
				var mclass_type = mpropdef.mclassdef.bound_mtype
				rmt = rmt.anchor_to(mmodule, mclass_type)
			end
			var mtype = rmt.resolve_for(recv_type, recv_type, mmodule, true)
			fcs.types.add(mtype)
		end

		# params
		for p in mpropdef.msignature.mparameters do
			var mtype = p.mtype.resolve_for(recv_type, recv_type, mmodule, true)
			if mtype isa MFormalType then
				var mclass_type = mpropdef.mclassdef.bound_mtype
				mtype = mtype.anchor_to(mmodule, mclass_type)
			end
			fcs.types.add( mtype )
		end

		# explicit callbacks
		if n_extern_calls != null then
			for ec in n_extern_calls.n_extern_calls do
				ec.verify_and_collect(self, fcs, toolcontext)
			end
		end

		# store result
		foreign_callbacks_cache = fcs
	end

	redef fun accept_rapid_type_visitor(v)
	do
		if foreign_callbacks_cache == null then return

		for cb in foreign_callbacks.callbacks do v.add_send(cb.recv_mtype, cb.mproperty.as(MMethod))
		for cast in foreign_callbacks.casts do v.add_cast_type(cast.to)
		for sup in foreign_callbacks.supers do
			v.analysis.add_super_send(sup.from.mclassdef.mclass.mclass_type, sup.from.as(MMethodDef))
		end
		for t in foreign_callbacks.types do if t isa MClassType then v.add_type t
	end
end

# Classification for all nitni callbacks
interface NitniCallback
end

redef class MType
	super NitniCallback
end

# A prossible call from C, declared explictly after the `import` keyword
class MExplicitCall
	super NitniCallback

	# Previously resolved mtype
	var recv_mtype: MClassType
	var mproperty: MProperty
	var from_mmodule: MModule

	fun fill_type_for( callback_set: ForeignCallbackSet, from: MModule )
	do
		var first = mproperty.lookup_first_definition( from, recv_mtype )
		var mclassdef = first.mclassdef
		var bound_mtype = mclassdef.bound_mtype

		# receiver / constructor return
		recv_mtype = recv_mtype.resolve_for(bound_mtype, bound_mtype, from, true)
		recv_mtype = recv_mtype.anchor_to(from, bound_mtype)
		callback_set.types.add( recv_mtype )

		if first isa MMethodDef then
			var rmt = first.msignature.return_mtype
			if rmt != null then
				rmt = rmt.resolve_for(bound_mtype, bound_mtype, from, true)
				rmt = rmt.anchor_to(from, bound_mtype)
				callback_set.types.add( rmt )
			end

			for p in first.msignature.mparameters do
				var param_mtype = p.mtype.resolve_for(recv_mtype, recv_mtype, from, true)
				param_mtype = param_mtype.resolve_for(bound_mtype, bound_mtype, from, true)
				param_mtype = param_mtype.anchor_to(from, bound_mtype)
				callback_set.types.add( param_mtype )
			end
		end
	end

	# Signature of this call in C as seen by user
	fun csignature: String
	do
		var mproperty = self.mproperty
		if mproperty isa MMethod then
			var signature = mproperty.intro.msignature
			assert signature != null

			var creturn_type
			if mproperty.is_init then
				creturn_type = recv_mtype.cname
			else if signature.return_mtype != null then
				var ret_mtype = signature.return_mtype
				ret_mtype = ret_mtype.resolve_for(recv_mtype, recv_mtype, from_mmodule, true)
				creturn_type = ret_mtype.cname
			else
				creturn_type = "void"
			end

			var cname
			if mproperty.is_init then
				if mproperty.name == "init" or mproperty.name == "new" or mproperty.name == "defaultinit" then
					cname = "new_{recv_mtype.mangled_cname}"
				else
					cname = "new_{recv_mtype.mangled_cname}_{mproperty.short_cname}"
				end
			else
				cname = "{recv_mtype.mangled_cname}_{mproperty.short_cname}"
			end

			var cparams = new List[String]
			if not mproperty.is_init then
				cparams.add( "{recv_mtype.cname} self" )
			end
			for p in signature.mparameters do
				var param_mtype = p.mtype.resolve_for(recv_mtype, recv_mtype, from_mmodule, true)
				cparams.add( "{param_mtype.cname} {p.name}" )
			end

			return "{creturn_type} {cname}( {cparams.join(", ")} )"
		else
			print "Type of callback from foreign code not yet supported."
			abort
		end
	end

	redef fun hash do return recv_mtype.hash + 1024 * mproperty.hash
	redef fun ==(o) do return o isa MExplicitCall and recv_mtype == o.recv_mtype and mproperty == o.mproperty
end

class MExplicitSuper
	super NitniCallback

	var from: MPropDef

	redef fun hash do return from.hash
	redef fun ==(o) do return o isa MExplicitSuper and from == o.from
end

class MExplicitCast
	super NitniCallback

	var from: MType
	var to: MType

	fun check_cname: String do return "{from.mangled_cname}_is_a_{to.mangled_cname}"

	fun cast_cname: String do return "{from.mangled_cname}_as_{to.mangled_cname}"

	redef fun hash do return from.hash + 1024 * to.hash
	redef fun ==(o) do return o isa MExplicitCast and from == o.from and to == o.to
end

redef class AExternCall
	# Verify this explicit declaration of call from C and collect all relevant callbacks
	fun verify_and_collect(npropdef: AMethPropdef, callback_set: ForeignCallbackSet,
		toolcontext: ToolContext) is abstract
end

redef class ALocalPropExternCall
	redef fun verify_and_collect(npropdef, callback_set, toolcontext)
	do
		var mmodule = npropdef.mpropdef.mclassdef.mmodule
		var mclass_type = npropdef.mpropdef.mclassdef.bound_mtype
		var m_name = n_methid.collect_text
		var method = toolcontext.modelbuilder.try_get_mproperty_by_name2( self,
			mmodule, mclass_type, m_name )

		if method == null then
			toolcontext.error(location, "Error: local method `{m_name}` not found.")
			return
		end

		var explicit_call = new MExplicitCall(mclass_type, method, mmodule)
		callback_set.callbacks.add(explicit_call)

		explicit_call.fill_type_for(callback_set, mmodule)
	end
end

redef class AFullPropExternCall
	redef fun verify_and_collect(npropdef, callback_set, toolcontext)
	do
		var mmodule = npropdef.mpropdef.mclassdef.mmodule
		var mclassdef = npropdef.mpropdef.mclassdef
		var mclass_type = mclassdef.bound_mtype
		var mtype = toolcontext.modelbuilder.resolve_mtype(mclassdef, n_type)

		if mtype == null then return

		if mtype isa MFormalType then
			mtype = mtype.anchor_to(mmodule, mclass_type)
		end

		if mtype isa MNullableType then
			toolcontext.error(location, "Error: type `{n_type.collect_text}` is nullable and thus cannot be the receiver." )
			return
		end

		var m_name = n_methid.collect_text
		var method = toolcontext.modelbuilder.try_get_mproperty_by_name2( self,
			mmodule, mtype, m_name )

		if method == null then
			toolcontext.error(location, "Error: method `{m_name}` not found in `{n_type.collect_text}`." )
			return
		end

		var explicit_call = new MExplicitCall(mtype.as(MClassType), method, mmodule)
		callback_set.callbacks.add(explicit_call)
		explicit_call.fill_type_for(callback_set, mmodule)
	end
end

redef class AInitPropExternCall
	redef fun verify_and_collect(npropdef, callback_set, toolcontext)
	do
		var mmodule = npropdef.mpropdef.mclassdef.mmodule
		var mclassdef = npropdef.mpropdef.mclassdef
		var mtype = toolcontext.modelbuilder.resolve_mtype(mclassdef, n_type)
		if mtype == null then return

		if not mtype isa MClassType then
			toolcontext.error(location, "Error: type `{n_type.collect_text}` is not a class and thus cannot be used to instantiate a new instance." )
			return
		end

		var meth_name = "new"
		var meth = toolcontext.modelbuilder.try_get_mproperty_by_name2( self,
			mmodule, mtype, meth_name )

		if meth == null then
			meth_name = "defaultinit"
			meth = toolcontext.modelbuilder.try_get_mproperty_by_name2( self,
				mmodule, mtype, meth_name )
		end

		if meth == null then
			toolcontext.error(location, "Error: method `{meth_name}` not found in `{n_type.collect_text}`." )
			return
		end

		var explicit_call = new MExplicitCall(mtype, meth, mmodule)
		callback_set.callbacks.add(explicit_call)
		explicit_call.fill_type_for(callback_set, mmodule)
	end
end

redef class ASuperExternCall
	redef fun verify_and_collect(npropdef, callback_set, toolcontext)
	do
		callback_set.supers.add( new MExplicitSuper( npropdef.mpropdef.as(not null) ) )
		callback_set.types.add( npropdef.mpropdef.mclassdef.mclass.mclass_type )
		npropdef.mpropdef.has_supercall = true
	end
end

redef class ACastExternCall
	fun from_mtype: MType is abstract
	fun to_mtype: MType is abstract

	redef fun verify_and_collect(npropdef, callback_set, toolcontext)
	do
		var from = from_mtype
		var to = to_mtype

		callback_set.types.add(from)
		callback_set.types.add(to)

		callback_set.casts.add(new MExplicitCast(from, to))
	end
end

redef class ACastAsExternCall
	redef fun from_mtype do return n_from_type.mtype.as(not null)
	redef fun to_mtype do return n_to_type.mtype.as(not null)

	redef fun verify_and_collect(npropdef, callback_set, toolcontext)
	do
		var mclassdef = npropdef.mpropdef.mclassdef
		toolcontext.modelbuilder.resolve_mtype_unchecked(mclassdef, n_from_type, true)
		toolcontext.modelbuilder.resolve_mtype_unchecked(mclassdef, n_to_type, true)
		super
	end
end

redef class AAsNullableExternCall
	redef fun from_mtype do return n_type.mtype.as(not null)
	redef fun to_mtype do return n_type.mtype.as_nullable

	redef fun verify_and_collect(npropdef, callback_set, toolcontext)
	do
		var mclassdef = npropdef.mpropdef.mclassdef
		toolcontext.modelbuilder.resolve_mtype_unchecked(mclassdef, n_type, true)
		super
	end
end

redef class AAsNotNullableExternCall
	redef fun from_mtype do return n_type.mtype.as_nullable
	redef fun to_mtype do
		var mtype = n_type.mtype.as(not null)
		mtype = mtype.undecorate
		return mtype
	end

	redef fun verify_and_collect(npropdef, callback_set, toolcontext)
	do
		var mclassdef = npropdef.mpropdef.mclassdef
		toolcontext.modelbuilder.resolve_mtype_unchecked(mclassdef, n_type, true)
		super
	end
end
src/nitni/nitni_callbacks.nit:17,1--433,3