Git Product home page Git Product logo

mita's Introduction

Mita logo

Eclipse Mita is a new programming language for the embedded IoT. It targets developers who are new to embedded software development, specifically those who come from a cloud background. As a developer Mita feels like a modern programming language (in the vein of TypeScript), but translates to C code which compiles to native code running directly on the embedded hardware. Combining declarative configuration, powerful language features with code generation enables projects to scale their deployment over quantity - from the first prototype to shipping thousands of devices.

Getting started

Mita serves two separate user groups: IoT developers and device vendors/platform integrators.

Getting started as IoT developer

To get an impression of how Mita looks like for IoT developers, check out a short quick demo, or a talk from the Eclipse IoT Day 2018 in Grenoble. As an IoT developer Mita is most useful to you if it comes integrated in a device vendors offering. See below for a list of vendors who currently offer Mita support (if your organization/offering/platform should be in this list, please raise a pull-request):

More information about the language itself can be found in our documentation.

Getting started as a device vendor/platform integrator

For Mita to run on a platform/device there is some integration work necessary. Have a look at our platform integrators guide for more details on how to enable Mita for your platform.

Developer Resources

  • Contributing: Learn how to report bugs, setup your workspace and submit your changes.
  • Quality Guidelines: Learn how to write good commits and pull requests.

Get in Touch

Come and find us in our Mattermost channel at eclipse.org or check out the Eclipse Mita project home page for details regarding our mailing list. We also hold bi-weekly meetings at 2:00 PM GMT+1 here starting from Nov 13, 2018.

mita's People

Contributors

andreasmuelder avatar eclipsewebmaster avatar karthikaappusamy avatar kumarroh avatar muthumaldini avatar priyagovind avatar priyashiyadav avatar rherrmannr avatar tkutz avatar wegendt-bosch avatar xalban avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

mita's Issues

Implement parsing tests for standard library

When the stdlib can't be loaded correctly that leads to all kind of funky behavior in the test suite. To make debugging the tests easier, we should try and parse/load all .x and .platform files in the stdlib plugin.

String.con and Array.con generate invalid code

Even though we have noCompileErrors, var x = new string(300); generates invalid C code:

char y[301];
exception = con_uint32(&y, 300);
if(exception != NO_EXCEPTION) return exception;

Expected code is just the first line.

The same happens for arrays.

SumType alternatives are not subtypes of their parent SumType

You can't write

alt anyVec {
	  vec0d
	| vec1d: int32
	| vec2d: int32, int32
}
fn foo() {
    var y: anyVec.vec2d = vec2d(10, 10);
}

This is because the type inferrer infers anyVec for vec2d(int32, int32), since vec2d isn't a subtype of anyVec. That is because I didn't find a way to tell the parser/linker that one is a subtype of another.

Solving this would allow one to reuse substructures in sum types without exporting them, among other simplified uses.

noCompileErrors does not work with overloaded functions

Using // XPECT noCompileErrors on an overloaded function (see below) yields an exception/error, subsequently failing the test.

Example

fn overloadingTest(x : int8) : int16 {
	return x as int16;
}

fn overloadingTest(x : uint8) : uint16 {
	return x as uint16;
}

// XPECT noCompileErrors
fn main() : void {
	// XPECT inferredType --> int16 
	let x1 = overloadingTest(10 as int8);
	
	// XPECT inferredType --> uint16
	let x2 = overloadingTest(10 as uint8);
}

Stack trace

