You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@flex.apache.org by Michael Schmalle <te...@gmail.com> on 2015/06/09 21:38:16 UTC

Re: Re : Re: [FalconJX] Vanilla compiler, all externs parsing and contained in SWC :)

Fred,

All that is going on is, I have a ReferenceModel that encapsulates the
Closure Compiler's Compiler.compile() method. So this code I wrote is going
to be a "COMPCExtern" compiler tool.

Basically we need to just feed it the source locations of the .js extern
files we want to transform into .as API that will be compiled into a SWC.

It has some phases;

1. Create the ReferenceModel which created a Compiler.
3. Pass in the actionscript output location (File path).
2. Pass the .js extern locations(File paths) to the model.
4. Add exclusions [className, memeberName] to exclude, this is important
right now because there are some edge cases that screw up the .as compiling
into a SWC.
4. Clean the output directory.
6. Call ReferenceModel.compile(), this calls the JavaScript compiler on all
the extern files
6a. Compiler pass 1, finds all the Classes, Interfaces, Global Functions,
Global Constants.
6b. Compiler pass 2, resolves all memebers to their types in the
ReferenceModel, creates BaseReference classes for them, save the AST which
holds the JSDocInfo.
7. Call ReferenceModel.emit(), this produces the actual actionscript Class,
Interface, Function and Constant files.
8. Call the COMPC compiler on the actionscript output, create the SWC.

Viola, that is it. :)

Mike


On Tue, Jun 9, 2015 at 3:22 PM, Frédéric THOMAS <we...@hotmail.com>
wrote:

> Yep man you did something great, I would like do understand it more now,
> so if you can check in an give some pointers to follow what you did would
> be greater even :-)
>
> Cheers,
> -Fred
>
> --- Message initial ---
>
> De : "Alex Harui" <ah...@adobe.com>
> Envoyé : 9 juin 2015 20:15
> A : dev@flex.apache.org
> Objet : Re: [FalconJX] Vanilla compiler, all externs parsing and contained
> in SWC :)
>
> Freakin’ awesome!  Can you check it in so I can try to integrate it into
> the builds?
>
> -Alex
>
> On 6/9/15, 11:20 AM, "Michael Schmalle" <te...@gmail.com> wrote:
>
> >Oh yeah, here is the class list;
> >
> >AlphaFilter.as
> >AlphaImageLoaderFilter.as
> >ANGLE_instanced_arrays.as
> >Arguments.as
> >Array.as
> >ArrayBuffer.as
> >ArrayBufferView.as
> >Attr.as
> >Audio.as
> >AudioBuffer.as
> >AudioBufferSourceNode.as
> >AudioChannelMerger.as
> >AudioChannelSplitter.as
> >AudioContext.as
> >AudioDestinationNode.as
> >AudioGain.as
> >AudioListener.as
> >AudioNode.as
> >AudioPannerNode.as
> >AudioParam.as
> >AudioProcessingEvent.as
> >AudioSourceNode.as
> >BatteryManager.as
> >BiquadFilterNode.as
> >Blob.as
> >BlobBuilder.as
> >Boolean.as
> >BoxObject.as
> >BufferSource.as
> >CanvasGradient.as
> >CanvasPattern.as
> >CanvasPixelArray.as
> >CanvasRenderingContext2D.as
> >CaretPosition.as
> >CDATASection.as
> >CharacterData.as
> >chrome.as
> >ChromeBooleanEvent.as
> >ChromeCsiInfo.as
> >ChromeEvent.as
> >ChromeLoadTimes.as
> >ChromeNumberEvent.as
> >ChromeObjectEvent.as
> >ChromeStringArrayEvent.as
> >ChromeStringEvent.as
> >ChromeStringStringEvent.as
> >ClientInformation.as
> >ClientRect.as
> >ClientRectList.as
> >ClipboardData.as
> >Comment.as
> >Console.as
> >ControlRange.as
> >ConvolverNode.as
> >Counter.as
> >CSSCharsetRule.as
> >CSSFontFaceRule.as
> >CSSImportRule.as
> >CSSInterface.as
> >CSSMatrix.as
> >CSSMediaRule.as
> >CSSPageRule.as
> >CSSPrimitiveValue.as
> >CSSProperties.as
> >CSSRule.as
> >CSSRuleList.as
> >CSSStyleDeclaration.as
> >CSSStyleRule.as
> >CSSStyleSheet.as
> >CSSUnknownRule.as
> >CSSValue.as
> >CSSValueList.as
> >CustomEvent.as
> >CustomEventInit.as
> >Database.as
> >DatabaseCallback.as
> >DataTransfer.as
> >DataTransferItem.as
> >DataTransferItemList.as
> >DataView.as
> >Date.as
> >DedicatedWorkerGlobalScope.as
> >DelayNode.as
> >DeviceAcceleration.as
> >DeviceMotionEvent.as
> >DeviceOrientationEvent.as
> >DeviceRotationRate.as
> >DirectoryEntry.as
> >DirectoryReader.as
> >Document.as
> >DocumentCSS.as
> >DocumentEvent.as
> >DocumentFragment.as
> >DocumentRange.as
> >DocumentStyle.as
> >DocumentType.as
> >DOMApplicationCache.as
> >DOMConfiguration.as
> >DOMError.as
> >DOMErrorHandler.as
> >DOMException.as
> >DOMImplementation.as
> >DOMImplementationCSS.as
> >DOMImplementationList.as
> >DOMImplementationSource.as
> >DOMLocator.as
> >DOMStringList.as
> >DOMTokenList.as
> >DOMURL.as
> >DragEvent.as
> >DynamicsCompressorNode.as
> >Element.as
> >ElementCSSInlineStyle.as
> >Entity.as
> >EntityReference.as
> >Entry.as
> >Error.as
> >ErrorEvent.as
> >ErrorEventInit.as
> >EvalError.as
> >Event.as
> >EventInit.as
> >EventListener.as
> >EventTarget.as
> >ExceptionCode.as
> >EXT_texture_filter_anisotropic.as
> >ExtendableEvent.as
> >File.as
> >FileEntry.as
> >FileError.as
> >FileList.as
> >FileReader.as
> >FileSaver.as
> >FileSystem.as
> >FileWriter.as
> >Float32Array.as
> >Float64Array.as
> >FontFace.as
> >FontFaceDescriptors.as
> >FontFaceLoadStatus.as
> >FontFaceSet.as
> >FontFaceSetLoadStatus.as
> >FormData.as
> >Function.as
> >GainNode.as
> >Generator.as
> >Geolocation.as
> >GeolocationCoordinates.as
> >GeolocationPosition.as
> >GeolocationPositionError.as
> >GeolocationPositionOptions.as
> >GestureEvent.as
> >HashChangeEvent.as
> >History.as
> >HTMLAnchorElement.as
> >HTMLAppletElement.as
> >HTMLAreaElement.as
> >HTMLAudioElement.as
> >HTMLBaseElement.as
> >HTMLBaseFontElement.as
> >HTMLBodyElement.as
> >HTMLBRElement.as
> >HTMLButtonElement.as
> >HTMLCanvasElement.as
> >HTMLCollection.as
> >HTMLContentElement.as
> >HTMLDetailsElement.as
> >HTMLDialogElement.as
> >HTMLDirectoryElement.as
> >HTMLDivElement.as
> >HTMLDListElement.as
> >HTMLDocument.as
> >HTMLElement.as
> >HTMLEmbedElement.as
> >HTMLFieldSetElement.as
> >HTMLFilter.as
> >HTMLFiltersCollection.as
> >HTMLFontElement.as
> >HTMLFormElement.as
> >HTMLFrameElement.as
> >HTMLFrameSetElement.as
> >HTMLHeadElement.as
> >HTMLHeadingElement.as
> >HTMLHRElement.as
> >HTMLHtmlElement.as
> >HTMLIFrameElement.as
> >HTMLImageElement.as
> >HTMLInputElement.as
> >HTMLIsIndexElement.as
> >HTMLLabelElement.as
> >HTMLLegendElement.as
> >HTMLLIElement.as
> >HTMLLinkElement.as
> >HTMLMapElement.as
> >HTMLMediaElement.as
> >HTMLMenuElement.as
> >HTMLMenuItemElement.as
> >HTMLMetaElement.as
> >HTMLModElement.as
> >HTMLObjectElement.as
> >HTMLOListElement.as
> >HTMLOptGroupElement.as
> >HTMLOptionElement.as
> >HTMLOptionsCollection.as
> >HTMLParagraphElement.as
> >HTMLParamElement.as
> >HTMLPictureElement.as
> >HTMLPreElement.as
> >HTMLQuoteElement.as
> >HTMLScriptElement.as
> >HTMLSelectElement.as
> >HTMLShadowElement.as
> >HTMLSourceElement.as
> >HTMLSpanElement.as
> >HTMLStyleElement.as
> >HTMLTableCaptionElement.as
> >HTMLTableCellElement.as
> >HTMLTableColElement.as
> >HTMLTableElement.as
> >HTMLTableRowElement.as
> >HTMLTableSectionElement.as
> >HTMLTemplateElement.as
> >HTMLTextAreaElement.as
> >HTMLTitleElement.as
> >HTMLUListElement.as
> >HTMLVideoElement.as
> >IceCandidate.as
> >IDBCursor.as
> >IDBCursorWithValue.as
> >IDBDatabase.as
> >IDBDatabaseException.as
> >IDBFactory.as
> >IDBIndex.as
> >IDBKeyRange.as
> >IDBKeyType.as
> >IDBObjectStore.as
> >IDBOpenDBRequest.as
> >IDBRequest.as
> >IDBTransaction.as
> >IDBVersionChangeEvent.as
> >Image.as
> >ImageData.as
> >int.as
> >Int8Array.as
> >Int16Array.as
> >Int32Array.as
> >Iterable.as
> >Iterator.as
> >JavaScriptAudioNode.as
> >JSONType.as
> >KeyboardEvent.as
> >KeyboardEventInit.as
> >LinkStyle.as
> >LocalFileSystem.as
> >Location.as
> >Math.as
> >MediaConstraints.as
> >MediaConstraintSet_.as
> >MediaConstraintSetInterface_.as
> >MediaConstraintsInterface_.as
> >MediaElementAudioSourceNode.as
> >MediaError.as
> >MediaList.as
> >MediaQueryList.as
> >MediaQueryListListener.as
> >MediaStream.as
> >MediaStreamAudioDestinationNode.as
> >MediaStreamAudioSourceNode.as
> >MediaStreamConstraints.as
> >MediaStreamConstraintsInterface_.as
> >MediaStreamEvent.as
> >MediaStreamTrack.as
> >MediaStreamTrackEvent.as
> >MediaStreamTrackState.as
> >MediaTrackConstraints.as
> >MediaTrackConstraintSet.as
> >MediaTrackConstraintSetInterface_.as
> >MediaTrackConstraintsInterface_.as
> >MemoryInfo.as
> >MessageChannel.as
> >MessageEvent.as
> >MessagePort.as
> >MessageSender.as
> >Metadata.as
> >MimeType.as
> >MimeTypeArray.as
> >MouseEvent.as
> >MouseEventInit.as
> >MSCSSMatrix.as
> >MutationEvent.as
> >MutationObserver.as
> >MutationObserverInit.as
> >MutationRecord.as
> >NamedNodeMap.as
> >NameList.as
> >Navigator.as
> >NavigatorUserMediaError.as
> >Node.as
> >NodeFilter.as
> >NodeIterator.as
> >NodeList.as
> >Notation.as
> >Notification.as
> >NotificationCenter.as
> >NotificationEvent.as
> >NotificationOptions.as
> >NotificationPermissionCallback.as
> >Number.as
> >Object.as
> >ObjectPropertyDescriptor.as
> >OES_depth_texture.as
> >OES_element_index_uint.as
> >OES_standard_derivatives.as
> >OES_texture_float.as
> >OES_texture_half_float.as
> >OES_vertex_array_object.as
> >OfflineAudioCompletionEvent.as
> >OfflineAudioContext.as
> >OscillatorNode.as
> >PageTransitionEvent.as
> >Performance.as
> >PerformanceEntry.as
> >PerformanceMemory.as
> >PerformanceNavigation.as
> >PerformanceResourceTiming.as
> >PerformanceTiming.as
> >PeriodicWave.as
> >Plugin.as
> >PluginArray.as
> >PopStateEvent.as
> >Port.as
> >ProcessingInstruction.as
> >ProgressEvent.as
> >ProgressEventInit.as
> >Promise.as
> >Range.as
> >RangeError.as
> >RangeException.as
> >RealtimeAnalyserNode.as
> >Rect.as
> >ReferenceError.as
> >RegExp.as
> >RelatedEvent.as
> >RGBColor.as
> >RTCConfiguration.as
> >RTCConfigurationInterface_.as
> >RTCConfigurationRecord_.as
> >RTCDataChannel.as
> >RTCDataChannelEvent.as
> >RTCDataChannelInit.as
> >RTCDataChannelInitInterface_.as
> >RTCDataChannelInitRecord_.as
> >RTCIceCandidate.as
> >RTCIceConnectionState.as
> >RTCIceGatheringState.as
> >RTCIceServer.as
> >RTCIceServerInterface_.as
> >RTCIceServerRecord_.as
> >RTCPeerConnection.as
> >RTCPeerConnectionErrorCallback.as
> >RTCPeerConnectionIceEvent.as
> >RTCSdpType.as
> >RTCSessionDescription.as
> >RTCSessionDescriptionCallback.as
> >RTCSignalingState.as
> >RTCStatsCallback.as
> >RTCStatsElement.as
> >RTCStatsReport.as
> >RTCStatsResponse.as
> >RTCVoidCallback.as
> >Screen.as
> >ScriptProcessorNode.as
> >ScriptProfile.as
> >ScriptProfileNode.as
> >Selection.as
> >ShadowRoot.as
> >SharedWorker.as
> >SharedWorkerGlobalScope.as
> >SourceInfo.as
> >SQLError.as
> >SQLResultSet.as
> >SQLResultSetRowList.as
> >SQLStatementCallback.as
> >SQLTransaction.as
> >StereoPannerNode.as
> >Storage.as
> >StorageEvent.as
> >StorageInfo.as
> >StorageQuota.as
> >String.as
> >StyleSheet.as
> >StyleSheetList.as
> >symbol.as
> >SyntaxError.as
> >Tab.as
> >Text.as
> >TextDecoder.as
> >TextEncoder.as
> >TextMetrics.as
> >TextRange.as
> >TextTrack.as
> >TextTrackCue.as
> >TextTrackCueList.as
> >TextTrackList.as
> >Thenable.as
> >TimeRanges.as
> >Touch.as
> >TouchEvent.as
> >TouchList.as
> >Transferable.as
> >TraversalDocument.as
> >TreeWalker.as
> >TypeError.as
> >TypeInfo.as
> >UIEvent.as
> >UIEventInit.as
> >uint.as
> >Uint8Array.as
> >Uint8ClampedArray.as
> >Uint16Array.as
> >Uint32Array.as
> >URIError.as
> >URL.as
> >UserDataHandler.as
> >ValidityState.as
> >VideoPlaybackQuality.as
> >ViewCSS.as
> >VisibilityState.as
> >VTTCue.as
> >WaveShaperNode.as
> >WaveTable.as
> >WEBGL_compressed_texture_s3tc.as
> >WEBGL_debug_renderer_info.as
> >WEBGL_debug_shaders.as
> >WEBGL_lose_context.as
> >WebGLActiveInfo.as
> >WebGLBuffer.as
> >WebGLContextAttributes.as
> >WebGLContextEvent.as
> >WebGLFramebuffer.as
> >WebGLObject.as
> >WebGLProgram.as
> >WebGLRenderbuffer.as
> >WebGLRenderingContext.as
> >WebGLShader.as
> >WebGLShaderPrecisionFormat.as
> >WebGLTexture.as
> >WebGLUniformLocation.as
> >WebGLVertexArrayObjectOES.as
> >WebKitAnimationEvent.as
> >webkitAudioContext.as
> >webkitAudioPannerNode.as
> >WebKitBlobBuilder.as
> >WebKitCSSMatrix.as
> >webkitIDBCursor.as
> >webkitIDBDatabaseException.as
> >webkitIDBKeyRange.as
> >webkitIDBRequest.as
> >webkitIDBTransaction.as
> >webkitIDBVersionChangeEvent.as
> >webkitOfflineAudioContext.as
> >WebKitPoint.as
> >webkitURL.as
> >WebSocket.as
> >WebWorker.as
> >WheelEvent.as
> >WheelEventInit.as
> >Window.as
> >WindowLocalStorage.as
> >WindowSessionStorage.as
> >Worker.as
> >WorkerGlobalScope.as
> >WorkerLocation.as
> >XDomainRequest.as
> >XMLDOMDocument.as
> >XMLHttpRequest.as
> >XMLHttpRequestEventTarget.as
> >XMLHttpRequestUpload.as
> >XPathEvaluator.as
> >XPathException.as
> >XPathExpression.as
> >XPathNamespace.as
> >XPathNSResolver.as
> >XPathResult.as
> >
> >
> >On Tue, Jun 9, 2015 at 2:20 PM, Michael Schmalle
> ><te...@gmail.com>
> >wrote:
> >
> >> Hey,
> >>
> >> Well I spent the whole day getting this working and did a Web Audio
> >> experiment as well! Wow, code completion in class form for Audio apps, I
> >> think I am hooked. :)
> >>
> >> 1. AS
> >> 2 .JS (around a 2M SWC for everything)
> >> 3. List of classes currently compiled
> >>
> >> This thing is pretty stable compiling this mess of JS in all the files
> >> below.
> >>
> >> WebGL and HTML5 is in there as well. :)
> >>
> >> Mike
> >>
> >>
> >> -------------------------------------------------------------
> >> Extern Libs in SWC
> >> -------------------------------------------------------------
> >>
> >> model.addExternal("es3");
> >> model.addExternal("es5");
> >> model.addExternal("es6");
> >>
> >> model.addExternal("w3c_anim_timing");
> >> model.addExternal("w3c_audio");
> >> model.addExternal("w3c_batterystatus");
> >> model.addExternal("w3c_css");
> >> model.addExternal("w3c_css3d");
> >> model.addExternal("w3c_device_sensor_event");
> >> model.addExternal("w3c_dom1");
> >> model.addExternal("w3c_dom2");
> >> model.addExternal("w3c_dom3");
> >> model.addExternal("w3c_elementtraversal");
> >> model.addExternal("w3c_encoding");
> >> model.addExternal("w3c_event");
> >> model.addExternal("w3c_event3");
> >> model.addExternal("w3c_geolocation");
> >> model.addExternal("w3c_indexeddb");
> >> model.addExternal("w3c_navigation_timing");
> >> model.addExternal("w3c_range");
> >> model.addExternal("w3c_rtc");
> >> model.addExternal("w3c_selectors");
> >> //model.addExternal("w3c_serviceworker");
> >> //model.addExternal("w3c_webcrypto");
> >> model.addExternal("w3c_xml");
> >>
> >>         //model.addExternal("fetchapi");
> >>
> >> model.addExternal("window");
> >>
> >> model.addExternal("ie_dom");
> >> model.addExternal("gecko_dom");
> >>
> >> model.addExternal("webkit_css");
> >> model.addExternal("webkit_dom");
> >> model.addExternal("webkit_event");
> >> model.addExternal("webkit_notifications");
> >>
> >> model.addExternal("iphone");
> >> model.addExternal("chrome");
> >> model.addExternal("flash");
> >>
> >> model.addExternal("page_visibility");
> >> model.addExternal("fileapi");
> >> model.addExternal("html5");
> >>
> >>     model.addExternal("webgl");
> >> model.addExternal("webstorage");
> >>
> >>
> >>
> >>
> >> -------------------------------------------------------------
> >> AS
> >> -------------------------------------------------------------
> >>
> >> package
> >> {
> >>
> >> import ui.ButtonFactory;
> >>
> >> public class Main
> >> {
> >>     public var factory:ButtonFactory;
> >>
> >>     private var _audioContext:AudioContext;
> >>     private var sound:ArrayBuffer;
> >>
> >>     public function Main()
> >>     {
> >>         factory = new ButtonFactory();
> >>
> >>         var button:Element = factory.createButton(function ():void {
> >>             button.textContent = "Say Hello FalconJX!";
> >>             window.alert("Hello browser from FalconJX!");
> >>         });
> >>         button.textContent = "Say Hello";
> >>         document.body.appendChild(button);
> >>
> >>         var n:Number = Math.ceil(420);
> >>         button.tabIndex = 1;
> >>         //ButtonFactory.foo();
> >>
> >>         var t:Touch = new Touch();
> >>         t.pageY = 3;
> >>
> >>         var context:AudioContext;
> >>         try {
> >>             _audioContext  = new AudioContext();
> >>         }
> >>         catch (e:Error) {
> >>             alert('Web Audio API is not supported in this browser')
> >>         }
> >>
> >>         loadSound('/foo/bark.wav');
> >>     }
> >>
> >>     private function loadSound(url:String):void
> >>     {
> >>         var request:XMLHttpRequest = new XMLHttpRequest();
> >>         request.open('GET', url, true);
> >>         request.responseType = 'arraybuffer';
> >>
> >>         // Decode async
> >>         request['onload'] = function () {
> >>             _audioContext.decodeAudioData(request.response,
> >>                                           function
> >> (buffer:ArrayBuffer):void {
> >>                 sound = buffer;
> >>                 playSound();
> >>             }, onError);
> >>         };
> >>
> >>         request.send();
> >>     }
> >>
> >>     private function playSound():void
> >>     {
> >>         var source:AudioBufferSourceNode =
> >> _audioContext.createBufferSource();
> >>         source.connect(_audioContext.destination);
> >>         source.start(0);
> >>     }
> >>
> >>     private function onError():void
> >>     {
> >>
> >>     }
> >> }
> >>
> >>
> >>
> >> -------------------------------------------------------------
> >> JS
> >> -------------------------------------------------------------
> >>
> >>
> >> /**
> >>  * Main
> >>  *
> >>  * @fileoverview
> >>  *
> >>  * @suppress {checkTypes}
> >>  */
> >>
> >> goog.provide('Main');
> >>
> >> goog.require('org_apache_flex_utils_Language');
> >>
> >>
> >>
> >> /**
> >>  * @constructor
> >>  */
> >> Main = function() {
> >>   var self = this;
> >>   this.factory = new ui_ButtonFactory();
> >>   var /** @type {Element} */ button =
> >>this.factory.createButton(function()
> >> {
> >>     button.textContent = "Say Hello FalconJX!";
> >>     window.alert("Hello browser from FalconJX!");
> >>   });
> >>   button.textContent = "Say Hello";
> >>   document.body.appendChild(button);
> >>   var /** @type {number} */ n = Math.ceil(420);
> >>   button.tabIndex = 1;
> >>   var /** @type {Touch} */ t = new Touch();
> >>   t.pageY = 3;
> >>   var /** @type {AudioContext} */ context;
> >>   try {
> >>     this._audioContext = new AudioContext();
> >>   } catch (e) {
> >>     alert('Web Audio API is not supported in this browser');
> >>   }
> >>   this.loadSound('/foo/bark.wav');
> >> };
> >>
> >>
> >> /**
> >>  * @expose
> >>  * @type {ui_ButtonFactory}
> >>  */
> >> Main.prototype.factory;
> >>
> >>
> >> /**
> >>  * @private
> >>  * @type {AudioContext}
> >>  */
> >> Main.prototype._audioContext;
> >>
> >>
> >> /**
> >>  * @private
> >>  * @type {ArrayBuffer}
> >>  */
> >> Main.prototype.sound;
> >>
> >>
> >> /**
> >>  * @private
> >>  * @param {string} url
> >>  */
> >> Main.prototype.loadSound = function(url) {
> >>   var self = this;
> >>   var /** @type {XMLHttpRequest} */ request = new XMLHttpRequest();
> >>   request.open('GET', url, true);
> >>   request.responseType = 'arraybuffer';
> >>   request['onload'] = function() {
> >>     self._audioContext.decodeAudioData(request.response,
> >>function(buffer) {
> >>       self.sound = buffer;
> >>       self.playSound();
> >>     }, goog.bind(self.onError, this));
> >>   };
> >>   request.send();
> >> };
> >>
> >>
> >> /**
> >>  * @private
> >>  */
> >> Main.prototype.playSound = function() {
> >>   var /** @type {AudioBufferSourceNode} */ source =
> >> this._audioContext.createBufferSource();
> >>   source.connect(this._audioContext.destination);
> >>   source.start(0);
> >> };
> >>
> >>
> >> /**
> >>  * @private
> >>  */
> >> Main.prototype.onError = function() {
> >> };
> >>
> >>
> >> /**
> >>  * Metadata
> >>  *
> >>  * @type {Object.<string, Array.<Object>>}
> >>  */
> >> Main.prototype.FLEXJS_CLASS_INFO = { names: [{ name: 'Main', qName:
> >> 'Main'}] };
> >>
> >>
> >>
> >>
> >>
> >> Mike
> >>
> >>
> >>
> >>
> >>
> >>
> >>
> >>
> >>
> >>
> >>
> >>
> >>
> >>
> >>
> >>
> >>
> >>
> >>
> >>
> >>
> >>
>
>