java.lang.RuntimeException: No EObjectDescription could be found in Scope ElementReferenceExpression.reference for Program'unittest'.functionDefinitions[1]->FunctionDefinition'overloadingTest'
Semantic Object: Program'unittest'.functionDefinitions[2]->FunctionDefinition'main'.body->ProgramBlock.content[1]->VariableDeclaration'x2'.initialization->ElementReferenceExpression
URI: platform:/resource/unittestprj/application.x
EStructuralFeature: expressions::ElementReferenceExpression.reference
	at org.eclipse.xtext.serializer.diagnostic.ISerializationDiagnostic$ExceptionThrowingAcceptor.accept(ISerializationDiagnostic.java:131)
	at org.eclipse.xtext.serializer.tokens.CrossReferenceSerializer.getCrossReferenceNameFromScope(CrossReferenceSerializer.java:138)
	at org.eclipse.xtext.serializer.tokens.CrossReferenceSerializer.serializeCrossRef(CrossReferenceSerializer.java:111)
	at org.eclipse.xtext.serializer.acceptor.SequenceFeeder.getToken(SequenceFeeder.java:481)
	at org.eclipse.xtext.serializer.acceptor.SequenceFeeder.accept(SequenceFeeder.java:244)
	at org.eclipse.xtext.serializer.sequencer.BacktrackingSemanticSequencer.accept(BacktrackingSemanticSequencer.java:441)
	at org.eclipse.xtext.serializer.sequencer.BacktrackingSemanticSequencer.createSequence(BacktrackingSemanticSequencer.java:501)
	at org.yakindu.base.expressions.serializer.ExpressionsSemanticSequencer.sequence_ElementReferenceExpression(ExpressionsSemanticSequencer.java:426)
	at com.bosch.cds.xdk.live.program.serializer.ProgramDslSemanticSequencer.sequence(ProgramDslSemanticSequencer.java:141)
	at org.eclipse.xtext.serializer.sequencer.AbstractSemanticSequencer.createSequence(AbstractSemanticSequencer.java:67)
	at org.eclipse.xtext.serializer.acceptor.SequenceFeeder.acceptEObjectRuleCall(SequenceFeeder.java:325)
	at org.eclipse.xtext.serializer.acceptor.SequenceFeeder.acceptRuleCall(SequenceFeeder.java:352)
	at org.eclipse.xtext.serializer.acceptor.SequenceFeeder.accept(SequenceFeeder.java:246)
	at org.eclipse.xtext.serializer.sequencer.BacktrackingSemanticSequencer.accept(BacktrackingSemanticSequencer.java:441)
	at org.eclipse.xtext.serializer.sequencer.BacktrackingSemanticSequencer.createSequence(BacktrackingSemanticSequencer.java:501)
	at com.bosch.cds.xdk.live.program.serializer.ProgramDslSemanticSequencer.sequence_VariableDeclaration(ProgramDslSemanticSequencer.java:1020)
	at com.bosch.cds.xdk.live.program.serializer.ProgramDslSemanticSequencer.sequence(ProgramDslSemanticSequencer.java:301)
	at org.eclipse.xtext.serializer.sequencer.AbstractSemanticSequencer.createSequence(AbstractSemanticSequencer.java:67)
	at org.eclipse.xtext.serializer.acceptor.SequenceFeeder.acceptEObjectRuleCall(SequenceFeeder.java:325)
	at org.eclipse.xtext.serializer.acceptor.SequenceFeeder.acceptRuleCall(SequenceFeeder.java:352)
	at org.eclipse.xtext.serializer.acceptor.SequenceFeeder.accept(SequenceFeeder.java:263)
	at org.eclipse.xtext.serializer.sequencer.BacktrackingSemanticSequencer.accept(BacktrackingSemanticSequencer.java:434)
	at org.eclipse.xtext.serializer.sequencer.BacktrackingSemanticSequencer.createSequence(BacktrackingSemanticSequencer.java:501)
	at com.bosch.cds.xdk.live.program.serializer.ProgramDslSemanticSequencer.sequence_ProgramBlock(ProgramDslSemanticSequencer.java:879)
	at com.bosch.cds.xdk.live.program.serializer.ProgramDslSemanticSequencer.sequence(ProgramDslSemanticSequencer.java:267)
	at org.eclipse.xtext.serializer.sequencer.AbstractSemanticSequencer.createSequence(AbstractSemanticSequencer.java:67)
	at org.eclipse.xtext.serializer.acceptor.SequenceFeeder.acceptEObjectRuleCall(SequenceFeeder.java:325)
	at org.eclipse.xtext.serializer.acceptor.SequenceFeeder.acceptRuleCall(SequenceFeeder.java:352)
	at org.eclipse.xtext.serializer.acceptor.SequenceFeeder.accept(SequenceFeeder.java:246)
	at org.eclipse.xtext.serializer.sequencer.BacktrackingSemanticSequencer.accept(BacktrackingSemanticSequencer.java:441)
	at org.eclipse.xtext.serializer.sequencer.BacktrackingSemanticSequencer.createSequence(BacktrackingSemanticSequencer.java:501)
	at com.bosch.cds.xdk.live.program.serializer.ProgramDslSemanticSequencer.sequence_FunctionDefinition(ProgramDslSemanticSequencer.java:583)
	at com.bosch.cds.xdk.live.program.serializer.ProgramDslSemanticSequencer.sequence(ProgramDslSemanticSequencer.java:228)
	at org.eclipse.xtext.serializer.sequencer.AbstractSemanticSequencer.createSequence(AbstractSemanticSequencer.java:67)
	at org.eclipse.xtext.serializer.acceptor.SequenceFeeder.acceptEObjectRuleCall(SequenceFeeder.java:325)
	at org.eclipse.xtext.serializer.acceptor.SequenceFeeder.acceptRuleCall(SequenceFeeder.java:352)
	at org.eclipse.xtext.serializer.acceptor.SequenceFeeder.accept(SequenceFeeder.java:263)
	at org.eclipse.xtext.serializer.sequencer.BacktrackingSemanticSequencer.accept(BacktrackingSemanticSequencer.java:434)
	at org.eclipse.xtext.serializer.sequencer.BacktrackingSemanticSequencer.createSequence(BacktrackingSemanticSequencer.java:501)
	at com.bosch.cds.xdk.live.program.serializer.ProgramDslSemanticSequencer.sequence_Program(ProgramDslSemanticSequencer.java:902)
	at com.bosch.cds.xdk.live.program.serializer.ProgramDslSemanticSequencer.sequence(ProgramDslSemanticSequencer.java:264)
	at org.eclipse.xtext.serializer.sequencer.AbstractSemanticSequencer.createSequence(AbstractSemanticSequencer.java:67)
	at org.eclipse.xtext.serializer.impl.Serializer.serialize(Serializer.java:115)
	at org.eclipse.xtext.serializer.impl.Serializer.serialize(Serializer.java:128)
	at org.eclipse.xtext.serializer.impl.Serializer.serialize(Serializer.java:192)
	at org.eclipse.xtext.resource.XtextResource.doSave(XtextResource.java:386)
	at org.eclipse.emf.ecore.resource.impl.ResourceImpl.save(ResourceImpl.java:1430)
	at org.eclipse.emf.ecore.resource.impl.ResourceImpl.save(ResourceImpl.java:999)
	at com.bosch.cds.xdk.live.program.tests.util.GenerationTest.noCompileErrors(GenerationTest.java:80)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
	at java.lang.reflect.Method.invoke(Unknown Source)
	at org.xpect.runner.TestExecutor.runTest(TestExecutor.java:150)
	at org.xpect.runner.XpectTestRunner.runInternal(XpectTestRunner.java:67)
	at org.xpect.runner.AbstractTestRunner.run(AbstractTestRunner.java:59)
	at org.xpect.runner.XpectFileRunner.run(XpectFileRunner.java:142)
	at org.xpect.runner.XpectRunner.runChild(XpectRunner.java:208)
	at org.xpect.runner.XpectRunner.runChild(XpectRunner.java:1)
	at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
	at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
	at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
	at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
	at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
	at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
	at org.xpect.runner.XpectRunner.run(XpectRunner.java:194)
	at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:86)
	at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:678)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382)
	at org.eclipse.pde.internal.junit.runtime.RemotePluginTestRunner.main(RemotePluginTestRunner.java:66)
	at org.eclipse.pde.internal.junit.runtime.PlatformUITestHarness.lambda$0(PlatformUITestHarness.java:43)
	at org.eclipse.swt.widgets.RunnableLock.run(RunnableLock.java:35)
	at org.eclipse.swt.widgets.Synchronizer.runAsyncMessages(Synchronizer.java:182)
	at org.eclipse.swt.widgets.Display.runAsyncMessages(Display.java:4211)
	at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3827)
	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$4.run(PartRenderingEngine.java:1121)
	at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336)
	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:1022)
	at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:150)
	at org.eclipse.ui.internal.Workbench$5.run(Workbench.java:693)
	at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:336)
	at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:610)
	at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:148)
	at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:138)
	at org.eclipse.pde.internal.junit.runtime.NonUIThreadTestApplication.runApp(NonUIThreadTestApplication.java:52)
	at org.eclipse.pde.internal.junit.runtime.UITestApplication.runApp(UITestApplication.java:43)
	at org.eclipse.pde.internal.junit.runtime.NonUIThreadTestApplication.start(NonUIThreadTestApplication.java:46)
	at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196)
	at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:134)
	at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:104)
	at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:388)
	at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:243)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
	at java.lang.reflect.Method.invoke(Unknown Source)
	at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:673)
	at org.eclipse.equinox.launcher.Main.basicRun(Main.java:610)
	at org.eclipse.equinox.launcher.Main.run(Main.java:1519)
	at org.eclipse.equinox.launcher.Main.main(Main.java:1492)

Enum usage in setups is somewhat buggy

the following can't resolve Red:

setup endpoint: WLAN {
	ssid = "replace_me";
	psk = "replace_me";
}
setup asdf: LED {
	var af = light_up(Red);
}

To resolve it, you need to use named parameters.

Type system should support value type attributes

Proposal

At the moment the type system only supports other types as type attributes, for example:
var x : array<uint32_t>;

We would need the size as part of the type system, for example:
var x : array<uint32_t, size=30>;

More generically, types should have parameters which are of a value type (bool, int, type).

Motivation

We ran a user study to determine whether users would prefer the size information in the type system. Participants were randomly chosen from the office (1 female, 2 male) and the experiment design followed a Roman mosaic order. Participants were presented with the following options:

  1. struct A { var x = new array<int32_t>(size=30); var y: int32_t; }
  2. struct A { var x: array<int32_t, size=30>; var y: int32_t; }

Users overwhelmingly choose option 2.

Receiving Optionals doesn't work

Mita:

fn foo(): int32? {
  return some(1);
}
fn bar() {
  let x1 = foo();
}

C:

Retcode_T foo(optional_int32_t* _result)
{

	Retcode_T exception = NO_EXCEPTION;
	
	
	optional_int32_t result1155795087 = {
		.data = 1,
		.flag = Some
	};
	*_result = result1155795087;
	return exception;

	return exception;
}

Retcode_T bar(void* _result)
{

	Retcode_T exception = NO_EXCEPTION;
	
	
	optional_int32_t result1834518249 = exception = foo(NULL);
	if(exception != NO_EXCEPTION) return exception;;
	optional_int32_t x1 = result1834518249;

	return exception;
}

Implement generator tests for standard library

We need a project org.eclipse.mita.library.stdlib.tests with basically two kind of tests:

  1. Parse all .x and .platform files and check if they are valid => #7
  2. Test Generators that come with standard library (String, Array, Printf, etc.) => This issue

RFC: A better event system

Introduction

Events are at the very heart of Mita. They map well to the IoT world where devices often have to lay
dormant until some event arises. Events are also well suited as blocking signal mechanism (think Go
channels or mutexes) where, when an event is triggered, some barrier is passed e.g., the entry into
an event handler.

Current Situtation

Mita currently has a crude form of event mechanism where platform components can define events which
can be handled once on the top-level. This approach suffers several drawbacks:

  1. Events can only be defined and triggered by platform components. This takes great power away from
    the user who might be inclined to use the event system to structure their own code.
  2. Events can only be handled at the top-level. For example, at the moment one can not write a
    function where we wait for a sequence of events to happen.
  3. Events have no parameters which limits their usefulness. For example in case of a sensor event it
    is only possible to express that an event happened but not which event that was.

Proposal

Events with payload

Events can, but don't have to, deliver a single piece of data. Thus events can be typed to that datum
(called event value). Upon their triggering that data is distributed to all subscriber to that event.
There is only a event value that can be sent as payload. Due to heaplessness at the moment we can only
send value types as event values (otherwise we'd need to find space on the stack which is guaranteed to
still exist when the event handler starts).

User defined events

Users can define events at the top level. Events can be exported from a package (see RFC000) so that
others can await them. Events are defined with the "event" keyword. Events can be triggered using the
"trigger" keyword. Users can only trigger events defined in the same package.

Await events

Users can await events in functions or other event handlers. Users can choose to use or ignore the
value that comes with the event. Awaiting an event halts the entire call chain until the event is received.
Users can specify how long they want to wait for an event. If the event does occur within that timeframe,
an AwaitTimeoutException is thrown. Awaiting a timeout (time-based event) is a special case of this
behavior where no exception is thrown.

Limits and Exclusion

"Qualified events" e.g., events declared in a struct and triggered on an instance of that struct, could be
a powerful tool. However it is unclear how to implement this. Also, it raises further questions:

  • Can events be passed around like values? I.e. assigned to variables or returned by functions?
  • How would one "branch off" from the main execution to not block the current call chain while waiting for
    a "local" event?

Implementation

Events exist only in Mita and have no direct representation in C other than maybe a constant used for
identifying an event.

Events with payloads

The event payload would be passed as copy to the event handler. Event handler have the event value available
as it variable.

User defined events

User-defined events have little impact on code generation (global events exist, if they're defined
in a library of by the user hardly matters).

Await events

When a function awaits for an event we store it's location using setjmp and restore it using lngjmp.
Instead of directly enqueueing the event handler we generate a wrapper which either calls the event handler
afresh or uses lngjump to return to the previous location. This wrapper also takes care of unwrapping/
providing the event value (Note: in the XDK platform we're already generating this kind of behavior).

It is unclear how to handle multiple calls to the same function from different places. For example:

event FooEvent

func WaitsForFoo(name : string) {
    println(`Enter ${name}`)
    await FooEvent
    println(`Exit #{name}`)
}

every button_one.pressed {
    WaitForFoo("f2")
}

every system.startup {
    WaitForFoo("f1")
}

Assuming that both system.startup and button_one.pressed events have been triggered we'll need to
store two stacks/jmp information for the same function. The setjmp/lngjmp is bound to the function
call, not the function itself. However, using static code analysis we should be able to compute
the worst-case scenario for function execution and prepare enough memory.

Code Example

event shockEvent : i32

func computeShockSeverity() : i32 {
    return (accelerometer.magnitude / 0.1) as i32
}

every accelerometer.activity {
    var severity = computeShockSeverity()
    if severity > 0 {
        trigger shockEvent, severity
    }
}

every button.pressed {
    if(it == 0) {
        // button one was pressed. Let's give the user some time to put the device out of their hand
        // and wait for a shock event to happen.
        await 30 seconds

        try {
            var severity = await shockEvent, 1 minute
            println(`Shock detected at level ${severity}`)
        } catch(AwaitTimeoutException) {
            println("No shock happened.")
        }
    }
}

Comments

Unraveling can be tamed

The following code doesn't need unraveling, but is unraveled:

package foo;
import platforms.xdk110;

fn test(): int32 {
	return 1;
}

fn asdf() {
	var x = 0;
	x = test();
}

In general, only function calls that have references that are not refering a variable declaration might need to be unraveled.

RFC: add switch case to language

@andreasmuelder:
for implementing a statemachine in the program DSL it is much more readable to have a switch case instead of if else if blocks. We should add a switch case to the language (maybe without fall through)

Unify backend for enums/sum types

We support enums in Mita. Since enums can be implemented with sum types, this is redundant. Since some people might prefer enums, I propose keeping them in the language, but implementing them by just parsing them as sum types. This allows us to reuse code in the model and generator, while not changing the language itself. Furthermore, one can then use enums in where-is statements.

The only drawback I see with this is that the C code is slightly more than just enum as we would generate the following instead of a bare C enum:

enum Foo {
  X, 
  Y,
  Z
}
typedef enum {
	X_e,
	Y_e,
	Z_e
} Foo_enum;

typedef struct {
	Foo_enum tag;
	union Data {
	} data;
} Foo;

However this imposes no runtime overhead since empty unions have a sizeof 0.

Exception thrown in background when clicking on "Use XDK Live" in welcome page

Exception only thrown in background, it is not visible for the user.

org.eclipse.e4.core.di.InjectionException: java.lang.IllegalStateException: Application does not have an active window
at org.eclipse.e4.core.internal.di.MethodRequestor.execute(MethodRequestor.java:65)
at org.eclipse.e4.ui.internal.di.UIEventObjectSupplier$UIEventHandler$1.run(UIEventObjectSupplier.java:56)
at org.eclipse.swt.widgets.Synchronizer.syncExec(Synchronizer.java:233)
at org.eclipse.ui.internal.UISynchronizer.syncExec(UISynchronizer.java:145)
at org.eclipse.swt.widgets.Display.syncExec(Display.java:4814)
at org.eclipse.e4.ui.internal.workbench.swt.E4Application$1.syncExec(E4Application.java:211)
at org.eclipse.e4.ui.internal.di.UIEventObjectSupplier$UIEventHandler.handleEvent(UIEventObjectSupplier.java:53)
at org.eclipse.equinox.internal.event.EventHandlerWrapper.handleEvent(EventHandlerWrapper.java:201)
at org.eclipse.equinox.internal.event.EventHandlerTracker.dispatchEvent(EventHandlerTracker.java:197)
at org.eclipse.equinox.internal.event.EventHandlerTracker.dispatchEvent(EventHandlerTracker.java:1)
at org.eclipse.osgi.framework.eventmgr.EventManager.dispatchEvent(EventManager.java:230)
at org.eclipse.osgi.framework.eventmgr.ListenerQueue.dispatchEventSynchronous(ListenerQueue.java:148)
at org.eclipse.equinox.internal.event.EventAdminImpl.dispatchEvent(EventAdminImpl.java:135)
at org.eclipse.equinox.internal.event.EventAdminImpl.sendEvent(EventAdminImpl.java:78)
at org.eclipse.equinox.internal.event.EventComponent.sendEvent(EventComponent.java:39)
at org.eclipse.e4.ui.services.internal.events.EventBroker.send(EventBroker.java:94)
at org.eclipse.e4.ui.internal.workbench.UIEventPublisher.notifyChanged(UIEventPublisher.java:60)
at org.eclipse.emf.common.notify.impl.BasicNotifierImpl.eNotify(BasicNotifierImpl.java:374)
at org.eclipse.emf.ecore.util.EcoreEList.dispatchNotification(EcoreEList.java:249)
at org.eclipse.emf.common.notify.impl.NotifyingListImpl.remove(NotifyingListImpl.java:725)
at org.eclipse.emf.common.util.AbstractEList.remove(AbstractEList.java:462)
at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.subscribeTopicToBeRendered(PartRenderingEngine.java:169)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.eclipse.e4.core.internal.di.MethodRequestor.execute(MethodRequestor.java:55)
at org.eclipse.e4.core.di.internal.extensions.EventObjectSupplier$DIEventHandler.handleEvent(EventObjectSupplier.java:80)
at org.eclipse.equinox.internal.event.EventHandlerWrapper.handleEvent(EventHandlerWrapper.java:201)
at org.eclipse.equinox.internal.event.EventHandlerTracker.dispatchEvent(EventHandlerTracker.java:197)
at org.eclipse.equinox.internal.event.EventHandlerTracker.dispatchEvent(EventHandlerTracker.java:1)
at org.eclipse.osgi.framework.eventmgr.EventManager.dispatchEvent(EventManager.java:230)
at org.eclipse.osgi.framework.eventmgr.ListenerQueue.dispatchEventSynchronous(ListenerQueue.java:148)
at org.eclipse.equinox.internal.event.EventAdminImpl.dispatchEvent(EventAdminImpl.java:135)
at org.eclipse.equinox.internal.event.EventAdminImpl.sendEvent(EventAdminImpl.java:78)
at org.eclipse.equinox.internal.event.EventComponent.sendEvent(EventComponent.java:39)
at org.eclipse.e4.ui.services.internal.events.EventBroker.send(EventBroker.java:94)
at org.eclipse.e4.ui.internal.workbench.UIEventPublisher.notifyChanged(UIEventPublisher.java:60)
at org.eclipse.emf.common.notify.impl.BasicNotifierImpl.eNotify(BasicNotifierImpl.java:374)
at org.eclipse.e4.ui.model.application.ui.impl.UIElementImpl.setToBeRendered(UIElementImpl.java:303)
at org.eclipse.e4.ui.workbench.addons.cleanupaddon.CleanupAddon$2.run(CleanupAddon.java:325)
at org.eclipse.swt.widgets.RunnableLock.run(RunnableLock.java:35)
at org.eclipse.swt.widgets.Synchronizer.runAsyncMessages(Synchronizer.java:182)
at org.eclipse.swt.widgets.Display.runAsyncMessages(Display.java:4032)
at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3708)
at org.eclipse.ui.internal.dialogs.EventLoopProgressMonitor.runEventLoop(EventLoopProgressMonitor.java:125)
at org.eclipse.ui.internal.dialogs.EventLoopProgressMonitor.setTaskName(EventLoopProgressMonitor.java:164)
at org.eclipse.core.runtime.ProgressMonitorWrapper.setTaskName(ProgressMonitorWrapper.java:152)
at org.eclipse.core.runtime.SubMonitor$RootInfo.setTaskName(SubMonitor.java:292)
at org.eclipse.core.runtime.SubMonitor.beginTaskImpl(SubMonitor.java:651)
at org.eclipse.core.runtime.SubMonitor.beginTask(SubMonitor.java:646)
at org.eclipse.core.runtime.ProgressMonitorWrapper.beginTask(ProgressMonitorWrapper.java:48)
at org.eclipse.core.internal.resources.SaveManager.save(SaveManager.java:1174)
at org.eclipse.core.internal.resources.SaveManager.save(SaveManager.java:1165)
at org.eclipse.core.internal.resources.Project.close(Project.java:193)
at com.bosch.cds.xdk.ui.samples.SampleHelper.setupXdkProject(SampleHelper.java:210)
at com.bosch.cds.xdk.ui.samples.SampleHelper.createProject(SampleHelper.java:94)
at com.bosch.cds.xdk.live.onboarding.XdkLiveProjectGenerator.create(XdkLiveProjectGenerator.java:37)
at com.bosch.cds.xdk.ui.welcome.NewXdkLiveProjectAction$2.execute(NewXdkLiveProjectAction.java:64)
at org.eclipse.ui.actions.WorkspaceModifyOperation.lambda$0(WorkspaceModifyOperation.java:107)
at org.eclipse.core.internal.resources.Workspace.run(Workspace.java:2240)
at org.eclipse.core.internal.resources.Workspace.run(Workspace.java:2267)
at org.eclipse.ui.actions.WorkspaceModifyOperation.run(WorkspaceModifyOperation.java:128)
at org.eclipse.jface.operation.ModalContext.runInCurrentThread(ModalContext.java:437)
at org.eclipse.jface.operation.ModalContext.run(ModalContext.java:353)
at org.eclipse.jface.dialogs.ProgressMonitorDialog.run(ProgressMonitorDialog.java:481)
at org.eclipse.ui.internal.progress.ProgressMonitorJobsDialog.run(ProgressMonitorJobsDialog.java:242)
at org.eclipse.ui.internal.progress.ProgressManager.run(ProgressManager.java:1074)
at com.bosch.cds.xdk.ui.welcome.NewXdkLiveProjectAction.createExampleProject(NewXdkLiveProjectAction.java:69)
at com.bosch.cds.xdk.ui.welcome.NewXdkLiveProjectAction.run(NewXdkLiveProjectAction.java:31)
at com.bosch.cds.xdk.ui.welcome.NewXdkLiveProjectAction.run(NewXdkLiveProjectAction.java:82)

Allow read-only access to configuration items

At the moment users cannot access configuration items (e.g. the sensor range of an accelerometer) in their code. We should allow fully-qualified, read-only access to configuration items, similar to VCI. For example:

package main;

import platforms.xdk110;

setup accelerometer {
    range = BMA280_8g;
}

setup foonet : WLAN {
    PSK = "foonet";
    SSID = "blabla";
}

every WLAN.connected {
    if(foonet.useDHCP) {
        print("Connected using dynamic address\n");
    }
}

every 100 milliseconds {
    if(accelerometer.range == BMA280Range.BMA280_8g) {
        // do something
    }
}

Formatter bug when using InterpolatedStringExpression

fn assertTrue(t : bool) {
	if(true) {
			printf(`${testNum}_pass\n`);
	} else {
			printf(`${testNum}_fail\n`);
	}
} 

formats to

fn assertTrue(t : bool) {
	if(true) {
		printf(`${testNum}_pass\n`);
} else {
	printf(`${testNum}_fail\n`);
}
}

Optionals are missing tests

OptionalsTest.mita.xt doesn't test:

  • some
  • none with explicit typing
  • some with explicit typing

Further, it isn't validated that none has a valid type (only a warning).

Struct constructors don't copy arrays

This:

var foo = new array<int32>(size = 10);

struct s {
	var a: array<int32>;
}

var bar = s(foo);

generates this:

int32_t data_foo_0[10];
array_int32_t foo = {
	.data = data_foo_0,
	.length = 10
};
s bar = {
	.a = foo
}
;

instead of the correct:

int32_t data_foo_0[10];
array_int32_t foo = {
	.data = data_foo_0,
	.length = 10
};
int32_t data_bar_tmp_0[foo.length];
array_int32_t bar_tmp = {
        .data = data_bar_tmp_0,
        .length = foo.length
};
memcpy(bar_tmp.data, foo.data, bar_tmp.length);
s bar = {
	.a = bar_tmp
}
;

RFC: Bugs should directly restart the platform, instead of throwing a catchable exception

Introduction

Yesterday I read an interesting blog post on how Midori-C# handles errors. It boils down to the fact that there are two kinds of errors:

  • Exceptions, like "User didn't specify 'http://' in URL"
  • Bugs, like indexing beyond the bounds of an array

Both will always be there, however only former can be handled by a program, the latter will never be handleable, since the programmer never expected them in the first place.

Proposal

Make some exceptions no longer exceptional, but instead make them "abandon" the current program, restarting it.

Implementation

On the language generation side, we would need some kind of PlatformGenerator#generateAbandon or PlatformGenerator#generateRestart method, that restarts the platform.

On the C-side, most (all) plattforms have some method for restarting, the XDK110 has one: restarting the XDK.

Which kind of bugs really are bugs, and which are catchable is open for debate, but I think that Midori did a pretty good job.

RFC: Multiple Returns

Introduction

Functions typically return a single value. However multiple return values from a single Function
can help structure code and avoid repetition. Further, in recent years multiple return has been
popularized again.

Current Situation

Currently we only support a single return value.

Proposal

We could support multiple return values by extending the function declaration, return statement
and variable declaration. Using a simple form of pattern matching users could utilize multiple
returns. As is common in other languages the _ character becomes the wildcard for ignoring values.
Return values can not be named.

Code Example

func plusAndMinus(a : i32, b : i32) : (i32, i32) {
    let p = a + b
    let m = a - b

    // Multiple return is here. One always has to return a complete set of values
    return p, m
}

func main() {
    // use _ to ignore return values
    var r, _ = plusAndMinus(10, 2)

    // you cannot use multiple-return functions in other statements than variable declarations
    // This is not a valid statement!
    if(a, _ = plusAndMinus(10, 2) == 12) {

    }
}

Implementation

We are already passing result values back out via pointer. This change would simply mean adding
more pointer and adding more logic to variable declarations.

Strings can be compared, but wrong code is produced

The following is legal Mita:

package bar;
import platforms.xdk110; 


every 100 milliseconds {
	var x = "asdf";
	if(x == "asdf") {
		/*...*/
	}
}

The produced code doesn't work though:

	char x[5];
	const char* _xInit = "asdf";
	strcpy(x, _xInit);
	
	if(x == "asdf")
	{
	}

RFC: Type Parameters in Built-in Types

Current Situation

Generated types support type parameters, no support for built-in types.

Proposal

Allow type parameters for structs and sum types. A separate proposal should be made for functions with type parameters.

Code Example

Current Type Parameter Syntax

alt Maybe<T>  {
    Just T 
  | Nothing
}
alt Vector<T> {
    Zero 
  | One T 
  | Two T, T 
  | Three T, T, T 
}

struct NamedElement<T> {
  T t;
  String name;
}

fn foo() {
  let x: Maybe<int16> = Just(21);
  let y = Nothing<int8>(); 
  let z = Just(42 as uint8);
  let w = Nothing() as Maybe String;
}

Updated Syntax

Since anything after (struct|alt) ID must be a type argument, we could remove the brackets, cleaning up the definitions:

alt Maybe T  {
    Just T 
  | Nothing
}
alt Vector T {
    Zero 
  | One T 
  | Two T T 
  | Three T T T 
}

struct NamedElement T {
  T t;
  String name;
}

However, using those types isn't as straight forward if the type parameters are not bound in a variable declaration, since with this syntax we can't make the types part of a constructor (as in Just<int32>(42)), so the user would have to specify the type in an as Expression:

fn foo() {
  let x = Just(21); // x is Maybe int32
  let y = Nothing(); // what type is y here? No types bound
  let z = Just(42 as uint8);
  let w = Nothing() as Maybe String;
}

Implementation

For each instantiation, we need to generate a separate declaration. We can keep the type parameters in the code as long as we add a typedef:

let x1: Maybe int32;
let x2: Maybe String;
typedef int32 T_1;
typdef String T_2;

typedef struct {
  T_1 _0;
} Just_1;
typedef struct {
  T_2 _0;
} Just_2;

typedef enum {
  Nothing_1_e,
  Just_1_e
} Maybe_1_enum;
typedef enum {
  Nothing_2_e,
  Just_2_e
} Maybe_2_enum;

typedef struct {
  Maybe_1_enum tag;
  union Data {
    Just_1 just;
  } data;
} Maybe_1;

typedef struct {
  Maybe_2_enum tag;
  union Data {
    Just_2 just;
  } data;
} Maybe_2;

Discussion

Advantages

  • We can define Optional and similar types in terms of our language, without needing to defer to a generated type.
  • Generated types use Java class identifiers, which is not very elegant or guarantees success. Language support is nicer.
  • This shifts responsibility for some complicated generated type generation from the end-user/developer to us core language developers. Thich creates a better environment for the language, since bugs don't get recreated everywhere if multiple platforms create their own generated types again and again. Generating in the code generator is more error prone than writing Mita code.

Disadvantages

  • We generate lots more code, but not that much more than we already (would have to) do
  • Some parts of the code have to be reorganized, or we create spaghetti code. Breaking the compiler into small phases might help.

Future

In the future, this could lead to:

  • Higher order types
  • Type constraints (Vector<T extends Numeric> / Arrow<A extends ?, ? extends B> / Functor F => map((F T) t, T -> R f): F R)

HTTPRestClient is broken

code:

package main;
import platforms.xdk110;


setup internet : WLAN {
	ssid = "";	
	psk = "";
}

setup http : HttpRestClient {
	endpointBase = "http://google.com/test";
	transport = internet;
	var foo = resource("","application/json");
}



every 1 second {
	var x = accelerometer.x_axis.read();
	if (x>500){
		http.foo.write("");
	}
}
Retcode_T ConnectivityHttpRestClientHttp_Enable(void)
{
	retcode = HttpClient_initialize();
	if(retcode != RETCODE_OK) 
	{
		return retcode;
	}
	
	return NO_EXCEPTION;
}

var retcode needs to be declared

Global variables are not in setup scopes

The following code can not resolve addr:

package test;

import platforms.xdk110;

let addr = "localhost";

setup endpoint: WLAN {
	psk = addr;
	ssid = addr;
}

While in this case it might not be hugely useful to define addr outside the setup, in other cases it might be, for example when doing arithmetic with register addresses for I2C.

For-each statement not yet supported in code generator

One of the first things I wanted to try is:

every button_one.pressed {

	let myList = [1, 2, 3];
	for (var i in myList) {
		print(`${i}`);
	}
}

But it just gives me an unsatisfying:

// ERROR: for-each statements are not supported yet

In the generated source code.

We should either fix this in the generator (how complex is this?), or prevent the user of using that statement (at least a warning).

Arrayslices with variables are sometimes broken

If the array generator can't infer the size of the slice bounds, it doesn't always generate a buffer of the correct length (or at all):

fn foo(x: uint32, y: array<int32>) {
	//var y = new array<int32>(size = 10);
 	var z = y[x:2];
}
	// WARNING: Couldn't infer size!
	// var z: array<int32_t>
	array_int32_t z = {
		.data = data_z_1,
		.length = -1
	};

data_z_1 isn't declared beforehand.

Improve XDK110 Platform

  • Analyze what's missing, sensors, connectivity, ...
  • Fix it
    • basics
      • I2C
      • SD Card
      • GPIO
      • Magnetometer
      • Gyroscope
      • Acoustic
    • events
      • BLE
      • I2C
      • SD Card
      • GPIO
      • Magnetometer
      • Gyroscope
      • Acoustic

Merge generated code instead of overwriting it

If users modify the generated C code they can no longer use Mita as that would overwrite their changes. Our goal however, is to provide a jump-start for C development should the user choose to do so. Thus, we need to introduce means to merge the user-made changes and the code we're generating.

We could use the TextStreamMerger of the team plugin to perform the merge of newly generated files. If the merge fails, the code generation fails or we bring up a merge dialog (difficult if we ever introduce command line tooling).

RFC: Functions as first-class types

Introduction

In many languages, functions can be passed to functions. In some, this is even easy. Eclipse Mita should be one of those :)

Current Situation

No support OOTB, only through generated types, but not implemented.

Proposal

Add function references to the language. Closures and currying could follow, but let's not go overboard.

Code Example

fn id(x: int32): int32 {
  return x;
}
fn add(x: int32, y: int32): int32 {
  return x + y;
}

fn foo(x: int32, f: int32 -> int32) {
  print(f(x));
}

fn fooUnicode(x: int32, f: int32 โ†’ int32) {
  print(f(x));
}

// Parameters could be named?
fn binaryFoo(x: int32, y: int32, f: (a: int32, b: int32) -> int32) {
  print(f(b = x, a = y));
}

Implementation

Translation to C is straight forward:

f: (int32, int32) -> int32 = add;

z = f(x, y);

corresponds to

Retcode_T (*f)(int *result, int x, int y) = &add;

(*f)(&z, x, y);

Double Angle-bracket is not valid

You can't write this: message: "mismatched input '>>' expecting '>'"

var y: array<array<int32>>;

This is not an issue currently, since optionals will forbid nested generated types anyway.

Not that easy to fix since the parser recurses in between >s. It would probably be better to remove the >>-keyword and replace it with hidden(): '>' '>'.

EDIT:
Actually, you can't do that with enums (the hidden() part).

Also, are we C++ now? C++ is bad and should burn in hell

Polymorphic dispatch does not work with references

The following code does throws an error that it cannot resolve the function:

package main;
import platforms.xdk110;

every 1 second {
    let m : testRef;
    let mRef = &m;
    
    // XPECT inferredType --> int8
    (&m).doSomething();
    
    // XPECT inferredType --> int16
    (&mRef).doSomething();
}

fn doSomething(msg : &testRef) : int8 {
	return 0;
}

fn doSomething(msg : &&testRef) : int16 {
	return 0;
}

This issue might exist for optionals as well.

Basic descriptive functions for arrays are missing

As a programmer I expect some basic functions over lists:

  • min(x : array<T>) : optional<T> where T is int32, uint32, float finds the minimum of a list of numbers
  • minArg(x : array<T>) : optional<uint32> where T is int32, uint32, float finds the index of the minimum member of a list of numbers
  • max(x : array<T>) : optional<T> where T is int32, uint32, float finds the maximum of a list of numbers
  • maxArg(x : array<T>) : optional<uint32> where T is int32, uint32, float finds the index of the maximum member of a list of numbers
  • mean(x : array<float>) : float computes the mean of all values in a list
  • std(x : array<float>) : float computes the standard deviation of all values in a list

Declaring struct vars beside a function leads to compile errors

For example:

struct MyStruct{
	var b:bool;
}

var myStruct : MyStruct;

will generate a call of memset((void *) &myStruct, 0, sizeof(MyStruct)); outside any function.

Declaring the struct var within a function is working without compile errors:

struct MyStruct {
	var b : bool;
}

function myFunction() {
	var myStruct : MyStruct;
}

Arrays and references don't mix

The following code produces several issues while linking. Removing the &array<SensorMessage> "fixes" the issue.

package main;

import platforms.xdk110;

struct SensorMessage {
	var accX : int32;
	var accY : int32;
	var accZ : int32;
	
	var temp : int32;
}

// BUG: make data a reference to see the goodness
fn mean(data : &array<SensorMessage>) {
	let result : SensorMessage;
	
	for(var i = 0; i < 10; i++) {
		let sampleCount = 10;
		let x = data[i];
		result.accX += x.accX / sampleCount;
		result.accY += x.accY / sampleCount;
		result.accZ += x.accZ / sampleCount;
		result.temp += x.temp / sampleCount;
	}
	
	return result;
}

Error message is:

ERROR | resolution of uriFragment '|1' failed.
java.lang.NullPointerException
	at org.eclipse.xtext.linking.impl.ImportedNamesAdapter.find(ImportedNamesAdapter.java:34)
	at org.eclipse.xtext.linking.impl.DefaultLinkingService.getImportedNamesAdapter(DefaultLinkingService.java:95)
	at org.eclipse.xtext.linking.impl.DefaultLinkingService.registerImportedNamesAdapter(DefaultLinkingService.java:86)
	at org.eclipse.xtext.linking.impl.DefaultLinkingService.registerImportedNamesAdapter(DefaultLinkingService.java:90)
	at org.eclipse.xtext.linking.impl.DefaultLinkingService.registerImportedNamesAdapter(DefaultLinkingService.java:80)
	at org.eclipse.xtext.linking.impl.DefaultLinkingService.getScope(DefaultLinkingService.java:58)
	at org.eclipse.xtext.linking.impl.DefaultLinkingService.getLinkedObjects(DefaultLinkingService.java:120)
	at com.bosch.cds.xdk.live.program.linking.ProgramLinkingService.getLinkedObjects(ProgramLinkingService.java:62)
	at org.eclipse.xtext.linking.lazy.LazyLinkingResource.getEObject(LazyLinkingResource.java:247)
	at org.eclipse.xtext.linking.lazy.LazyLinkingResource.getEObject(LazyLinkingResource.java:222)
	at org.eclipse.xtext.linking.lazy.LazyLinkingResource.doResolveLazyCrossReference(LazyLinkingResource.java:189)
	at org.eclipse.xtext.linking.lazy.LazyLinkingResource.resolveLazyCrossReference(LazyLinkingResource.java:148)
	at org.eclipse.xtext.linking.lazy.LazyLinkingResource.resolveLazyCrossReferences(LazyLinkingResource.java:134)
	at org.eclipse.xtext.EcoreUtil2.resolveLazyCrossReferences(EcoreUtil2.java:500)
	at org.eclipse.xtext.builder.clustering.ClusteringBuilderState.doUpdate(ClusteringBuilderState.java:230)
	at org.eclipse.xtext.builder.builderState.AbstractBuilderState.update(AbstractBuilderState.java:116)
	at org.eclipse.xtext.builder.impl.XtextBuilder.doBuild(XtextBuilder.java:287)
	at org.eclipse.xtext.builder.impl.XtextBuilder.incrementalBuild(XtextBuilder.java:267)
	at org.eclipse.xtext.builder.impl.XtextBuilder.build(XtextBuilder.java:161)
	at org.eclipse.core.internal.events.BuildManager$2.run(BuildManager.java:735)
	at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42)
	at org.eclipse.core.internal.events.BuildManager.basicBuild(BuildManager.java:206)
	at org.eclipse.core.internal.events.BuildManager.basicBuild(BuildManager.java:246)
	at org.eclipse.core.internal.events.BuildManager$1.run(BuildManager.java:301)
	at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42)
	at org.eclipse.core.internal.events.BuildManager.basicBuild(BuildManager.java:304)
	at org.eclipse.core.internal.events.BuildManager.basicBuildLoop(BuildManager.java:360)
	at org.eclipse.core.internal.events.BuildManager.build(BuildManager.java:383)
	at org.eclipse.core.internal.events.AutoBuildJob.doBuild(AutoBuildJob.java:142)
	at org.eclipse.core.internal.events.AutoBuildJob.run(AutoBuildJob.java:232)
	at org.eclipse.core.internal.jobs.Worker.run(Worker.java:56)
ERROR | Error loading resource from: platform:/resource/XdkLiveApplication/application.x
org.eclipse.emf.common.util.WrappedException: java.lang.NullPointerException
	at org.eclipse.xtext.linking.lazy.LazyLinkingResource.getEObject(LazyLinkingResource.java:230)
	at org.eclipse.xtext.linking.lazy.LazyLinkingResource.doResolveLazyCrossReference(LazyLinkingResource.java:189)
	at org.eclipse.xtext.linking.lazy.LazyLinkingResource.resolveLazyCrossReference(LazyLinkingResource.java:148)
	at org.eclipse.xtext.linking.lazy.LazyLinkingResource.resolveLazyCrossReferences(LazyLinkingResource.java:134)
	at org.eclipse.xtext.EcoreUtil2.resolveLazyCrossReferences(EcoreUtil2.java:500)
	at org.eclipse.xtext.builder.clustering.ClusteringBuilderState.doUpdate(ClusteringBuilderState.java:230)
	at org.eclipse.xtext.builder.builderState.AbstractBuilderState.update(AbstractBuilderState.java:116)
	at org.eclipse.xtext.builder.impl.XtextBuilder.doBuild(XtextBuilder.java:287)
	at org.eclipse.xtext.builder.impl.XtextBuilder.incrementalBuild(XtextBuilder.java:267)
	at org.eclipse.xtext.builder.impl.XtextBuilder.build(XtextBuilder.java:161)
	at org.eclipse.core.internal.events.BuildManager$2.run(BuildManager.java:735)
	at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42)
	at org.eclipse.core.internal.events.BuildManager.basicBuild(BuildManager.java:206)
	at org.eclipse.core.internal.events.BuildManager.basicBuild(BuildManager.java:246)
	at org.eclipse.core.internal.events.BuildManager$1.run(BuildManager.java:301)
	at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42)
	at org.eclipse.core.internal.events.BuildManager.basicBuild(BuildManager.java:304)
	at org.eclipse.core.internal.events.BuildManager.basicBuildLoop(BuildManager.java:360)
	at org.eclipse.core.internal.events.BuildManager.build(BuildManager.java:383)
	at org.eclipse.core.internal.events.AutoBuildJob.doBuild(AutoBuildJob.java:142)
	at org.eclipse.core.internal.events.AutoBuildJob.run(AutoBuildJob.java:232)
	at org.eclipse.core.internal.jobs.Worker.run(Worker.java:56)
Caused by: java.lang.NullPointerException
	at org.eclipse.xtext.linking.impl.ImportedNamesAdapter.find(ImportedNamesAdapter.java:34)
	at org.eclipse.xtext.linking.impl.DefaultLinkingService.getImportedNamesAdapter(DefaultLinkingService.java:95)
	at org.eclipse.xtext.linking.impl.DefaultLinkingService.registerImportedNamesAdapter(DefaultLinkingService.java:86)
	at org.eclipse.xtext.linking.impl.DefaultLinkingService.registerImportedNamesAdapter(DefaultLinkingService.java:90)
	at org.eclipse.xtext.linking.impl.DefaultLinkingService.registerImportedNamesAdapter(DefaultLinkingService.java:80)
	at org.eclipse.xtext.linking.impl.DefaultLinkingService.getScope(DefaultLinkingService.java:58)
	at org.eclipse.xtext.linking.impl.DefaultLinkingService.getLinkedObjects(DefaultLinkingService.java:120)
	at com.bosch.cds.xdk.live.program.linking.ProgramLinkingService.getLinkedObjects(ProgramLinkingService.java:62)
	at org.eclipse.xtext.linking.lazy.LazyLinkingResource.getEObject(LazyLinkingResource.java:247)
	at org.eclipse.xtext.linking.lazy.LazyLinkingResource.getEObject(LazyLinkingResource.java:222)
	... 21 more
ERROR | java.lang.IllegalStateException: getReferenceDescriptions platform:/resource/XdkLiveApplication/application.x
java.lang.IllegalStateException: getReferenceDescriptions platform:/resource/XdkLiveApplication/application.x
	at org.eclipse.xtext.builder.clustering.CopiedResourceDescription.getReferenceDescriptions(CopiedResourceDescription.java:84)
	at org.eclipse.xtext.builder.builderState.BuilderStateUtil.copyReferenceDescriptions(BuilderStateUtil.java:59)
	at org.eclipse.xtext.builder.builderState.BuilderStateUtil.create(BuilderStateUtil.java:34)
	at org.eclipse.xtext.builder.clustering.ClusteringBuilderState.doUpdate(ClusteringBuilderState.java:267)
	at org.eclipse.xtext.builder.builderState.AbstractBuilderState.update(AbstractBuilderState.java:116)
	at org.eclipse.xtext.builder.impl.XtextBuilder.doBuild(XtextBuilder.java:287)
	at org.eclipse.xtext.builder.impl.XtextBuilder.incrementalBuild(XtextBuilder.java:267)
	at org.eclipse.xtext.builder.impl.XtextBuilder.build(XtextBuilder.java:161)
	at org.eclipse.core.internal.events.BuildManager$2.run(BuildManager.java:735)
	at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42)
	at org.eclipse.core.internal.events.BuildManager.basicBuild(BuildManager.java:206)
	at org.eclipse.core.internal.events.BuildManager.basicBuild(BuildManager.java:246)
	at org.eclipse.core.internal.events.BuildManager$1.run(BuildManager.java:301)
	at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42)
	at org.eclipse.core.internal.events.BuildManager.basicBuild(BuildManager.java:304)
	at org.eclipse.core.internal.events.BuildManager.basicBuildLoop(BuildManager.java:360)
	at org.eclipse.core.internal.events.BuildManager.build(BuildManager.java:383)
	at org.eclipse.core.internal.events.AutoBuildJob.doBuild(AutoBuildJob.java:142)
	at org.eclipse.core.internal.events.AutoBuildJob.run(AutoBuildJob.java:232)
	at org.eclipse.core.internal.jobs.Worker.run(Worker.java:56)
ERROR | java.lang.IllegalStateException: getImportedNames platform:/resource/XdkLiveApplication/application.x
java.lang.IllegalStateException: getImportedNames platform:/resource/XdkLiveApplication/application.x
	at org.eclipse.xtext.builder.clustering.CopiedResourceDescription.getImportedNames(CopiedResourceDescription.java:75)
	at org.eclipse.xtext.builder.builderState.BuilderStateUtil.copyImportedNames(BuilderStateUtil.java:40)
	at org.eclipse.xtext.builder.builderState.BuilderStateUtil.create(BuilderStateUtil.java:35)
	at org.eclipse.xtext.builder.clustering.ClusteringBuilderState.doUpdate(ClusteringBuilderState.java:267)
	at org.eclipse.xtext.builder.builderState.AbstractBuilderState.update(AbstractBuilderState.java:116)
	at org.eclipse.xtext.builder.impl.XtextBuilder.doBuild(XtextBuilder.java:287)
	at org.eclipse.xtext.builder.impl.XtextBuilder.incrementalBuild(XtextBuilder.java:267)
	at org.eclipse.xtext.builder.impl.XtextBuilder.build(XtextBuilder.java:161)
	at org.eclipse.core.internal.events.BuildManager$2.run(BuildManager.java:735)
	at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42)
	at org.eclipse.core.internal.events.BuildManager.basicBuild(BuildManager.java:206)
	at org.eclipse.core.internal.events.BuildManager.basicBuild(BuildManager.java:246)
	at org.eclipse.core.internal.events.BuildManager$1.run(BuildManager.java:301)
	at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42)
	at org.eclipse.core.internal.events.BuildManager.basicBuild(BuildManager.java:304)
	at org.eclipse.core.internal.events.BuildManager.basicBuildLoop(BuildManager.java:360)
	at org.eclipse.core.internal.events.BuildManager.build(BuildManager.java:383)
	at org.eclipse.core.internal.events.AutoBuildJob.doBuild(AutoBuildJob.java:142)
	at org.eclipse.core.internal.events.AutoBuildJob.run(AutoBuildJob.java:232)
	at org.eclipse.core.internal.jobs.Worker.run(Worker.java:56)
ERROR | resolution of uriFragment '|1' failed.
java.lang.NullPointerException
	at org.eclipse.xtext.linking.impl.ImportedNamesAdapter.find(ImportedNamesAdapter.java:34)
	at org.eclipse.xtext.linking.impl.DefaultLinkingService.getImportedNamesAdapter(DefaultLinkingService.java:95)
	at org.eclipse.xtext.linking.impl.DefaultLinkingService.registerImportedNamesAdapter(DefaultLinkingService.java:86)
	at org.eclipse.xtext.linking.impl.DefaultLinkingService.registerImportedNamesAdapter(DefaultLinkingService.java:90)
	at org.eclipse.xtext.linking.impl.DefaultLinkingService.registerImportedNamesAdapter(DefaultLinkingService.java:80)
	at org.eclipse.xtext.linking.impl.DefaultLinkingService.getScope(DefaultLinkingService.java:58)
	at org.eclipse.xtext.linking.impl.DefaultLinkingService.getLinkedObjects(DefaultLinkingService.java:120)
	at com.bosch.cds.xdk.live.program.linking.ProgramLinkingService.getLinkedObjects(ProgramLinkingService.java:62)
	at org.eclipse.xtext.linking.lazy.LazyLinkingResource.getEObject(LazyLinkingResource.java:247)
	at org.eclipse.xtext.linking.lazy.LazyLinkingResource.getEObject(LazyLinkingResource.java:222)
	at org.eclipse.xtext.linking.lazy.LazyLinkingResource.doResolveLazyCrossReference(LazyLinkingResource.java:189)
	at org.eclipse.xtext.linking.lazy.LazyLinkingResource.resolveLazyCrossReference(LazyLinkingResource.java:148)
	at org.eclipse.xtext.linking.lazy.LazyLinkingResource.resolveLazyCrossReferences(LazyLinkingResource.java:134)
	at org.eclipse.xtext.EcoreUtil2.resolveLazyCrossReferences(EcoreUtil2.java:500)
	at org.eclipse.xtext.validation.ResourceValidatorImpl.resolveProxies(ResourceValidatorImpl.java:161)
	at org.eclipse.xtext.validation.ResourceValidatorImpl.validate(ResourceValidatorImpl.java:74)
	at org.eclipse.xtext.ui.validation.DefaultResourceUIValidatorExtension.addMarkers(DefaultResourceUIValidatorExtension.java:60)
	at org.eclipse.xtext.ui.validation.DefaultResourceUIValidatorExtension.updateValidationMarkers(DefaultResourceUIValidatorExtension.java:46)
	at org.eclipse.xtext.builder.builderState.MarkerUpdaterImpl.processDelta(MarkerUpdaterImpl.java:93)
	at org.eclipse.xtext.builder.builderState.MarkerUpdaterImpl.updateMarkers(MarkerUpdaterImpl.java:63)
	at org.eclipse.xtext.builder.builderState.AbstractBuilderState.updateMarkers(AbstractBuilderState.java:82)
	at org.eclipse.xtext.builder.clustering.ClusteringBuilderState.doUpdate(ClusteringBuilderState.java:283)
	at org.eclipse.xtext.builder.builderState.AbstractBuilderState.update(AbstractBuilderState.java:116)
	at org.eclipse.xtext.builder.impl.XtextBuilder.doBuild(XtextBuilder.java:287)
	at org.eclipse.xtext.builder.impl.XtextBuilder.incrementalBuild(XtextBuilder.java:267)
	at org.eclipse.xtext.builder.impl.XtextBuilder.build(XtextBuilder.java:161)
	at org.eclipse.core.internal.events.BuildManager$2.run(BuildManager.java:735)
	at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42)
	at org.eclipse.core.internal.events.BuildManager.basicBuild(BuildManager.java:206)
	at org.eclipse.core.internal.events.BuildManager.basicBuild(BuildManager.java:246)
	at org.eclipse.core.internal.events.BuildManager$1.run(BuildManager.java:301)
	at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42)
	at org.eclipse.core.internal.events.BuildManager.basicBuild(BuildManager.java:304)
	at org.eclipse.core.internal.events.BuildManager.basicBuildLoop(BuildManager.java:360)
	at org.eclipse.core.internal.events.BuildManager.build(BuildManager.java:383)
	at org.eclipse.core.internal.events.AutoBuildJob.doBuild(AutoBuildJob.java:142)
	at org.eclipse.core.internal.events.AutoBuildJob.run(AutoBuildJob.java:232)
	at org.eclipse.core.internal.jobs.Worker.run(Worker.java:56)
ERROR | Error validating platform:/resource/XdkLiveApplication/application.x
org.eclipse.emf.common.util.WrappedException: java.lang.NullPointerException
	at org.eclipse.xtext.linking.lazy.LazyLinkingResource.getEObject(LazyLinkingResource.java:230)
	at org.eclipse.xtext.linking.lazy.LazyLinkingResource.doResolveLazyCrossReference(LazyLinkingResource.java:189)
	at org.eclipse.xtext.linking.lazy.LazyLinkingResource.resolveLazyCrossReference(LazyLinkingResource.java:148)
	at org.eclipse.xtext.linking.lazy.LazyLinkingResource.resolveLazyCrossReferences(LazyLinkingResource.java:134)
	at org.eclipse.xtext.EcoreUtil2.resolveLazyCrossReferences(EcoreUtil2.java:500)
	at org.eclipse.xtext.validation.ResourceValidatorImpl.resolveProxies(ResourceValidatorImpl.java:161)
	at org.eclipse.xtext.validation.ResourceValidatorImpl.validate(ResourceValidatorImpl.java:74)
	at org.eclipse.xtext.ui.validation.DefaultResourceUIValidatorExtension.addMarkers(DefaultResourceUIValidatorExtension.java:60)
	at org.eclipse.xtext.ui.validation.DefaultResourceUIValidatorExtension.updateValidationMarkers(DefaultResourceUIValidatorExtension.java:46)
	at org.eclipse.xtext.builder.builderState.MarkerUpdaterImpl.processDelta(MarkerUpdaterImpl.java:93)
	at org.eclipse.xtext.builder.builderState.MarkerUpdaterImpl.updateMarkers(MarkerUpdaterImpl.java:63)
	at org.eclipse.xtext.builder.builderState.AbstractBuilderState.updateMarkers(AbstractBuilderState.java:82)
	at org.eclipse.xtext.builder.clustering.ClusteringBuilderState.doUpdate(ClusteringBuilderState.java:283)
	at org.eclipse.xtext.builder.builderState.AbstractBuilderState.update(AbstractBuilderState.java:116)
	at org.eclipse.xtext.builder.impl.XtextBuilder.doBuild(XtextBuilder.java:287)
	at org.eclipse.xtext.builder.impl.XtextBuilder.incrementalBuild(XtextBuilder.java:267)
	at org.eclipse.xtext.builder.impl.XtextBuilder.build(XtextBuilder.java:161)
	at org.eclipse.core.internal.events.BuildManager$2.run(BuildManager.java:735)
	at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42)
	at org.eclipse.core.internal.events.BuildManager.basicBuild(BuildManager.java:206)
	at org.eclipse.core.internal.events.BuildManager.basicBuild(BuildManager.java:246)
	at org.eclipse.core.internal.events.BuildManager$1.run(BuildManager.java:301)
	at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:42)
	at org.eclipse.core.internal.events.BuildManager.basicBuild(BuildManager.java:304)
	at org.eclipse.core.internal.events.BuildManager.basicBuildLoop(BuildManager.java:360)
	at org.eclipse.core.internal.events.BuildManager.build(BuildManager.java:383)
	at org.eclipse.core.internal.events.AutoBuildJob.doBuild(AutoBuildJob.java:142)
	at org.eclipse.core.internal.events.AutoBuildJob.run(AutoBuildJob.java:232)
	at org.eclipse.core.internal.jobs.Worker.run(Worker.java:56)
Caused by: java.lang.NullPointerException
	at org.eclipse.xtext.linking.impl.ImportedNamesAdapter.find(ImportedNamesAdapter.java:34)
	at org.eclipse.xtext.linking.impl.DefaultLinkingService.getImportedNamesAdapter(DefaultLinkingService.java:95)
	at org.eclipse.xtext.linking.impl.DefaultLinkingService.registerImportedNamesAdapter(DefaultLinkingService.java:86)
	at org.eclipse.xtext.linking.impl.DefaultLinkingService.registerImportedNamesAdapter(DefaultLinkingService.java:90)
	at org.eclipse.xtext.linking.impl.DefaultLinkingService.registerImportedNamesAdapter(DefaultLinkingService.java:80)
	at org.eclipse.xtext.linking.impl.DefaultLinkingService.getScope(DefaultLinkingService.java:58)
	at org.eclipse.xtext.linking.impl.DefaultLinkingService.getLinkedObjects(DefaultLinkingService.java:120)
	at com.bosch.cds.xdk.live.program.linking.ProgramLinkingService.getLinkedObjects(ProgramLinkingService.java:62)
	at org.eclipse.xtext.linking.lazy.LazyLinkingResource.getEObject(LazyLinkingResource.java:247)
	at org.eclipse.xtext.linking.lazy.LazyLinkingResource.getEObject(LazyLinkingResource.java:222)
	... 28 more

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.